Acked-by: Mark Michelson <[email protected]>

On 12/19/22 11:18, Adrian Moreno wrote:
Make physical (pflow) engine node also depend on
Flow_Sample_Collector_Set table and only enable flow sampling if the
right collector set exists.

Signed-off-by: Adrian Moreno <[email protected]>
---
  controller/ovn-controller.c | 104 ++++++++++++++++++++++++++----------
  1 file changed, 75 insertions(+), 29 deletions(-)

diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c
index 09f843541..b2af0298d 100644
--- a/controller/ovn-controller.c
+++ b/controller/ovn-controller.c
@@ -3127,6 +3127,64 @@ lflow_output_flow_sample_collector_set_handler(struct 
engine_node *node,
      return true;
  }
+static void
+pflow_output_get_debug(struct engine_node *node, struct physical_debug *debug)
+{
+    const struct ovsrec_open_vswitch_table *ovs_table =
+        EN_OVSDB_GET(engine_get_input("OVS_open_vswitch", node));
+    const struct ovsrec_bridge_table *bridge_table =
+        EN_OVSDB_GET(engine_get_input("OVS_bridge", node));
+    const struct sbrec_sb_global_table *sb_global_table =
+        EN_OVSDB_GET(engine_get_input("SB_sb_global", node));
+    const struct sbrec_sb_global *sb_global =
+        sbrec_sb_global_table_first(sb_global_table);
+
+    if (!debug) {
+        return;
+    }
+    debug->collector_set_id = 0;
+    debug->obs_domain_id = 0;
+
+    const struct ovsrec_open_vswitch *ovs_cfg =
+        ovsrec_open_vswitch_table_first(ovs_table);
+    if (!ovs_cfg) {
+        return;
+    }
+
+    const struct ovsrec_bridge *br_int;
+    br_int = get_bridge(bridge_table, br_int_name(ovs_cfg));
+    if (!br_int) {
+        return;
+    }
+
+    const uint32_t debug_collector_set =
+        smap_get_uint(&sb_global->options, "debug_drop_collector_set", 0);
+    if (!debug_collector_set) {
+        return;
+    }
+
+    struct ovsdb_idl_index *ovsrec_flow_sample_collector_set_by_id =
+        engine_ovsdb_node_get_index(
+                engine_get_input("OVS_flow_sample_collector_set", node), "id");
+
+    struct ovsrec_flow_sample_collector_set *s =
+        ovsrec_flow_sample_collector_set_index_init_row(
+        ovsrec_flow_sample_collector_set_by_id);
+
+    ovsrec_flow_sample_collector_set_index_set_id(s, debug_collector_set);
+    ovsrec_flow_sample_collector_set_index_set_bridge(s, br_int);
+    if (!ovsrec_flow_sample_collector_set_index_find(
+        ovsrec_flow_sample_collector_set_by_id, s)) {
+        ovsrec_flow_sample_collector_set_index_destroy_row(s);
+        return;
+    }
+    ovsrec_flow_sample_collector_set_index_destroy_row(s);
+
+    debug->collector_set_id = debug_collector_set;
+    debug->obs_domain_id = smap_get_uint(&sb_global->options,
+                                         "debug_drop_domain_id", 0);
+}
+
  static bool
  lflow_output_sb_mac_binding_handler(struct engine_node *node, void *data)
  {
@@ -3577,11 +3635,6 @@ static void init_physical_ctx(struct engine_node *node,
          chassis = chassis_lookup_by_name(sbrec_chassis_by_name, chassis_id);
      }
- const struct sbrec_sb_global_table *sb_global_table =
-        EN_OVSDB_GET(engine_get_input("SB_sb_global", node));
-    const struct sbrec_sb_global *sb_global =
-        sbrec_sb_global_table_first(sb_global_table);
-
      ovs_assert(br_int && chassis);
struct ed_type_ct_zones *ct_zones_data =
@@ -3603,13 +3656,8 @@ static void init_physical_ctx(struct engine_node *node,
      p_ctx->local_bindings = &rt_data->lbinding_data.bindings;
      p_ctx->patch_ofports = &non_vif_data->patch_ofports;
      p_ctx->chassis_tunnels = &non_vif_data->chassis_tunnels;
-    p_ctx->debug.collector_set_id = smap_get_uint(&sb_global->options,
-                                                  "debug_drop_collector_set",
-                                                  0);
- p_ctx->debug.obs_domain_id = smap_get_uint(&sb_global->options,
-                                               "debug_drop_domain_id",
-                                               0);
+    pflow_output_get_debug(node, &p_ctx->debug);
  }
static void *
@@ -3813,26 +3861,16 @@ pflow_output_activated_ports_handler(struct engine_node 
*node, void *data)
  }
