• Vladimir Oltean's avatar
    net: dsa: properly fall back to software bridging · 67b5fb5d
    Vladimir Oltean authored
    If the driver does not implement .port_bridge_{join,leave}, then we must
    fall back to standalone operation on that port, and trigger the error
    path of dsa_port_bridge_join. This sets dp->bridge_dev = NULL.
    
    In turn, having a non-NULL dp->bridge_dev when there is no offloading
    support makes the following things go wrong:
    
    - dsa_default_offload_fwd_mark make the wrong decision in setting
      skb->offload_fwd_mark. It should set skb->offload_fwd_mark = 0 for
      ports that don't offload the bridge, which should instruct the bridge
      to forward in software. But this does not happen, dp->bridge_dev is
      incorrectly set to point to the bridge, so the bridge is told that
      packets have been forwarded in hardware, which they haven't.
    
    - switchdev objects (MDBs, VLANs) should not be offloaded by ports that
      don't offload the bridge. Standalone ports should behave as packet-in,
      packet-out and the bridge should not be able to manipulate the pvid of
      the port, or tag stripping on egress, or ingress filtering. This
      should already work fine because dsa_slave_port_obj_add has:
    
    	case SWITCHDEV_OBJ_ID_PORT_VLAN:
    		if (!dsa_port_offloads_bridge_port(dp, obj->orig_dev))
    			return -EOPNOTSUPP;
    
    		err = dsa_slave_vlan_add(dev, obj, extack);
    
      but since dsa_port_offloads_bridge_port works based on dp->bridge_dev,
      this is again sabotaging us.
    
    All the above work in case the port has an unoffloaded LAG interface, so
    this is well exercised code, we should apply it for plain unoffloaded
    bridge ports too.
    Reported-by: default avatarAlvin Šipraga <alsi@bang-olufsen.dk>
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    67b5fb5d
switch.c 18.3 KB