This is required to add I-P for logical switch and logical router
inserts.
Signed-off-by: Lorenzo Bianconi <[email protected]>
---
northd/lb.c | 2 +-
northd/lb.h | 1 +
northd/lflow-mgr.c | 8 +++++---
northd/northd.c | 49 ++++++++++++++++++++++++++++------------------
northd/northd.h | 6 ++++--
5 files changed, 41 insertions(+), 25 deletions(-)
diff --git a/northd/lb.c b/northd/lb.c
index 11bd17515..039830563 100644
--- a/northd/lb.c
+++ b/northd/lb.c
@@ -650,7 +650,7 @@ ovn_lb_datapaths_destroy(struct ovn_lb_datapaths *lb_dps)
free(lb_dps);
}
-static void
+void
dynamic_bitmap_realloc(struct dynamic_bitmap *db, size_t new_n_elems)
{
if (new_n_elems > db->capacity) {
diff --git a/northd/lb.h b/northd/lb.h
index 81cb59fec..885d1afc4 100644
--- a/northd/lb.h
+++ b/northd/lb.h
@@ -189,6 +189,7 @@ struct ovn_lb_datapaths *ovn_lb_datapaths_create(const
struct ovn_northd_lb *,
struct ovn_lb_datapaths *ovn_lb_datapaths_find(const struct hmap *,
const struct uuid *);
void ovn_lb_datapaths_destroy(struct ovn_lb_datapaths *);
+void dynamic_bitmap_realloc(struct dynamic_bitmap *, size_t new_n_elems);
void ovn_lb_datapaths_add_lr(struct ovn_lb_datapaths *, size_t n,
struct ovn_datapath **,
diff --git a/northd/lflow-mgr.c b/northd/lflow-mgr.c
index 31476286a..6a66a9718 100644
--- a/northd/lflow-mgr.c
+++ b/northd/lflow-mgr.c
@@ -1007,12 +1007,12 @@ sync_lflow_to_sb(struct ovn_lflow *lflow,
if (ovn_stage_to_datapath_type(lflow->stage) == DP_SWITCH) {
n_datapaths = ods_size(ls_datapaths);
- datapaths_array = ls_datapaths->array;
+ datapaths_array = vector_get_array(&ls_datapaths->dps);
dp_groups = &lflow_table->ls_dp_groups;
is_switch = true;
} else {
n_datapaths = ods_size(lr_datapaths);
- datapaths_array = lr_datapaths->array;
+ datapaths_array = vector_get_array(&lr_datapaths->dps);
dp_groups = &lflow_table->lr_dp_groups;
is_switch = false;
}
@@ -1226,7 +1226,9 @@ ovn_sb_insert_or_update_logical_dp_group(
sb = xmalloc(bitmap_count1(dpg_bitmap, ods_size(datapaths)) * sizeof *sb);
BITMAP_FOR_EACH_1 (index, ods_size(datapaths), dpg_bitmap) {
- sb[n++] = datapaths->array[index]->sdp->sb_dp;
+ struct ovn_datapath *od = vector_get(&datapaths->dps, index,
+ struct ovn_datapath *);
+ sb[n++] = od->sdp->sb_dp;
}
if (!dp_group) {
struct uuid dpg_uuid = uuid_random();
diff --git a/northd/northd.c b/northd/northd.c
index 0de440559..7cbea7d57 100644
--- a/northd/northd.c
+++ b/northd/northd.c
@@ -839,18 +839,22 @@ parse_dynamic_routing_redistribute(
static void
ods_build_array_index(struct ovn_datapaths *datapaths)
{
+ datapaths->dps = VECTOR_CAPACITY_INITIALIZER(struct ovn_datapath *,
+ ods_size(datapaths));
+ datapaths->dps_index_map.map = bitmap_allocate(ods_size(datapaths));
+ datapaths->dps_index_map.capacity = ods_size(datapaths);
+
/* Assign unique sequential indexes to all datapaths. These are not
* visible outside of the northd loop, so, unlike the tunnel keys, it
* doesn't matter if they are different on every iteration. */
- size_t index = 0;
-
- datapaths->array = xrealloc(datapaths->array,
- ods_size(datapaths) * sizeof *datapaths->array);
-
struct ovn_datapath *od;
HMAP_FOR_EACH (od, key_node, &datapaths->datapaths) {
+ size_t index = bitmap_scan(datapaths->dps_index_map.map, 0, 0,
+ datapaths->dps_index_map.capacity);
+ bitmap_set1(datapaths->dps_index_map.map, index);
+ datapaths->dps_index_map.n_elems++;
od->index = index;
- datapaths->array[index++] = od;
+ vector_push(&datapaths->dps, &od);
od->datapaths = datapaths;
}
}
@@ -3416,7 +3420,8 @@ build_lswitch_lbs_from_lrouter(struct ovn_datapaths
*lr_datapaths,
HMAP_FOR_EACH (lb_dps, hmap_node, lb_dps_map) {
BITMAP_FOR_EACH_1 (index, ods_size(lr_datapaths),
lb_dps->nb_lr_map.map) {
- struct ovn_datapath *od = lr_datapaths->array[index];
+ struct ovn_datapath *od = vector_get(&lr_datapaths->dps, index,
+ struct ovn_datapath *);
ovn_lb_datapaths_add_ls(lb_dps, vector_len(&od->ls_peers),
vector_get_array(&od->ls_peers),
ods_size(ls_datapaths));
@@ -5019,7 +5024,7 @@ northd_handle_lb_data_changes(struct tracked_lb_data
*trk_lb_data,
size_t index;
BITMAP_FOR_EACH_1 (index, ods_size(ls_datapaths),
lb_dps->nb_ls_map.map) {
- od = ls_datapaths->array[index];
+ od = vector_get(&ls_datapaths->dps, index, struct ovn_datapath *);
/* Add the ls datapath to the northd tracked data. */
hmapx_add(&nd_changes->ls_with_changed_lbs, od);
@@ -5155,7 +5160,7 @@ northd_handle_lb_data_changes(struct tracked_lb_data
*trk_lb_data,
size_t index;
BITMAP_FOR_EACH_1 (index, ods_size(ls_datapaths),
lb_dps->nb_ls_map.map) {
- od = ls_datapaths->array[index];
+ od = vector_get(&ls_datapaths->dps, index, struct ovn_datapath *);
/* Add the ls datapath to the northd tracked data. */
hmapx_add(&nd_changes->ls_with_changed_lbs, od);
@@ -8099,7 +8104,8 @@ build_lb_rules(struct lflow_table *lflows, struct
ovn_lb_datapaths *lb_dps,
ods_size(ls_datapaths));
BITMAP_FOR_EACH_1 (index, ods_size(ls_datapaths),
lb_dps->nb_ls_map.map) {
- struct ovn_datapath *od = ls_datapaths->array[index];
+ struct ovn_datapath *od = vector_get(&ls_datapaths->dps, index,
+ struct ovn_datapath *);
meter = copp_meter_get(COPP_REJECT, od->nbs->copp,
meter_groups);
@@ -12104,7 +12110,8 @@ build_gw_lrouter_nat_flows_for_lb(struct
lrouter_nat_lb_flows_ctx *ctx,
if (ctx->reject) {
dp_non_meter = bitmap_clone(dp_bitmap, bitmap_len);
BITMAP_FOR_EACH_1 (index, bitmap_len, dp_bitmap) {
- struct ovn_datapath *od = lr_datapaths->array[index];
+ struct ovn_datapath *od = vector_get(&lr_datapaths->dps, index,
+ struct ovn_datapath *);
const char *meter;
meter = copp_meter_get(COPP_REJECT, od->nbr->copp,
@@ -12241,7 +12248,8 @@ build_lrouter_nat_flows_for_lb(
bool use_stateless_nat = smap_get_bool(&lb->nlb->options,
"use_stateless_nat", false);
BITMAP_FOR_EACH_1 (index, bitmap_len, lb_dps->nb_lr_map.map) {
- struct ovn_datapath *od = lr_datapaths->array[index];
+ struct ovn_datapath *od = vector_get(&lr_datapaths->dps, index,
+ struct ovn_datapath *);
enum lrouter_nat_lb_flow_type type;
const struct lr_stateful_record *lr_stateful_rec =
@@ -12341,7 +12349,8 @@ build_lswitch_flows_for_lb(struct ovn_lb_datapaths
*lb_dps,
size_t index;
BITMAP_FOR_EACH_1 (index, ods_size(ls_datapaths),
lb_dps->nb_ls_map.map) {
- struct ovn_datapath *od = ls_datapaths->array[index];
+ struct ovn_datapath *od = vector_get(&ls_datapaths->dps, index,
+ struct ovn_datapath *);
ovn_lflow_add_with_hint__(lflows, od,
S_SWITCH_IN_PRE_LB, 130, ds_cstr(match),
@@ -12419,7 +12428,8 @@ build_lrouter_allow_vip_traffic_template(struct
lflow_table *lflows,
size_t index;
BITMAP_FOR_EACH_1 (index, ods_size(lr_dps), lb_dps->nb_lr_map.map) {
- struct ovn_datapath *od = lr_dps->array[index];
+ struct ovn_datapath *od = vector_get(&lr_dps->dps, index,
+ struct ovn_datapath *);
/* Do not drop ip traffic with destination the template VIP. */
ds_clear(&match);
ds_put_format(&match, "ip%d.dst == %s",
@@ -12466,7 +12476,8 @@ build_lrouter_flows_for_lb(struct ovn_lb_datapaths
*lb_dps,
BITMAP_FOR_EACH_1 (index, ods_size(lr_datapaths),
lb_dps->nb_lr_map.map) {
- struct ovn_datapath *od = lr_datapaths->array[index];
+ struct ovn_datapath *od = vector_get(&lr_datapaths->dps, index,
+ struct ovn_datapath *);
ovn_lflow_add_with_hint__(lflows, od, S_ROUTER_IN_DNAT,
130, ds_cstr(match), ds_cstr(action),
@@ -12481,7 +12492,8 @@ build_lrouter_flows_for_lb(struct ovn_lb_datapaths
*lb_dps,
if (lb->skip_snat) {
BITMAP_FOR_EACH_1 (index, ods_size(lr_datapaths),
lb_dps->nb_lr_map.map) {
- struct ovn_datapath *od = lr_datapaths->array[index];
+ struct ovn_datapath *od = vector_get(&lr_datapaths->dps, index,
+ struct ovn_datapath *);
ovn_lflow_add(lflows, od, S_ROUTER_OUT_SNAT, 120,
"flags.skip_snat_for_lb == 1 && ip", "next;",
@@ -18931,7 +18943,6 @@ static void
ovn_datapaths_init(struct ovn_datapaths *datapaths)
{
hmap_init(&datapaths->datapaths);
- datapaths->array = NULL;
}
static void
@@ -18943,8 +18954,8 @@ ovn_datapaths_destroy(struct ovn_datapaths *datapaths)
}
hmap_destroy(&datapaths->datapaths);
- free(datapaths->array);
- datapaths->array = NULL;
+ bitmap_free(datapaths->dps_index_map.map);
+ vector_destroy(&datapaths->dps);
}
static void
diff --git a/northd/northd.h b/northd/northd.h
index 8f865e8b3..b71b13ca9 100644
--- a/northd/northd.h
+++ b/northd/northd.h
@@ -23,6 +23,7 @@
#include "northd/en-port-group.h"
#include "northd/ipam.h"
#include "openvswitch/hmap.h"
+#include "northd/lb.h"
#include "simap.h"
#include "ovs-thread.h"
#include "en-lr-stateful.h"
@@ -93,7 +94,8 @@ struct ovn_datapaths {
struct hmap datapaths;
/* The array index of each element in 'datapaths'. */
- struct ovn_datapath **array;
+ struct dynamic_bitmap dps_index_map;
+ struct vector dps;
};
static inline size_t
@@ -457,7 +459,7 @@ ovn_datapaths_find_by_index(const struct ovn_datapaths
*ovn_datapaths,
size_t od_index)
{
ovs_assert(od_index <= hmap_count(&ovn_datapaths->datapaths));
- return ovn_datapaths->array[od_index];
+ return vector_get(&ovn_datapaths->dps, od_index, struct ovn_datapath *);
}
struct ovn_datapath *ovn_datapath_from_sbrec(
--
2.50.1
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev