diff mbox series

[ovs-dev,2/2] mcast-snooping: Flush flood and report ports when deleting interfaces.

Message ID 20231109095546.469063-2-david.marchand@redhat.com
State Superseded
Headers show
Series [ovs-dev,1/2] mcast-snooping: Test per port explicit flooding. | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_Build_and_Test fail github build: failed
ovsrobot/intel-ovs-compilation success test: success

Commit Message

David Marchand Nov. 9, 2023, 9:55 a.m. UTC
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 <david.marchand@redhat.com>
---
 lib/mcast-snooping.c    | 15 +++++++++++++++
 tests/mcast-snooping.at | 18 ++++++++++++++++++
 2 files changed, 33 insertions(+)
diff mbox series

Patch

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