From patchwork Wed Aug 9 16:37:56 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Numan Siddique X-Patchwork-Id: 1819460 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=2605:bc80:3010::137; helo=smtp4.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Received: from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::137]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4RLbNq3V2wz1yYl for ; Thu, 10 Aug 2023 02:39:07 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id 8E56A41B94; Wed, 9 Aug 2023 16:39:05 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org 8E56A41B94 X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 1EEIQYuY3Zpm; Wed, 9 Aug 2023 16:39:03 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp4.osuosl.org (Postfix) with ESMTPS id 4DF6A41B91; Wed, 9 Aug 2023 16:39:02 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org 4DF6A41B91 Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 165C3C0071; Wed, 9 Aug 2023 16:39:02 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp2.osuosl.org (smtp2.osuosl.org [140.211.166.133]) by lists.linuxfoundation.org (Postfix) with ESMTP id 0868BC0032 for ; Wed, 9 Aug 2023 16:39:01 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id 3013341749 for ; Wed, 9 Aug 2023 16:38:07 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp2.osuosl.org 3013341749 X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp2.osuosl.org ([127.0.0.1]) by localhost (smtp2.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id SOBNuiHn7AP3 for ; Wed, 9 Aug 2023 16:38:03 +0000 (UTC) Received: from relay4-d.mail.gandi.net (relay4-d.mail.gandi.net [217.70.183.196]) by smtp2.osuosl.org (Postfix) with ESMTPS id 5685B4158F for ; Wed, 9 Aug 2023 16:38:02 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp2.osuosl.org 5685B4158F Received: by mail.gandi.net (Postfix) with ESMTPSA id 91931E000A; Wed, 9 Aug 2023 16:37:59 +0000 (UTC) From: numans@ovn.org To: dev@openvswitch.org Date: Wed, 9 Aug 2023 22:07:56 +0530 Message-Id: <20230809163756.1561651-1-numans@ovn.org> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230809163616.1561383-1-numans@ovn.org> References: <20230809163616.1561383-1-numans@ovn.org> MIME-Version: 1.0 X-GND-Sasl: numans@ovn.org Subject: [ovs-dev] [PATCH ovn v5 13/14] northd: Refactor the northd change tracking. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Numan Siddique Previous commits made of objdep_mgr to store the lflow references for ovn_port, ovn_datapath and load balancers. This patch refactors the northd change tracking to make it easier to pass the northd changed data to lflow engine for lflow generation. In order to incrementally handle the northd changes in the lflow engine, it is sufficient to provide the below changed data to lflow engine node - changed ovn_ports - changed ovn_datapaths - changed load balancers. For every changed resource, lflow northd change handler can get the objdep_mgr for each of these resources and can regenerate the lflows easily. 'lflow' changes for ovn_port is already handled. Upcoming commits will handle the ovn_datapath and load balancer changes in lflow engine. Signed-off-by: Numan Siddique --- northd/en-lflow.c | 8 +- northd/en-northd.c | 2 +- northd/northd.c | 308 +++++++++++++++++++++++---------------------- northd/northd.h | 49 +++++--- 4 files changed, 192 insertions(+), 175 deletions(-) diff --git a/northd/en-lflow.c b/northd/en-lflow.c index b7538d6382..dacaaa549a 100644 --- a/northd/en-lflow.c +++ b/northd/en-lflow.c @@ -106,7 +106,7 @@ lflow_northd_handler(struct engine_node *node, } /* Fall back to recompute if lb related data has changed. */ - if (northd_data->lb_changed) { + if (northd_data->trk_northd_changes.lb_changed) { return false; } @@ -116,9 +116,9 @@ lflow_northd_handler(struct engine_node *node, struct lflow_input lflow_input; lflow_get_input_data(node, &lflow_input); - if (!lflow_handle_northd_ls_changes(eng_ctx->ovnsb_idl_txn, - &northd_data->tracked_ls_changes, - &lflow_input, lflow_data)) { + if (!lflow_handle_northd_changes(eng_ctx->ovnsb_idl_txn, + &northd_data->trk_northd_changes, + &lflow_input, lflow_data)) { return false; } diff --git a/northd/en-northd.c b/northd/en-northd.c index 3be0f79e19..7a4a1d8629 100644 --- a/northd/en-northd.c +++ b/northd/en-northd.c @@ -303,7 +303,7 @@ northd_lb_data_handler_post_od(struct engine_node *node, void *data) /* Indicate the depedendant engine nodes that load balancer/group * related data has changed (including association to logical * switch/router). */ - nd->lb_changed = true; + nd->trk_northd_changes.lb_changed = true; engine_set_node_state(node, EN_UPDATED); return true; } diff --git a/northd/northd.c b/northd/northd.c index c1f66ac3c7..b7736bbc85 100644 --- a/northd/northd.c +++ b/northd/northd.c @@ -4994,34 +4994,50 @@ build_ports(struct ovsdb_idl_txn *ovnsb_txn, } static void -destroy_tracked_ls_change(struct ls_change *ls_change) +destroy_tracked_ovn_ports(struct tracked_ovn_ports *trk_ovn_ports) { - struct ovn_port *op; - LIST_FOR_EACH (op, list, &ls_change->added_ports) { - ovs_list_remove(&op->list); + struct tracked_ovn_port *trk_op; + HMAP_FOR_EACH_POP (trk_op, hmap_node, &trk_ovn_ports->deleted) { + ovn_port_destroy_orphan(trk_op->op); + free(trk_op); } - LIST_FOR_EACH (op, list, &ls_change->updated_ports) { - ovs_list_remove(&op->list); + + HMAP_FOR_EACH_POP (trk_op, hmap_node, &trk_ovn_ports->created) { + free(trk_op); } - LIST_FOR_EACH_SAFE (op, list, &ls_change->deleted_ports) { - ovs_list_remove(&op->list); - ovn_port_destroy_orphan(op); + + HMAP_FOR_EACH_POP (trk_op, hmap_node, &trk_ovn_ports->updated) { + free(trk_op); } } void destroy_northd_data_tracked_changes(struct northd_data *nd) { - struct ls_change *ls_change; - LIST_FOR_EACH_SAFE (ls_change, list_node, - &nd->tracked_ls_changes.updated) { - destroy_tracked_ls_change(ls_change); - ovs_list_remove(&ls_change->list_node); - free(ls_change); - } + struct northd_tracked_data *trk_changes = &nd->trk_northd_changes; + destroy_tracked_ovn_ports(&trk_changes->trk_ovn_ports); nd->change_tracked = false; - nd->lb_changed = false; + trk_changes->lb_changed = false; +} + +static void +add_op_to_northd_tracked_ports(struct hmap *tracked_ovn_ports, + struct ovn_port *op) +{ + struct tracked_ovn_port *trk_op; + uint32_t hash = hash_string(op->key, 0); + HMAP_FOR_EACH_WITH_HASH (trk_op, hmap_node, hash, tracked_ovn_ports) { + if (!strcmp(trk_op->op->key, op->key)) { + break; + } + } + + if (!trk_op) { + trk_op = xzalloc(sizeof *trk_op); + trk_op->op = op; + hmap_insert(tracked_ovn_ports, &trk_op->hmap_node, hash); + } } /* Check if a changed LSP can be handled incrementally within the I-P engine @@ -5272,7 +5288,7 @@ ls_handle_lsp_changes(struct ovsdb_idl_txn *ovnsb_idl_txn, const struct northd_input *ni, struct northd_data *nd, struct ovn_datapath *od, - struct ls_change *ls_change, + struct tracked_ovn_ports *trk_ports, bool *updated) { bool ls_ports_changed = false; @@ -5333,8 +5349,7 @@ ls_handle_lsp_changes(struct ovsdb_idl_txn *ovnsb_idl_txn, if (!op) { goto fail; } - ovs_list_push_back(&ls_change->added_ports, - &op->list); + add_op_to_northd_tracked_ports(&trk_ports->created, op); } else if (ls_port_has_changed(op->nbsp, new_nbsp)) { /* Existing port updated */ bool temp = false; @@ -5365,7 +5380,8 @@ ls_handle_lsp_changes(struct ovsdb_idl_txn *ovnsb_idl_txn, ni->sbrec_chassis_by_hostname)) { goto fail; } - ovs_list_push_back(&ls_change->updated_ports, &op->list); + + add_op_to_northd_tracked_ports(&trk_ports->updated, op); } op->visited = true; } @@ -5374,20 +5390,19 @@ ls_handle_lsp_changes(struct ovsdb_idl_txn *ovnsb_idl_txn, HMAP_FOR_EACH_SAFE (op, dp_node, &od->ports) { if (!op->visited) { if (!op->lsp_can_be_inc_processed) { - goto fail_clean_deleted; + goto fail; } if (sset_contains(&nd->svc_monitor_lsps, op->key)) { /* This port was used for svc monitor, which may be * impacted by this deletion. Fallback to recompute. */ - goto fail_clean_deleted; + goto fail; } - ovs_list_push_back(&ls_change->deleted_ports, - &op->list); + add_op_to_northd_tracked_ports(&trk_ports->deleted, op); hmap_remove(&nd->ls_ports, &op->key_node); hmap_remove(&od->ports, &op->dp_node); sbrec_port_binding_delete(op->sb); delete_fdb_entry(ni->sbrec_fdb_by_dp_and_port, od->tunnel_key, - op->tunnel_key); + op->tunnel_key); } } @@ -5404,23 +5419,19 @@ ls_handle_lsp_changes(struct ovsdb_idl_txn *ovnsb_idl_txn, only_rports = (od->n_router_ports && (od->n_router_ports == hmap_count(&od->ports))); if (only_rports) { - goto fail_clean_deleted; + goto fail; } - if (!ovs_list_is_empty(&ls_change->added_ports) || - !ovs_list_is_empty(&ls_change->updated_ports) || - !ovs_list_is_empty(&ls_change->deleted_ports)) { + if (!hmap_is_empty(&trk_ports->created) + || !hmap_is_empty(&trk_ports->updated) + || !hmap_is_empty(&trk_ports->deleted)) { *updated = true; } return true; -fail_clean_deleted: - LIST_FOR_EACH_POP (op, list, &ls_change->deleted_ports) { - ovn_port_destroy_orphan(op); - } - fail: + destroy_tracked_ovn_ports(trk_ports); return false; } @@ -5438,8 +5449,8 @@ northd_handle_ls_changes(struct ovsdb_idl_txn *ovnsb_idl_txn, struct northd_data *nd) { const struct nbrec_logical_switch *changed_ls; - struct ls_change *ls_change = NULL; + struct northd_tracked_data *trk_nd_changes = &nd->trk_northd_changes; NBREC_LOGICAL_SWITCH_TABLE_FOR_EACH_TRACKED (changed_ls, ni->nbrec_logical_switch_table) { if (nbrec_logical_switch_is_new(changed_ls) || @@ -5462,33 +5473,18 @@ northd_handle_ls_changes(struct ovsdb_idl_txn *ovnsb_idl_txn, goto fail; } - ls_change = xzalloc(sizeof *ls_change); - ls_change->od = od; - ovs_list_init(&ls_change->added_ports); - ovs_list_init(&ls_change->deleted_ports); - ovs_list_init(&ls_change->updated_ports); - bool updated = false; if (!ls_handle_lsp_changes(ovnsb_idl_txn, changed_ls, - ni, nd, od, ls_change, + ni, nd, od, &trk_nd_changes->trk_ovn_ports, &updated)) { - destroy_tracked_ls_change(ls_change); - free(ls_change); goto fail; } if (updated) { - ovs_list_push_back(&nd->tracked_ls_changes.updated, - &ls_change->list_node); - } else { - free(ls_change); + nd->change_tracked = true; } } - if (!ovs_list_is_empty(&nd->tracked_ls_changes.updated)) { - nd->change_tracked = true; - } - return true; fail: @@ -17856,118 +17852,121 @@ sync_lflows_from_objres(struct ovsdb_idl_txn *ovnsb_txn, return true; } -bool lflow_handle_northd_ls_changes(struct ovsdb_idl_txn *ovnsb_txn, - struct tracked_ls_changes *ls_changes, - struct lflow_input *lflow_input, - struct lflow_data *lflow_data) +bool lflow_handle_northd_changes(struct ovsdb_idl_txn *ovnsb_txn, + struct northd_tracked_data *trk_nd_changes, + struct lflow_input *lflow_input, + struct lflow_data *lflow_data) { - struct ls_change *ls_change; + struct tracked_ovn_ports *trk_ovn_ports = &trk_nd_changes->trk_ovn_ports; - LIST_FOR_EACH (ls_change, list_node, &ls_changes->updated) { - const struct sbrec_multicast_group *sbmc_flood = - mcast_group_lookup(lflow_input->sbrec_mcast_group_by_name_dp, - MC_FLOOD, ls_change->od->sb); - const struct sbrec_multicast_group *sbmc_flood_l2 = - mcast_group_lookup(lflow_input->sbrec_mcast_group_by_name_dp, - MC_FLOOD_L2, ls_change->od->sb); - const struct sbrec_multicast_group *sbmc_unknown = - mcast_group_lookup(lflow_input->sbrec_mcast_group_by_name_dp, - MC_UNKNOWN, ls_change->od->sb); + struct tracked_ovn_port *trk_op; + HMAP_FOR_EACH (trk_op, hmap_node, &trk_ovn_ports->deleted) { + struct ovn_port *op = trk_op->op; - struct ovn_port *op; - LIST_FOR_EACH (op, list, &ls_change->deleted_ports) { - struct resource_to_objects_node *res_node = + struct resource_to_objects_node *res_node = objdep_mgr_find_objs(&op->lflow_dep_mgr, OBJDEP_TYPE_LPORT, op->nbsp->name); - /* unlink old lflows. */ - unlink_objres_lflows(res_node, op->od, lflow_data, - &op->lflow_dep_mgr); - sync_lflows_from_objres(ovnsb_txn, res_node, lflow_input, - lflow_data, &op->lflow_dep_mgr); - objdep_mgr_clear(&op->lflow_dep_mgr); + /* unlink old lflows. */ + unlink_objres_lflows(res_node, op->od, lflow_data, + &op->lflow_dep_mgr); + sync_lflows_from_objres(ovnsb_txn, res_node, lflow_input, + lflow_data, &op->lflow_dep_mgr); + objdep_mgr_clear(&op->lflow_dep_mgr); - /* No need to update SB multicast groups, thanks to weak - * references. */ - } + /* No need to update SB multicast groups, thanks to weak + * references. */ + } - LIST_FOR_EACH (op, list, &ls_change->updated_ports) { - struct resource_to_objects_node *res_node = - objdep_mgr_find_objs(&op->lflow_dep_mgr, OBJDEP_TYPE_LPORT, - op->nbsp->name); + HMAP_FOR_EACH (trk_op, hmap_node, &trk_ovn_ports->updated) { + struct ovn_port *op = trk_op->op; - /* unlink old lflows. */ - unlink_objres_lflows(res_node, op->od, - lflow_data, &op->lflow_dep_mgr); - - /* Generate new lflows. */ - struct ds match = DS_EMPTY_INITIALIZER; - struct ds actions = DS_EMPTY_INITIALIZER; - build_lswitch_and_lrouter_iterate_by_lsp(op, lflow_input->ls_ports, - lflow_input->lr_ports, - lflow_input->meter_groups, - &match, &actions, - lflow_data); - ds_destroy(&match); - ds_destroy(&actions); - - /* SB port_binding is not deleted, so don't update SB multicast - * groups. */ - - /* Sync the new flows to SB. */ - res_node = objdep_mgr_find_objs(&op->lflow_dep_mgr, - OBJDEP_TYPE_LPORT, - op->nbsp->name); - sync_lflows_from_objres(ovnsb_txn, res_node, lflow_input, - lflow_data, &op->lflow_dep_mgr); - } - - LIST_FOR_EACH (op, list, &ls_change->added_ports) { - struct ds match = DS_EMPTY_INITIALIZER; - struct ds actions = DS_EMPTY_INITIALIZER; - build_lswitch_and_lrouter_iterate_by_lsp(op, lflow_input->ls_ports, - lflow_input->lr_ports, - lflow_input->meter_groups, - &match, &actions, - lflow_data); - ds_destroy(&match); - ds_destroy(&actions); - - /* Update SB multicast groups for the new port. */ - if (!sbmc_flood) { - sbmc_flood = create_sb_multicast_group(ovnsb_txn, - ls_change->od->sb, MC_FLOOD, OVN_MCAST_FLOOD_TUNNEL_KEY); - } - sbrec_multicast_group_update_ports_addvalue(sbmc_flood, op->sb); + struct resource_to_objects_node *res_node = + objdep_mgr_find_objs(&op->lflow_dep_mgr, OBJDEP_TYPE_LPORT, + op->nbsp->name); - if (!sbmc_flood_l2) { - sbmc_flood_l2 = create_sb_multicast_group(ovnsb_txn, - ls_change->od->sb, MC_FLOOD_L2, - OVN_MCAST_FLOOD_L2_TUNNEL_KEY); - } - sbrec_multicast_group_update_ports_addvalue(sbmc_flood_l2, op->sb); + /* unlink old lflows. */ + unlink_objres_lflows(res_node, op->od, + lflow_data, &op->lflow_dep_mgr); - if (op->has_unknown) { - if (!sbmc_unknown) { - sbmc_unknown = create_sb_multicast_group(ovnsb_txn, - ls_change->od->sb, MC_UNKNOWN, - OVN_MCAST_UNKNOWN_TUNNEL_KEY); - } - sbrec_multicast_group_update_ports_addvalue(sbmc_unknown, - op->sb); - } + /* Generate new lflows. */ + struct ds match = DS_EMPTY_INITIALIZER; + struct ds actions = DS_EMPTY_INITIALIZER; + build_lswitch_and_lrouter_iterate_by_lsp(op, lflow_input->ls_ports, + lflow_input->lr_ports, + lflow_input->meter_groups, + &match, &actions, + lflow_data); + ds_destroy(&match); + ds_destroy(&actions); + + /* SB port_binding is not deleted, so don't update SB multicast + * groups. */ + + /* Sync the new flows to SB. */ + res_node = objdep_mgr_find_objs(&op->lflow_dep_mgr, OBJDEP_TYPE_LPORT, + op->nbsp->name); + sync_lflows_from_objres(ovnsb_txn, res_node, lflow_input, + lflow_data, &op->lflow_dep_mgr); + } - /* Sync the newly added flows to SB. */ - struct resource_to_objects_node *res_node; - res_node = objdep_mgr_find_objs(&op->lflow_dep_mgr, - OBJDEP_TYPE_LPORT, - op->nbsp->name); - sync_lflows_from_objres(ovnsb_txn, res_node, lflow_input, - lflow_data, &op->lflow_dep_mgr); + HMAP_FOR_EACH (trk_op, hmap_node, &trk_ovn_ports->created) { + struct ovn_port *op = trk_op->op; + + const struct sbrec_multicast_group *sbmc_flood = + mcast_group_lookup(lflow_input->sbrec_mcast_group_by_name_dp, + MC_FLOOD, op->od->sb); + const struct sbrec_multicast_group *sbmc_flood_l2 = + mcast_group_lookup(lflow_input->sbrec_mcast_group_by_name_dp, + MC_FLOOD_L2, op->od->sb); + const struct sbrec_multicast_group *sbmc_unknown = + mcast_group_lookup(lflow_input->sbrec_mcast_group_by_name_dp, + MC_UNKNOWN, op->od->sb); + + struct ds match = DS_EMPTY_INITIALIZER; + struct ds actions = DS_EMPTY_INITIALIZER; + build_lswitch_and_lrouter_iterate_by_lsp(op, lflow_input->ls_ports, + lflow_input->lr_ports, + lflow_input->meter_groups, + &match, &actions, + lflow_data); + ds_destroy(&match); + ds_destroy(&actions); + + /* Update SB multicast groups for the new port. */ + if (!sbmc_flood) { + sbmc_flood = create_sb_multicast_group(ovnsb_txn, + op->od->sb, MC_FLOOD, OVN_MCAST_FLOOD_TUNNEL_KEY); + } + sbrec_multicast_group_update_ports_addvalue(sbmc_flood, op->sb); + + if (!sbmc_flood_l2) { + sbmc_flood_l2 = create_sb_multicast_group(ovnsb_txn, + op->od->sb, MC_FLOOD_L2, + OVN_MCAST_FLOOD_L2_TUNNEL_KEY); + } + sbrec_multicast_group_update_ports_addvalue(sbmc_flood_l2, op->sb); + + if (op->has_unknown) { + if (!sbmc_unknown) { + sbmc_unknown = create_sb_multicast_group(ovnsb_txn, + op->od->sb, MC_UNKNOWN, + OVN_MCAST_UNKNOWN_TUNNEL_KEY); + } + sbrec_multicast_group_update_ports_addvalue(sbmc_unknown, + op->sb); } + + /* Sync the newly added flows to SB. */ + struct resource_to_objects_node *res_node; + res_node = objdep_mgr_find_objs(&op->lflow_dep_mgr, + OBJDEP_TYPE_LPORT, + op->nbsp->name); + sync_lflows_from_objres(ovnsb_txn, res_node, lflow_input, + lflow_data, &op->lflow_dep_mgr); } - return true; + return true; } /* Each port group in Port_Group table in OVN_Northbound has a corresponding @@ -18848,7 +18847,10 @@ northd_init(struct northd_data *data) sset_init(&data->svc_monitor_lsps); hmap_init(&data->svc_monitor_map); data->change_tracked = false; - ovs_list_init(&data->tracked_ls_changes.updated); + + hmap_init(&data->trk_northd_changes.trk_ovn_ports.created); + hmap_init(&data->trk_northd_changes.trk_ovn_ports.updated); + hmap_init(&data->trk_northd_changes.trk_ovn_ports.deleted); } void @@ -18901,6 +18903,10 @@ northd_destroy(struct northd_data *data) destroy_debug_config(); sset_destroy(&data->svc_monitor_lsps); + + hmap_destroy(&data->trk_northd_changes.trk_ovn_ports.created); + hmap_destroy(&data->trk_northd_changes.trk_ovn_ports.updated); + hmap_destroy(&data->trk_northd_changes.trk_ovn_ports.deleted); } void diff --git a/northd/northd.h b/northd/northd.h index d0992f142e..1634463a67 100644 --- a/northd/northd.h +++ b/northd/northd.h @@ -19,6 +19,7 @@ #include "lib/ovn-sb-idl.h" #include "lib/ovn-util.h" #include "lib/ovs-atomic.h" +#include "lib/hmapx.h" #include "lib/objdep.h" #include "lib/sset.h" #include "northd/ipam.h" @@ -87,21 +88,33 @@ struct ovn_datapaths { struct ovn_datapath **array; }; -/* Track what's changed for a single LS. - * Now only track port changes. */ -struct ls_change { - struct ovs_list list_node; - struct ovn_datapath *od; - struct ovs_list added_ports; - struct ovs_list deleted_ports; - struct ovs_list updated_ports; +/* Represents a tracked ovn_port. */ +struct tracked_ovn_port { + struct hmap_node hmap_node; + struct ovn_port *op; }; -/* Track what's changed for logical switches. - * Now only track updated ones (added or deleted may be supported in the - * future). */ -struct tracked_ls_changes { - struct ovs_list updated; /* Contains struct ls_change */ +struct tracked_ovn_ports { + /* tracked created ports. + * hmap node data is 'struct tracked_ovn_port *' */ + struct hmap created; + + /* tracked updated ports. + * hmap node data is 'struct tracked_ovn_port *' */ + struct hmap updated; + + /* tracked deleted ports. + * hmap node data is 'struct tracked_ovn_port *' */ + struct hmap deleted; +}; + +/* Track what's changed in the northd engine node. + * Now only tracks ovn_ports (of vif type) - created, updated + * and deleted and indicates if load balancers have changed. */ +struct northd_tracked_data { + struct tracked_ovn_ports trk_ovn_ports; + bool lb_changed; /* Indicates if load balancers changed or association of + * load balancer to logical switch/router changed. */ }; struct northd_data { @@ -120,9 +133,7 @@ struct northd_data { struct sset svc_monitor_lsps; struct hmap svc_monitor_map; bool change_tracked; - struct tracked_ls_changes tracked_ls_changes; - bool lb_changed; /* Indicates if load balancers changed or association of - * load balancer to logical switch/router changed. */ + struct northd_tracked_data trk_northd_changes; }; struct lflow_data { @@ -352,9 +363,9 @@ void northd_indices_create(struct northd_data *data, void build_lflows(struct ovsdb_idl_txn *ovnsb_txn, struct lflow_input *input_data, struct lflow_data *lflow_data); -bool lflow_handle_northd_ls_changes(struct ovsdb_idl_txn *ovnsb_txn, - struct tracked_ls_changes *, - struct lflow_input *, struct lflow_data *); +bool lflow_handle_northd_changes(struct ovsdb_idl_txn *ovnsb_txn, + struct northd_tracked_data *, + struct lflow_input *, struct lflow_data *); bool northd_handle_sb_port_binding_changes( const struct sbrec_port_binding_table *, struct hmap *ls_ports);