Skip to content

Commit

Permalink
net: dsa: call dsa_port_bridge_join when joining a LAG that is alread…
Browse files Browse the repository at this point in the history
…y in a bridge

DSA can properly detect and offload this sequence of operations:

ip link add br0 type bridge
ip link add bond0 type bond
ip link set swp0 master bond0
ip link set bond0 master br0

But not this one:

ip link add br0 type bridge
ip link add bond0 type bond
ip link set bond0 master br0
ip link set swp0 master bond0

Actually the second one is more complicated, due to the elapsed time
between the enslavement of bond0 and the offloading of it via swp0, a
lot of things could have happened to the bond0 bridge port in terms of
switchdev objects (host MDBs, VLANs, altered STP state etc). So this is
a bit of a can of worms, and making sure that the DSA port's state is in
sync with this already existing bridge port is handled in the next
patches.

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
  • Loading branch information
vladimiroltean authored and intel-lab-lkp committed Mar 18, 2021
1 parent 3122216 commit d7d0384
Showing 1 changed file with 18 additions and 4 deletions.
22 changes: 18 additions & 4 deletions net/dsa/port.c
Original file line number Diff line number Diff line change
Expand Up @@ -249,17 +249,31 @@ int dsa_port_lag_join(struct dsa_port *dp, struct net_device *lag,
.lag = lag,
.info = uinfo,
};
struct net_device *bridge_dev;
int err;

dsa_lag_map(dp->ds->dst, lag);
dp->lag_dev = lag;

err = dsa_port_notify(dp, DSA_NOTIFIER_LAG_JOIN, &info);
if (err) {
dp->lag_dev = NULL;
dsa_lag_unmap(dp->ds->dst, lag);
}
if (err)
goto err_lag_join;

bridge_dev = netdev_master_upper_dev_get(lag);
if (!bridge_dev || !netif_is_bridge_master(bridge_dev))
return 0;

err = dsa_port_bridge_join(dp, bridge_dev);
if (err)
goto err_bridge_join;

return 0;

err_bridge_join:
dsa_port_notify(dp, DSA_NOTIFIER_LAG_LEAVE, &info);
err_lag_join:
dp->lag_dev = NULL;
dsa_lag_unmap(dp->ds->dst, lag);
return err;
}

Expand Down

0 comments on commit d7d0384

Please sign in to comment.