In order to keep backward compatibility with northd we need to check if MAC binding table actually has the timestamp column.
Reported-at: https://bugzilla.redhat.com/2151066 Signed-off-by: Ales Musil <[email protected]> --- v2: Address comments from Dumitru. --- controller/pinctrl.c | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/controller/pinctrl.c b/controller/pinctrl.c index f44775c7e..15a3ff31d 100644 --- a/controller/pinctrl.c +++ b/controller/pinctrl.c @@ -173,6 +173,7 @@ struct pinctrl { pthread_t pinctrl_thread; /* Latch to destroy the 'pinctrl_thread' */ struct latch pinctrl_thread_exit; + bool mac_binding_has_timestamp_column; }; static struct pinctrl pinctrl; @@ -544,6 +545,7 @@ pinctrl_init(void) bfd_monitor_init(); init_fdb_entries(); pinctrl.br_int_name = NULL; + pinctrl.mac_binding_has_timestamp_column = false; pinctrl_handler_seq = seq_create(); pinctrl_main_seq = seq_create(); @@ -3532,6 +3534,26 @@ pinctrl_set_br_int_name_(char *br_int_name) } } +static void +pinctrl_set_sb_mac_binding_has_timestamp_column(struct ovsdb_idl_txn *txn) + OVS_REQUIRES(pinctrl_mutex) +{ + if (!txn) { + return; + } + + struct ovsdb_idl *idl = ovsdb_idl_txn_get_idl(txn); + bool current = sbrec_server_has_mac_binding_table_col_timestamp(idl); + + if (current != pinctrl.mac_binding_has_timestamp_column) { + pinctrl.mac_binding_has_timestamp_column = current; + + /* Notify pinctrl_handler that mac binding timestamp column + * availability has changed. */ + notify_pinctrl_handler(); + } +} + void pinctrl_set_br_int_name(char *br_int_name) { @@ -3563,6 +3585,7 @@ pinctrl_run(struct ovsdb_idl_txn *ovnsb_idl_txn, const struct shash *local_active_ports_ras) { ovs_mutex_lock(&pinctrl_mutex); + pinctrl_set_sb_mac_binding_has_timestamp_column(ovnsb_idl_txn); pinctrl_set_br_int_name_(br_int->name); run_put_mac_bindings(ovnsb_idl_txn, sbrec_datapath_binding_by_key, sbrec_port_binding_by_key, @@ -4245,12 +4268,17 @@ mac_binding_add_to_sb(struct ovsdb_idl_txn *ovnsb_idl_txn, b = sbrec_mac_binding_insert(ovnsb_idl_txn); sbrec_mac_binding_set_logical_port(b, logical_port); sbrec_mac_binding_set_ip(b, ip); - sbrec_mac_binding_set_mac(b, mac_string); sbrec_mac_binding_set_datapath(b, dp); - sbrec_mac_binding_set_timestamp(b, time_wall_msec()); - } else if (strcmp(b->mac, mac_string)) { + } + + if (strcmp(b->mac, mac_string)) { sbrec_mac_binding_set_mac(b, mac_string); - sbrec_mac_binding_set_timestamp(b, time_wall_msec()); + + /* For backward compatibility check if timestamp column is available + * in SB DB. */ + if (pinctrl.mac_binding_has_timestamp_column) { + sbrec_mac_binding_set_timestamp(b, time_wall_msec()); + } } } -- 2.38.1 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
