From: Numan Siddique <[email protected]>

When a vtep logical port changes, necessary flows are not added as
expected.  This is because the function physical_handle_flows_for_lport()
in physical.c does not add flows required for vtep logical ports.
These flows are added by physical_run(). So fall back to full recompute
of pflow_output engine node when vtep lports change.

Reported-by: Odintsov Vladislav <[email protected]>
Reported-at: 
https://mail.openvswitch.org/pipermail/ovs-dev/2021-September/387435.html
Signed-off-by: Numan Siddique <[email protected]>
---
 controller/ovn-controller.c | 11 ++++++++---
 controller/physical.c       |  9 ++++++++-
 controller/physical.h       |  2 +-
 3 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c
index 0031a1035..d98ebbbfa 100644
--- a/controller/ovn-controller.c
+++ b/controller/ovn-controller.c
@@ -2867,7 +2867,10 @@ 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) {
         bool removed = sbrec_port_binding_is_deleted(pb);
-        physical_handle_flows_for_lport(pb, removed, &p_ctx, &pfo->flow_table);
+        if (!physical_handle_flows_for_lport(pb, removed, &p_ctx,
+                                             &pfo->flow_table)) {
+            return false;
+        }
     }
 
     engine_set_node_state(node, EN_UPDATED);
@@ -2930,8 +2933,10 @@ pflow_output_runtime_data_handler(struct engine_node 
*node, void *data)
             struct tracked_lport *lport = shash_node->data;
             bool removed =
                 lport->tracked_type == TRACKED_RESOURCE_REMOVED ? true: false;
-            physical_handle_flows_for_lport(lport->pb, removed, &p_ctx,
-                                            &pfo->flow_table);
+            if (!physical_handle_flows_for_lport(lport->pb, removed, &p_ctx,
+                                                 &pfo->flow_table)) {
+                return false;
+            }
         }
     }
 
diff --git a/controller/physical.c b/controller/physical.c
index 6f2c1cea0..ffb9f9952 100644
--- a/controller/physical.c
+++ b/controller/physical.c
@@ -1509,11 +1509,16 @@ consider_mc_group(enum mf_field_id mff_ovn_geneve,
     sset_destroy(&remote_chassis);
 }
 
-void
+bool
 physical_handle_flows_for_lport(const struct sbrec_port_binding *pb,
                                 bool removed, struct physical_ctx *p_ctx,
                                 struct ovn_desired_flow_table *flow_table)
 {
+    if (!strcmp(pb->type, "vtep")) {
+        /* Cannot handle changes to vtep lports (yet). */
+        return false;
+    }
+
     ofctrl_remove_flows(flow_table, &pb->header_.uuid);
 
     if (!strcmp(pb->type, "external")) {
@@ -1553,6 +1558,8 @@ physical_handle_flows_for_lport(const struct 
sbrec_port_binding *pb,
                               p_ctx->chassis, flow_table, &ofpacts);
         ofpbuf_uninit(&ofpacts);
     }
+
+    return true;
 }
 
 void
diff --git a/controller/physical.h b/controller/physical.h
index c4540ad7f..ee4b1ae1f 100644
--- a/controller/physical.h
+++ b/controller/physical.h
@@ -65,7 +65,7 @@ void physical_run(struct physical_ctx *,
                   struct ovn_desired_flow_table *);
 void physical_handle_mc_group_changes(struct physical_ctx *,
                                       struct ovn_desired_flow_table *);
-void physical_handle_flows_for_lport(const struct sbrec_port_binding *,
+bool physical_handle_flows_for_lport(const struct sbrec_port_binding *,
                                      bool removed,
                                      struct physical_ctx *,
                                      struct ovn_desired_flow_table *);
-- 
2.31.1

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

Reply via email to