@@ -239,23 +239,27 @@ ovn_northd_lb_find(const struct hmap *lbs, const struct uuid *uuid)
}
void
-ovn_northd_lb_add_lr(struct ovn_northd_lb *lb, struct ovn_datapath *od)
+ovn_northd_lb_add_lr(struct ovn_northd_lb *lb, size_t n,
+ struct ovn_datapath **ods)
{
- if (lb->n_allocated_nb_lr == lb->n_nb_lr) {
+ while (lb->n_allocated_nb_lr <= lb->n_nb_lr + n) {
lb->nb_lr = x2nrealloc(lb->nb_lr, &lb->n_allocated_nb_lr,
sizeof *lb->nb_lr);
}
- lb->nb_lr[lb->n_nb_lr++] = od;
+ memcpy(&lb->nb_lr[lb->n_nb_lr], ods, n * sizeof *ods);
+ lb->n_nb_lr += n;
}
void
-ovn_northd_lb_add_ls(struct ovn_northd_lb *lb, struct ovn_datapath *od)
+ovn_northd_lb_add_ls(struct ovn_northd_lb *lb, size_t n,
+ struct ovn_datapath **ods)
{
- if (lb->n_allocated_nb_ls == lb->n_nb_ls) {
+ while (lb->n_allocated_nb_ls <= lb->n_nb_ls + n) {
lb->nb_ls = x2nrealloc(lb->nb_ls, &lb->n_allocated_nb_ls,
sizeof *lb->nb_ls);
}
- lb->nb_ls[lb->n_nb_ls++] = od;
+ memcpy(&lb->nb_ls[lb->n_nb_ls], ods, n * sizeof *ods);
+ lb->n_nb_ls += n;
}
void
@@ -276,10 +280,13 @@ ovn_northd_lb_destroy(struct ovn_northd_lb *lb)
}
/* Constructs a new 'struct ovn_lb_group' object from the Nb LB Group record
- * and a hash map of all existing 'struct ovn_northd_lb' objects. */
+ * and a hash map of all existing 'struct ovn_northd_lb' objects. Space will
+ * be allocated for 'max_datapaths' logical switches and the same amount of
+ * logical routers to which this LB Group is applied. Can be filled later
+ * with ovn_lb_group_add_ls() and ovn_lb_group_add_lr() respectively. */
struct ovn_lb_group *
ovn_lb_group_create(const struct nbrec_load_balancer_group *nbrec_lb_group,
- const struct hmap *lbs)
+ const struct hmap *lbs, size_t max_datapaths)
{
struct ovn_lb_group *lb_group;
@@ -287,6 +294,8 @@ ovn_lb_group_create(const struct nbrec_load_balancer_group *nbrec_lb_group,
lb_group->uuid = nbrec_lb_group->header_.uuid;
lb_group->n_lbs = nbrec_lb_group->n_load_balancer;
lb_group->lbs = xmalloc(lb_group->n_lbs * sizeof *lb_group->lbs);
+ lb_group->ls = xmalloc(max_datapaths * sizeof *lb_group->ls);
+ lb_group->lr = xmalloc(max_datapaths * sizeof *lb_group->lr);
for (size_t i = 0; i < nbrec_lb_group->n_load_balancer; i++) {
const struct uuid *lb_uuid =
@@ -305,6 +314,8 @@ ovn_lb_group_destroy(struct ovn_lb_group *lb_group)
}
free(lb_group->lbs);
+ free(lb_group->ls);
+ free(lb_group->lr);
free(lb_group);
}
@@ -28,6 +28,7 @@ struct nbrec_load_balancer;
struct nbrec_load_balancer_group;
struct sbrec_load_balancer;
struct sbrec_datapath_binding;
+struct ovn_datapath;
struct ovn_port;
struct uuid;
@@ -91,25 +92,44 @@ struct ovn_northd_lb *ovn_northd_lb_create(const struct nbrec_load_balancer *);
struct ovn_northd_lb *ovn_northd_lb_find(const struct hmap *,
const struct uuid *);
void ovn_northd_lb_destroy(struct ovn_northd_lb *);
-void
-ovn_northd_lb_add_lr(struct ovn_northd_lb *lb, struct ovn_datapath *od);
-void
-ovn_northd_lb_add_ls(struct ovn_northd_lb *lb, struct ovn_datapath *od);
+void ovn_northd_lb_add_lr(struct ovn_northd_lb *lb, size_t n,
+ struct ovn_datapath **ods);
+void ovn_northd_lb_add_ls(struct ovn_northd_lb *lb, size_t n,
+ struct ovn_datapath **ods);
struct ovn_lb_group {
struct hmap_node hmap_node;
struct uuid uuid;
size_t n_lbs;
struct ovn_northd_lb **lbs;
+
+ /* Datapaths to which this LB group is applied. */
+ size_t n_ls;
+ struct ovn_datapath **ls;
+ size_t n_lr;
+ struct ovn_datapath **lr;
};
struct ovn_lb_group *ovn_lb_group_create(
const struct nbrec_load_balancer_group *,
- const struct hmap *lbs);
+ const struct hmap *lbs,
+ size_t max_datapaths);
void ovn_lb_group_destroy(struct ovn_lb_group *lb_group);
struct ovn_lb_group *ovn_lb_group_find(const struct hmap *lb_groups,
const struct uuid *);
+static inline void
+ovn_lb_group_add_ls(struct ovn_lb_group *lb_group, struct ovn_datapath *ls)
+{
+ lb_group->ls[lb_group->n_ls++] = ls;
+}
+
+static inline void
+ovn_lb_group_add_lr(struct ovn_lb_group *lb_group, struct ovn_datapath *lr)
+{
+ lb_group->lr[lb_group->n_lr++] = lr;
+}
+
struct ovn_controller_lb {
const struct sbrec_load_balancer *slb; /* May be NULL. */
@@ -3862,7 +3862,8 @@ build_lbs(struct northd_input *input_data, struct hmap *datapaths,
NBREC_LOAD_BALANCER_GROUP_TABLE_FOR_EACH (nbrec_lb_group,
input_data->nbrec_load_balancer_group_table) {
- lb_group = ovn_lb_group_create(nbrec_lb_group, lbs);
+ lb_group = ovn_lb_group_create(nbrec_lb_group, lbs,
+ hmap_count(datapaths));
hmap_insert(lb_groups, &lb_group->hmap_node,
uuid_hash(&lb_group->uuid));
}
@@ -3877,16 +3878,21 @@ build_lbs(struct northd_input *input_data, struct hmap *datapaths,
const struct uuid *lb_uuid =
&od->nbs->load_balancer[i]->header_.uuid;
lb = ovn_northd_lb_find(lbs, lb_uuid);
- ovn_northd_lb_add_ls(lb, od);
+ ovn_northd_lb_add_ls(lb, 1, &od);
}
for (size_t i = 0; i < od->nbs->n_load_balancer_group; i++) {
nbrec_lb_group = od->nbs->load_balancer_group[i];
lb_group = ovn_lb_group_find(lb_groups,
&nbrec_lb_group->header_.uuid);
- for (size_t j = 0; j < lb_group->n_lbs; j++) {
- ovn_northd_lb_add_ls(lb_group->lbs[j], od);
- }
+ ovn_lb_group_add_ls(lb_group, od);
+ }
+ }
+
+ HMAP_FOR_EACH (lb_group, hmap_node, lb_groups) {
+ for (size_t j = 0; j < lb_group->n_lbs; j++) {
+ ovn_northd_lb_add_ls(lb_group->lbs[j], lb_group->n_ls,
+ lb_group->ls);
}
}
@@ -3899,7 +3905,7 @@ build_lbs(struct northd_input *input_data, struct hmap *datapaths,
const struct uuid *lb_uuid =
&od->nbr->load_balancer[i]->header_.uuid;
lb = ovn_northd_lb_find(lbs, lb_uuid);
- ovn_northd_lb_add_lr(lb, od);
+ ovn_northd_lb_add_lr(lb, 1, &od);
build_lrouter_lb_ips(od, lb);
}
@@ -3907,12 +3913,19 @@ build_lbs(struct northd_input *input_data, struct hmap *datapaths,
nbrec_lb_group = od->nbr->load_balancer_group[i];
lb_group = ovn_lb_group_find(lb_groups,
&nbrec_lb_group->header_.uuid);
+ ovn_lb_group_add_lr(lb_group, od);
for (size_t j = 0; j < lb_group->n_lbs; j++) {
- ovn_northd_lb_add_lr(lb_group->lbs[j], od);
build_lrouter_lb_ips(od, lb_group->lbs[j]);
}
}
}
+
+ HMAP_FOR_EACH (lb_group, hmap_node, lb_groups) {
+ for (size_t j = 0; j < lb_group->n_lbs; j++) {
+ ovn_northd_lb_add_lr(lb_group->lbs[j], lb_group->n_lr,
+ lb_group->lr);
+ }
+ }
}
static void
@@ -4097,7 +4110,7 @@ build_lswitch_lbs_from_lrouter(struct hmap *datapaths, struct hmap *lbs)
}
}
if (!installed) {
- ovn_northd_lb_add_ls(lb, od);
+ ovn_northd_lb_add_ls(lb, 1, &od);
}
if (lb->nlb) {
od->has_lb_vip |= lb_has_vip(lb->nlb);