static bool
-pflow_output_sb_sb_global_handler(struct engine_node *node, void *data)
+pflow_output_debug_handler(struct engine_node *node, void *data)
  {
-    const struct sbrec_sb_global_table *sb_global_table =
-        EN_OVSDB_GET(engine_get_input("SB_sb_global", node));
-    const struct sbrec_sb_global *sb_global =
-        sbrec_sb_global_table_first(sb_global_table);
-
      struct ed_type_pflow_output *pfo = data;
+    struct physical_debug debug;
+
+    pflow_output_get_debug(node, &debug);
- uint32_t collector_set_id = smap_get_uint(&sb_global->options,
-                                              "debug_drop_collector_set",
-                                              0);
-    uint32_t obs_domain_id = smap_get_uint(&sb_global->options,
-                                           "debug_drop_domain_id",
-                                           0);
-
-    if (pfo->debug.collector_set_id != collector_set_id ||
-        pfo->debug.obs_domain_id != obs_domain_id) {
-        pfo->debug.collector_set_id = collector_set_id;
-        pfo->debug.obs_domain_id = obs_domain_id;
+    if (pfo->debug.collector_set_id != debug.collector_set_id ||
+        pfo->debug.obs_domain_id != debug.obs_domain_id) {
+        pfo->debug = debug;
          return false;
      }
      engine_set_node_state(node, EN_UPDATED);
@@ -3989,6 +4027,10 @@ main(int argc, char *argv[])
      struct ovsdb_idl_index *ovsrec_port_by_interfaces
          = ovsdb_idl_index_create1(ovs_idl_loop.idl,
                                    &ovsrec_port_col_interfaces);
+    struct ovsdb_idl_index *ovsrec_flow_sample_collector_set_by_id
+        = ovsdb_idl_index_create2(ovs_idl_loop.idl,
+                                  &ovsrec_flow_sample_collector_set_col_bridge,
+                                  &ovsrec_flow_sample_collector_set_col_id);
ovsdb_idl_get_initial_snapshot(ovs_idl_loop.idl); @@ -4189,8 +4231,10 @@ main(int argc, char *argv[])
      engine_add_input(&en_pflow_output, &en_mff_ovn_geneve, NULL);
      engine_add_input(&en_pflow_output, &en_ovs_open_vswitch, NULL);
      engine_add_input(&en_pflow_output, &en_ovs_bridge, NULL);
+    engine_add_input(&en_pflow_output, &en_ovs_flow_sample_collector_set,
+                     pflow_output_debug_handler);
      engine_add_input(&en_pflow_output, &en_sb_sb_global,
-                     pflow_output_sb_sb_global_handler);
+                     pflow_output_debug_handler);
engine_add_input(&en_northd_options, &en_sb_sb_global,
                       en_northd_options_sb_sb_global_handler);
@@ -4327,6 +4371,8 @@ main(int argc, char *argv[])
                                  sbrec_static_mac_binding_by_datapath);
      engine_ovsdb_node_add_index(&en_sb_chassis_template_var, "chassis",
                                  sbrec_chassis_template_var_index_by_chassis);
+    engine_ovsdb_node_add_index(&en_ovs_flow_sample_collector_set, "id",
+                                ovsrec_flow_sample_collector_set_by_id);
struct ed_type_lflow_output *lflow_output_data =
          engine_get_internal_data(&en_lflow_output);

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

Reply via email to