The physical output node needs to allocate group IDs for ECMP
FDB select groups, which must share the same ID space as load
balancer groups. Move the group table out of the engine so it
can be shared by both output nodes.

Assisted-by: Claude Opus 4.6, Claude Code
Signed-off-by: Ales Musil <[email protected]>
---
 controller/ovn-controller.c | 23 ++++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c
index c46530f90..de6975f98 100644
--- a/controller/ovn-controller.c
+++ b/controller/ovn-controller.c
@@ -3874,8 +3874,8 @@ struct lflow_output_persistent_data {
 struct ed_type_lflow_output {
     /* Logical flow table */
     struct ovn_desired_flow_table flow_table;
-    /* group ids for load balancing */
-    struct ovn_extend_table group_table;
+    /* Group IDs for load balancing and ECMP, owned outside the engine. */
+    struct ovn_extend_table *group_table;
     /* meter ids for QoS */
     struct ovn_extend_table meter_table;
     /* lflow <-> resource cross reference */
@@ -4051,7 +4051,7 @@ init_lflow_ctx(struct engine_node *node,
     l_ctx_in->lbinding_lports = &rt_data->lbinding_data.bindings;
 
     l_ctx_out->flow_table = &fo->flow_table;
-    l_ctx_out->group_table = &fo->group_table;
+    l_ctx_out->group_table = fo->group_table;
     l_ctx_out->meter_table = &fo->meter_table;
     l_ctx_out->lflow_deps_mgr = &fo->lflow_deps_mgr;
     l_ctx_out->conj_ids = &fo->conj_ids;
@@ -4065,7 +4065,6 @@ en_lflow_output_init(struct engine_node *node OVS_UNUSED,
 {
     struct ed_type_lflow_output *data = xzalloc(sizeof *data);
     ovn_desired_flow_table_init(&data->flow_table);
-    ovn_extend_table_init(&data->group_table, "group-table", 0);
     ovn_extend_table_init(&data->meter_table, "meter-table", 0);
     objdep_mgr_init(&data->lflow_deps_mgr);
     lflow_conj_ids_init(&data->conj_ids);
@@ -4088,7 +4087,6 @@ en_lflow_output_cleanup(void *data)
 {
     struct ed_type_lflow_output *flow_output_data = data;
     ovn_desired_flow_table_destroy(&flow_output_data->flow_table);
-    ovn_extend_table_destroy(&flow_output_data->group_table);
     ovn_extend_table_destroy(&flow_output_data->meter_table);
     objdep_mgr_destroy(&flow_output_data->lflow_deps_mgr);
     lflow_conj_ids_destroy(&flow_output_data->conj_ids);
@@ -4136,7 +4134,7 @@ en_lflow_output_run(struct engine_node *node, void *data)
 
     struct ed_type_lflow_output *fo = data;
     struct ovn_desired_flow_table *lflow_table = &fo->flow_table;
-    struct ovn_extend_table *group_table = &fo->group_table;
+    struct ovn_extend_table *group_table = fo->group_table;
     struct ovn_extend_table *meter_table = &fo->meter_table;
     struct objdep_mgr *lflow_deps_mgr = &fo->lflow_deps_mgr;
 
@@ -7646,12 +7644,14 @@ main(int argc, char *argv[])
     struct ed_type_evpn_arp *earp_data =
         engine_get_internal_data(&en_evpn_arp);
 
-    ofctrl_init(&lflow_output_data->group_table,
-                &lflow_output_data->meter_table);
+    struct ovn_extend_table group_table;
+    ovn_extend_table_init(&group_table, "group-table", 0);
+    lflow_output_data->group_table = &group_table;
+
+    ofctrl_init(&group_table, &lflow_output_data->meter_table);
 
     unixctl_command_register("group-table-list", "", 0, 0,
-                             extend_table_list,
-                             &lflow_output_data->group_table);
+                             extend_table_list, &group_table);
 
     unixctl_command_register("meter-table-list", "", 0, 0,
                              extend_table_list,
@@ -7928,7 +7928,7 @@ main(int argc, char *argv[])
                 struct ed_type_lflow_output *lflow_out_data =
                     engine_get_internal_data(&en_lflow_output);
 
-                ovn_extend_table_reinit(&lflow_out_data->group_table,
+                ovn_extend_table_reinit(&group_table,
                                         ovs_feature_max_select_groups_get());
                 ovn_extend_table_reinit(&lflow_out_data->meter_table,
                                         ovs_feature_max_meters_get());
@@ -8439,6 +8439,7 @@ loop_done:
 
     engine_set_context(NULL);
     engine_cleanup();
+    ovn_extend_table_destroy(&group_table);
 
     free(ovn_version);
     lflow_destroy();
-- 
2.53.0

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

Reply via email to