mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-29 18:19:02 +00:00
920eaab1d8
Marvell mv88e6xxx switch series cannot perform MAC learning from CPU-injected (FROM_CPU) DSA frames, which results in 2 issues. - excessive flooding, due to the fact that DSA treats those addresses as unknown - the risk of stale routes, which can lead to temporary packet loss Backport those patch series from netdev mailing list, which solve these issues by adding and clearing static entries to the switch's FDB. Add a hack patch to set default VID to 1 in port_fdb_{add,del}. Otherwise the static entries will be added to the switch's private FDB if VLAN filtering disabled, which will not work. The switch may generate an "ATU violation" warning when a client moves from the CPU port to a switch port because the static ATU entry added by DSA core still points to the CPU port. DSA core will then clear the static entry so it is not fatal. Disable the warning so it will not confuse users. Link: https://lore.kernel.org/netdev/20210106095136.224739-1-olteanv@gmail.com/ Link: https://lore.kernel.org/netdev/20210116012515.3152-1-tobias@waldekranz.com/ Ref: https://gitlab.nic.cz/turris/turris-build/-/issues/165 Signed-off-by: DENG Qingfang <dqfext@gmail.com>
86 lines
2.5 KiB
Diff
86 lines
2.5 KiB
Diff
From 447d290a58bd335d68f665713842365d3d6447df Mon Sep 17 00:00:00 2001
|
|
From: Vladimir Oltean <vladimir.oltean@nxp.com>
|
|
Date: Wed, 6 Jan 2021 11:51:33 +0200
|
|
Subject: [PATCH] net: dsa: move switchdev event implementation under the same
|
|
switch/case statement
|
|
|
|
We'll need to start listening to SWITCHDEV_FDB_{ADD,DEL}_TO_DEVICE
|
|
events even for interfaces where dsa_slave_dev_check returns false, so
|
|
we need that check inside the switch-case statement for SWITCHDEV_FDB_*.
|
|
|
|
This movement also avoids a useless allocation / free of switchdev_work
|
|
on the untreated "default event" case.
|
|
|
|
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
|
|
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
|
|
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|
---
|
|
net/dsa/slave.c | 35 ++++++++++++++++-------------------
|
|
1 file changed, 16 insertions(+), 19 deletions(-)
|
|
|
|
--- a/net/dsa/slave.c
|
|
+++ b/net/dsa/slave.c
|
|
@@ -2077,31 +2077,29 @@ static int dsa_slave_switchdev_event(str
|
|
struct dsa_port *dp;
|
|
int err;
|
|
|
|
- if (event == SWITCHDEV_PORT_ATTR_SET) {
|
|
+ switch (event) {
|
|
+ case SWITCHDEV_PORT_ATTR_SET:
|
|
err = switchdev_handle_port_attr_set(dev, ptr,
|
|
dsa_slave_dev_check,
|
|
dsa_slave_port_attr_set);
|
|
return notifier_from_errno(err);
|
|
- }
|
|
-
|
|
- if (!dsa_slave_dev_check(dev))
|
|
- return NOTIFY_DONE;
|
|
+ case SWITCHDEV_FDB_ADD_TO_DEVICE:
|
|
+ case SWITCHDEV_FDB_DEL_TO_DEVICE:
|
|
+ if (!dsa_slave_dev_check(dev))
|
|
+ return NOTIFY_DONE;
|
|
|
|
- dp = dsa_slave_to_port(dev);
|
|
+ dp = dsa_slave_to_port(dev);
|
|
|
|
- switchdev_work = kzalloc(sizeof(*switchdev_work), GFP_ATOMIC);
|
|
- if (!switchdev_work)
|
|
- return NOTIFY_BAD;
|
|
-
|
|
- INIT_WORK(&switchdev_work->work,
|
|
- dsa_slave_switchdev_event_work);
|
|
- switchdev_work->ds = dp->ds;
|
|
- switchdev_work->port = dp->index;
|
|
- switchdev_work->event = event;
|
|
+ switchdev_work = kzalloc(sizeof(*switchdev_work), GFP_ATOMIC);
|
|
+ if (!switchdev_work)
|
|
+ return NOTIFY_BAD;
|
|
+
|
|
+ INIT_WORK(&switchdev_work->work,
|
|
+ dsa_slave_switchdev_event_work);
|
|
+ switchdev_work->ds = dp->ds;
|
|
+ switchdev_work->port = dp->index;
|
|
+ switchdev_work->event = event;
|
|
|
|
- switch (event) {
|
|
- case SWITCHDEV_FDB_ADD_TO_DEVICE:
|
|
- case SWITCHDEV_FDB_DEL_TO_DEVICE:
|
|
fdb_info = ptr;
|
|
|
|
if (!fdb_info->added_by_user) {
|
|
@@ -2114,13 +2112,12 @@ static int dsa_slave_switchdev_event(str
|
|
switchdev_work->vid = fdb_info->vid;
|
|
|
|
dev_hold(dev);
|
|
+ dsa_schedule_work(&switchdev_work->work);
|
|
break;
|
|
default:
|
|
- kfree(switchdev_work);
|
|
return NOTIFY_DONE;
|
|
}
|
|
|
|
- dsa_schedule_work(&switchdev_work->work);
|
|
return NOTIFY_OK;
|
|
}
|
|
|