mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-22 23:12:32 +00:00
f1158fbcf6
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>
(cherry picked from commit 920eaab1d8
)
57 lines
1.8 KiB
Diff
57 lines
1.8 KiB
Diff
From 81e39fd78db82fb51b05fff309b9c521f1a0bc5a Mon Sep 17 00:00:00 2001
|
|
From: Tobias Waldekranz <tobias@waldekranz.com>
|
|
Date: Sat, 16 Jan 2021 02:25:14 +0100
|
|
Subject: [PATCH] net: dsa: Sync static FDB entries on foreign interfaces to
|
|
hardware
|
|
|
|
Reuse the "assisted_learning_on_cpu_port" functionality to always add
|
|
entries for user-configured entries on foreign interfaces, even if
|
|
assisted_learning_on_cpu_port is not enabled. E.g. in this situation:
|
|
|
|
br0
|
|
/ \
|
|
swp0 dummy0
|
|
|
|
$ bridge fdb add 02:00:de:ad:00:01 dev dummy0 vlan 1 master
|
|
|
|
Results in DSA adding an entry in the hardware FDB, pointing this
|
|
address towards the CPU port.
|
|
|
|
The same is true for entries added to the bridge itself, e.g:
|
|
|
|
$ bridge fdb add 02:00:de:ad:00:01 dev br0 vlan 1 self
|
|
|
|
Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>
|
|
---
|
|
net/dsa/slave.c | 12 ++++++++----
|
|
1 file changed, 8 insertions(+), 4 deletions(-)
|
|
|
|
--- a/net/dsa/slave.c
|
|
+++ b/net/dsa/slave.c
|
|
@@ -1702,9 +1702,12 @@ static int dsa_slave_switchdev_event(str
|
|
else if (!fdb_info->added_by_user)
|
|
return NOTIFY_OK;
|
|
} else {
|
|
- /* Snoop addresses learnt on foreign interfaces
|
|
- * bridged with us, for switches that don't
|
|
- * automatically learn SA from CPU-injected traffic
|
|
+ /* Snoop addresses added to foreign interfaces
|
|
+ * bridged with us, or the bridge
|
|
+ * itself. Dynamically learned addresses can
|
|
+ * also be added for switches that don't
|
|
+ * automatically learn SA from CPU-injected
|
|
+ * traffic.
|
|
*/
|
|
struct net_device *br_dev;
|
|
struct dsa_slave_priv *p;
|
|
@@ -1726,7 +1729,8 @@ static int dsa_slave_switchdev_event(str
|
|
|
|
dp = p->dp->cpu_dp;
|
|
|
|
- if (!dp->ds->assisted_learning_on_cpu_port)
|
|
+ if (!fdb_info->added_by_user &&
|
|
+ !dp->ds->assisted_learning_on_cpu_port)
|
|
return NOTIFY_DONE;
|
|
}
|
|
|