When a configuration change triggers an interface destruction/creation
(like for example, setting ofport_request), a port object may still be
referenced as a fport or a rport in the mdb:
bridge("br0")
-------------
0. priority 32768
NORMAL
-> forwarding to mcast group port
>> mcast flood port is unknown, dropping
-> mcast flood port is input port, dropping
-> forwarding to mcast flood port
Add relevant cleanup and update a unit test.
Fixes: 4fbbf8624868 ("mcast-snooping: Flush ports mdb when VLAN configuration
changed.")
Signed-off-by: David Marchand <[email protected]>
---
lib/mcast-snooping.c | 15 +++++++++++++++
tests/mcast-snooping.at | 18 ++++++++++++++++++
2 files changed, 33 insertions(+)
diff --git a/lib/mcast-snooping.c b/lib/mcast-snooping.c
index 029ca28558..34755447f8 100644
--- a/lib/mcast-snooping.c
+++ b/lib/mcast-snooping.c
@@ -948,6 +948,7 @@ mcast_snooping_flush_bundle(struct mcast_snooping *ms, void
*port)
{
struct mcast_group *g;
struct mcast_mrouter_bundle *m;
+ struct mcast_port_bundle *p;
if (!mcast_snooping_enabled(ms)) {
return;
@@ -971,5 +972,19 @@ mcast_snooping_flush_bundle(struct mcast_snooping *ms,
void *port)
}
}
+ LIST_FOR_EACH_SAFE (p, node, &ms->fport_list) {
+ if (p->port == port) {
+ mcast_snooping_flush_port(p);
+ ms->need_revalidate = true;
+ }
+ }
+
+ LIST_FOR_EACH_SAFE (p, node, &ms->rport_list) {
+ if (p->port == port) {
+ mcast_snooping_flush_port(p);
+ ms->need_revalidate = true;
+ }
+ }
+
ovs_rwlock_unlock(&ms->rwlock);
}
diff --git a/tests/mcast-snooping.at b/tests/mcast-snooping.at
index 21c806ef63..66bb8d0c65 100644
--- a/tests/mcast-snooping.at
+++ b/tests/mcast-snooping.at
@@ -189,6 +189,24 @@ Megaflow:
recirc_id=0,eth,udp,in_port=3,dl_src=aa:55:aa:55:00:ff,dl_dst=01:00:5e
Datapath actions: 1,2
])
+AT_CHECK([ovs-vsctl set interface p2 ofport_request=4])
+
+AT_CHECK([ovs-appctl ofproto/trace
"in_port(3),eth(src=aa:55:aa:55:00:ff,dst=01:00:5e:5e:01:01),eth_type(0x0800),ipv4(src=10.0.0.1,dst=224.1.1.1,proto=17,tos=0,ttl=64,frag=no),udp(src=0,dst=8000)"],
[0], [dnl
+Flow:
udp,in_port=3,vlan_tci=0x0000,dl_src=aa:55:aa:55:00:ff,dl_dst=01:00:5e:5e:01:01,nw_src=10.0.0.1,nw_dst=224.1.1.1,nw_tos=0,nw_ecn=0,nw_ttl=64,nw_frag=no,tp_src=0,tp_dst=8000
+
+bridge("br0")
+-------------
+ 0. priority 32768
+ NORMAL
+ -> forwarding to mcast group port
+ -> mcast flood port is input port, dropping
+ -> forwarding to mcast flood port
+
+Final flow: unchanged
+Megaflow:
recirc_id=0,eth,udp,in_port=3,dl_src=aa:55:aa:55:00:ff,dl_dst=01:00:5e:5e:01:01,nw_dst=224.1.1.1,nw_frag=no
+Datapath actions: 1,2
+])
+
OVS_VSWITCHD_STOP
AT_CLEANUP
--
2.41.0
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev