On Thu, Aug 10, 2023 at 5:45 AM Dumitru Ceara <dce...@redhat.com> wrote: > > No functional differences in this commit, just abstract out the > processing a bit. > > Signed-off-by: Dumitru Ceara <dce...@redhat.com> > --- > northd/automake.mk | 2 > northd/en-port-group.c | 237 ++++++++++++++++++++++++++++++++++++++++++++++ > northd/en-port-group.h | 63 ++++++++++++ > northd/northd.c | 246 ++++++++---------------------------------------- > northd/northd.h | 26 +---- > 5 files changed, 350 insertions(+), 224 deletions(-) > create mode 100644 northd/en-port-group.c > create mode 100644 northd/en-port-group.h > > diff --git a/northd/automake.mk b/northd/automake.mk > index b17f1fdb54..0fc634b4b4 100644 > --- a/northd/automake.mk > +++ b/northd/automake.mk > @@ -14,6 +14,8 @@ northd_ovn_northd_SOURCES = \ > northd/en-lflow.h \ > northd/en-northd-output.c \ > northd/en-northd-output.h \ > + northd/en-port-group.c \ > + northd/en-port-group.h \ > northd/en-sync-sb.c \ > northd/en-sync-sb.h \ > northd/en-sync-from-sb.c \ > diff --git a/northd/en-port-group.c b/northd/en-port-group.c > new file mode 100644 > index 0000000000..b83926c351 > --- /dev/null > +++ b/northd/en-port-group.c > @@ -0,0 +1,237 @@ > +/* > + * Copyright (c) 2023, Red Hat, Inc. > + * > + * Licensed under the Apache License, Version 2.0 (the "License"); > + * you may not use this file except in compliance with the License. > + * You may obtain a copy of the License at: > + * > + * http://www.apache.org/licenses/LICENSE-2.0 > + * > + * Unless required by applicable law or agreed to in writing, software > + * distributed under the License is distributed on an "AS IS" BASIS, > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. > + * See the License for the specific language governing permissions and > + * limitations under the License. > + */ > + > +#include <config.h> > + > +#include "openvswitch/vlog.h" > + > +#include "en-port-group.h" > +#include "northd.h" > + > +VLOG_DEFINE_THIS_MODULE(en_port_group); > + > +static struct ls_port_group *ls_port_group_create( > + struct ls_port_group_table *, > + const struct nbrec_logical_switch *, > + const struct sbrec_datapath_binding *); > + > +static void ls_port_group_destroy(struct ls_port_group_table *, > + struct ls_port_group *); > + > +static struct ls_port_group_record *ls_port_group_record_add( > + struct ls_port_group *, > + const struct nbrec_port_group *, > + const char *port_name); > + > +static void ls_port_group_record_destroy( > + struct ls_port_group *, > + struct ls_port_group_record *); > + > +void > +ls_port_group_table_init(struct ls_port_group_table *table) > +{ > + *table = (struct ls_port_group_table) { > + .entries = HMAP_INITIALIZER(&table->entries), > + }; > +} > + > +void > +ls_port_group_table_clear(struct ls_port_group_table *table) > +{ > + struct ls_port_group *ls_pg; > + HMAP_FOR_EACH_SAFE (ls_pg, key_node, &table->entries) { > + ls_port_group_destroy(table, ls_pg); > + } > +} > + > +void > +ls_port_group_table_destroy(struct ls_port_group_table *table) > +{ > + ls_port_group_table_clear(table); > + hmap_destroy(&table->entries); > +} > + > +struct ls_port_group * > +ls_port_group_table_find(const struct ls_port_group_table *table, > + const struct nbrec_logical_switch *nbs) > +{ > + struct ls_port_group *ls_pg; > + > + HMAP_FOR_EACH_WITH_HASH (ls_pg, key_node, uuid_hash(&nbs->header_.uuid), > + &table->entries) { > + if (nbs == ls_pg->nbs) { > + return ls_pg; > + } > + } > + return NULL; > +} > + > +void > +ls_port_group_table_build(struct ls_port_group_table *ls_port_groups, > + const struct nbrec_port_group_table *pg_table, > + const struct hmap *ls_ports) > +{ > + const struct nbrec_port_group *nb_pg; > + NBREC_PORT_GROUP_TABLE_FOR_EACH (nb_pg, pg_table) { > + for (size_t i = 0; i < nb_pg->n_ports; i++) { > + const char *port_name = nb_pg->ports[i]->name; > + const struct ovn_datapath *od = > + northd_get_datapath_for_port(ls_ports, port_name); > + > + if (!od) { > + static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1); > + VLOG_ERR_RL(&rl, "lport %s in port group %s not found.", > + port_name, nb_pg->name); > + continue; > + } > + > + if (!od->nbs) { > + static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1); > + VLOG_WARN_RL(&rl, "lport %s in port group %s has no lswitch.", > + nb_pg->ports[i]->name, > + nb_pg->name); > + continue; > + } > + > + struct ls_port_group *ls_pg = > + ls_port_group_table_find(ls_port_groups, od->nbs); > + if (!ls_pg) { > + ls_pg = ls_port_group_create(ls_port_groups, od->nbs, od->sb); > + } > + ls_port_group_record_add(ls_pg, nb_pg, port_name); > + } > + } > +} > + > +/* Each port group in Port_Group table in OVN_Northbound has a corresponding > + * entry in Port_Group table in OVN_Southbound. In OVN_Northbound the entries > + * contains lport uuids, while in OVN_Southbound we store the lport names. > + */ > +void > +ls_port_group_table_sync( > + const struct ls_port_group_table *ls_port_groups, > + const struct sbrec_port_group_table *sbrec_port_group_table, > + struct ovsdb_idl_txn *ovnsb_txn) > +{ > + 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, sbrec_port_group_table) { > + shash_add(&sb_port_groups, sb_port_group->name, sb_port_group); > + } > + > + struct ds sb_name = DS_EMPTY_INITIALIZER; > + > + struct ls_port_group *ls_pg; > + HMAP_FOR_EACH (ls_pg, key_node, &ls_port_groups->entries) { > + struct ls_port_group_record *ls_pg_rec; > + > + HMAP_FOR_EACH (ls_pg_rec, key_node, &ls_pg->nb_pgs) { > + get_sb_port_group_name(ls_pg_rec->nb_pg->name, > + ls_pg->sb_datapath_key, > + &sb_name); > + sb_port_group = shash_find_and_delete(&sb_port_groups, > + ds_cstr(&sb_name)); > + if (!sb_port_group) { > + sb_port_group = sbrec_port_group_insert(ovnsb_txn); > + sbrec_port_group_set_name(sb_port_group, ds_cstr(&sb_name)); > + } > + > + const char **nb_port_names = sset_array(&ls_pg_rec->ports); > + sbrec_port_group_set_ports(sb_port_group, > + nb_port_names, > + sset_count(&ls_pg_rec->ports)); > + free(nb_port_names); > + } > + } > + ds_destroy(&sb_name); > + > + struct shash_node *node; > + SHASH_FOR_EACH_SAFE (node, &sb_port_groups) { > + sbrec_port_group_delete(node->data); > + shash_delete(&sb_port_groups, node); > + } > + shash_destroy(&sb_port_groups); > +} > + > +static struct ls_port_group * > +ls_port_group_create(struct ls_port_group_table *ls_port_groups, > + const struct nbrec_logical_switch *nbs, > + const struct sbrec_datapath_binding *dp) > +{ > + struct ls_port_group *ls_pg = xmalloc(sizeof *ls_pg); > + > + *ls_pg = (struct ls_port_group) { > + .nbs = nbs, > + .sb_datapath_key = dp->tunnel_key, > + .nb_pgs = HMAP_INITIALIZER(&ls_pg->nb_pgs), > + }; > + hmap_insert(&ls_port_groups->entries, &ls_pg->key_node, > + uuid_hash(&nbs->header_.uuid)); > + return ls_pg; > +} > + > +static void > +ls_port_group_destroy(struct ls_port_group_table *ls_port_groups, > + struct ls_port_group *ls_pg) > +{ > + if (ls_pg) { > + struct ls_port_group_record *ls_pg_rec; > + HMAP_FOR_EACH_SAFE (ls_pg_rec, key_node, &ls_pg->nb_pgs) { > + ls_port_group_record_destroy(ls_pg, ls_pg_rec); > + } > + hmap_destroy(&ls_pg->nb_pgs); > + hmap_remove(&ls_port_groups->entries, &ls_pg->key_node); > + free(ls_pg); > + } > +} > + > +static struct ls_port_group_record * > +ls_port_group_record_add(struct ls_port_group *ls_pg, > + const struct nbrec_port_group *nb_pg, > + const char *port_name) > +{ > + struct ls_port_group_record *ls_pg_rec = NULL; > + size_t hash = uuid_hash(&nb_pg->header_.uuid); > + > + HMAP_FOR_EACH_WITH_HASH (ls_pg_rec, key_node, hash, &ls_pg->nb_pgs) { > + if (ls_pg_rec->nb_pg == nb_pg) { > + goto done; > + } > + } > + > + ls_pg_rec = xzalloc(sizeof *ls_pg_rec); > + *ls_pg_rec = (struct ls_port_group_record) { > + .nb_pg = nb_pg, > + .ports = SSET_INITIALIZER(&ls_pg_rec->ports), > + }; > + hmap_insert(&ls_pg->nb_pgs, &ls_pg_rec->key_node, hash); > +done: > + sset_add(&ls_pg_rec->ports, port_name); > + return ls_pg_rec; > +} > + > +static void > +ls_port_group_record_destroy(struct ls_port_group *ls_pg, > + struct ls_port_group_record *ls_pg_rec) > +{ > + if (ls_pg_rec) { > + hmap_remove(&ls_pg->nb_pgs, &ls_pg_rec->key_node); > + sset_destroy(&ls_pg_rec->ports); > + free(ls_pg_rec); > + } > +} > + > diff --git a/northd/en-port-group.h b/northd/en-port-group.h > new file mode 100644 > index 0000000000..2c8e01f51f > --- /dev/null > +++ b/northd/en-port-group.h > @@ -0,0 +1,63 @@ > +/* > + * Copyright (c) 2023, Red Hat, Inc. > + * > + * Licensed under the Apache License, Version 2.0 (the "License"); > + * you may not use this file except in compliance with the License. > + * You may obtain a copy of the License at: > + * > + * http://www.apache.org/licenses/LICENSE-2.0 > + * > + * Unless required by applicable law or agreed to in writing, software > + * distributed under the License is distributed on an "AS IS" BASIS, > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. > + * See the License for the specific language governing permissions and > + * limitations under the License. > + */ > +#ifndef EN_PORT_GROUP_H > +#define EN_PORT_GROUP_H 1 > + > +#include <stdint.h> > + > +#include "lib/inc-proc-eng.h" > +#include "lib/ovn-nb-idl.h" > +#include "lib/ovn-sb-idl.h" > +#include "openvswitch/hmap.h" > + > +#include "sset.h" > + > +/* Per logical switch port group information. */ > +struct ls_port_group_table { > + struct hmap entries; /* Stores struct ls_port_group. */ > +}; > + > +struct ls_port_group { > + struct hmap_node key_node; /* Index on 'nbs->header_.uuid'. */ > + > + const struct nbrec_logical_switch *nbs; > + int64_t sb_datapath_key; /* SB.Datapath_Binding.tunnel_key. */ > + > + /* Port groups with ports attached to 'nbs'. */ > + struct hmap nb_pgs; /* Stores struct ls_port_group_record. */ > +}; > + > +struct ls_port_group_record { > + struct hmap_node key_node; /* Index on 'nb_pg->header_.uuid'. */ > + > + const struct nbrec_port_group *nb_pg; > + struct sset ports; /* Subset of 'nb_pg' ports in this record. */ > +}; > + > +void ls_port_group_table_init(struct ls_port_group_table *); > +void ls_port_group_table_clear(struct ls_port_group_table *); > +void ls_port_group_table_destroy(struct ls_port_group_table *); > +struct ls_port_group *ls_port_group_table_find( > + const struct ls_port_group_table *, > + const struct nbrec_logical_switch *); > + > +void ls_port_group_table_build(struct ls_port_group_table *ls_port_groups, > + const struct nbrec_port_group_table *, > + const struct hmap *ls_ports); > +void ls_port_group_table_sync(const struct ls_port_group_table *ls_port_groups, > + const struct sbrec_port_group_table *, > + struct ovsdb_idl_txn *ovnsb_txn); > +#endif /* EN_PORT_GROUP_H */ > diff --git a/northd/northd.c b/northd/northd.c > index 73fab3af7e..04da75fa96 100644 > --- a/northd/northd.c > +++ b/northd/northd.c > @@ -21,6 +21,7 @@ > #include "bitmap.h" > #include "coverage.h" > #include "dirs.h" > +#include "en-port-group.h" > #include "ipam.h" > #include "openvswitch/dynamic-string.h" > #include "hash.h" > @@ -6237,89 +6238,6 @@ build_dhcpv6_action(struct ovn_port *op, struct in6_addr *offer_ip, > return true; > } > > -static struct ls_port_group_record * > -ls_port_group_record_add(struct hmap *nb_pgs, > - const struct nbrec_port_group *nb_pg, > - const char *port_name) > -{ > - struct ls_port_group_record *ls_pg_rec = NULL; > - size_t hash = uuid_hash(&nb_pg->header_.uuid); > - > - HMAP_FOR_EACH_WITH_HASH (ls_pg_rec, key_node, hash, nb_pgs) { > - if (ls_pg_rec->nb_pg == nb_pg) { > - goto done; > - } > - } > - > - ls_pg_rec = xzalloc(sizeof *ls_pg_rec); > - *ls_pg_rec = (struct ls_port_group_record) { > - .nb_pg = nb_pg, > - .ports = SSET_INITIALIZER(&ls_pg_rec->ports), > - }; > - hmap_insert(nb_pgs, &ls_pg_rec->key_node, hash); > -done: > - sset_add(&ls_pg_rec->ports, port_name); > - return ls_pg_rec; > -} > - > -static void > -ls_port_group_record_destroy(struct hmap *nb_pgs, > - struct ls_port_group_record *ls_pg_rec) > -{ > - if (ls_pg_rec) { > - hmap_remove(nb_pgs, &ls_pg_rec->key_node); > - sset_destroy(&ls_pg_rec->ports); > - free(ls_pg_rec); > - } > -} > - > - > -static struct ls_port_group * > -ls_port_group_create(struct hmap *ls_port_groups, > - const struct nbrec_logical_switch *nbs, > - const struct sbrec_datapath_binding *dp) > -{ > - struct ls_port_group *ls_pg = xmalloc(sizeof *ls_pg); > - > - *ls_pg = (struct ls_port_group) { > - .nbs = nbs, > - .sb_datapath_key = dp->tunnel_key, > - .nb_pgs = HMAP_INITIALIZER(&ls_pg->nb_pgs), > - }; > - hmap_insert(ls_port_groups, &ls_pg->key_node, > - uuid_hash(&nbs->header_.uuid)); > - return ls_pg; > -} > - > -static void > -ls_port_group_destroy(struct hmap *ls_port_groups, struct ls_port_group *ls_pg) > -{ > - if (ls_pg) { > - struct ls_port_group_record *ls_pg_rec; > - HMAP_FOR_EACH_SAFE (ls_pg_rec, key_node, &ls_pg->nb_pgs) { > - ls_port_group_record_destroy(&ls_pg->nb_pgs, ls_pg_rec); > - } > - hmap_destroy(&ls_pg->nb_pgs); > - hmap_remove(ls_port_groups, &ls_pg->key_node); > - free(ls_pg); > - } > -} > - > -static struct ls_port_group * > -ls_port_group_find(const struct hmap *ls_port_groups, > - const struct nbrec_logical_switch *nbs) > -{ > - struct ls_port_group *ls_pg; > - > - HMAP_FOR_EACH_WITH_HASH (ls_pg, key_node, uuid_hash(&nbs->header_.uuid), > - ls_port_groups) { > - if (nbs == ls_pg->nbs) { > - return ls_pg; > - } > - } > - return NULL; > -} > - > static bool > od_set_acl_flags(struct ovn_datapath *od, struct nbrec_acl **acls, > size_t n_acls) > @@ -6351,7 +6269,8 @@ od_set_acl_flags(struct ovn_datapath *od, struct nbrec_acl **acls, > } > > static void > -ls_get_acl_flags(struct ovn_datapath *od, const struct hmap *ls_port_groups) > +ls_get_acl_flags(struct ovn_datapath *od, > + const struct ls_port_group_table *ls_port_groups) > { > od->has_acls = false; > od->has_stateful_acl = false; > @@ -6361,15 +6280,13 @@ ls_get_acl_flags(struct ovn_datapath *od, const struct hmap *ls_port_groups) > return; > } > > - const struct ls_port_group *ls_pg; > - > - ls_pg = ls_port_group_find(ls_port_groups, od->nbs); > + const struct ls_port_group *ls_pg = > + ls_port_group_table_find(ls_port_groups, od->nbs); > if (!ls_pg) { > return; > } > > - > - struct ls_port_group_record *ls_pg_rec; > + const struct ls_port_group_record *ls_pg_rec; > HMAP_FOR_EACH (ls_pg_rec, key_node, &ls_pg->nb_pgs) { > if (od_set_acl_flags(od, ls_pg_rec->nb_pg->acls, > ls_pg_rec->nb_pg->n_acls)) { > @@ -6578,7 +6495,7 @@ build_stateless_filter(struct ovn_datapath *od, > > static void > build_stateless_filters(struct ovn_datapath *od, > - const struct hmap *ls_port_groups, > + const struct ls_port_group_table *ls_port_groups, > struct hmap *lflows) > { > for (size_t i = 0; i < od->nbs->n_acls; i++) { > @@ -6588,8 +6505,8 @@ build_stateless_filters(struct ovn_datapath *od, > } > } > > - const struct ls_port_group *ls_pg = ls_port_group_find(ls_port_groups, > - od->nbs); > + const struct ls_port_group *ls_pg = > + ls_port_group_table_find(ls_port_groups, od->nbs); > if (!ls_pg) { > return; > } > @@ -6607,7 +6524,8 @@ build_stateless_filters(struct ovn_datapath *od, > } > > static void > -build_pre_acls(struct ovn_datapath *od, const struct hmap *ls_port_groups, > +build_pre_acls(struct ovn_datapath *od, > + const struct ls_port_group_table *ls_port_groups, > struct hmap *lflows) > { > /* Ingress and Egress Pre-ACL Table (Priority 0): Packets are > @@ -7301,44 +7219,6 @@ ovn_update_ipv6_options(struct hmap *lr_ports) > } > } > > -static void > -build_port_group_lswitches( > - const struct nbrec_port_group_table *nbrec_port_group_table, > - struct hmap *ls_pgs, struct hmap *ls_ports) > -{ > - hmap_init(ls_pgs); > - > - const struct nbrec_port_group *nb_pg; > - NBREC_PORT_GROUP_TABLE_FOR_EACH (nb_pg, nbrec_port_group_table) { > - for (size_t i = 0; i < nb_pg->n_ports; i++) { > - struct ovn_port *op = ovn_port_find(ls_ports, > - nb_pg->ports[i]->name); > - if (!op) { > - static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1); > - VLOG_ERR_RL(&rl, "lport %s in port group %s not found.", > - nb_pg->ports[i]->name, > - nb_pg->name); > - continue; > - } > - > - if (!op->od->nbs) { > - static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1); > - VLOG_WARN_RL(&rl, "lport %s in port group %s has no lswitch.", > - nb_pg->ports[i]->name, > - nb_pg->name); > - continue; > - } > - > - struct ls_port_group *ls_pg = > - ls_port_group_find(ls_pgs, op->od->nbs); > - if (!ls_pg) { > - ls_pg = ls_port_group_create(ls_pgs, op->od->nbs, op->od->sb); > - } > - ls_port_group_record_add(&ls_pg->nb_pgs, nb_pg, op->key); > - } > - } > -} > - > #define IPV6_CT_OMIT_MATCH "nd || nd_ra || nd_rs || mldv1 || mldv2" > > static void > @@ -7491,7 +7371,8 @@ build_acl_log_related_flows(struct ovn_datapath *od, struct hmap *lflows, > > static void > build_acls(struct ovn_datapath *od, const struct chassis_features *features, > - struct hmap *lflows, const struct hmap *ls_port_groups, > + struct hmap *lflows, > + const struct ls_port_group_table *ls_port_groups, > const struct shash *meter_groups) > { > const char *default_acl_action = default_acl_drop > @@ -7678,8 +7559,8 @@ build_acls(struct ovn_datapath *od, const struct chassis_features *features, > meter_groups, &match, &actions); > } > > - const struct ls_port_group *ls_pg = ls_port_group_find(ls_port_groups, > - od->nbs); > + const struct ls_port_group *ls_pg = > + ls_port_group_table_find(ls_port_groups, od->nbs); > if (ls_pg) { > const struct ls_port_group_record *ls_pg_rec; > HMAP_FOR_EACH (ls_pg_rec, key_node, &ls_pg->nb_pgs) { > @@ -9188,11 +9069,12 @@ build_lswitch_lflows_l2_unknown(struct ovn_datapath *od, > /* Build pre-ACL and ACL tables for both ingress and egress. > * Ingress tables 3 through 10. Egress tables 0 through 7. */ > static void > -build_lswitch_lflows_pre_acl_and_acl(struct ovn_datapath *od, > - const struct hmap *ls_port_groups, > - const struct chassis_features *features, > - struct hmap *lflows, > - const struct shash *meter_groups) > +build_lswitch_lflows_pre_acl_and_acl( > + struct ovn_datapath *od, > + const struct ls_port_group_table *ls_port_groups, > + const struct chassis_features *features, > + struct hmap *lflows, > + const struct shash *meter_groups) > { > ovs_assert(od->nbs); > ls_get_acl_flags(od, ls_port_groups); > @@ -15502,7 +15384,7 @@ struct lswitch_flow_build_info { > const struct ovn_datapaths *lr_datapaths; > const struct hmap *ls_ports; > const struct hmap *lr_ports; > - const struct hmap *ls_port_groups; > + const struct ls_port_group_table *ls_port_groups; > struct hmap *lflows; > struct hmap *igmp_groups; > const struct shash *meter_groups; > @@ -15800,7 +15682,7 @@ build_lswitch_and_lrouter_flows(const struct ovn_datapaths *ls_datapaths, > const struct ovn_datapaths *lr_datapaths, > const struct hmap *ls_ports, > const struct hmap *lr_ports, > - const struct hmap *ls_port_groups, > + const struct ls_port_group_table *ls_pgs, > struct hmap *lflows, > struct hmap *igmp_groups, > const struct shash *meter_groups, > @@ -15828,7 +15710,7 @@ build_lswitch_and_lrouter_flows(const struct ovn_datapaths *ls_datapaths, > lsiv[index].lr_datapaths = lr_datapaths; > lsiv[index].ls_ports = ls_ports; > lsiv[index].lr_ports = lr_ports; > - lsiv[index].ls_port_groups = ls_port_groups; > + lsiv[index].ls_port_groups = ls_pgs; > lsiv[index].igmp_groups = igmp_groups; > lsiv[index].meter_groups = meter_groups; > lsiv[index].lbs = lbs; > @@ -15861,7 +15743,7 @@ build_lswitch_and_lrouter_flows(const struct ovn_datapaths *ls_datapaths, > .lr_datapaths = lr_datapaths, > .ls_ports = ls_ports, > .lr_ports = lr_ports, > - .ls_port_groups = ls_port_groups, > + .ls_port_groups = ls_pgs, > .lflows = lflows, > .igmp_groups = igmp_groups, > .meter_groups = meter_groups, > @@ -16546,56 +16428,6 @@ bool lflow_handle_northd_ls_changes(struct ovsdb_idl_txn *ovnsb_txn, > > } > > -/* Each port group in Port_Group table in OVN_Northbound has a corresponding > - * entry in Port_Group table in OVN_Southbound. In OVN_Northbound the entries > - * contains lport uuids, while in OVN_Southbound we store the lport names. > - */ > -static void > -sync_port_groups(struct ovsdb_idl_txn *ovnsb_txn, > - const struct sbrec_port_group_table *sbrec_port_group_table, > - struct hmap *ls_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, sbrec_port_group_table) { > - shash_add(&sb_port_groups, sb_port_group->name, sb_port_group); > - } > - > - struct ds sb_name = DS_EMPTY_INITIALIZER; > - > - struct ls_port_group *ls_pg; > - HMAP_FOR_EACH (ls_pg, key_node, ls_pgs) { > - struct ls_port_group_record *ls_pg_rec; > - > - HMAP_FOR_EACH (ls_pg_rec, key_node, &ls_pg->nb_pgs) { > - get_sb_port_group_name(ls_pg_rec->nb_pg->name, > - ls_pg->sb_datapath_key, > - &sb_name); > - sb_port_group = shash_find_and_delete(&sb_port_groups, > - ds_cstr(&sb_name)); > - if (!sb_port_group) { > - sb_port_group = sbrec_port_group_insert(ovnsb_txn); > - sbrec_port_group_set_name(sb_port_group, ds_cstr(&sb_name)); > - } > - > - const char **nb_port_names = sset_array(&ls_pg_rec->ports); > - sbrec_port_group_set_ports(sb_port_group, > - nb_port_names, > - sset_count(&ls_pg_rec->ports)); > - free(nb_port_names); > - } > - } > - ds_destroy(&sb_name); > - > - struct shash_node *node; > - SHASH_FOR_EACH_SAFE (node, &sb_port_groups) { > - sbrec_port_group_delete(node->data); > - shash_delete(&sb_port_groups, node); > - } > - shash_destroy(&sb_port_groups); > -} > - > struct band_entry { > int64_t rate; > int64_t burst_size; > @@ -17406,7 +17238,7 @@ northd_init(struct northd_data *data) > ovn_datapaths_init(&data->lr_datapaths); > hmap_init(&data->ls_ports); > hmap_init(&data->lr_ports); > - hmap_init(&data->ls_port_groups); > + ls_port_group_table_init(&data->ls_port_groups); > shash_init(&data->meter_groups); > hmap_init(&data->lbs); > hmap_init(&data->lb_groups); > @@ -17438,11 +17270,7 @@ northd_destroy(struct northd_data *data) > } > hmap_destroy(&data->lb_groups); > > - struct ls_port_group *ls_pg; > - HMAP_FOR_EACH_SAFE (ls_pg, key_node, &data->ls_port_groups) { > - ls_port_group_destroy(&data->ls_port_groups, ls_pg); > - } > - hmap_destroy(&data->ls_port_groups); > + ls_port_group_table_destroy(&data->ls_port_groups); > > struct shash_node *node; > SHASH_FOR_EACH_SAFE (node, &data->meter_groups) { > @@ -17582,9 +17410,9 @@ ovnnb_db_run(struct northd_input *input_data, > ods_size(&data->ls_datapaths), > ods_size(&data->lr_datapaths)); > build_ipam(&data->ls_datapaths.datapaths, &data->ls_ports); > - build_port_group_lswitches(input_data->nbrec_port_group_table, > - &data->ls_port_groups, > - &data->ls_ports); > + ls_port_group_table_build(&data->ls_port_groups, > + input_data->nbrec_port_group_table, > + &data->ls_ports); > build_lrouter_groups(&data->lr_ports, &data->lr_list); > build_ip_mcast(ovnsb_txn, input_data->sbrec_ip_multicast_table, > input_data->sbrec_ip_mcast_by_dp, > @@ -17602,8 +17430,9 @@ ovnnb_db_run(struct northd_input *input_data, > > 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->ls_port_groups); > + ls_port_group_table_sync(&data->ls_port_groups, > + input_data->sbrec_port_group_table, > + ovnsb_txn); > sync_meters(ovnsb_txn, input_data->nbrec_meter_table, > input_data->nbrec_acl_table, input_data->sbrec_meter_table, > &data->meter_groups); > @@ -17898,3 +17727,12 @@ northd_get_svc_monitor_mac(void) > { > return svc_monitor_mac; > } > + > +const struct ovn_datapath * > +northd_get_datapath_for_port(const struct hmap *ls_ports, > + const char *port_name) > +{ > + const struct ovn_port *op = ovn_port_find(ls_ports, port_name); > + > + return op ? op->od : NULL; > +} > diff --git a/northd/northd.h b/northd/northd.h > index 38bc7f50f1..da93a7c6a5 100644 > --- a/northd/northd.h > +++ b/northd/northd.h > @@ -19,6 +19,7 @@ > #include "lib/ovn-util.h" > #include "lib/ovs-atomic.h" > #include "lib/sset.h" > +#include "northd/en-port-group.h" > #include "northd/ipam.h" > #include "openvswitch/hmap.h" > > @@ -108,7 +109,7 @@ struct northd_data { > struct ovn_datapaths lr_datapaths; > struct hmap ls_ports; > struct hmap lr_ports; > - struct hmap ls_port_groups; /* Stores struct ls_port_group. */ > + struct ls_port_group_table ls_port_groups; > struct shash meter_groups; > struct hmap lbs; > struct hmap lb_groups; > @@ -144,7 +145,7 @@ struct lflow_input { > const struct ovn_datapaths *lr_datapaths; > const struct hmap *ls_ports; > const struct hmap *lr_ports; > - const struct hmap *ls_port_groups; > + const struct ls_port_group_table *ls_port_groups; > const struct shash *meter_groups; > const struct hmap *lbs; > const struct hmap *bfd_connections; > @@ -314,24 +315,6 @@ struct ovn_datapath { > struct hmap ports; > }; > > -/* Per logical switch port group information. */ > -struct ls_port_group { > - struct hmap_node key_node; /* Index on 'nbs->header_.uuid'. */ > - > - const struct nbrec_logical_switch *nbs; > - int64_t sb_datapath_key; /* SB.Datapath_Binding.tunnel_key. */ > - > - /* Port groups with ports attached to 'nbs'. */ > - struct hmap nb_pgs; /* Stores struct ls_port_group_record. */ > -}; > - > -struct ls_port_group_record { > - struct hmap_node key_node; /* Index on 'nb_pg->header_.uuid'. */ > - > - const struct nbrec_port_group *nb_pg; > - struct sset ports; /* Subset of 'nb_pg' ports in this record. */ > -}; > - > void ovnnb_db_run(struct northd_input *input_data, > struct northd_data *data, > struct ovsdb_idl_txn *ovnnb_txn, > @@ -369,4 +352,7 @@ void bfd_cleanup_connections(const struct nbrec_bfd_table *, > void run_update_worker_pool(int n_threads); > > const char *northd_get_svc_monitor_mac(void); > + > +const struct ovn_datapath *northd_get_datapath_for_port( > + const struct hmap *ls_ports, const char *port_name); > #endif /* NORTHD_H */ >
Acked-by: Han Zhou <hz...@ovn.org> _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev