Andrew Lunn
2020-Apr-20 13:31 UTC
[Bridge] [RFC PATCH net-next] net: bridge: fix client roaming from DSA user port
> When a client moves from a hardware port (e.g. sw0p1) to a software port (wlan0) > or another hardware port that belongs to a different switch (sw1p1), > that MAC entry > in sw0's MAC table should be deleted, or replaced with the CPU port as > destination, > by DSA. Otherwise the client is unable to talk to other hosts on sw0 because sw0 > still thinks the client is on sw0p1.The MAC address needs to move, no argument there. But what are the mechanisms which cause this. Is learning sufficient, or does DSA need to take an active role? Forget about DSA for the moment. How does this work for two normal bridges? Is the flow of unicast packets sufficient? Does it requires a broadcast packet from the device after it moves? Andrew
Chuanhong Guo
2020-Apr-22 06:01 UTC
[Bridge] [RFC PATCH net-next] net: bridge: fix client roaming from DSA user port
Hi! On Tue, Apr 21, 2020 at 12:36 AM Andrew Lunn <andrew at lunn.ch> wrote:> > The MAC address needs to move, no argument there. But what are the > mechanisms which cause this. Is learning sufficient, or does DSA need > to take an active role?cpu port learning will break switch operation if for whatever reason we want to disable bridge offloading (e.g. ebtables?). In this case a packet received from cpu port need to be sent back through cpu port to another switch port, and the switch will learn from this packet incorrectly. If we want cpu port learning to kick in, we need to make sure that: 1. When bridge offload is enabled, the switch takes care of packet flooding on switch ports itself, instead of flooding with software bridge. 2. Software bridge shouldn't forward any packet between ports on the same switch. 3. cpu port learning should only be enabled when bridge offloading is used. Otherwise we need to manually sync fdb between software bridge and switch, specifically we need to take over fdb management on cpu port and tell the switch what devices are on the software bridge port side. I haven't read kernel bridge code thoroughly and have no idea which one is better/easier. Some switches (e.g. mt753x) have an option to forward packets with unknown destination port to cpu port only, instead of flooding. For this type of switch, the solution proposed in this patch is fine, because removing fdb entries has the same effect as telling switch that a device is on cpu port. If there's a switch without this feature, (which I have no idea if it exists) there will be issues on packet flooding behavior.> > Forget about DSA for the moment. How does this work for two normal > bridges? Is the flow of unicast packets sufficient? Does it requires a > broadcast packet from the device after it moves?It doesn't have to be a broadcast packet but it needs a packet to go through both bridges. Say we have bridge A and bridge B, port A1 and B1 are connected together and a device is on port A2 first: Bridge A knows that this device is on port A2 and will forward traffic through A1 to B1 if needed. Bridge B sees these packets and knows device is on port B1. When the device move from A2 to B2, B updates its fdb and if a packet reaches A, A will update its fdb too. The problem addressed in this patch is that switch doesn't update its fdb when a device moves from switch to software bridge, because cpu port learning is disabled. -- Regards, Chuanhong Guo
Andrew Lunn
2020-Apr-23 21:36 UTC
[Bridge] [RFC PATCH net-next] net: bridge: fix client roaming from DSA user port
On Wed, Apr 22, 2020 at 02:01:28PM +0800, Chuanhong Guo wrote:> Hi! > > On Tue, Apr 21, 2020 at 12:36 AM Andrew Lunn <andrew at lunn.ch> wrote: > > > > The MAC address needs to move, no argument there. But what are the > > mechanisms which cause this. Is learning sufficient, or does DSA need > > to take an active role? > > cpu port learning will break switch operation if for whatever reason > we want to disable bridge offloading (e.g. ebtables?). In this case > a packet received from cpu port need to be sent back through > cpu port to another switch port, and the switch will learn from this > packet incorrectly. > > If we want cpu port learning to kick in, we need to make sure that: > 1. When bridge offload is enabled, the switch takes care of packet > flooding on switch ports itself, instead of flooding with software > bridge.Hi Chuanhong This is what the skb->offload_fwd_mark is all about. If this is set to 1, it means the switch has done all the forwarding needed for ports in that switch. Most of the tag drivers set this unconditionally true.> 2. Software bridge shouldn't forward any packet between ports > on the same switch.If skb->offload_fwd_mark is true, it won't.> 3. cpu port learning should only be enabled when bridge > offloading is used.So it should be safe for most switch drivers. And the ones which don't set offload_fwd_mark are probably relying of software bridging, or are broken and replicating frames.> It doesn't have to be a broadcast packet but it needs a packet to go > through both bridges. > > Say we have bridge A and bridge B, port A1 and B1 are connected > together and a device is on port A2 first: > Bridge A knows that this device is on port A2 and will forward traffic > through A1 to B1 if needed. Bridge B sees these packets and knows > device is on port B1. > When the device move from A2 to B2, B updates its fdb and if a > packet reaches A, A will update its fdb too.The issue here is 'if a packet reaches A'. B might have no reason to send a unicast packet to A, if none of the destinations the device is talking to is reached via A. Which is why i think a broadcast/multicast packet is more likely to be involved. Andrew