From: Numan Siddique <num...@ovn.org>

This is required to add I-P for logical switch and logical router
inserts.

Signed-off-by: Numan Siddique <num...@ovn.org>
---
 lib/ovn-util.h  | 22 +++++++++++++++++++
 northd/lb.c     | 44 +++++++++++++++++++++++++++++++++++--
 northd/lb.h     | 24 ++++++++++++++++----
 northd/northd.c | 58 ++++++++++++++++++++++++++++++++-----------------
 4 files changed, 122 insertions(+), 26 deletions(-)

diff --git a/lib/ovn-util.h b/lib/ovn-util.h
index 2468a6de4..2f9a7a307 100644
--- a/lib/ovn-util.h
+++ b/lib/ovn-util.h
@@ -17,6 +17,7 @@
 #define OVN_UTIL_H 1
 
 #include "ovsdb-idl.h"
+#include "lib/bitmap.h"
 #include "lib/packets.h"
 #include "lib/sset.h"
 #include "lib/svec.h"
@@ -477,6 +478,27 @@ void sorted_array_apply_diff(const struct sorted_array *a1,
                                                     bool add),
                              const void *arg);
 
+static inline unsigned long *
+ovn_bitmap_realloc(unsigned long *bitmap, size_t n_bits_old,
+                   size_t n_bits_new)
+{
+    ovs_assert(n_bits_new >= n_bits_old);
+
+    if (bitmap_n_bytes(n_bits_old) == bitmap_n_bytes(n_bits_new)) {
+        return bitmap;
+    }
+
+    bitmap = xrealloc(bitmap, bitmap_n_bytes(n_bits_new));
+    /* Set the unitialized bits to 0 as xrealloc doesn't initialize the
+     * added memory. */
+    for (size_t i = BITMAP_N_LONGS(n_bits_old);
+         i < BITMAP_N_LONGS(n_bits_new); i++) {
+        bitmap[i] = 0;
+    }
+
+    return bitmap;
+}
+
 /* Utilities around properly handling exit command. */
 struct ovn_exit_args {
     struct unixctl_conn **conns;
diff --git a/northd/lb.c b/northd/lb.c
index b11896cf1..d61818721 100644
--- a/northd/lb.c
+++ b/northd/lb.c
@@ -40,6 +40,11 @@ static struct nbrec_load_balancer_health_check *
 ovn_lb_get_health_check(const struct nbrec_load_balancer *nbrec_lb,
                         const char *vip_port_str, bool template);
 
+static void ovn_lb_datapaths_realloc_ls_map(struct ovn_lb_datapaths *,
+                                            size_t n_ls_datapaths);
+static void ovn_lb_datapaths_realloc_lr_map(struct ovn_lb_datapaths *,
+                                            size_t n_lr_datapaths);
+
 struct ovn_lb_ip_set *
 ovn_lb_ip_set_create(void)
 {
@@ -580,6 +585,8 @@ ovn_lb_datapaths_create(const struct ovn_northd_lb *lb, 
size_t n_ls_datapaths,
     lb_dps->lb = lb;
     lb_dps->nb_ls_map = bitmap_allocate(n_ls_datapaths);
     lb_dps->nb_lr_map = bitmap_allocate(n_lr_datapaths);
+    lb_dps->ls_map_size = n_ls_datapaths;
+    lb_dps->lr_map_size = n_lr_datapaths;
     lb_dps->lflow_ref = lflow_ref_create();
     hmapx_init(&lb_dps->ls_lb_with_stateless_mode);
     return lb_dps;
@@ -597,9 +604,12 @@ ovn_lb_datapaths_destroy(struct ovn_lb_datapaths *lb_dps)
 
 void
 ovn_lb_datapaths_add_lr(struct ovn_lb_datapaths *lb_dps, size_t n,
-                        struct ovn_datapath **ods)
+                        struct ovn_datapath **ods,
+                        size_t n_lr_datapaths)
 {
+    ovn_lb_datapaths_realloc_lr_map(lb_dps, n_lr_datapaths);
     for (size_t i = 0; i < n; i++) {
+        ovs_assert(ods[i]->index < lb_dps->lr_map_size);
         if (!bitmap_is_set(lb_dps->nb_lr_map, ods[i]->index)) {
             bitmap_set1(lb_dps->nb_lr_map, ods[i]->index);
             lb_dps->n_nb_lr++;
@@ -609,9 +619,12 @@ ovn_lb_datapaths_add_lr(struct ovn_lb_datapaths *lb_dps, 
size_t n,
 
 void
 ovn_lb_datapaths_add_ls(struct ovn_lb_datapaths *lb_dps, size_t n,
-                        struct ovn_datapath **ods)
+                        struct ovn_datapath **ods,
+                        size_t n_ls_datapaths)
 {
+    ovn_lb_datapaths_realloc_ls_map(lb_dps, n_ls_datapaths);
     for (size_t i = 0; i < n; i++) {
+        ovs_assert(ods[i]->index < lb_dps->ls_map_size);
         if (!bitmap_is_set(lb_dps->nb_ls_map, ods[i]->index)) {
             bitmap_set1(lb_dps->nb_ls_map, ods[i]->index);
             lb_dps->n_nb_ls++;
@@ -643,6 +656,8 @@ ovn_lb_group_datapaths_create(const struct ovn_lb_group 
*lb_group,
     lb_group_dps->lb_group = lb_group;
     lb_group_dps->ls = xmalloc(max_ls_datapaths * sizeof *lb_group_dps->ls);
     lb_group_dps->lr = xmalloc(max_lr_datapaths * sizeof *lb_group_dps->lr);
+    lb_group_dps->max_lr = max_ls_datapaths;
+    lb_group_dps->max_lr = max_lr_datapaths;
 
     return lb_group_dps;
 }
@@ -669,3 +684,28 @@ ovn_lb_group_datapaths_find(const struct hmap 
*lb_group_dps_map,
     }
     return NULL;
 }
+
+/* Static functions. */
+static void
+ovn_lb_datapaths_realloc_ls_map(struct ovn_lb_datapaths *lb_dps,
+                                size_t n_ls_datapaths)
+{
+    if (n_ls_datapaths > lb_dps->ls_map_size) {
+        lb_dps->nb_ls_map = ovn_bitmap_realloc(lb_dps->nb_ls_map,
+                                               lb_dps->ls_map_size,
+                                               n_ls_datapaths);
+        lb_dps->ls_map_size = n_ls_datapaths;
+    }
+}
+
+static void
+ovn_lb_datapaths_realloc_lr_map(struct ovn_lb_datapaths *lb_dps,
+                                size_t n_lr_datapaths)
+{
+    if (n_lr_datapaths > lb_dps->lr_map_size) {
+        lb_dps->nb_lr_map = ovn_bitmap_realloc(lb_dps->nb_lr_map,
+                                               lb_dps->lr_map_size,
+                                               n_lr_datapaths);
+        lb_dps->lr_map_size = n_lr_datapaths;
+    }
+}
diff --git a/northd/lb.h b/northd/lb.h
index eb1942bd4..7a810061b 100644
--- a/northd/lb.h
+++ b/northd/lb.h
@@ -137,9 +137,11 @@ struct ovn_lb_datapaths {
 
     const struct ovn_northd_lb *lb;
     size_t n_nb_ls;
+    size_t ls_map_size;
     unsigned long *nb_ls_map;
 
     size_t n_nb_lr;
+    size_t lr_map_size;
     unsigned long *nb_lr_map;
 
     struct hmapx ls_lb_with_stateless_mode;
@@ -180,9 +182,11 @@ struct ovn_lb_datapaths *ovn_lb_datapaths_find(const 
struct hmap *,
 void ovn_lb_datapaths_destroy(struct ovn_lb_datapaths *);
 
 void ovn_lb_datapaths_add_lr(struct ovn_lb_datapaths *, size_t n,
-                             struct ovn_datapath **);
+                             struct ovn_datapath **,
+                             size_t n_lr_datapaths);
 void ovn_lb_datapaths_add_ls(struct ovn_lb_datapaths *, size_t n,
-                             struct ovn_datapath **);
+                             struct ovn_datapath **,
+                             size_t n_ls_datapaths);
 
 struct ovn_lb_group_datapaths {
     struct hmap_node hmap_node;
@@ -191,8 +195,10 @@ struct ovn_lb_group_datapaths {
 
     /* Datapaths to which 'lb_group' is applied. */
     size_t n_ls;
+    size_t max_ls;
     struct ovn_datapath **ls;
     size_t n_lr;
+    size_t max_lr;
     struct ovn_datapath **lr;
 };
 
@@ -206,16 +212,26 @@ struct ovn_lb_group_datapaths 
*ovn_lb_group_datapaths_find(
 
 static inline void
 ovn_lb_group_datapaths_add_ls(struct ovn_lb_group_datapaths *lbg_dps, size_t n,
-                               struct ovn_datapath **ods)
+                              struct ovn_datapath **ods, size_t n_ls_datapaths)
 {
+    if (n_ls_datapaths > lbg_dps->max_ls) {
+        lbg_dps->ls = xrealloc(lbg_dps->ls,
+                               n_ls_datapaths * sizeof *lbg_dps->ls);
+        lbg_dps->max_ls = n_ls_datapaths;
+    }
     memcpy(&lbg_dps->ls[lbg_dps->n_ls], ods, n * sizeof *ods);
     lbg_dps->n_ls += n;
 }
 
 static inline void
 ovn_lb_group_datapaths_add_lr(struct ovn_lb_group_datapaths *lbg_dps,
-                               struct ovn_datapath *lr)
+                              struct ovn_datapath *lr, size_t n_lr_datapaths)
 {
+    if (n_lr_datapaths > lbg_dps->max_lr) {
+        lbg_dps->lr = xrealloc(lbg_dps->lr,
+                               n_lr_datapaths * sizeof *lbg_dps->lr);
+        lbg_dps->max_lr = n_lr_datapaths;
+    }
     lbg_dps->lr[lbg_dps->n_lr++] = lr;
 }
 
diff --git a/northd/northd.c b/northd/northd.c
index 93d03843c..b700ca28e 100644
--- a/northd/northd.c
+++ b/northd/northd.c
@@ -3470,7 +3470,7 @@ build_lb_datapaths(const struct hmap *lbs, const struct 
hmap *lb_groups,
                 &od->nbs->load_balancer[i]->header_.uuid;
             lb_dps = ovn_lb_datapaths_find(lb_datapaths_map, lb_uuid);
             ovs_assert(lb_dps);
-            ovn_lb_datapaths_add_ls(lb_dps, 1, &od);
+            ovn_lb_datapaths_add_ls(lb_dps, 1, &od, ods_size(ls_datapaths));
             if (od->lb_with_stateless_mode) {
                 hmapx_add(&lb_dps->ls_lb_with_stateless_mode, od);
             }
@@ -3483,7 +3483,8 @@ build_lb_datapaths(const struct hmap *lbs, const struct 
hmap *lb_groups,
                 ovn_lb_group_datapaths_find(lb_group_datapaths_map,
                                             lb_group_uuid);
             ovs_assert(lb_group_dps);
-            ovn_lb_group_datapaths_add_ls(lb_group_dps, 1, &od);
+            ovn_lb_group_datapaths_add_ls(lb_group_dps, 1, &od,
+                                          ods_size(ls_datapaths));
         }
     }
 
@@ -3498,7 +3499,8 @@ build_lb_datapaths(const struct hmap *lbs, const struct 
hmap *lb_groups,
                 ovn_lb_group_datapaths_find(lb_group_datapaths_map,
                                             lb_group_uuid);
             ovs_assert(lb_group_dps);
-            ovn_lb_group_datapaths_add_lr(lb_group_dps, od);
+            ovn_lb_group_datapaths_add_lr(lb_group_dps, od,
+                                          ods_size(lr_datapaths));
         }
 
         for (size_t i = 0; i < od->nbr->n_load_balancer; i++) {
@@ -3506,7 +3508,7 @@ build_lb_datapaths(const struct hmap *lbs, const struct 
hmap *lb_groups,
                 &od->nbr->load_balancer[i]->header_.uuid;
             lb_dps = ovn_lb_datapaths_find(lb_datapaths_map, lb_uuid);
             ovs_assert(lb_dps);
-            ovn_lb_datapaths_add_lr(lb_dps, 1, &od);
+            ovn_lb_datapaths_add_lr(lb_dps, 1, &od, ods_size(lr_datapaths));
         }
     }
 
@@ -3517,9 +3519,11 @@ build_lb_datapaths(const struct hmap *lbs, const struct 
hmap *lb_groups,
             lb_dps = ovn_lb_datapaths_find(lb_datapaths_map, lb_uuid);
             ovs_assert(lb_dps);
             ovn_lb_datapaths_add_ls(lb_dps, lb_group_dps->n_ls,
-                                    lb_group_dps->ls);
+                                    lb_group_dps->ls,
+                                    ods_size(ls_datapaths));
             ovn_lb_datapaths_add_lr(lb_dps, lb_group_dps->n_lr,
-                                    lb_group_dps->lr);
+                                    lb_group_dps->lr,
+                                    ods_size(lr_datapaths));
         }
     }
 }
@@ -3565,6 +3569,7 @@ build_lb_svcs(
 
 static void
 build_lswitch_lbs_from_lrouter(struct ovn_datapaths *lr_datapaths,
+                               struct ovn_datapaths *ls_datapaths,
                                struct hmap *lb_dps_map,
                                struct hmap *lb_group_dps_map)
 {
@@ -3579,7 +3584,8 @@ build_lswitch_lbs_from_lrouter(struct ovn_datapaths 
*lr_datapaths,
         BITMAP_FOR_EACH_1 (index, ods_size(lr_datapaths), lb_dps->nb_lr_map) {
             struct ovn_datapath *od = lr_datapaths->array[index];
             ovn_lb_datapaths_add_ls(lb_dps, vector_len(&od->ls_peers),
-                                    vector_get_array(&od->ls_peers));
+                                    vector_get_array(&od->ls_peers),
+                                    ods_size(ls_datapaths));
         }
     }
 
@@ -3589,14 +3595,15 @@ build_lswitch_lbs_from_lrouter(struct ovn_datapaths 
*lr_datapaths,
             struct ovn_datapath *od = lb_group_dps->lr[i];
             ovn_lb_group_datapaths_add_ls(lb_group_dps,
                                           vector_len(&od->ls_peers),
-                                          vector_get_array(&od->ls_peers));
+                                          vector_get_array(&od->ls_peers), 0);
             for (size_t j = 0; j < lb_group_dps->lb_group->n_lbs; j++) {
                 const struct uuid *lb_uuid =
                     &lb_group_dps->lb_group->lbs[j]->nlb->header_.uuid;
                 lb_dps = ovn_lb_datapaths_find(lb_dps_map, lb_uuid);
                 ovs_assert(lb_dps);
                 ovn_lb_datapaths_add_ls(lb_dps, vector_len(&od->ls_peers),
-                                        vector_get_array(&od->ls_peers));
+                                        vector_get_array(&od->ls_peers),
+                                        ods_size(ls_datapaths));
             }
         }
     }
@@ -3625,7 +3632,9 @@ build_lb_port_related_data(
     const struct sbrec_service_monitor_table *sbrec_service_monitor_table,
     const char *svc_monitor_mac,
     const struct eth_addr *svc_monitor_mac_ea,
-    struct ovn_datapaths *lr_datapaths, struct hmap *ls_ports,
+    struct ovn_datapaths *lr_datapaths,
+    struct ovn_datapaths *ls_datapaths,
+    struct hmap *ls_ports,
     struct hmap *lb_dps_map, struct hmap *lb_group_dps_map,
     struct sset *svc_monitor_lsps,
     struct hmap *svc_monitor_map)
@@ -3633,7 +3642,8 @@ build_lb_port_related_data(
     build_lb_svcs(ovnsb_txn, sbrec_service_monitor_table, svc_monitor_mac,
                   svc_monitor_mac_ea, ls_ports, lb_dps_map,
                   svc_monitor_lsps, svc_monitor_map);
-    build_lswitch_lbs_from_lrouter(lr_datapaths, lb_dps_map, lb_group_dps_map);
+    build_lswitch_lbs_from_lrouter(lr_datapaths, ls_datapaths, lb_dps_map,
+                                   lb_group_dps_map);
 }
 
 /* Returns true if the peer port IPs of op should be added in the nat_addresses
@@ -4968,7 +4978,7 @@ northd_handle_lb_data_changes(struct tracked_lb_data 
*trk_lb_data,
         UUIDSET_FOR_EACH (uuidnode, &codlb->assoc_lbs) {
             lb_dps = ovn_lb_datapaths_find(lb_datapaths_map, &uuidnode->uuid);
             ovs_assert(lb_dps);
-            ovn_lb_datapaths_add_ls(lb_dps, 1, &od);
+            ovn_lb_datapaths_add_ls(lb_dps, 1, &od, ods_size(ls_datapaths));
 
             if (od->lb_with_stateless_mode) {
                 hmapx_add(&lb_dps->ls_lb_with_stateless_mode, od);
@@ -4982,7 +4992,8 @@ northd_handle_lb_data_changes(struct tracked_lb_data 
*trk_lb_data,
             lbgrp_dps = ovn_lb_group_datapaths_find(lbgrp_datapaths_map,
                                                     &uuidnode->uuid);
             ovs_assert(lbgrp_dps);
-            ovn_lb_group_datapaths_add_ls(lbgrp_dps, 1, &od);
+            ovn_lb_group_datapaths_add_ls(lbgrp_dps, 1, &od,
+                                          ods_size(ls_datapaths));
 
             /* Associate all the lbs of the lbgrp to the datapath 'od' */
             for (size_t j = 0; j < lbgrp_dps->lb_group->n_lbs; j++) {
@@ -4990,7 +5001,8 @@ northd_handle_lb_data_changes(struct tracked_lb_data 
*trk_lb_data,
                     = &lbgrp_dps->lb_group->lbs[j]->nlb->header_.uuid;
                 lb_dps = ovn_lb_datapaths_find(lb_datapaths_map, lb_uuid);
                 ovs_assert(lb_dps);
-                ovn_lb_datapaths_add_ls(lb_dps, 1, &od);
+                ovn_lb_datapaths_add_ls(lb_dps, 1, &od,
+                                        ods_size(ls_datapaths));
 
                 /* Add the lb to the northd tracked data. */
                 hmapx_add(&nd_changes->trk_lbs.crupdated, lb_dps);
@@ -5009,7 +5021,7 @@ northd_handle_lb_data_changes(struct tracked_lb_data 
*trk_lb_data,
         UUIDSET_FOR_EACH (uuidnode, &codlb->assoc_lbs) {
             lb_dps = ovn_lb_datapaths_find(lb_datapaths_map, &uuidnode->uuid);
             ovs_assert(lb_dps);
-            ovn_lb_datapaths_add_lr(lb_dps, 1, &od);
+            ovn_lb_datapaths_add_lr(lb_dps, 1, &od, ods_size(lr_datapaths));
 
             /* Add the lb to the northd tracked data. */
             hmapx_add(&nd_changes->trk_lbs.crupdated, lb_dps);
@@ -5019,7 +5031,8 @@ northd_handle_lb_data_changes(struct tracked_lb_data 
*trk_lb_data,
             lbgrp_dps = ovn_lb_group_datapaths_find(lbgrp_datapaths_map,
                                                     &uuidnode->uuid);
             ovs_assert(lbgrp_dps);
-            ovn_lb_group_datapaths_add_lr(lbgrp_dps, od);
+            ovn_lb_group_datapaths_add_lr(lbgrp_dps, od,
+                                          ods_size(lr_datapaths));
 
             /* Associate all the lbs of the lbgrp to the datapath 'od' */
             for (size_t j = 0; j < lbgrp_dps->lb_group->n_lbs; j++) {
@@ -5027,7 +5040,8 @@ northd_handle_lb_data_changes(struct tracked_lb_data 
*trk_lb_data,
                     = &lbgrp_dps->lb_group->lbs[j]->nlb->header_.uuid;
                 lb_dps = ovn_lb_datapaths_find(lb_datapaths_map, lb_uuid);
                 ovs_assert(lb_dps);
-                ovn_lb_datapaths_add_lr(lb_dps, 1, &od);
+                ovn_lb_datapaths_add_lr(lb_dps, 1, &od,
+                                        ods_size(lr_datapaths));
 
                 /* Add the lb to the northd tracked data. */
                 hmapx_add(&nd_changes->trk_lbs.crupdated, lb_dps);
@@ -5068,12 +5082,14 @@ northd_handle_lb_data_changes(struct tracked_lb_data 
*trk_lb_data,
             ovs_assert(lb_dps);
             for (size_t i = 0; i < lbgrp_dps->n_lr; i++) {
                 od = lbgrp_dps->lr[i];
-                ovn_lb_datapaths_add_lr(lb_dps, 1, &od);
+                ovn_lb_datapaths_add_lr(lb_dps, 1, &od,
+                                        ods_size(lr_datapaths));
             }
 
             for (size_t i = 0; i < lbgrp_dps->n_ls; i++) {
                od = lbgrp_dps->ls[i];
-                ovn_lb_datapaths_add_ls(lb_dps, 1, &od);
+                ovn_lb_datapaths_add_ls(lb_dps, 1, &od,
+                                        ods_size(ls_datapaths));
 
                 /* Add the ls datapath to the northd tracked data. */
                 hmapx_add(&nd_changes->ls_with_changed_lbs, od);
@@ -18861,7 +18877,9 @@ ovnnb_db_run(struct northd_input *input_data,
                                input_data->sbrec_service_monitor_table,
                                input_data->svc_monitor_mac,
                                &input_data->svc_monitor_mac_ea,
-                               &data->lr_datapaths, &data->ls_ports,
+                               &data->lr_datapaths,
+                               &data->ls_datapaths,
+                               &data->ls_ports,
                                &data->lb_datapaths_map,
                                &data->lb_group_datapaths_map,
                                &data->svc_monitor_lsps,
-- 
2.50.0

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to