64fdc5f341
If certain conditions are met, DSA can install all necessary MAC addresses on the CPU ports as FDB entries and disable flooding towards the CPU (we call this RX filtering). There is one corner case where this does not work. ip link add br0 type bridge vlan_filtering 1 && ip link set br0 up ip link set swp0 master br0 && ip link set swp0 up ip link add link swp0 name swp0.100 type vlan id 100 ip link set swp0.100 up && ip addr add 192.168.100.1/24 dev swp0.100 Traffic through swp0.100 is broken, because the bridge turns on VLAN filtering in the swp0 port (causing RX packets to be classified to the FDB database corresponding to the VID from their 802.1Q header), and although the 8021q module does call dev_uc_add() towards the real device, that API is VLAN-unaware, so it only contains the MAC address, not the VID; and DSA's current implementation of ndo_set_rx_mode() is only for VID 0 (corresponding to FDB entries which are installed in an FDB database which is only hit when the port is VLAN-unaware). It's interesting to understand why the bridge does not turn on IFF_PROMISC for its swp0 bridge port, and it may appear at first glance that this is a regression caused by the logic in commit |
||
---|---|---|
.. | ||
devlink.c | ||
devlink.h | ||
dsa.c | ||
dsa.h | ||
Kconfig | ||
Makefile | ||
master.c | ||
master.h | ||
netlink.c | ||
netlink.h | ||
port.c | ||
port.h | ||
slave.c | ||
slave.h | ||
switch.c | ||
switch.h | ||
tag_8021q.c | ||
tag_8021q.h | ||
tag_ar9331.c | ||
tag_brcm.c | ||
tag_dsa.c | ||
tag_gswip.c | ||
tag_hellcreek.c | ||
tag_ksz.c | ||
tag_lan9303.c | ||
tag_mtk.c | ||
tag_none.c | ||
tag_ocelot_8021q.c | ||
tag_ocelot.c | ||
tag_qca.c | ||
tag_rtl4_a.c | ||
tag_rtl8_4.c | ||
tag_rzn1_a5psw.c | ||
tag_sja1105.c | ||
tag_trailer.c | ||
tag_xrs700x.c | ||
tag.c | ||
tag.h |