Message ID | 20210618183017.3340769-4-olteanv@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | Improvement for DSA cross-chip setups | expand |
Context | Check | Description |
---|---|---|
netdev/cover_letter | success | Link |
netdev/fixes_present | success | Link |
netdev/patch_count | success | Link |
netdev/tree_selection | success | Clearly marked for net-next |
netdev/subject_prefix | success | Link |
netdev/cc_maintainers | success | CCed 7 of 7 maintainers |
netdev/source_inline | success | Was 0 now: 0 |
netdev/verify_signedoff | success | Link |
netdev/module_param | success | Was 0 now: 0 |
netdev/build_32bit | success | Errors and warnings before: 0 this patch: 0 |
netdev/kdoc | success | Errors and warnings before: 0 this patch: 0 |
netdev/verify_fixes | success | Link |
netdev/checkpatch | success | total: 0 errors, 0 warnings, 0 checks, 38 lines checked |
netdev/build_allmodconfig_warn | success | Errors and warnings before: 0 this patch: 0 |
netdev/header_inline | success | Link |
On 6/18/2021 11:30 AM, Vladimir Oltean wrote: > From: Vladimir Oltean <vladimir.oltean@nxp.com> > > Currently, the notifier for adding a multicast MAC address matches on > the targeted port and on all DSA links in the system, be they upstream > or downstream links. > > This leads to a considerable amount of useless traffic. > > Consider this daisy chain topology, and a MDB add notifier emitted on > sw0p0. It matches on sw0p0, sw0p3, sw1p3 and sw2p4. > > sw0p0 sw0p1 sw0p2 sw0p3 sw0p4 > [ user ] [ user ] [ user ] [ dsa ] [ cpu ] > [ x ] [ ] [ ] [ x ] [ ] > | > +---------+ > | > sw1p0 sw1p1 sw1p2 sw1p3 sw1p4 > [ user ] [ user ] [ user ] [ dsa ] [ dsa ] > [ ] [ ] [ ] [ x ] [ x ] > | > +---------+ > | > sw2p0 sw2p1 sw2p2 sw2p3 sw2p4 > [ user ] [ user ] [ user ] [ user ] [ dsa ] > [ ] [ ] [ ] [ ] [ x ] > > But switch 0 has no reason to send the multicast traffic for that MAC > address on sw0p3, which is how it reaches switches 1 and 2. Those > switches don't expect, according to the user configuration, to receive > this multicast address from switch 1, and they will drop it anyway, > because the only valid destination is the port they received it on. > They only need to configure themselves to deliver that multicast address > _towards_ switch 1, where the MDB entry is installed. > > Similarly, switch 1 should not send this multicast traffic towards > sw1p3, because that is how it reaches switch 2. > > With this change, the heat map for this MDB notifier changes as follows: > > sw0p0 sw0p1 sw0p2 sw0p3 sw0p4 > [ user ] [ user ] [ user ] [ dsa ] [ cpu ] > [ x ] [ ] [ ] [ ] [ ] > | > +---------+ > | > sw1p0 sw1p1 sw1p2 sw1p3 sw1p4 > [ user ] [ user ] [ user ] [ dsa ] [ dsa ] > [ ] [ ] [ ] [ ] [ x ] > | > +---------+ > | > sw2p0 sw2p1 sw2p2 sw2p3 sw2p4 > [ user ] [ user ] [ user ] [ user ] [ dsa ] > [ ] [ ] [ ] [ ] [ x ] > > Now the mdb notifier behaves the same as the fdb notifier. > > Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
diff --git a/net/dsa/switch.c b/net/dsa/switch.c index 9bf8e20ecdf3..8b601ced6b45 100644 --- a/net/dsa/switch.c +++ b/net/dsa/switch.c @@ -232,36 +232,15 @@ static int dsa_switch_lag_leave(struct dsa_switch *ds, return 0; } -static bool dsa_switch_mdb_match(struct dsa_switch *ds, int port, - struct dsa_notifier_mdb_info *info) -{ - if (ds->index == info->sw_index && port == info->port) - return true; - - if (dsa_is_dsa_port(ds, port)) - return true; - - return false; -} - static int dsa_switch_mdb_add(struct dsa_switch *ds, struct dsa_notifier_mdb_info *info) { - int err = 0; - int port; + int port = dsa_towards_port(ds, info->sw_index, info->port); if (!ds->ops->port_mdb_add) return -EOPNOTSUPP; - for (port = 0; port < ds->num_ports; port++) { - if (dsa_switch_mdb_match(ds, port, info)) { - err = ds->ops->port_mdb_add(ds, port, info->mdb); - if (err) - break; - } - } - - return err; + return ds->ops->port_mdb_add(ds, port, info->mdb); } static int dsa_switch_mdb_del(struct dsa_switch *ds,