• Vladimir Oltean's avatar
    net: dsa: inherit the actual bridge port flags at join time · 5961d6a1
    Vladimir Oltean authored
    DSA currently assumes that the bridge port starts off with this
    constellation of bridge port flags:
    
    - learning on
    - unicast flooding on
    - multicast flooding on
    - broadcast flooding on
    
    just by virtue of code copy-pasta from the bridge layer (new_nbp).
    This was a simple enough strategy thus far, because the 'bridge join'
    moment always coincided with the 'bridge port creation' moment.
    
    But with sandwiched interfaces, such as:
    
     br0
      |
    bond0
      |
     swp0
    
    it may happen that the user has had time to change the bridge port flags
    of bond0 before enslaving swp0 to it. In that case, swp0 will falsely
    assume that the bridge port flags are those determined by new_nbp, when
    in fact this can happen:
    
    ip link add br0 type bridge
    ip link add bond0 type bond
    ip link set bond0 master br0
    ip link set bond0 type bridge_slave learning off
    ip link set swp0 master br0
    
    Now swp0 has learning enabled, bond0 has learning disabled. Not nice.
    
    Fix this by "dumpster diving" through the actual bridge port flags with
    br_port_flag_is_set, at bridge join time.
    
    We use this opportunity to split dsa_port_change_brport_flags into two
    distinct functions called dsa_port_inherit_brport_flags and
    dsa_port_clear_brport_flags, now that the implementation for the two
    cases is no longer similar. This patch also creates two functions called
    dsa_port_switchdev_sync and dsa_port_switchdev_unsync which collect what
    we have so far, even if that's asymmetrical. More is going to be added
    in the next patch.
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    5961d6a1
port.c 24.5 KB