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>
---
* 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 f08c61296..876afd28e 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 false;
     }
 
+    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;
     }
@@ -391,8 +398,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));
 
     bool ic_vxlan_mode = false;
     const struct nbrec_logical_switch *nbs;
@@ -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 1ec02cac5..c37ddc2d9 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 7cea8863c..ea946696c 100644
--- a/northd/en-northd.c
+++ b/northd/en-northd.c
@@ -110,6 +110,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;
 }
 
 void
diff --git a/northd/northd.c b/northd/northd.c
index 1f9340e55..feb50fba6 100644
--- a/northd/northd.c
+++ b/northd/northd.c
@@ -990,24 +990,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)
@@ -19011,8 +18993,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 388bac6df..0c53f89fb 100644
--- a/northd/northd.h
+++ b/northd/northd.h
@@ -63,6 +63,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;
@@ -966,10 +967,6 @@ lr_has_multiple_gw_ports(const struct ovn_datapath *od)
     return od->n_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