@@ -351,6 +351,7 @@ chassis_build_other_config(const struct ovs_chassis_cfg *ovs_cfg,
ovs_cfg->is_interconn ? "true" : "false");
smap_replace(config, OVN_FEATURE_PORT_UP_NOTIF, "true");
smap_replace(config, OVN_FEATURE_CT_NO_MASKED_LABEL, "true");
+ smap_replace(config, OVN_FEATURE_MAC_BINDING_TIMESTAMP, "true");
}
/*
@@ -462,6 +463,12 @@ chassis_other_config_changed(const struct ovs_chassis_cfg *ovs_cfg,
return true;
}
+ if (!smap_get_bool(&chassis_rec->other_config,
+ OVN_FEATURE_MAC_BINDING_TIMESTAMP,
+ false)) {
+ return true;
+ }
+
return false;
}
@@ -23,6 +23,7 @@
/* ovn-controller supported feature names. */
#define OVN_FEATURE_PORT_UP_NOTIF "port-up-notif"
#define OVN_FEATURE_CT_NO_MASKED_LABEL "ct-no-masked-label"
+#define OVN_FEATURE_MAC_BINDING_TIMESTAMP "mac-binding-timestamp"
/* OVS datapath supported features. Based on availability OVN might generate
* different types of openflows.
@@ -90,8 +90,10 @@ void
en_mac_binding_aging_run(struct engine_node *node, void *data OVS_UNUSED)
{
const struct engine_context *eng_ctx = engine_get_context();
+ struct northd_data *northd_data = engine_get_input_data("northd", node);
- if (!eng_ctx->ovnsb_idl_txn) {
+ if (!eng_ctx->ovnsb_idl_txn ||
+ !northd_data->features.mac_binding_timestamp) {
return;
}
@@ -99,7 +101,6 @@ en_mac_binding_aging_run(struct engine_node *node, void *data OVS_UNUSED)
int64_t now = time_wall_msec();
uint32_t removal_limit = get_removal_limit(node);
uint32_t removed_n = 0;
- struct northd_data *northd_data = engine_get_input_data("northd", node);
struct mac_binding_waker *waker =
engine_get_input_data("mac_binding_aging_waker", node);
struct ovsdb_idl_index *sbrec_mac_binding_by_datapath =
@@ -407,14 +407,23 @@ build_chassis_features(const struct northd_input *input_data,
const struct sbrec_chassis *chassis;
SBREC_CHASSIS_TABLE_FOR_EACH (chassis, input_data->sbrec_chassis) {
- if (!smap_get_bool(&chassis->other_config,
- OVN_FEATURE_CT_NO_MASKED_LABEL,
- false)) {
+ bool ct_no_masked_label =
+ smap_get_bool(&chassis->other_config,
+ OVN_FEATURE_CT_NO_MASKED_LABEL,
+ false);
+ if (!ct_no_masked_label && chassis_features->ct_no_masked_label) {
chassis_features->ct_no_masked_label = false;
- return;
+ }
+
+ bool mac_binding_timestamp =
+ smap_get_bool(&chassis->other_config,
+ OVN_FEATURE_MAC_BINDING_TIMESTAMP,
+ false);
+ if (!mac_binding_timestamp &&
+ chassis_features->mac_binding_timestamp) {
+ chassis_features->mac_binding_timestamp = false;
}
}
- chassis_features->ct_no_masked_label = true;
}
struct ovn_chassis_qdisc_queues {
@@ -15324,7 +15333,10 @@ northd_init(struct northd_data *data)
hmap_init(&data->lb_groups);
hmap_init(&data->bfd_connections);
ovs_list_init(&data->lr_list);
- memset(&data->features, 0, sizeof data->features);
+ data->features = (struct chassis_features) {
+ .ct_no_masked_label = true,
+ .mac_binding_timestamp = true,
+ };
data->ovn_internal_version_changed = false;
}
@@ -66,6 +66,7 @@ struct northd_input {
struct chassis_features {
bool ct_no_masked_label;
+ bool mac_binding_timestamp;
};
struct northd_data {