diff options
author | Vivien Didelot <vivien.didelot@savoirfairelinux.com> | 2017-11-30 12:56:43 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-12-02 21:21:17 -0500 |
commit | 3169241f55e194278294c7a4c43ef558c75cb0b7 (patch) | |
tree | 6865c94b27eaef509b93bbcd81fce2c87baa9c67 | |
parent | 3b8fac5d905ee15346ba2de1e2427ef43fbbd880 (diff) | |
download | op-kernel-dev-3169241f55e194278294c7a4c43ef558c75cb0b7.zip op-kernel-dev-3169241f55e194278294c7a4c43ef558c75cb0b7.tar.gz |
net: dsa: support cross-chip FDB operations
When a MAC address is added to or removed from a switch port in the
fabric, the target switch must program its port and adjacent switches
must program their local DSA port used to reach the target switch.
For this purpose, use the dsa_towards_port() helper to identify the
local switch port which must be programmed.
Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/dsa/switch.c | 14 |
1 files changed, 4 insertions, 10 deletions
diff --git a/net/dsa/switch.c b/net/dsa/switch.c index 9a01514..b935117 100644 --- a/net/dsa/switch.c +++ b/net/dsa/switch.c @@ -83,29 +83,23 @@ static int dsa_switch_bridge_leave(struct dsa_switch *ds, static int dsa_switch_fdb_add(struct dsa_switch *ds, struct dsa_notifier_fdb_info *info) { - /* Do not care yet about other switch chips of the fabric */ - if (ds->index != info->sw_index) - return 0; + int port = dsa_towards_port(ds, info->sw_index, info->port); if (!ds->ops->port_fdb_add) return -EOPNOTSUPP; - return ds->ops->port_fdb_add(ds, info->port, info->addr, - info->vid); + return ds->ops->port_fdb_add(ds, port, info->addr, info->vid); } static int dsa_switch_fdb_del(struct dsa_switch *ds, struct dsa_notifier_fdb_info *info) { - /* Do not care yet about other switch chips of the fabric */ - if (ds->index != info->sw_index) - return 0; + int port = dsa_towards_port(ds, info->sw_index, info->port); if (!ds->ops->port_fdb_del) return -EOPNOTSUPP; - return ds->ops->port_fdb_del(ds, info->port, info->addr, - info->vid); + return ds->ops->port_fdb_del(ds, port, info->addr, info->vid); } static int |