There are going to be additional incremental nodes that wish to know if
vxlan mode is enabled. Instead of having to traverse the chassis in each
of those nodes, we can cache the vxlan status in the global config.

We can do the same with the max tunnel key based on the vxlan setting.

Signed-off-by: Mark Michelson <mmich...@redhat.com>
Acked-by: Dumitru Ceara <dce...@redhat.com>
---
* v4 -> v5:
  * Rebased.

* v3 -> v4:
  * Rebased.

* v2 -> v3:
  * Rebased, but no other changes made.

* v1 -> v2:
  * Fixed compilation error.
  * Fixed indentation of is_vxlan_mode declaration.
  * Added Dumitru's ack.
---

 northd/en-global-config.c | 50 ++++++++++++++++++++++++++-------------
 northd/en-global-config.h |  3 +++
 northd/en-northd.c        |  1 +
 northd/northd.c           | 21 +---------------
 northd/northd.h           |  5 +---
 5 files changed, 40 insertions(+), 40 deletions(-)

diff --git a/northd/en-global-config.c b/northd/en-global-config.c
index 98c2fd0cc..11513e31e 100644
--- a/northd/en-global-config.c
+++ b/northd/en-global-config.c
@@ -49,6 +49,8 @@ static bool check_nb_options_out_of_sync(
     const struct sampling_app_table *);
 static void update_sb_config_options_to_sbrec(struct ed_type_global_config *,
                                               const struct sbrec_sb_global *);
+static bool is_vxlan_mode(const struct smap *nb_options,
+                          const struct sbrec_chassis_table *);
 
 void *
 en_global_config_init(struct engine_node *node OVS_UNUSED,
@@ -131,11 +133,11 @@ en_global_config_run(struct engine_node *node , void 
*data)
             break;
         }
     }
-    uint32_t max_dp_key =
-        get_ovn_max_dp_key_local(is_vxlan_mode(&nb->options,
-                                               sbrec_chassis_table),
-                                 ic_vxlan_mode);
-    char *max_tunid = xasprintf("%d", max_dp_key);
+    config_data->vxlan_mode = is_vxlan_mode(&nb->options, sbrec_chassis_table);
+    config_data->max_dp_tunnel_id =
+        get_ovn_max_dp_key_local(config_data->vxlan_mode, ic_vxlan_mode);
+
+    char *max_tunid = xasprintf("%d", config_data->max_dp_tunnel_id);
     smap_replace(options, "max_tunid", max_tunid);
     free(max_tunid);
 
@@ -269,6 +271,11 @@ global_config_nb_global_handler(struct engine_node *node, 
void *data)
         return EN_UNHANDLED;
     }
 
+    if (config_out_of_sync(&nb->options, &config_data->nb_options,
+                           "vxlan_mode", false)) {
+        return false;
+    }
+
     if (check_nb_options_out_of_sync(nb, config_data, sampling_apps)) {
         config_data->tracked_data.nb_options_changed = true;
     }
@@ -390,8 +397,6 @@ global_config_nb_logical_switch_handler(struct engine_node 
*node,
         EN_OVSDB_GET(engine_get_input("NB_logical_switch", node));
     const struct nbrec_nb_global *nb = nbrec_nb_global_table_first(
                 EN_OVSDB_GET(engine_get_input("NB_nb_global", node)));
-    const struct sbrec_chassis_table *sbrec_chassis_table =
-        EN_OVSDB_GET(engine_get_input("SB_chassis", node));
     enum engine_input_handler_result result;
 
     bool ic_vxlan_mode = false;
@@ -402,11 +407,10 @@ global_config_nb_logical_switch_handler(struct 
engine_node *node,
             break;
         }
     }
