On Mon, Jul 29, 2024 at 2:41 AM Ales Musil <[email protected]> wrote:
>
> In order to be able to store CT limits for specified zone, store the
> zone inside separate struct instead of simap. This allows to add
> the addition of limit without changing the whole infrastructure again.
>
> This is a preparation step for the CT zone limits.
>
> Acked-by: Mark Michelson <[email protected]>
> Signed-off-by: Ales Musil <[email protected]>
> ---
> v7: Rebase on top of latest main.
> v6: Rebase on top of latest main.
> Add ack from Mark.
> v5: Rebase on top of latest main.
> Address comments from Dumitru:
> Remove the CT_ZONE_STATE_NEW enum variant.
> Add wrappers for ct_zone_ctx_init/destroy().
> v4: Rebase on top of latest main.
> Address comments from Lorenzo.
> v3: Rebase on top of latest main.
> v2: Fix NULL ptr deref.
> ---
> controller/ct-zone.c | 195 ++++++++++++++++++++++--------------
> controller/ct-zone.h | 13 ++-
> controller/ofctrl.c | 2 +-
> controller/ovn-controller.c | 17 ++--
> controller/physical.c | 17 ++--
> controller/physical.h | 2 +-
> 6 files changed, 147 insertions(+), 99 deletions(-)
>
> diff --git a/controller/ct-zone.c b/controller/ct-zone.c
> index c80562e4b..f19883831 100644
> --- a/controller/ct-zone.c
> +++ b/controller/ct-zone.c
> @@ -28,13 +28,29 @@ ct_zone_restore(const struct sbrec_datapath_binding_table
> *dp_table,
> struct ct_zone_ctx *ctx, const char *name, int zone);
> static void ct_zone_add_pending(struct shash *pending_ct_zones,
> enum ct_zone_pending_state state,
> - int zone, bool add, const char *name);
> + struct ct_zone *zone, bool add,
> + const char *name);
> static int ct_zone_get_snat(const struct sbrec_datapath_binding *dp);
> static bool ct_zone_assign_unused(struct ct_zone_ctx *ctx,
> const char *zone_name,
> int *scan_start, int scan_stop);
> -static bool ct_zone_remove(struct ct_zone_ctx *ctx,
> - struct simap_node *ct_zone);
> +static bool ct_zone_remove(struct ct_zone_ctx *ctx, const char *name);
> +static void ct_zone_add(struct ct_zone_ctx *ctx, const char *name,
> + uint16_t zone, bool set_pending);
> +
> +void
> +ct_zone_ctx_init(struct ct_zone_ctx *ctx)
> +{
> + shash_init(&ctx->pending);
> + shash_init(&ctx->current);
> +}
> +
> +void
> +ct_zone_ctx_destroy(struct ct_zone_ctx *ctx)
> +{
> + shash_destroy_free_data(&ctx->current);
> + shash_destroy_free_data(&ctx->pending);
> +}
>
> void
> ct_zones_restore(struct ct_zone_ctx *ctx,
> @@ -50,7 +66,8 @@ ct_zones_restore(struct ct_zone_ctx *ctx,
> struct ct_zone_pending_entry *ctpe = pending_node->data;
>
> if (ctpe->add) {
> - ct_zone_restore(dp_table, ctx, pending_node->name, ctpe->zone);
> + ct_zone_restore(dp_table, ctx, pending_node->name,
> + ctpe->ct_zone.zone);
> }
> }
>
> @@ -144,7 +161,6 @@ ct_zones_update(const struct sset *local_lports,
> const struct hmap *local_datapaths, struct ct_zone_ctx *ctx)
> {
> int min_ct_zone, max_ct_zone;
> - struct simap_node *ct_zone;
> const char *user;
> struct sset all_users = SSET_INITIALIZER(&all_users);
> struct simap req_snat_zones = SIMAP_INITIALIZER(&req_snat_zones);
> @@ -186,13 +202,15 @@ ct_zones_update(const struct sset *local_lports,
> ct_zones_parse_range(ovs_table, &min_ct_zone, &max_ct_zone);
>
> /* Delete zones that do not exist in above sset. */
> - SIMAP_FOR_EACH_SAFE (ct_zone, &ctx->current) {
> - if (!sset_contains(&all_users, ct_zone->name) ||
> - ct_zone->data < min_ct_zone || ct_zone->data > max_ct_zone) {
> - ct_zone_remove(ctx, ct_zone);
> - } else if (!simap_find(&req_snat_zones, ct_zone->name)) {
> - bitmap_set1(unreq_snat_zones_map, ct_zone->data);
> - simap_put(&unreq_snat_zones, ct_zone->name, ct_zone->data);
> + struct shash_node *node;
> + SHASH_FOR_EACH_SAFE (node, &ctx->current) {
> + struct ct_zone *ct_zone = node->data;
> + if (!sset_contains(&all_users, node->name) ||
> + ct_zone->zone < min_ct_zone || ct_zone->zone > max_ct_zone) {
> + ct_zone_remove(ctx, node->name);
> + } else if (!simap_find(&req_snat_zones, node->name)) {
> + bitmap_set1(unreq_snat_zones_map, ct_zone->zone);
> + simap_put(&unreq_snat_zones, node->name, ct_zone->zone);
> }
> }
>
> @@ -207,7 +225,7 @@ ct_zones_update(const struct sset *local_lports,
> struct simap_node *unreq_node;
> SIMAP_FOR_EACH_SAFE (unreq_node, &unreq_snat_zones) {
> if (unreq_node->data == snat_req_node->data) {
> - simap_find_and_delete(&ctx->current, unreq_node->name);
> + ct_zone_remove(ctx, unreq_node->name);
> simap_delete(&unreq_snat_zones, unreq_node);
> }
> }
> @@ -218,26 +236,12 @@ ct_zones_update(const struct sset *local_lports,
> bitmap_set0(unreq_snat_zones_map, snat_req_node->data);
> }
>
> - struct simap_node *node = simap_find(&ctx->current,
> - snat_req_node->name);
> - if (node) {
> - if (node->data != snat_req_node->data) {
> - /* Zone request has changed for this node. delete old entry
> and
> - * create new one*/
> - ct_zone_add_pending(&ctx->pending, CT_ZONE_OF_QUEUED,
> - snat_req_node->data, true,
> - snat_req_node->name);
> - bitmap_set0(ctx->bitmap, node->data);
> - }
> - bitmap_set1(ctx->bitmap, snat_req_node->data);
> - node->data = snat_req_node->data;
> - } else {
> - ct_zone_add_pending(&ctx->pending, CT_ZONE_OF_QUEUED,
> - snat_req_node->data, true,
> - snat_req_node->name);
> - bitmap_set1(ctx->bitmap, snat_req_node->data);
> - simap_put(&ctx->current, snat_req_node->name,
> snat_req_node->data);
> + struct ct_zone *ct_zone = shash_find_data(&ctx->current,
> + snat_req_node->name);
> + if (node && ct_zone->zone != snat_req_node->data) {
There is a small bug here.
It should be
if (ct_zone && ct_zone->zone != snat_req_node->data) {
...
...
> + ct_zone_remove(ctx, snat_req_node->name);
> }
> + ct_zone_add(ctx, snat_req_node->name, snat_req_node->data, true);
> }
>
> /* xxx This is wasteful to assign a zone to each port--even if no
> @@ -246,7 +250,7 @@ ct_zones_update(const struct sset *local_lports,
> /* Assign a unique zone id for each logical port and two zones
> * to a gateway router. */
> SSET_FOR_EACH (user, &all_users) {
> - if (simap_contains(&ctx->current, user)) {
> + if (shash_find(&ctx->current, user)) {
> continue;
> }
>
> @@ -277,7 +281,7 @@ ct_zones_commit(const struct ovsrec_bridge *br_int,
>
> char *user_str = xasprintf("ct-zone-%s", iter->name);
> if (ctzpe->add) {
> - char *zone_str = xasprintf("%"PRId32, ctzpe->zone);
> + char *zone_str = xasprintf("%"PRIu16, ctzpe->ct_zone.zone);
> struct smap_node *node =
> smap_get_node(&br_int->external_ids, user_str);
> if (!node || strcmp(node->value, zone_str)) {
> @@ -336,12 +340,17 @@ ct_zone_handle_dp_update(struct ct_zone_ctx *ctx,
> * or not. If so, then fall back to full recompute of
> * ct_zone engine. */
> char *snat_dp_zone_key = alloc_nat_zone_key(name, "snat");
> - struct simap_node *simap_node =
> - simap_find(&ctx->current, snat_dp_zone_key);
> + struct shash_node *node = shash_find(&ctx->current, snat_dp_zone_key);
> free(snat_dp_zone_key);
> - if (!simap_node || simap_node->data != req_snat_zone) {
> - /* There is no entry yet or the requested snat zone has changed.
> - * Trigger full recompute of ct_zones engine. */
> +
> + if (!node) {
> + return false;
> + }
> +
> + struct ct_zone *ct_zone = node->data;
> + if (ct_zone->zone != req_snat_zone) {
> + /* The requested snat zone has changed. Trigger full recompute of
> + * ct_zones engine. */
> return false;
> }
The above code can be simplified.
I did the below changes and applied to main
--------------------------
diff --git a/controller/ct-zone.c b/controller/ct-zone.c
index f19883831c..3fab208245 100644
--- a/controller/ct-zone.c
+++ b/controller/ct-zone.c
@@ -238,7 +238,7 @@ ct_zones_update(const struct sset *local_lports,
struct ct_zone *ct_zone = shash_find_data(&ctx->current,
snat_req_node->name);
- if (node && ct_zone->zone != snat_req_node->data) {
+ if (ct_zone && ct_zone->zone != snat_req_node->data) {
ct_zone_remove(ctx, snat_req_node->name);
}
ct_zone_add(ctx, snat_req_node->name, snat_req_node->data, true);
@@ -340,17 +340,9 @@ ct_zone_handle_dp_update(struct ct_zone_ctx *ctx,
* or not. If so, then fall back to full recompute of
* ct_zone engine. */
char *snat_dp_zone_key = alloc_nat_zone_key(name, "snat");
- struct shash_node *node = shash_find(&ctx->current, snat_dp_zone_key);
+ struct ct_zone *ct_zone = shash_find_data(&ctx->current, snat_dp_zone_key);
free(snat_dp_zone_key);
-
- if (!node) {
- return false;
- }
-
- struct ct_zone *ct_zone = node->data;
- if (ct_zone->zone != req_snat_zone) {
- /* The requested snat zone has changed. Trigger full recompute of
- * ct_zones engine. */
+ if (!ct_zone || ct_zone->zone != req_snat_zone) {
return false;
}
---------------------------
Thanks
Numan
>
> @@ -354,24 +363,33 @@ ct_zone_handle_port_update(struct ct_zone_ctx *ctx,
> const char *name,
> bool updated, int *scan_start,
> int min_ct_zone, int max_ct_zone)
> {
> - struct simap_node *ct_zone = simap_find(&ctx->current, name);
> + struct shash_node *node = shash_find(&ctx->current, name);
>
> - if (ct_zone &&
> - (ct_zone->data < min_ct_zone || ct_zone->data > max_ct_zone)) {
> - ct_zone_remove(ctx, ct_zone);
> - ct_zone = NULL;
> + if (node) {
> + struct ct_zone *ct_zone = node->data;
> + if (ct_zone->zone < min_ct_zone || ct_zone->zone > max_ct_zone) {
> + ct_zone_remove(ctx, node->name);
> + node = NULL;
> + }
> }
>
> - if (updated && !ct_zone) {
> + if (updated && !node) {
> ct_zone_assign_unused(ctx, name, scan_start, max_ct_zone);
> return true;
> - } else if (!updated && ct_zone_remove(ctx, ct_zone)) {
> + } else if (!updated && node && ct_zone_remove(ctx, node->name)) {
> return true;
> }
>
> return false;
> }
>
> +uint16_t
> +ct_zone_find_zone(const struct shash *ct_zones, const char *name)
> +{
> + struct ct_zone *ct_zone = shash_find_data(ct_zones, name);
> + return ct_zone ? ct_zone->zone : 0;
> +}
> +
>
> static bool
> ct_zone_assign_unused(struct ct_zone_ctx *ctx, const char *zone_name,
> @@ -386,33 +404,53 @@ ct_zone_assign_unused(struct ct_zone_ctx *ctx, const
> char *zone_name,
> }
>
> *scan_start = zone + 1;
> + ct_zone_add(ctx, zone_name, zone, true);
>
> - ct_zone_add_pending(&ctx->pending, CT_ZONE_OF_QUEUED,
> - zone, true, zone_name);
> -
> - bitmap_set1(ctx->bitmap, zone);
> - simap_put(&ctx->current, zone_name, zone);
> return true;
> }
>
> static bool
> -ct_zone_remove(struct ct_zone_ctx *ctx, struct simap_node *ct_zone)
> +ct_zone_remove(struct ct_zone_ctx *ctx, const char *name)
> {
> - if (!ct_zone) {
> + struct shash_node *node = shash_find(&ctx->current, name);
> + if (!node) {
> return false;
> }
>
> - VLOG_DBG("removing ct zone %"PRId32" for '%s'", ct_zone->data,
> - ct_zone->name);
> + struct ct_zone *ct_zone = node->data;
> +
> + VLOG_DBG("removing ct zone %"PRIu16" for '%s'", ct_zone->zone, name);
>
> ct_zone_add_pending(&ctx->pending, CT_ZONE_OF_QUEUED,
> - ct_zone->data, false, ct_zone->name);
> - bitmap_set0(ctx->bitmap, ct_zone->data);
> - simap_delete(&ctx->current, ct_zone);
> + ct_zone, false, name);
> + bitmap_set0(ctx->bitmap, ct_zone->zone);
> + shash_delete(&ctx->current, node);
> + free(ct_zone);
>
> return true;
> }
>
> +static void
> +ct_zone_add(struct ct_zone_ctx *ctx, const char *name, uint16_t zone,
> + bool set_pending)
> +{
> + VLOG_DBG("assigning ct zone %"PRIu16" for '%s'", zone, name);
> +
> + struct ct_zone *ct_zone = shash_find_data(&ctx->current, name);
> + if (!ct_zone) {
> + ct_zone = xmalloc(sizeof *ct_zone);
> + shash_add(&ctx->current, name, ct_zone);
> + }
> +
> + ct_zone->zone = zone;
> +
> + if (set_pending) {
> + ct_zone_add_pending(&ctx->pending, CT_ZONE_OF_QUEUED,
> + ct_zone, true, name);
> + }
> + bitmap_set1(ctx->bitmap, zone);
> +}
> +
> static int
> ct_zone_get_snat(const struct sbrec_datapath_binding *dp)
> {
> @@ -422,27 +460,29 @@ ct_zone_get_snat(const struct sbrec_datapath_binding
> *dp)
> static void
> ct_zone_add_pending(struct shash *pending_ct_zones,
> enum ct_zone_pending_state state,
> - int zone, bool add, const char *name)
> + struct ct_zone *zone, bool add, const char *name)
> {
> - VLOG_DBG("%s ct zone %"PRId32" for '%s'",
> - add ? "assigning" : "removing", zone, name);
> -
> - struct ct_zone_pending_entry *pending = xmalloc(sizeof *pending);
> - *pending = (struct ct_zone_pending_entry) {
> - .state = state,
> - .zone = zone,
> - .add = add,
> - };
> -
> /* Its important that we add only one entry for the key 'name'.
> * Replace 'pending' with 'existing' and free up 'existing'.
> * Otherwise, we may end up in a continuous loop of adding
> * and deleting the zone entry in the 'external_ids' of
> * integration bridge.
> */
> - struct ct_zone_pending_entry *existing =
> - shash_replace(pending_ct_zones, name, pending);
> - free(existing);
> + struct ct_zone_pending_entry *entry =
> + shash_find_data(pending_ct_zones, name);
> +
> + if (!entry) {
> + entry = xmalloc(sizeof *entry);
> + entry->state = state;
> +
> + shash_add(pending_ct_zones, name, entry);
> + }
> +
> + *entry = (struct ct_zone_pending_entry) {
> + .ct_zone = *zone,
> + .state = MIN(entry->state, state),
> + .add = add,
> + };
> }
>
> /* Replaces a UUID prefix from 'uuid_zone' (if any) with the
> @@ -483,19 +523,20 @@ ct_zone_restore(const struct
> sbrec_datapath_binding_table *dp_table,
> VLOG_DBG("ct zone %"PRId32" replace uuid name '%s' with '%s'",
> zone, name, new_name);
>
> + struct ct_zone ct_zone = {
> + .zone = zone,
> + };
> /* Make sure we remove the uuid one in the next OvS DB commit without
> * flush. */
> ct_zone_add_pending(&ctx->pending, CT_ZONE_DB_QUEUED,
> - zone, false, name);
> + &ct_zone, false, name);
> /* Store the zone in OvS DB with name instead of uuid without flush.
> * */
> ct_zone_add_pending(&ctx->pending, CT_ZONE_DB_QUEUED,
> - zone, true, new_name);
> + &ct_zone, true, new_name);
> current_name = new_name;
> }
>
> - simap_put(&ctx->current, current_name, zone);
> - bitmap_set1(ctx->bitmap, zone);
> -
> + ct_zone_add(ctx, current_name, zone, false);
> free(new_name);
> }
> diff --git a/controller/ct-zone.h b/controller/ct-zone.h
> index 690b2ec7c..79e894de9 100644
> --- a/controller/ct-zone.h
> +++ b/controller/ct-zone.h
> @@ -37,8 +37,12 @@ struct ct_zone_ctx {
> struct shash pending; /* Pending entries,
> * 'struct ct_zone_pending_entry'
> * by name. */
> - struct simap current; /* Current CT zones mapping
> - * (zone id by name). */
> + struct shash current; /* Current CT zones mapping
> + * (struct ct_zone by name). */
> +};
> +
> +struct ct_zone {
> + uint16_t zone;
> };
>
> /* States to move through when a new conntrack zone has been allocated. */
> @@ -50,12 +54,14 @@ enum ct_zone_pending_state {
> };
>
> struct ct_zone_pending_entry {
> - int zone;
> + struct ct_zone ct_zone;
> bool add; /* Is the entry being added? */
> ovs_be32 of_xid; /* Transaction id for barrier. */
> enum ct_zone_pending_state state;
> };
>
> +void ct_zone_ctx_init(struct ct_zone_ctx *ctx);
> +void ct_zone_ctx_destroy(struct ct_zone_ctx *ctx);
> void ct_zones_parse_range(const struct ovsrec_open_vswitch_table *ovs_table,
> int *min_ct_zone, int *max_ct_zone);
> void ct_zones_restore(struct ct_zone_ctx *ctx,
> @@ -74,5 +80,6 @@ bool ct_zone_handle_dp_update(struct ct_zone_ctx *ctx,
> bool ct_zone_handle_port_update(struct ct_zone_ctx *ctx, const char *name,
> bool updated, int *scan_start,
> int min_ct_zone, int max_ct_zone);
> +uint16_t ct_zone_find_zone(const struct shash *ct_zones, const char *name);
>
> #endif /* controller/ct-zone.h */
> diff --git a/controller/ofctrl.c b/controller/ofctrl.c
> index 8a19106c2..f9387d375 100644
> --- a/controller/ofctrl.c
> +++ b/controller/ofctrl.c
> @@ -2709,7 +2709,7 @@ ofctrl_put(struct ovn_desired_flow_table *lflow_table,
> SHASH_FOR_EACH(iter, pending_ct_zones) {
> struct ct_zone_pending_entry *ctzpe = iter->data;
> if (ctzpe->state == CT_ZONE_OF_QUEUED) {
> - add_ct_flush_zone(ctzpe->zone, &msgs);
> + add_ct_flush_zone(ctzpe->ct_zone.zone, &msgs);
> ctzpe->state = CT_ZONE_OF_SENT;
> ctzpe->of_xid = 0;
> }
> diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c
> index 384744e6d..4634fc6fe 100644
> --- a/controller/ovn-controller.c
> +++ b/controller/ovn-controller.c
> @@ -2188,8 +2188,7 @@ en_ct_zones_init(struct engine_node *node OVS_UNUSED,
> {
> struct ed_type_ct_zones *data = xzalloc(sizeof *data);
>
> - shash_init(&data->ctx.pending);
> - simap_init(&data->ctx.current);
> + ct_zone_ctx_init(&data->ctx);
>
> return data;
> }
> @@ -2206,8 +2205,7 @@ en_ct_zones_cleanup(void *data)
> {
> struct ed_type_ct_zones *ct_zones_data = data;
>
> - simap_destroy(&ct_zones_data->ctx.current);
> - shash_destroy_free_data(&ct_zones_data->ctx.pending);
> + ct_zone_ctx_destroy(&ct_zones_data->ctx);
> }
>
> static void
> @@ -4341,7 +4339,7 @@ static void init_physical_ctx(struct engine_node *node,
>
> struct ed_type_ct_zones *ct_zones_data =
> engine_get_input_data("ct_zones", node);
> - struct simap *ct_zones = &ct_zones_data->ctx.current;
> + struct shash *ct_zones = &ct_zones_data->ctx.current;
>
> struct ed_type_northd_options *n_opts =
> engine_get_input_data("northd_options", node);
> @@ -6066,12 +6064,13 @@ static void
> ct_zone_list(struct unixctl_conn *conn, int argc OVS_UNUSED,
> const char *argv[] OVS_UNUSED, void *ct_zones_)
> {
> - struct simap *ct_zones = ct_zones_;
> + struct shash *ct_zones = ct_zones_;
> struct ds ds = DS_EMPTY_INITIALIZER;
> - struct simap_node *zone;
> + struct shash_node *node;
>
> - SIMAP_FOR_EACH(zone, ct_zones) {
> - ds_put_format(&ds, "%s %d\n", zone->name, zone->data);
> + SHASH_FOR_EACH (node, ct_zones) {
> + struct ct_zone *ct_zone = node->data;
> + ds_put_format(&ds, "%s %d\n", node->name, ct_zone->zone);
> }
>
> unixctl_command_reply(conn, ds_cstr(&ds));
> diff --git a/controller/physical.c b/controller/physical.c
> index f4d4854ff..3c0200c38 100644
> --- a/controller/physical.c
> +++ b/controller/physical.c
> @@ -17,6 +17,7 @@
> #include "binding.h"
> #include "coverage.h"
> #include "byte-order.h"
> +#include "ct-zone.h"
> #include "encaps.h"
> #include "flow.h"
> #include "ha-chassis.h"
> @@ -212,10 +213,10 @@ get_vtep_port(const struct hmap *local_datapaths,
> int64_t tunnel_key)
>
> static struct zone_ids
> get_zone_ids(const struct sbrec_port_binding *binding,
> - const struct simap *ct_zones)
> + const struct shash *ct_zones)
> {
> struct zone_ids zone_ids = {
> - .ct = simap_get(ct_zones, binding->logical_port)
> + .ct = ct_zone_find_zone(ct_zones, binding->logical_port)
> };
>
> const char *name = smap_get(&binding->datapath->external_ids, "name");
> @@ -228,11 +229,11 @@ get_zone_ids(const struct sbrec_port_binding *binding,
> }
>
> char *dnat = alloc_nat_zone_key(name, "dnat");
> - zone_ids.dnat = simap_get(ct_zones, dnat);
> + zone_ids.dnat = ct_zone_find_zone(ct_zones, dnat);
> free(dnat);
>
> char *snat = alloc_nat_zone_key(name, "snat");
> - zone_ids.snat = simap_get(ct_zones, snat);
> + zone_ids.snat = ct_zone_find_zone(ct_zones, snat);
> free(snat);
>
> return zone_ids;
> @@ -631,7 +632,7 @@ put_chassis_mac_conj_id_flow(const struct
> sbrec_chassis_table *chassis_table,
> }
>
> static void
> -put_replace_chassis_mac_flows(const struct simap *ct_zones,
> +put_replace_chassis_mac_flows(const struct shash *ct_zones,
> const struct
> sbrec_port_binding *localnet_port,
> const struct hmap *local_datapaths,
> @@ -1477,7 +1478,7 @@ enforce_tunneling_for_multichassis_ports(
> static void
> consider_port_binding(struct ovsdb_idl_index *sbrec_port_binding_by_name,
> enum mf_field_id mff_ovn_geneve,
> - const struct simap *ct_zones,
> + const struct shash *ct_zones,
> const struct sset *active_tunnels,
> const struct hmap *local_datapaths,
> const struct shash *local_bindings,
> @@ -2116,7 +2117,7 @@ mc_ofctrl_add_flow(const struct sbrec_multicast_group
> *mc,
> static void
> consider_mc_group(struct ovsdb_idl_index *sbrec_port_binding_by_name,
> enum mf_field_id mff_ovn_geneve,
> - const struct simap *ct_zones,
> + const struct shash *ct_zones,
> const struct hmap *local_datapaths,
> struct shash *local_bindings,
> struct simap *patch_ofports,
> @@ -2180,7 +2181,7 @@ consider_mc_group(struct ovsdb_idl_index
> *sbrec_port_binding_by_name,
> continue;
> }
>
> - int zone_id = simap_get(ct_zones, port->logical_port);
> + int zone_id = ct_zone_find_zone(ct_zones, port->logical_port);
> if (zone_id) {
> put_load(zone_id, MFF_LOG_CT_ZONE, 0, 16, &ofpacts);
> }
> diff --git a/controller/physical.h b/controller/physical.h
> index 4dd228cf8..dd4be7041 100644
> --- a/controller/physical.h
> +++ b/controller/physical.h
> @@ -61,7 +61,7 @@ struct physical_ctx {
> const struct if_status_mgr *if_mgr;
> struct hmap *local_datapaths;
> struct sset *local_lports;
> - const struct simap *ct_zones;
> + const struct shash *ct_zones;
> enum mf_field_id mff_ovn_geneve;
> struct shash *local_bindings;
> struct simap *patch_ofports;
> --
> 2.45.2
>
> _______________________________________________
> dev mailing list
> [email protected]
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev