The I-P engine node functions get inputs from the node's input data, and then call the real implementation functions (implemented in northd.c) with a xxx_input wrapper variable, and then in the called functions, it passes the variable further down to other functions, regardless of what fields are really used by those functions. This is fine when there is no real I-P implementation (i.e. we are always recompute), but to add incremental processing, we need to figure out which functions depend on which part of the input data, so that we can keep track of the logic that is needed to handle a specific change in the input data. Ideally, for incremental processing to work, we should be able to draw a dependency graph based on function prototypes.
To fulfill this purpose, this patch refactors related functions to expose real inputs through function arguments. It made some of the function prototypes lengthy (in fact, not too much, because it turned out most of the functions only require very few members of the wrapper input data structure), but the dependencies are much more clear. Signed-off-by: Han Zhou <[email protected]> --- northd/en-lflow.c | 7 +- northd/en-northd.c | 6 +- northd/northd.c | 447 +++++++++++++++++++++++++-------------------- northd/northd.h | 15 +- 4 files changed, 267 insertions(+), 208 deletions(-) diff --git a/northd/en-lflow.c b/northd/en-lflow.c index 995c7cc10e33..c1951c8c8c20 100644 --- a/northd/en-lflow.c +++ b/northd/en-lflow.c @@ -67,11 +67,14 @@ void en_lflow_run(struct engine_node *node, void *data OVS_UNUSED) northd_data->ovn_internal_version_changed; stopwatch_start(BUILD_LFLOWS_STOPWATCH_NAME, time_msec()); - build_bfd_table(&lflow_input, eng_ctx->ovnsb_idl_txn, + build_bfd_table(eng_ctx->ovnsb_idl_txn, + lflow_input.nbrec_bfd_table, + lflow_input.sbrec_bfd_table, &northd_data->bfd_connections, &northd_data->lr_ports); build_lflows(&lflow_input, eng_ctx->ovnsb_idl_txn); - bfd_cleanup_connections(&lflow_input, &northd_data->bfd_connections); + bfd_cleanup_connections(lflow_input.nbrec_bfd_table, + &northd_data->bfd_connections); stopwatch_stop(BUILD_LFLOWS_STOPWATCH_NAME, time_msec()); engine_set_node_state(node, EN_UPDATED); diff --git a/northd/en-northd.c b/northd/en-northd.c index 09fe8976af0d..38de18cdf0ce 100644 --- a/northd/en-northd.c +++ b/northd/en-northd.c @@ -62,9 +62,9 @@ void en_northd_run(struct engine_node *node, void *data) input_data.nbrec_nb_global_table = EN_OVSDB_GET(engine_get_input("NB_nb_global", node)); - input_data.nbrec_logical_switch = + input_data.nbrec_logical_switch_table = EN_OVSDB_GET(engine_get_input("NB_logical_switch", node)); - input_data.nbrec_logical_router = + input_data.nbrec_logical_router_table = EN_OVSDB_GET(engine_get_input("NB_logical_router", node)); input_data.nbrec_load_balancer_table = EN_OVSDB_GET(engine_get_input("NB_load_balancer", node)); @@ -93,7 +93,7 @@ void en_northd_run(struct engine_node *node, void *data) EN_OVSDB_GET(engine_get_input("SB_mac_binding", node)); input_data.sbrec_ha_chassis_group_table = EN_OVSDB_GET(engine_get_input("SB_ha_chassis_group", node)); - input_data.sbrec_chassis = + input_data.sbrec_chassis_table = EN_OVSDB_GET(engine_get_input("SB_chassis", node)); input_data.sbrec_fdb_table = EN_OVSDB_GET(engine_get_input("SB_fdb", node)); diff --git a/northd/northd.c b/northd/northd.c index baee1786469a..b62ae5dbcaa5 100644 --- a/northd/northd.c +++ b/northd/northd.c @@ -426,12 +426,12 @@ ovn_stage_to_datapath_type(enum ovn_stage stage) } static void -build_chassis_features(const struct northd_input *input_data, +build_chassis_features(const struct sbrec_chassis_table *sbrec_chassis_table, struct chassis_features *chassis_features) { const struct sbrec_chassis *chassis; - SBREC_CHASSIS_TABLE_FOR_EACH (chassis, input_data->sbrec_chassis) { + SBREC_CHASSIS_TABLE_FOR_EACH (chassis, sbrec_chassis_table) { /* Only consider local AZ chassis. Remote ones don't install * flows generated by the local northd. */ @@ -1207,7 +1207,9 @@ ovn_datapath_update_external_ids(struct ovn_datapath *od) } static void -join_datapaths(struct northd_input *input_data, +join_datapaths(const struct nbrec_logical_switch_table *nbrec_ls_table, + const struct nbrec_logical_router_table *nbrec_lr_table, + const struct sbrec_datapath_binding_table *sbrec_dp_table, struct ovsdb_idl_txn *ovnsb_txn, struct hmap *datapaths, struct ovs_list *sb_only, struct ovs_list *nb_only, struct ovs_list *both, @@ -1218,8 +1220,7 @@ join_datapaths(struct northd_input *input_data, ovs_list_init(both); const struct sbrec_datapath_binding *sb; - SBREC_DATAPATH_BINDING_TABLE_FOR_EACH_SAFE (sb, - input_data->sbrec_datapath_binding_table) { + SBREC_DATAPATH_BINDING_TABLE_FOR_EACH_SAFE (sb, sbrec_dp_table) { struct uuid key; if (!smap_get_uuid(&sb->external_ids, "logical-switch", &key) && !smap_get_uuid(&sb->external_ids, "logical-router", &key)) { @@ -1249,8 +1250,7 @@ join_datapaths(struct northd_input *input_data, } const struct nbrec_logical_switch *nbs; - NBREC_LOGICAL_SWITCH_TABLE_FOR_EACH (nbs, - input_data->nbrec_logical_switch) { + NBREC_LOGICAL_SWITCH_TABLE_FOR_EACH (nbs, nbrec_ls_table) { struct ovn_datapath *od = ovn_datapath_find(datapaths, &nbs->header_.uuid); if (od) { @@ -1270,8 +1270,7 @@ join_datapaths(struct northd_input *input_data, } const struct nbrec_logical_router *nbr; - NBREC_LOGICAL_ROUTER_TABLE_FOR_EACH (nbr, - input_data->nbrec_logical_router) { + NBREC_LOGICAL_ROUTER_TABLE_FOR_EACH (nbr, nbrec_lr_table) { if (!lrouter_is_enabled(nbr)) { continue; } @@ -1309,10 +1308,10 @@ join_datapaths(struct northd_input *input_data, } static bool -is_vxlan_mode(struct northd_input *input_data) +is_vxlan_mode(const struct sbrec_chassis_table *sbrec_chassis_table) { const struct sbrec_chassis *chassis; - SBREC_CHASSIS_TABLE_FOR_EACH (chassis, input_data->sbrec_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; @@ -1323,9 +1322,9 @@ is_vxlan_mode(struct northd_input *input_data) } static uint32_t -get_ovn_max_dp_key_local(struct northd_input *input_data) +get_ovn_max_dp_key_local(const struct sbrec_chassis_table *sbrec_chassis_table) { - if (is_vxlan_mode(input_data)) { + if (is_vxlan_mode(sbrec_chassis_table)) { /* OVN_MAX_DP_GLOBAL_NUM doesn't apply for vxlan mode. */ return OVN_MAX_DP_VXLAN_KEY; } @@ -1333,14 +1332,14 @@ get_ovn_max_dp_key_local(struct northd_input *input_data) } static void -ovn_datapath_allocate_key(struct northd_input *input_data, +ovn_datapath_allocate_key(const struct sbrec_chassis_table *sbrec_ch_table, struct hmap *datapaths, struct hmap *dp_tnlids, struct ovn_datapath *od, uint32_t *hint) { if (!od->tunnel_key) { od->tunnel_key = ovn_allocate_tnlid(dp_tnlids, "datapath", OVN_MIN_DP_KEY_LOCAL, - get_ovn_max_dp_key_local(input_data), + get_ovn_max_dp_key_local(sbrec_ch_table), hint); if (!od->tunnel_key) { if (od->sb) { @@ -1353,9 +1352,9 @@ ovn_datapath_allocate_key(struct northd_input *input_data, } static void -ovn_datapath_assign_requested_tnl_id(struct northd_input *input_data, - struct hmap *dp_tnlids, - struct ovn_datapath *od) +ovn_datapath_assign_requested_tnl_id( + const struct sbrec_chassis_table *sbrec_chassis_table, + struct hmap *dp_tnlids, struct ovn_datapath *od) { const struct smap *other_config = (od->nbs ? &od->nbs->other_config @@ -1363,7 +1362,7 @@ ovn_datapath_assign_requested_tnl_id(struct northd_input *input_data, uint32_t tunnel_key = smap_get_int(other_config, "requested-tnl-key", 0); if (tunnel_key) { const char *interconn_ts = smap_get(other_config, "interconn-ts"); - if (!interconn_ts && is_vxlan_mode(input_data) && + if (!interconn_ts && is_vxlan_mode(sbrec_chassis_table) && tunnel_key >= 1 << 12) { static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1); VLOG_WARN_RL(&rl, "Tunnel key %"PRIu32" for datapath %s is " @@ -1399,8 +1398,11 @@ static size_t n_lr_datapaths = 0; * Initializes 'datapaths' to contain a "struct ovn_datapath" for every logical * switch and router. */ static void -build_datapaths(struct northd_input *input_data, - struct ovsdb_idl_txn *ovnsb_txn, +build_datapaths(struct ovsdb_idl_txn *ovnsb_txn, + const struct nbrec_logical_switch_table *nbrec_ls_table, + const struct nbrec_logical_router_table *nbrec_lr_table, + const struct sbrec_datapath_binding_table *sbrec_dp_table, + const struct sbrec_chassis_table *sbrec_chassis_table, struct hmap *ls_datapaths, struct hmap *lr_datapaths, struct ovs_list *lr_list) @@ -1408,18 +1410,19 @@ build_datapaths(struct northd_input *input_data, struct ovs_list sb_only, nb_only, both; struct hmap *datapaths = ls_datapaths; - join_datapaths(input_data, ovnsb_txn, + join_datapaths(nbrec_ls_table, nbrec_lr_table, sbrec_dp_table, ovnsb_txn, datapaths, &sb_only, &nb_only, &both, lr_list); /* Assign explicitly requested tunnel ids first. */ struct hmap dp_tnlids = HMAP_INITIALIZER(&dp_tnlids); struct ovn_datapath *od; LIST_FOR_EACH (od, list, &both) { - ovn_datapath_assign_requested_tnl_id(input_data, &dp_tnlids, od); + ovn_datapath_assign_requested_tnl_id(sbrec_chassis_table, &dp_tnlids, + od); } LIST_FOR_EACH (od, list, &nb_only) { - ovn_datapath_assign_requested_tnl_id(input_data, &dp_tnlids, od); - } + ovn_datapath_assign_requested_tnl_id(sbrec_chassis_table, &dp_tnlids, + od); } /* Keep nonconflicting tunnel IDs that are already assigned. */ LIST_FOR_EACH (od, list, &both) { @@ -1431,11 +1434,11 @@ build_datapaths(struct northd_input *input_data, /* Assign new tunnel ids where needed. */ uint32_t hint = 0; LIST_FOR_EACH_SAFE (od, list, &both) { - ovn_datapath_allocate_key(input_data, + ovn_datapath_allocate_key(sbrec_chassis_table, datapaths, &dp_tnlids, od, &hint); } LIST_FOR_EACH_SAFE (od, list, &nb_only) { - ovn_datapath_allocate_key(input_data, + ovn_datapath_allocate_key(sbrec_chassis_table, datapaths, &dp_tnlids, od, &hint); } @@ -2473,7 +2476,7 @@ tag_alloc_create_new_tag(struct hmap *tag_alloc_table, static void -join_logical_ports(struct northd_input *input_data, +join_logical_ports(const struct sbrec_port_binding_table *sbrec_pb_table, struct hmap *ls_datapaths, struct hmap *lr_datapaths, struct hmap *ports, struct hmap *chassis_qdisc_queues, struct hmap *tag_alloc_table, struct ovs_list *sb_only, @@ -2484,8 +2487,7 @@ join_logical_ports(struct northd_input *input_data, ovs_list_init(both); const struct sbrec_port_binding *sb; - SBREC_PORT_BINDING_TABLE_FOR_EACH (sb, - input_data->sbrec_port_binding_table) { + SBREC_PORT_BINDING_TABLE_FOR_EACH (sb, sbrec_pb_table) { struct ovn_port *op = ovn_port_create(ports, sb->logical_port, NULL, NULL, sb); ovs_list_push_back(sb_only, &op->list); @@ -3088,16 +3090,17 @@ chassis_group_list_changed( } static void -sync_ha_chassis_group_for_sbpb(struct northd_input *input_data, - struct ovsdb_idl_txn *ovnsb_txn, - const struct nbrec_ha_chassis_group *nb_ha_grp, - struct ovsdb_idl_index *sbrec_chassis_by_name, - const struct sbrec_port_binding *pb) +sync_ha_chassis_group_for_sbpb( + struct ovsdb_idl_txn *ovnsb_txn, + struct ovsdb_idl_index *sbrec_chassis_by_name, + struct ovsdb_idl_index *sbrec_ha_chassis_grp_by_name, + const struct nbrec_ha_chassis_group *nb_ha_grp, + const struct sbrec_port_binding *pb) { bool new_sb_chassis_group = false; const struct sbrec_ha_chassis_group *sb_ha_grp = ha_chassis_group_lookup_by_name( - input_data->sbrec_ha_chassis_grp_by_name, nb_ha_grp->name); + sbrec_ha_chassis_grp_by_name, nb_ha_grp->name); if (!sb_ha_grp) { sb_ha_grp = sbrec_ha_chassis_group_insert(ovnsb_txn); @@ -3142,9 +3145,9 @@ sync_ha_chassis_group_for_sbpb(struct northd_input *input_data, */ static void copy_gw_chassis_from_nbrp_to_sbpb( - struct northd_input *input_data, struct ovsdb_idl_txn *ovnsb_txn, struct ovsdb_idl_index *sbrec_chassis_by_name, + struct ovsdb_idl_index *sbrec_ha_chassis_grp_by_name, const struct nbrec_logical_router_port *lrp, const struct sbrec_port_binding *port_binding) { @@ -3153,7 +3156,7 @@ copy_gw_chassis_from_nbrp_to_sbpb( * for the distributed gateway router port. */ const struct sbrec_ha_chassis_group *sb_ha_chassis_group = ha_chassis_group_lookup_by_name( - input_data->sbrec_ha_chassis_grp_by_name, lrp->name); + sbrec_ha_chassis_grp_by_name, lrp->name); if (!sb_ha_chassis_group) { sb_ha_chassis_group = sbrec_ha_chassis_group_insert(ovnsb_txn); sbrec_ha_chassis_group_set_name(sb_ha_chassis_group, lrp->name); @@ -3317,13 +3320,14 @@ check_and_do_sb_mirror_deletion(const struct ovn_port *op) } static void -check_and_do_sb_mirror_addition(struct northd_input *input_data, - const struct ovn_port *op) +check_and_do_sb_mirror_addition( + const struct sbrec_mirror_table *sbrec_mirror_table, + const struct ovn_port *op) { for (size_t i = 0; i < op->nbsp->n_mirror_rules; i++) { const struct sbrec_mirror *sb_mirror; SBREC_MIRROR_TABLE_FOR_EACH (sb_mirror, - input_data->sbrec_mirror_table) { + sbrec_mirror_table) { if (!strcmp(sb_mirror->name, op->nbsp->mirror_rules[i]->name)) { /* Add the value to SB */ @@ -3335,11 +3339,12 @@ check_and_do_sb_mirror_addition(struct northd_input *input_data, } static void -sbrec_port_binding_update_mirror_rules(struct northd_input *input_data, - const struct ovn_port *op) +sbrec_port_binding_update_mirror_rules( + const struct sbrec_mirror_table *sbrec_mirror_table, + const struct ovn_port *op) { check_and_do_sb_mirror_deletion(op); - check_and_do_sb_mirror_addition(input_data, op); + check_and_do_sb_mirror_addition(sbrec_mirror_table, op); } /* Return true if given ovn_port has peer and this peer's ovn_datapath @@ -3351,10 +3356,11 @@ l3dgw_port_has_associated_vtep_lports(const struct ovn_port *op) } static void -ovn_port_update_sbrec(struct northd_input *input_data, - struct ovsdb_idl_txn *ovnsb_txn, +ovn_port_update_sbrec(struct ovsdb_idl_txn *ovnsb_txn, struct ovsdb_idl_index *sbrec_chassis_by_name, struct ovsdb_idl_index *sbrec_chassis_by_hostname, + struct ovsdb_idl_index *sbrec_ha_chassis_grp_by_name, + const struct sbrec_mirror_table *sbrec_mirror_table, const struct ovn_port *op, struct hmap *chassis_qdisc_queues, struct sset *active_ha_chassis_grps) @@ -3388,9 +3394,11 @@ ovn_port_update_sbrec(struct northd_input *input_data, } /* HA Chassis group is set. Ignore 'gateway_chassis'. */ - sync_ha_chassis_group_for_sbpb(input_data, ovnsb_txn, + sync_ha_chassis_group_for_sbpb(ovnsb_txn, + sbrec_chassis_by_name, + sbrec_ha_chassis_grp_by_name, op->nbrp->ha_chassis_group, - sbrec_chassis_by_name, op->sb); + op->sb); sset_add(active_ha_chassis_grps, op->nbrp->ha_chassis_group->name); } else if (op->nbrp->n_gateway_chassis) { @@ -3399,10 +3407,9 @@ ovn_port_update_sbrec(struct northd_input *input_data, * associated with the lrp. */ if (sbpb_gw_chassis_needs_update(op->sb, op->nbrp, sbrec_chassis_by_name)) { - copy_gw_chassis_from_nbrp_to_sbpb(input_data, - ovnsb_txn, - sbrec_chassis_by_name, - op->nbrp, op->sb); + copy_gw_chassis_from_nbrp_to_sbpb( + ovnsb_txn, sbrec_chassis_by_name, + sbrec_ha_chassis_grp_by_name, op->nbrp, op->sb); } sset_add(active_ha_chassis_grps, op->nbrp->name); @@ -3536,9 +3543,10 @@ ovn_port_update_sbrec(struct northd_input *input_data, if (!strcmp(op->nbsp->type, "external")) { if (op->nbsp->ha_chassis_group) { sync_ha_chassis_group_for_sbpb( - input_data, - ovnsb_txn, op->nbsp->ha_chassis_group, - sbrec_chassis_by_name, op->sb); + ovnsb_txn, sbrec_chassis_by_name, + sbrec_ha_chassis_grp_by_name, + op->nbsp->ha_chassis_group, + op->sb); sset_add(active_ha_chassis_grps, op->nbsp->ha_chassis_group->name); } else { @@ -3718,7 +3726,7 @@ ovn_port_update_sbrec(struct northd_input *input_data, sbrec_port_binding_set_mirror_rules(op->sb, NULL, 0); } else { /* Check if SB DB update needed */ - sbrec_port_binding_update_mirror_rules(input_data, op); + sbrec_port_binding_update_mirror_rules(sbrec_mirror_table, op); } } @@ -3738,13 +3746,12 @@ ovn_port_update_sbrec(struct northd_input *input_data, /* Remove mac_binding entries that refer to logical_ports which are * deleted. */ static void -cleanup_mac_bindings(struct northd_input *input_data, - struct hmap *lr_datapaths, - struct hmap *lr_ports) +cleanup_mac_bindings( + const struct sbrec_mac_binding_table *sbrec_mac_binding_table, + struct hmap *lr_datapaths, struct hmap *lr_ports) { const struct sbrec_mac_binding *b; - SBREC_MAC_BINDING_TABLE_FOR_EACH_SAFE (b, - input_data->sbrec_mac_binding_table) { + SBREC_MAC_BINDING_TABLE_FOR_EACH_SAFE (b, sbrec_mac_binding_table) { const struct ovn_datapath *od = ovn_datapath_from_sbrec(NULL, lr_datapaths, b->datapath); @@ -3756,12 +3763,13 @@ cleanup_mac_bindings(struct northd_input *input_data, } static void -cleanup_sb_ha_chassis_groups(struct northd_input *input_data, - struct sset *active_ha_chassis_groups) +cleanup_sb_ha_chassis_groups( + const struct sbrec_ha_chassis_group_table *sbrec_ha_chassis_group_table, + struct sset *active_ha_chassis_groups) { const struct sbrec_ha_chassis_group *b; SBREC_HA_CHASSIS_GROUP_TABLE_FOR_EACH_SAFE (b, - input_data->sbrec_ha_chassis_group_table) { + sbrec_ha_chassis_group_table) { if (!sset_contains(active_ha_chassis_groups, b->name)) { sbrec_ha_chassis_group_delete(b); } @@ -3769,12 +3777,11 @@ cleanup_sb_ha_chassis_groups(struct northd_input *input_data, } static void -cleanup_stale_fdb_entries(struct northd_input *input_data, +cleanup_stale_fdb_entries(const struct sbrec_fdb_table *sbrec_fdb_table, struct hmap *ls_datapaths) { const struct sbrec_fdb *fdb_e; - SBREC_FDB_TABLE_FOR_EACH_SAFE (fdb_e, - input_data->sbrec_fdb_table) { + SBREC_FDB_TABLE_FOR_EACH_SAFE (fdb_e, sbrec_fdb_table) { bool delete = true; struct ovn_datapath *od = ovn_datapath_find_by_key(ls_datapaths, fdb_e->dp_key); @@ -4023,8 +4030,10 @@ build_lrouter_lb_ips(struct ovn_lb_ip_set *lb_ips, } static void -build_lbs(struct northd_input *input_data, struct hmap *ls_datapaths, - struct hmap *lr_datapaths, struct hmap *lbs, struct hmap *lb_groups) +build_lbs(const struct nbrec_load_balancer_table *nbrec_load_balancer_table, + const struct nbrec_load_balancer_group_table *nbrec_lb_group_table, + struct hmap *ls_datapaths, struct hmap *lr_datapaths, + struct hmap *lbs, struct hmap *lb_groups) { const struct nbrec_load_balancer_group *nbrec_lb_group; struct ovn_lb_group *lb_group; @@ -4034,8 +4043,7 @@ build_lbs(struct northd_input *input_data, struct hmap *ls_datapaths, hmap_init(lb_groups); const struct nbrec_load_balancer *nbrec_lb; - NBREC_LOAD_BALANCER_TABLE_FOR_EACH (nbrec_lb, - input_data->nbrec_load_balancer_table) { + NBREC_LOAD_BALANCER_TABLE_FOR_EACH (nbrec_lb, nbrec_load_balancer_table) { struct ovn_northd_lb *lb_nb = ovn_northd_lb_create(nbrec_lb, n_ls_datapaths, n_lr_datapaths); @@ -4044,7 +4052,7 @@ build_lbs(struct northd_input *input_data, struct hmap *ls_datapaths, } NBREC_LOAD_BALANCER_GROUP_TABLE_FOR_EACH (nbrec_lb_group, - input_data->nbrec_load_balancer_group_table) { + nbrec_lb_group_table) { lb_group = ovn_lb_group_create(nbrec_lb_group, lbs, hmap_count(ls_datapaths), hmap_count(lr_datapaths)); @@ -4140,16 +4148,17 @@ build_lbs(struct northd_input *input_data, struct hmap *ls_datapaths, } static void -build_lb_svcs(struct northd_input *input_data, - struct ovsdb_idl_txn *ovnsb_txn, - struct hmap *ls_ports, - struct hmap *lbs) +build_lb_svcs( + struct ovsdb_idl_txn *ovnsb_txn, + const struct sbrec_service_monitor_table *sbrec_service_monitor_table, + struct hmap *ls_ports, + struct hmap *lbs) { struct hmap monitor_map = HMAP_INITIALIZER(&monitor_map); const struct sbrec_service_monitor *sbrec_mon; SBREC_SERVICE_MONITOR_TABLE_FOR_EACH (sbrec_mon, - input_data->sbrec_service_monitor_table) { + sbrec_service_monitor_table) { uint32_t hash = sbrec_mon->port; hash = hash_string(sbrec_mon->ip, hash); hash = hash_string(sbrec_mon->logical_port, hash); @@ -4335,14 +4344,15 @@ build_lb_count_dps(struct hmap *lbs) * networks to have been parsed. */ static void -build_lb_port_related_data(struct hmap *lr_datapaths, struct hmap *ls_ports, - struct hmap *lbs, struct hmap *lb_groups, - struct northd_input *input_data, - struct ovsdb_idl_txn *ovnsb_txn) +build_lb_port_related_data( + struct ovsdb_idl_txn *ovnsb_txn, + const struct sbrec_service_monitor_table *sbrec_service_monitor_table, + struct hmap *lr_datapaths, struct hmap *ls_ports, + struct hmap *lbs, struct hmap *lb_groups) { build_lrouter_lbs_check(lr_datapaths); build_lrouter_lbs_reachable_ips(lr_datapaths, lbs, lb_groups); - build_lb_svcs(input_data, ovnsb_txn, ls_ports, lbs); + build_lb_svcs(ovnsb_txn, sbrec_service_monitor_table, ls_ports, lbs); build_lswitch_lbs_from_lrouter(lbs, lb_groups); } @@ -4394,7 +4404,8 @@ ovn_sb_insert_logical_dp_group(struct ovsdb_idl_txn *ovnsb_txn, * Southbound database. */ static void -sync_lbs(struct northd_input *input_data, struct ovsdb_idl_txn *ovnsb_txn, +sync_lbs(struct ovsdb_idl_txn *ovnsb_txn, + const struct sbrec_load_balancer_table *sbrec_load_balancer_table, struct hmap *ls_datapaths, struct hmap *lbs) { struct hmap dp_groups = HMAP_INITIALIZER(&dp_groups); @@ -4407,7 +4418,7 @@ sync_lbs(struct northd_input *input_data, struct ovsdb_idl_txn *ovnsb_txn, struct hmapx existing_lbs = HMAPX_INITIALIZER(&existing_lbs); const struct sbrec_load_balancer *sbrec_lb; SBREC_LOAD_BALANCER_TABLE_FOR_EACH_SAFE (sbrec_lb, - input_data->sbrec_load_balancer_table) { + sbrec_load_balancer_table) { const char *nb_lb_uuid = smap_get(&sbrec_lb->external_ids, "lb_id"); struct uuid lb_uuid; if (!nb_lb_uuid || !uuid_from_string(&lb_uuid, nb_lb_uuid)) { @@ -4557,15 +4568,15 @@ ovn_port_add_tnlid(struct ovn_port *op, uint32_t tunnel_key) } static void -ovn_port_assign_requested_tnl_id(struct northd_input *input_data, - struct ovn_port *op) +ovn_port_assign_requested_tnl_id( + const struct sbrec_chassis_table *sbrec_chassis_table, struct ovn_port *op) { const struct smap *options = (op->nbsp ? &op->nbsp->options : &op->nbrp->options); uint32_t tunnel_key = smap_get_int(options, "requested-tnl-key", 0); if (tunnel_key) { - if (is_vxlan_mode(input_data) && + if (is_vxlan_mode(sbrec_chassis_table) && tunnel_key >= OVN_VXLAN_MIN_MULTICAST) { static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1); VLOG_WARN_RL(&rl, "Tunnel key %"PRIu32" for port %s " @@ -4584,12 +4595,12 @@ ovn_port_assign_requested_tnl_id(struct northd_input *input_data, } static void -ovn_port_allocate_key(struct northd_input *input_data, +ovn_port_allocate_key(const struct sbrec_chassis_table *sbrec_chassis_table, struct hmap *ports, struct ovn_port *op) { if (!op->tunnel_key) { - uint8_t key_bits = is_vxlan_mode(input_data)? 12 : 16; + uint8_t key_bits = is_vxlan_mode(sbrec_chassis_table)? 12 : 16; op->tunnel_key = ovn_allocate_tnlid(&op->od->port_tnlids, "port", 1, (1u << (key_bits - 1)) - 1, &op->od->port_key_hint); @@ -4610,12 +4621,17 @@ ovn_port_allocate_key(struct northd_input *input_data, * using the "struct ovn_datapath"s in 'datapaths' to look up logical * datapaths. */ static void -build_ports(struct northd_input *input_data, - struct ovsdb_idl_txn *ovnsb_txn, - struct ovsdb_idl_index *sbrec_chassis_by_name, - struct ovsdb_idl_index *sbrec_chassis_by_hostname, - struct hmap *ls_datapaths, struct hmap *lr_datapaths, - struct hmap *ls_ports, struct hmap *lr_ports) +build_ports(struct ovsdb_idl_txn *ovnsb_txn, + const struct sbrec_port_binding_table *sbrec_port_binding_table, + const struct sbrec_chassis_table *sbrec_chassis_table, + const struct sbrec_mirror_table *sbrec_mirror_table, + const struct sbrec_mac_binding_table *sbrec_mac_binding_table, + const struct sbrec_ha_chassis_group_table *sbrec_ha_chassis_group_table, + struct ovsdb_idl_index *sbrec_chassis_by_name, + struct ovsdb_idl_index *sbrec_chassis_by_hostname, + struct ovsdb_idl_index *sbrec_ha_chassis_grp_by_name, + struct hmap *ls_datapaths, struct hmap *lr_datapaths, + struct hmap *ls_ports, struct hmap *lr_ports) { struct ovs_list sb_only, nb_only, both; struct hmap tag_alloc_table = HMAP_INITIALIZER(&tag_alloc_table); @@ -4628,7 +4644,7 @@ build_ports(struct northd_input *input_data, /* Borrow ls_ports for joining NB and SB for both LSPs and LRPs. * We will split them later. */ struct hmap *ports = ls_ports; - join_logical_ports(input_data, ls_datapaths, lr_datapaths, + join_logical_ports(sbrec_port_binding_table, ls_datapaths, lr_datapaths, ports, &chassis_qdisc_queues, &tag_alloc_table, &sb_only, &nb_only, &both); @@ -4638,10 +4654,10 @@ build_ports(struct northd_input *input_data, /* Assign explicitly requested tunnel ids first. */ struct ovn_port *op; LIST_FOR_EACH (op, list, &both) { - ovn_port_assign_requested_tnl_id(input_data, op); + ovn_port_assign_requested_tnl_id(sbrec_chassis_table, op); } LIST_FOR_EACH (op, list, &nb_only) { - ovn_port_assign_requested_tnl_id(input_data, op); + ovn_port_assign_requested_tnl_id(sbrec_chassis_table, op); } /* Keep nonconflicting tunnel IDs that are already assigned. */ @@ -4653,10 +4669,10 @@ build_ports(struct northd_input *input_data, /* Assign new tunnel ids where needed. */ LIST_FOR_EACH_SAFE (op, list, &both) { - ovn_port_allocate_key(input_data, ports, op); + ovn_port_allocate_key(sbrec_chassis_table, ports, op); } LIST_FOR_EACH_SAFE (op, list, &nb_only) { - ovn_port_allocate_key(input_data, ports, op); + ovn_port_allocate_key(sbrec_chassis_table, ports, op); } /* For logical ports that are in both databases, update the southbound @@ -4673,9 +4689,10 @@ build_ports(struct northd_input *input_data, if (op->nbsp) { tag_alloc_create_new_tag(&tag_alloc_table, op->nbsp); } - ovn_port_update_sbrec(input_data, - ovnsb_txn, sbrec_chassis_by_name, + ovn_port_update_sbrec(ovnsb_txn, sbrec_chassis_by_name, sbrec_chassis_by_hostname, + sbrec_ha_chassis_grp_by_name, + sbrec_mirror_table, op, &chassis_qdisc_queues, &active_ha_chassis_grps); } @@ -4683,10 +4700,11 @@ build_ports(struct northd_input *input_data, /* Add southbound record for each unmatched northbound record. */ LIST_FOR_EACH_SAFE (op, list, &nb_only) { op->sb = sbrec_port_binding_insert(ovnsb_txn); - ovn_port_update_sbrec(input_data, - ovnsb_txn, sbrec_chassis_by_name, - sbrec_chassis_by_hostname, op, - &chassis_qdisc_queues, + ovn_port_update_sbrec(ovnsb_txn, sbrec_chassis_by_name, + sbrec_chassis_by_hostname, + sbrec_ha_chassis_grp_by_name, + sbrec_mirror_table, + op, &chassis_qdisc_queues, &active_ha_chassis_grps); sbrec_port_binding_set_logical_port(op->sb, op->key); } @@ -4711,12 +4729,13 @@ build_ports(struct northd_input *input_data, } if (remove_mac_bindings) { - cleanup_mac_bindings(input_data, lr_datapaths, lr_ports); + cleanup_mac_bindings(sbrec_mac_binding_table, lr_datapaths, lr_ports); } tag_alloc_destroy(&tag_alloc_table); destroy_chassis_queues(&chassis_qdisc_queues); - cleanup_sb_ha_chassis_groups(input_data, &active_ha_chassis_grps); + cleanup_sb_ha_chassis_groups(sbrec_ha_chassis_group_table, + &active_ha_chassis_grps); sset_destroy(&active_ha_chassis_grps); } @@ -4901,7 +4920,7 @@ ovn_igmp_group_find(struct hmap *igmp_groups, } static struct ovn_igmp_group * -ovn_igmp_group_add(struct lflow_input *input_data, +ovn_igmp_group_add(struct ovsdb_idl_index *sbrec_mcast_group_by_name_dp, struct hmap *igmp_groups, struct ovn_datapath *datapath, const struct in6_addr *address, @@ -4914,7 +4933,7 @@ ovn_igmp_group_add(struct lflow_input *input_data, igmp_group = xmalloc(sizeof *igmp_group); const struct sbrec_multicast_group *mcgroup = - mcast_group_lookup(input_data->sbrec_mcast_group_by_name_dp, + mcast_group_lookup(sbrec_mcast_group_by_name_dp, address_s, datapath->sb); @@ -6742,15 +6761,14 @@ ovn_update_ipv6_options(struct hmap *lr_ports) } static void -build_port_group_lswitches(struct northd_input *input_data, - struct hmap *pgs, - struct hmap *ls_ports) +build_port_group_lswitches( + const struct nbrec_port_group_table *nbrec_port_group_table, + struct hmap *pgs, struct hmap *ls_ports) { hmap_init(pgs); const struct nbrec_port_group *nb_pg; - NBREC_PORT_GROUP_TABLE_FOR_EACH (nb_pg, - input_data->nbrec_port_group_table) { + NBREC_PORT_GROUP_TABLE_FOR_EACH (nb_pg, nbrec_port_group_table) { struct ovn_port_group *pg = ovn_port_group_create(pgs, nb_pg); for (size_t i = 0; i < nb_pg->n_ports; i++) { struct ovn_port *op = ovn_port_find(ls_ports, @@ -9362,13 +9380,13 @@ bfd_port_lookup(const struct hmap *bfd_map, const char *logical_port, } void -bfd_cleanup_connections(struct lflow_input *input_data, +bfd_cleanup_connections(const struct nbrec_bfd_table *nbrec_bfd_table, struct hmap *bfd_map) { const struct nbrec_bfd *nb_bt; struct bfd_entry *bfd_e; - NBREC_BFD_TABLE_FOR_EACH (nb_bt, input_data->nbrec_bfd_table) { + NBREC_BFD_TABLE_FOR_EACH (nb_bt, nbrec_bfd_table) { bfd_e = bfd_port_lookup(bfd_map, nb_bt->logical_port, nb_bt->dst_ip); if (!bfd_e) { continue; @@ -9446,8 +9464,9 @@ static int bfd_get_unused_port(unsigned long *bfd_src_ports) } void -build_bfd_table(struct lflow_input *input_data, - struct ovsdb_idl_txn *ovnsb_txn, +build_bfd_table(struct ovsdb_idl_txn *ovnsb_txn, + const struct nbrec_bfd_table *nbrec_bfd_table, + const struct sbrec_bfd_table *sbrec_bfd_table, struct hmap *bfd_connections, struct hmap *lr_ports) { struct hmap sb_only = HMAP_INITIALIZER(&sb_only); @@ -9458,7 +9477,7 @@ build_bfd_table(struct lflow_input *input_data, bfd_src_ports = bitmap_allocate(BFD_UDP_SRC_PORT_LEN); - SBREC_BFD_TABLE_FOR_EACH (sb_bt, input_data->sbrec_bfd_table) { + SBREC_BFD_TABLE_FOR_EACH (sb_bt, sbrec_bfd_table) { bfd_e = xmalloc(sizeof *bfd_e); bfd_e->sb_bt = sb_bt; hash = hash_string(sb_bt->dst_ip, 0); @@ -9468,7 +9487,7 @@ build_bfd_table(struct lflow_input *input_data, } const struct nbrec_bfd *nb_bt; - NBREC_BFD_TABLE_FOR_EACH (nb_bt, input_data->nbrec_bfd_table) { + NBREC_BFD_TABLE_FOR_EACH (nb_bt, nbrec_bfd_table) { if (!nb_bt->status) { /* default state is admin_down */ nbrec_bfd_set_status(nb_bt, "admin_down"); @@ -15066,7 +15085,8 @@ void run_update_worker_pool(int n_threads) } static void -build_mcast_groups(struct lflow_input *data, +build_mcast_groups(const struct sbrec_igmp_group_table *sbrec_igmp_group_table, + struct ovsdb_idl_index *sbrec_mcast_group_by_name_dp, const struct hmap *ls_datapaths, const struct hmap *ls_ports, const struct hmap *lr_ports, @@ -15082,7 +15102,9 @@ void build_lflows(struct lflow_input *input_data, struct hmap mcast_groups; struct hmap igmp_groups; - build_mcast_groups(input_data, input_data->ls_datapaths, + build_mcast_groups(input_data->sbrec_igmp_group_table, + input_data->sbrec_mcast_group_by_name_dp, + input_data->ls_datapaths, input_data->ls_ports, input_data->lr_ports, &mcast_groups, &igmp_groups); @@ -15459,15 +15481,14 @@ void build_lflows(struct lflow_input *input_data, * contains lport uuids, while in OVN_Southbound we store the lport names. */ static void -sync_port_groups(struct northd_input *input_data, - struct ovsdb_idl_txn *ovnsb_txn, +sync_port_groups(struct ovsdb_idl_txn *ovnsb_txn, + const struct sbrec_port_group_table *sbrec_port_group_table, struct hmap *pgs) { struct shash sb_port_groups = SHASH_INITIALIZER(&sb_port_groups); const struct sbrec_port_group *sb_port_group; - SBREC_PORT_GROUP_TABLE_FOR_EACH (sb_port_group, - input_data->sbrec_port_group_table) { + SBREC_PORT_GROUP_TABLE_FOR_EACH (sb_port_group, sbrec_port_group_table) { shash_add(&sb_port_groups, sb_port_group->name, sb_port_group); } @@ -15653,20 +15674,22 @@ sync_acl_fair_meter(struct ovsdb_idl_txn *ovnsb_txn, * a private copy of its meter in the SB table. */ static void -sync_meters(struct northd_input *input_data, - struct ovsdb_idl_txn *ovnsb_txn, +sync_meters(struct ovsdb_idl_txn *ovnsb_txn, + const struct nbrec_meter_table *nbrec_meter_table, + const struct nbrec_acl_table *nbrec_acl_table, + const struct sbrec_meter_table *sbrec_meter_table, struct shash *meter_groups) { struct shash sb_meters = SHASH_INITIALIZER(&sb_meters); struct sset used_sb_meters = SSET_INITIALIZER(&used_sb_meters); const struct sbrec_meter *sb_meter; - SBREC_METER_TABLE_FOR_EACH (sb_meter, input_data->sbrec_meter_table) { + SBREC_METER_TABLE_FOR_EACH (sb_meter, sbrec_meter_table) { shash_add(&sb_meters, sb_meter->name, sb_meter); } const struct nbrec_meter *nb_meter; - NBREC_METER_TABLE_FOR_EACH (nb_meter, input_data->nbrec_meter_table) { + NBREC_METER_TABLE_FOR_EACH (nb_meter, nbrec_meter_table) { sync_meters_iterate_nb_meter(ovnsb_txn, nb_meter->name, nb_meter, &sb_meters, &used_sb_meters); } @@ -15677,7 +15700,7 @@ sync_meters(struct northd_input *input_data, * rate-limited. */ const struct nbrec_acl *acl; - NBREC_ACL_TABLE_FOR_EACH (acl, input_data->nbrec_acl_table) { + NBREC_ACL_TABLE_FOR_EACH (acl, nbrec_acl_table) { sync_acl_fair_meter(ovnsb_txn, meter_groups, acl, &sb_meters, &used_sb_meters); } @@ -15741,18 +15764,19 @@ sync_mirrors_iterate_nb_mirror(struct ovsdb_idl_txn *ovnsb_txn, } static void -sync_mirrors(struct northd_input *input_data, - struct ovsdb_idl_txn *ovnsb_txn) +sync_mirrors(struct ovsdb_idl_txn *ovnsb_txn, + const struct nbrec_mirror_table *nbrec_mirror_table, + const struct sbrec_mirror_table *sbrec_mirror_table) { struct shash sb_mirrors = SHASH_INITIALIZER(&sb_mirrors); const struct sbrec_mirror *sb_mirror; - SBREC_MIRROR_TABLE_FOR_EACH (sb_mirror, input_data->sbrec_mirror_table) { + SBREC_MIRROR_TABLE_FOR_EACH (sb_mirror, sbrec_mirror_table) { shash_add(&sb_mirrors, sb_mirror->name, sb_mirror); } const struct nbrec_mirror *nb_mirror; - NBREC_MIRROR_TABLE_FOR_EACH (nb_mirror, input_data->nbrec_mirror_table) { + NBREC_MIRROR_TABLE_FOR_EACH (nb_mirror, nbrec_mirror_table) { sync_mirrors_iterate_nb_mirror(ovnsb_txn, nb_mirror->name, nb_mirror, &sb_mirrors); shash_find_and_delete(&sb_mirrors, nb_mirror->name); @@ -15795,8 +15819,8 @@ get_dns_info_from_hmap(struct hmap *dns_map, struct uuid *uuid) } static void -sync_dns_entries(struct northd_input *input_data, - struct ovsdb_idl_txn *ovnsb_txn, +sync_dns_entries(struct ovsdb_idl_txn *ovnsb_txn, + const struct sbrec_dns_table *sbrec_dns_table, struct hmap *ls_datapaths) { struct hmap dns_map = HMAP_INITIALIZER(&dns_map); @@ -15826,7 +15850,7 @@ sync_dns_entries(struct northd_input *input_data, } const struct sbrec_dns *sbrec_dns; - SBREC_DNS_TABLE_FOR_EACH_SAFE (sbrec_dns, input_data->sbrec_dns_table) { + SBREC_DNS_TABLE_FOR_EACH_SAFE (sbrec_dns, sbrec_dns_table) { const char *nb_dns_uuid = smap_get(&sbrec_dns->external_ids, "dns_id"); struct uuid dns_uuid; if (!nb_dns_uuid || !uuid_from_string(&dns_uuid, nb_dns_uuid)) { @@ -15884,8 +15908,10 @@ sync_dns_entries(struct northd_input *input_data, } static void -sync_template_vars(struct northd_input *input_data, - struct ovsdb_idl_txn *ovnsb_txn) +sync_template_vars( + struct ovsdb_idl_txn *ovnsb_txn, + const struct nbrec_chassis_template_var_table *nbrec_ch_template_var_table, + const struct sbrec_chassis_template_var_table *sbrec_ch_template_var_table) { struct shash nb_tvs = SHASH_INITIALIZER(&nb_tvs); @@ -15893,12 +15919,12 @@ sync_template_vars(struct northd_input *input_data, const struct sbrec_chassis_template_var *sb_tv; NBREC_CHASSIS_TEMPLATE_VAR_TABLE_FOR_EACH ( - nb_tv, input_data->nbrec_chassis_template_var_table) { + nb_tv, nbrec_ch_template_var_table) { shash_add(&nb_tvs, nb_tv->chassis, nb_tv); } SBREC_CHASSIS_TEMPLATE_VAR_TABLE_FOR_EACH_SAFE ( - sb_tv, input_data->sbrec_chassis_template_var_table) { + sb_tv, sbrec_ch_template_var_table) { nb_tv = shash_find_and_delete(&nb_tvs, sb_tv->chassis); if (!nb_tv) { sbrec_chassis_template_var_delete(sb_tv); @@ -15964,8 +15990,9 @@ destroy_datapaths_and_ports(struct hmap *ls_datapaths, } static void -build_ip_mcast(struct northd_input *input_data, - struct ovsdb_idl_txn *ovnsb_txn, +build_ip_mcast(struct ovsdb_idl_txn *ovnsb_txn, + const struct sbrec_ip_multicast_table *sbrec_ip_multicast_table, + struct ovsdb_idl_index *sbrec_ip_mcast_by_dp, struct hmap *ls_datapaths) { struct ovn_datapath *od; @@ -15974,7 +16001,7 @@ build_ip_mcast(struct northd_input *input_data, ovs_assert(od->nbs); const struct sbrec_ip_multicast *ip_mcast = - ip_mcast_lookup(input_data->sbrec_ip_mcast_by_dp, od->sb); + ip_mcast_lookup(sbrec_ip_mcast_by_dp, od->sb); if (!ip_mcast) { ip_mcast = sbrec_ip_multicast_insert(ovnsb_txn); @@ -15985,8 +16012,7 @@ build_ip_mcast(struct northd_input *input_data, /* Delete southbound records without northbound matches. */ const struct sbrec_ip_multicast *sb; - SBREC_IP_MULTICAST_TABLE_FOR_EACH_SAFE (sb, - input_data->sbrec_ip_multicast_table) { + SBREC_IP_MULTICAST_TABLE_FOR_EACH_SAFE (sb, sbrec_ip_multicast_table) { od = ovn_datapath_from_sbrec(ls_datapaths, NULL, sb->datapath); if (!od || ovn_datapath_is_stale(od)) { sbrec_ip_multicast_delete(sb); @@ -15995,7 +16021,8 @@ build_ip_mcast(struct northd_input *input_data, } static void -build_mcast_groups(struct lflow_input *input_data, +build_mcast_groups(const struct sbrec_igmp_group_table *sbrec_igmp_group_table, + struct ovsdb_idl_index *sbrec_mcast_group_by_name_dp, const struct hmap *ls_datapaths, const struct hmap *ls_ports, const struct hmap *lr_ports, @@ -16061,8 +16088,7 @@ build_mcast_groups(struct lflow_input *input_data, const struct sbrec_igmp_group *sb_igmp; - SBREC_IGMP_GROUP_TABLE_FOR_EACH_SAFE (sb_igmp, - input_data->sbrec_igmp_group_table) { + SBREC_IGMP_GROUP_TABLE_FOR_EACH_SAFE (sb_igmp, sbrec_igmp_group_table) { /* If this is a stale group (e.g., controller had crashed, * purge it). */ @@ -16106,8 +16132,8 @@ build_mcast_groups(struct lflow_input *input_data, * if the multicast group already exists. */ struct ovn_igmp_group *igmp_group = - ovn_igmp_group_add(input_data, igmp_groups, od, &group_address, - sb_igmp->address); + ovn_igmp_group_add(sbrec_mcast_group_by_name_dp, igmp_groups, od, + &group_address, sb_igmp->address); /* Add the extracted ports to the IGMP group. */ ovn_igmp_group_add_entry(igmp_group, igmp_ports, n_igmp_ports); @@ -16155,7 +16181,7 @@ build_mcast_groups(struct lflow_input *input_data, } struct ovn_igmp_group *igmp_group_rtr = - ovn_igmp_group_add(input_data, + ovn_igmp_group_add(sbrec_mcast_group_by_name_dp, igmp_groups, router_port->od, address, igmp_group->mcgroup.name); struct ovn_port **router_igmp_ports = @@ -16202,23 +16228,23 @@ build_mcast_groups(struct lflow_input *input_data, } static void -build_meter_groups(struct northd_input *input_data, +build_meter_groups(const struct nbrec_meter_table *nbrec_meter_table, struct shash *meter_groups) { const struct nbrec_meter *nb_meter; - NBREC_METER_TABLE_FOR_EACH (nb_meter, input_data->nbrec_meter_table) { + NBREC_METER_TABLE_FOR_EACH (nb_meter, nbrec_meter_table) { shash_add(meter_groups, nb_meter->name, nb_meter); } } static const struct nbrec_static_mac_binding * -static_mac_binding_by_port_ip(struct northd_input *input_data, - const char *logical_port, const char *ip) +static_mac_binding_by_port_ip( + const struct nbrec_static_mac_binding_table *nbrec_static_mb_table, + const char *logical_port, const char *ip) { const struct nbrec_static_mac_binding *nb_smb = NULL; - NBREC_STATIC_MAC_BINDING_TABLE_FOR_EACH ( - nb_smb, input_data->nbrec_static_mac_binding_table) { + NBREC_STATIC_MAC_BINDING_TABLE_FOR_EACH (nb_smb, nbrec_static_mb_table) { if (!strcmp(nb_smb->logical_port, logical_port) && !strcmp(nb_smb->ip, ip)) { break; @@ -16229,17 +16255,20 @@ static_mac_binding_by_port_ip(struct northd_input *input_data, } static void -build_static_mac_binding_table(struct northd_input *input_data, - struct ovsdb_idl_txn *ovnsb_txn, - struct hmap *lr_ports) +build_static_mac_binding_table( + struct ovsdb_idl_txn *ovnsb_txn, + const struct nbrec_static_mac_binding_table *nbrec_static_mb_table, + const struct sbrec_static_mac_binding_table *sbrec_static_mb_table, + struct ovsdb_idl_index *sbrec_static_mac_binding_by_lport_ip, + struct hmap *lr_ports) { /* Cleanup SB Static_MAC_Binding entries which do not have corresponding * NB Static_MAC_Binding entries. */ const struct nbrec_static_mac_binding *nb_smb; const struct sbrec_static_mac_binding *sb_smb; SBREC_STATIC_MAC_BINDING_TABLE_FOR_EACH_SAFE (sb_smb, - input_data->sbrec_static_mac_binding_table) { - nb_smb = static_mac_binding_by_port_ip(input_data, + sbrec_static_mb_table) { + nb_smb = static_mac_binding_by_port_ip(nbrec_static_mb_table, sb_smb->logical_port, sb_smb->ip); if (!nb_smb) { @@ -16250,14 +16279,14 @@ build_static_mac_binding_table(struct northd_input *input_data, /* Create/Update SB Static_MAC_Binding entries with corresponding values * from NB Static_MAC_Binding entries. */ NBREC_STATIC_MAC_BINDING_TABLE_FOR_EACH ( - nb_smb, input_data->nbrec_static_mac_binding_table) { + nb_smb, nbrec_static_mb_table) { struct ovn_port *op = ovn_port_find(lr_ports, nb_smb->logical_port); if (op && op->nbrp) { struct ovn_datapath *od = op->od; if (od && od->sb) { const struct sbrec_static_mac_binding *mb = static_mac_binding_lookup( - input_data->sbrec_static_mac_binding_by_lport_ip, + sbrec_static_mac_binding_by_lport_ip, nb_smb->logical_port, nb_smb->ip); if (!mb) { /* Create new entry */ @@ -16354,9 +16383,7 @@ static void ovnnb_db_run(struct northd_input *input_data, struct northd_data *data, struct ovsdb_idl_txn *ovnnb_txn, - struct ovsdb_idl_txn *ovnsb_txn, - struct ovsdb_idl_index *sbrec_chassis_by_name, - struct ovsdb_idl_index *sbrec_chassis_by_hostname) + struct ovsdb_idl_txn *ovnsb_txn) { if (!ovnsb_txn || !ovnnb_txn) { return; @@ -16397,7 +16424,8 @@ ovnnb_db_run(struct northd_input *input_data, smap_replace(&options, "svc_monitor_mac", svc_monitor_mac); } - char *max_tunid = xasprintf("%d", get_ovn_max_dp_key_local(input_data)); + char *max_tunid = xasprintf("%d", + get_ovn_max_dp_key_local(input_data->sbrec_chassis_table)); smap_replace(&options, "max_tunid", max_tunid); free(max_tunid); @@ -16430,41 +16458,70 @@ ovnnb_db_run(struct northd_input *input_data, "install_ls_lb_from_router", false); - build_chassis_features(input_data, &data->features); + build_chassis_features(input_data->sbrec_chassis_table, &data->features); init_debug_config(nb); - build_datapaths(input_data, ovnsb_txn, &data->ls_datapaths, + build_datapaths(ovnsb_txn, + input_data->nbrec_logical_switch_table, + input_data->nbrec_logical_router_table, + input_data->sbrec_datapath_binding_table, + input_data->sbrec_chassis_table, + &data->ls_datapaths, &data->lr_datapaths, &data->lr_list); - build_lbs(input_data, &data->ls_datapaths, &data->lr_datapaths, &data->lbs, + build_lbs(input_data->nbrec_load_balancer_table, + input_data->nbrec_load_balancer_group_table, + &data->ls_datapaths, &data->lr_datapaths, &data->lbs, &data->lb_groups); - build_ports(input_data, ovnsb_txn, sbrec_chassis_by_name, - sbrec_chassis_by_hostname, &data->ls_datapaths, - &data->lr_datapaths, &data->ls_ports, &data->lr_ports); - build_lb_port_related_data(&data->lr_datapaths, &data->ls_ports, - &data->lbs, &data->lb_groups, input_data, - ovnsb_txn); + build_ports(ovnsb_txn, + input_data->sbrec_port_binding_table, + input_data->sbrec_chassis_table, + input_data->sbrec_mirror_table, + input_data->sbrec_mac_binding_table, + input_data->sbrec_ha_chassis_group_table, + input_data->sbrec_chassis_by_name, + input_data->sbrec_chassis_by_hostname, + input_data->sbrec_ha_chassis_grp_by_name, + &data->ls_datapaths, &data->lr_datapaths, &data->ls_ports, + &data->lr_ports); + build_lb_port_related_data(ovnsb_txn, + input_data->sbrec_service_monitor_table, + &data->lr_datapaths, &data->ls_ports, + &data->lbs, &data->lb_groups); build_lb_count_dps(&data->lbs); build_ipam(&data->ls_datapaths, &data->ls_ports); - build_port_group_lswitches(input_data, &data->port_groups, - &data->ls_ports); + build_port_group_lswitches(input_data->nbrec_port_group_table, + &data->port_groups, &data->ls_ports); build_lrouter_groups(&data->lr_ports, &data->lr_list); - build_ip_mcast(input_data, ovnsb_txn, &data->ls_datapaths); - build_meter_groups(input_data, &data->meter_groups); - build_static_mac_binding_table(input_data, ovnsb_txn, &data->lr_ports); + build_ip_mcast(ovnsb_txn, input_data->sbrec_ip_multicast_table, + input_data->sbrec_ip_mcast_by_dp, &data->ls_datapaths); + build_meter_groups(input_data->nbrec_meter_table, &data->meter_groups); + build_static_mac_binding_table(ovnsb_txn, + input_data->nbrec_static_mac_binding_table, + input_data->sbrec_static_mac_binding_table, + input_data->sbrec_static_mac_binding_by_lport_ip, + &data->lr_ports); stopwatch_stop(BUILD_LFLOWS_CTX_STOPWATCH_NAME, time_msec()); stopwatch_start(CLEAR_LFLOWS_CTX_STOPWATCH_NAME, time_msec()); ovn_update_ipv6_options(&data->lr_ports); ovn_update_ipv6_prefix(&data->lr_ports); - sync_lbs(input_data, ovnsb_txn, &data->ls_datapaths, &data->lbs); - sync_port_groups(input_data, ovnsb_txn, &data->port_groups); - sync_meters(input_data, ovnsb_txn, &data->meter_groups); - sync_mirrors(input_data, ovnsb_txn); - sync_dns_entries(input_data, ovnsb_txn, &data->ls_datapaths); - sync_template_vars(input_data, ovnsb_txn); - - cleanup_stale_fdb_entries(input_data, &data->ls_datapaths); + sync_lbs(ovnsb_txn, input_data->sbrec_load_balancer_table, + &data->ls_datapaths, &data->lbs); + sync_port_groups(ovnsb_txn, input_data->sbrec_port_group_table, + &data->port_groups); + sync_meters(ovnsb_txn, input_data->nbrec_meter_table, + input_data->nbrec_acl_table, input_data->sbrec_meter_table, + &data->meter_groups); + sync_mirrors(ovnsb_txn, input_data->nbrec_mirror_table, + input_data->sbrec_mirror_table); + sync_dns_entries(ovnsb_txn, input_data->sbrec_dns_table, + &data->ls_datapaths); + sync_template_vars(ovnsb_txn, input_data->nbrec_chassis_template_var_table, + input_data->sbrec_chassis_template_var_table); + + cleanup_stale_fdb_entries(input_data->sbrec_fdb_table, + &data->ls_datapaths); stopwatch_stop(CLEAR_LFLOWS_CTX_STOPWATCH_NAME, time_msec()); /* Set up SB_Global (depends on chassis features). */ @@ -16728,9 +16785,7 @@ void northd_run(struct northd_input *input_data, struct ovsdb_idl_txn *ovnsb_txn) { stopwatch_start(OVNNB_DB_RUN_STOPWATCH_NAME, time_msec()); - ovnnb_db_run(input_data, data, ovnnb_txn, ovnsb_txn, - input_data->sbrec_chassis_by_name, - input_data->sbrec_chassis_by_hostname); + ovnnb_db_run(input_data, data, ovnnb_txn, ovnsb_txn); stopwatch_stop(OVNNB_DB_RUN_STOPWATCH_NAME, time_msec()); stopwatch_start(OVNSB_DB_RUN_STOPWATCH_NAME, time_msec()); ovnsb_db_run(input_data, ovnnb_txn, ovnsb_txn, &data->ls_ports); diff --git a/northd/northd.h b/northd/northd.h index cfd36e32c9a7..c4563f0cb15a 100644 --- a/northd/northd.h +++ b/northd/northd.h @@ -25,8 +25,8 @@ struct northd_input { /* Northbound table references */ const struct nbrec_nb_global_table *nbrec_nb_global_table; - const struct nbrec_logical_switch_table *nbrec_logical_switch; - const struct nbrec_logical_router_table *nbrec_logical_router; + const struct nbrec_logical_switch_table *nbrec_logical_switch_table; + const struct nbrec_logical_router_table *nbrec_logical_router_table; const struct nbrec_load_balancer_table *nbrec_load_balancer_table; const struct nbrec_load_balancer_group_table *nbrec_load_balancer_group_table; @@ -45,7 +45,7 @@ struct northd_input { const struct sbrec_port_binding_table *sbrec_port_binding_table; const struct sbrec_mac_binding_table *sbrec_mac_binding_table; const struct sbrec_ha_chassis_group_table *sbrec_ha_chassis_group_table; - const struct sbrec_chassis_table *sbrec_chassis; + const struct sbrec_chassis_table *sbrec_chassis_table; const struct sbrec_fdb_table *sbrec_fdb_table; const struct sbrec_load_balancer_table *sbrec_load_balancer_table; const struct sbrec_service_monitor_table *sbrec_service_monitor_table; @@ -283,10 +283,11 @@ void northd_indices_create(struct northd_data *data, struct ovsdb_idl *ovnsb_idl); void build_lflows(struct lflow_input *input_data, struct ovsdb_idl_txn *ovnsb_txn); -void build_bfd_table(struct lflow_input *input_data, - struct ovsdb_idl_txn *ovnsb_txn, - struct hmap *bfd_connections, struct hmap *ports); -void bfd_cleanup_connections(struct lflow_input *input_data, +void build_bfd_table(struct ovsdb_idl_txn *ovnsb_txn, + const struct nbrec_bfd_table *, + const struct sbrec_bfd_table *, + struct hmap *bfd_connections, struct hmap *lr_ports); +void bfd_cleanup_connections(const struct nbrec_bfd_table *, struct hmap *bfd_map); void run_update_worker_pool(int n_threads); -- 2.30.2 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