-    uint32_t max_dp_key =
-        get_ovn_max_dp_key_local(is_vxlan_mode(&nb->options,
-                                               sbrec_chassis_table),
+    config_data->max_dp_tunnel_id =
+        get_ovn_max_dp_key_local(config_data->vxlan_mode,
                                  ic_vxlan_mode);
-    char *max_tunid = xasprintf("%d", max_dp_key);
+    char *max_tunid = xasprintf("%d", config_data->max_dp_tunnel_id);
     struct smap *options = &config_data->nb_options;
     const char *cur_max_tunid = smap_get(options, "max_tunid");
 
@@ -629,11 +633,6 @@ check_nb_options_out_of_sync(
         return true;
     }
 
-    if (config_out_of_sync(&nb->options, &config_data->nb_options,
-                           "vxlan_mode", false)) {
-        return true;
-    }
-
     if (config_out_of_sync(&nb->options, &config_data->nb_options,
                            "always_tunnel", false)) {
         return true;
@@ -695,3 +694,22 @@ chassis_features_changed(const struct chassis_features 
*present,
 
     return false;
 }
+
+static bool
+is_vxlan_mode(const struct smap *nb_options,
+              const struct sbrec_chassis_table *sbrec_chassis_table)
+{
+    if (!smap_get_bool(nb_options, "vxlan_mode", true)) {
+        return false;
+    }
+
+    const struct sbrec_chassis *chassis;
+    SBREC_CHASSIS_TABLE_FOR_EACH (chassis, sbrec_chassis_table) {
+        for (int i = 0; i < chassis->n_encaps; i++) {
+            if (!strcmp(chassis->encaps[i]->type, "vxlan")) {
+                return true;
+            }
+        }
+    }
+    return false;
+}
diff --git a/northd/en-global-config.h b/northd/en-global-config.h
index 08da8a5ab..55a1e420b 100644
--- a/northd/en-global-config.h
+++ b/northd/en-global-config.h
@@ -49,6 +49,9 @@ struct ed_type_global_config {
 
     bool ovn_internal_version_changed;
 
+    bool vxlan_mode;
+    uint32_t max_dp_tunnel_id;
+
     bool tracked;
     struct global_config_tracked_data tracked_data;
 };
diff --git a/northd/en-northd.c b/northd/en-northd.c
index 3359d8d0e..02a27aac2 100644
--- a/northd/en-northd.c
+++ b/northd/en-northd.c
@@ -116,6 +116,7 @@ northd_get_input_data(struct engine_node *node,
     input_data->svc_monitor_mac = global_config->svc_monitor_mac;
     input_data->svc_monitor_mac_ea = global_config->svc_monitor_mac_ea;
     input_data->features = &global_config->features;
+    input_data->vxlan_mode = global_config->vxlan_mode;
 }
 
 enum engine_node_state
diff --git a/northd/northd.c b/northd/northd.c
index 7b05147b4..1a89b5224 100644
--- a/northd/northd.c
+++ b/northd/northd.c
@@ -984,24 +984,6 @@ join_datapaths(const struct nbrec_logical_switch_table 
*nbrec_ls_table,
     }
 }
 
-bool
-is_vxlan_mode(const struct smap *nb_options,
-              const struct sbrec_chassis_table *sbrec_chassis_table)
-{
-    if (!smap_get_bool(nb_options, "vxlan_mode", true)) {
-        return false;
-    }
-
-    const struct sbrec_chassis *chassis;
-    SBREC_CHASSIS_TABLE_FOR_EACH (chassis, sbrec_chassis_table) {
-        for (int i = 0; i < chassis->n_encaps; i++) {
-            if (!strcmp(chassis->encaps[i]->type, "vxlan")) {
-                return true;
-            }
-        }
-    }
-    return false;
-}
 
 uint32_t
 get_ovn_max_dp_key_local(bool _vxlan_mode, bool _vxlan_ic_mode)
@@ -19326,8 +19308,7 @@ ovnnb_db_run(struct northd_input *input_data,
     use_common_zone = smap_get_bool(input_data->nb_options, "use_common_zone",
                                     false);
 
-    vxlan_mode = is_vxlan_mode(input_data->nb_options,
-                               input_data->sbrec_chassis_table);
+    vxlan_mode = input_data->vxlan_mode;
 
     build_datapaths(ovnsb_txn,
                     input_data->nbrec_logical_switch_table,
diff --git a/northd/northd.h b/northd/northd.h
index 5a698458f..d4feff63d 100644
--- a/northd/northd.h
+++ b/northd/northd.h
@@ -65,6 +65,7 @@ struct northd_input {
     const char *svc_monitor_mac;
     struct eth_addr svc_monitor_mac_ea;
     const struct chassis_features *features;
+    bool vxlan_mode;
 
     /* ACL ID inputs. */
     const struct acl_id_data *acl_id_data;
@@ -967,10 +968,6 @@ lr_has_multiple_gw_ports(const struct ovn_datapath *od)
     return vector_len(&od->l3dgw_ports) > 1 && !od->is_gw_router;
 }
 
-bool
-is_vxlan_mode(const struct smap *nb_options,
-              const struct sbrec_chassis_table *sbrec_chassis_table);
-
 uint32_t get_ovn_max_dp_key_local(bool _vxlan_mode, bool ic_mode);
 
 /* Returns true if the logical router port 'enabled' column is empty or
-- 
2.47.0

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to