Similar to commit 1431276926 ("controller: fix ovn patch port
incremental processing"), update peer logical flows when the related
patch port is removed.

Reported-at: https://issues.redhat.com/browse/FDP-947
Signed-off-by: Lorenzo Bianconi <[email protected]>
---
Changes in v3:
- fallback to full recompute when type column in SB.port_binding tale is updated
- update pb patch port in 'removed' case in physical_handle_flows_for_lport()
Changes in v2:
- use OFTABLE_LOG_TO_PHY for table 65
---
 controller/ovn-controller.c |  5 ++++
 controller/physical.c       | 20 +++++++++++-----
 tests/ovn-controller.at     |  7 ++++++
 tests/ovn.at                | 47 +++++++++++++++++++++++++++++++++++++
 4 files changed, 73 insertions(+), 6 deletions(-)

diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c
index 890c8f988..8c44c88e3 100644
--- a/controller/ovn-controller.c
+++ b/controller/ovn-controller.c
@@ -4566,6 +4566,11 @@ pflow_output_sb_port_binding_handler(struct engine_node 
*node,
      */
     const struct sbrec_port_binding *pb;
     SBREC_PORT_BINDING_TABLE_FOR_EACH_TRACKED (pb, p_ctx.port_binding_table) {
+        /* Trigger a full recompute if type column is updated. */
+        if (sbrec_port_binding_is_updated(pb, SBREC_PORT_BINDING_COL_TYPE)) {
+            destroy_physical_ctx(&p_ctx);
+            return false;
+        }
         bool removed = sbrec_port_binding_is_deleted(pb);
         if (!physical_handle_flows_for_lport(pb, removed, &p_ctx,
                                              &pfo->flow_table)) {
diff --git a/controller/physical.c b/controller/physical.c
index c56c73c20..1da2dd226 100644
--- a/controller/physical.c
+++ b/controller/physical.c
@@ -2411,13 +2411,21 @@ physical_handle_flows_for_lport(const struct 
sbrec_port_binding *pb,
         physical_multichassis_reprocess(pb, p_ctx, flow_table);
     }
 
-    if (!removed) {
+    /* Always update pb and the configured peer for patch ports. */
+    if (!removed || !strcmp(pb->type, "patch")) {
         physical_eval_port_binding(p_ctx, pb, flow_table);
-        if (!strcmp(pb->type, "patch")) {
-            const struct sbrec_port_binding *peer =
-                get_binding_peer(p_ctx->sbrec_port_binding_by_name, pb);
-            if (peer) {
-                physical_eval_port_binding(p_ctx, peer, flow_table);
+    }
+
+    if (!strcmp(pb->type, "patch")) {
+        if (removed) {
+            ofctrl_remove_flows(flow_table, &pb->header_.uuid);
+        }
+        const struct sbrec_port_binding *peer =
+            get_binding_peer(p_ctx->sbrec_port_binding_by_name, pb);
+        if (peer) {
+            physical_eval_port_binding(p_ctx, peer, flow_table);
+            if (removed) {
+                ofctrl_remove_flows(flow_table, &peer->header_.uuid);
             }
         }
     }
diff --git a/tests/ovn-controller.at b/tests/ovn-controller.at
index df0158cd6..b2c90409b 100644
--- a/tests/ovn-controller.at
+++ b/tests/ovn-controller.at
@@ -917,6 +917,13 @@ check ovn-nbctl lrp-add lr0 rp-ls1 00:00:01:01:02:03 
192.168.1.254/24
 
 OVS_WAIT_UNTIL([as hv1 ovs-ofctl dump-flows br-int | grep 
table=OFTABLE_LOCAL_OUTPUT | grep -q "reg15=0x${port},metadata=0x${meta}"])
 
+# Check we have a full recompute if type column is updated
+AT_CHECK([ovn-appctl -t ovn-controller inc-engine/clear-stats])
+check ovn-nbctl lsp-set-type ls0-rp localnet
+AT_CHECK([ovn-appctl -t ovn-controller inc-engine/show-stats | grep 
physical_flow_output -A 1 | awk '/recompute/{print $3}'],[0],[dnl
+1
+])
+
 OVN_CLEANUP([hv1])
 AT_CLEANUP
 ])
diff --git a/tests/ovn.at b/tests/ovn.at
index 0ea403fd7..1297c5c51 100644
--- a/tests/ovn.at
+++ b/tests/ovn.at
@@ -40649,3 +40649,50 @@ AT_CHECK([as hv1 ovs-ofctl dump-flows br-int 
table=OFTABLE_PHY_TO_LOG | grep -v
 OVN_CLEANUP([hv1],[hv2])
 AT_CLEANUP
 ])
+
+OVN_FOR_EACH_NORTHD([
+AT_SETUP([requested-tnl-key-recompute])
+AT_KEYWORDS([requested-tnl-key-recompute])
+
+m4_define([OFTABLE_LOG_TO_PHY], [65])
+
+ovn_start
+net_add n1
+
+check ovn-nbctl ls-add ls
+check ovn-nbctl lsp-add ls lsp -- lsp-set-addresses lsp "00:00:10:01:02:01 
10.0.0.1"
+
+check ovn-nbctl lr-add lr
+check ovn-nbctl set logical_router lr options:mac_binding_age_threshold=3600
+check ovn-nbctl lrp-add lr lr-ls 00:00:00:00:ff:01 10.0.0.254/24
+check ovn-nbctl lsp-add ls ls-lr
+check ovn-nbctl lsp-set-type ls-lr router
+check ovn-nbctl lsp-set-addresses ls-lr router
+check ovn-nbctl lsp-set-options ls-lr router-port=lr-ls
+
+sim_add hv1
+
+as hv1
+ovs-vsctl add-br br-phys
+ovn_attach n1 br-phys 192.168.0.1
+ovs-vsctl set open . external_ids:ovn-bridge-mappings=physnet1:br-phys
+ovs-vsctl add-port br-int vif -- set Interface vif external-ids:iface-id=lsp
+
+check ovn-nbctl --wait=hv sync
+wait_for_ports_up
+
+check ovn-nbctl --wait=hv set logical_router_port lr-ls 
options:requested-tnl-key=42
+ls_tnl_key=$(fetch_column datapath_binding tunnel_key external_ids:name=ls)
+AT_CHECK([ovs-ofctl dump-flows br-int table=OFTABLE_LOG_TO_PHY | grep 
metadata=0x${ls_tnl_key} | grep -q load:0x2a->NXM_NX_REG14])
+
+check ovn-nbctl lrp-del lr-ls
+check ovn-nbctl                                             \
+    -- lrp-add lr lr-ls 00:00:00:00:10:00 192.168.10.1/24   \
+    -- set logical_router_port lr-ls options:requested-tnl-key=43
+check ovn-nbctl --wait=hv sync
+
+AT_CHECK([ovs-ofctl dump-flows br-int table=OFTABLE_LOG_TO_PHY | grep 
metadata=0x${ls_tnl_key} | grep -q load:0x2b->NXM_NX_REG14])
+
+OVN_CLEANUP([hv1])
+AT_CLEANUP
+])
-- 
2.48.0

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to