Reduce duplicated code between nb_ls_map and nb_lr_map.

Signed-off-by: Lorenzo Bianconi <lorenzo.bianc...@redhat.com>
---
 northd/en-lr-stateful.c |  2 +-
 northd/en-sync-sb.c     | 24 ++++++++++---------
 northd/lb.c             | 20 ++++++++--------
 northd/lb.h             | 13 +++++++----
 northd/northd.c         | 52 +++++++++++++++++++++++------------------
 5 files changed, 62 insertions(+), 49 deletions(-)

diff --git a/northd/en-lr-stateful.c b/northd/en-lr-stateful.c
index 56e93f3c4..58e90f2f2 100644
--- a/northd/en-lr-stateful.c
+++ b/northd/en-lr-stateful.c
@@ -252,7 +252,7 @@ lr_stateful_lb_data_handler(struct engine_node *node, void 
*data_)
 
         size_t index;
         BITMAP_FOR_EACH_1 (index, ods_size(input_data.lr_datapaths),
-                           lb_dps->nb_lr_map) {
+                           lb_dps->nb_lr_map.map) {
             const struct ovn_datapath *od =
                 ovn_datapaths_find_by_index(input_data.lr_datapaths, index);
 
diff --git a/northd/en-sync-sb.c b/northd/en-sync-sb.c
index a111f14fd..343c76b54 100644
--- a/northd/en-sync-sb.c
+++ b/northd/en-sync-sb.c
@@ -676,7 +676,7 @@ sb_lb_table_build_and_sync(
     struct sb_lb_record *sb_lb;
 
     HMAP_FOR_EACH (lb_dps, hmap_node, lb_dps_map) {
-        if (!lb_dps->n_nb_ls && !lb_dps->n_nb_lr) {
+        if (!lb_dps->nb_ls_map.n_elems && !lb_dps->nb_lr_map.n_elems) {
             continue;
         }
 
@@ -754,10 +754,10 @@ sync_sb_lb_record(struct sb_lb_record *sb_lb,
         sbrec_lr_dp_group = sbrec_lb->lr_datapath_group;
     }
 
-    if (lb_dps->n_nb_ls) {
+    if (lb_dps->nb_ls_map.n_elems) {
         sb_lb->ls_dpg = ovn_dp_group_get(&sb_lbs->ls_dp_groups,
-                                         lb_dps->n_nb_ls,
-                                         lb_dps->nb_ls_map,
+                                         lb_dps->nb_ls_map.n_elems,
+                                         lb_dps->nb_ls_map.map,
                                          ods_size(ls_datapaths));
         if (sb_lb->ls_dpg) {
             /* Update the dpg's sb dp_group. */
@@ -787,7 +787,7 @@ sync_sb_lb_record(struct sb_lb_record *sb_lb,
         } else {
             sb_lb->ls_dpg = ovn_dp_group_create(
                 ovnsb_txn, &sb_lbs->ls_dp_groups, sbrec_ls_dp_group,
-                lb_dps->n_nb_ls, lb_dps->nb_ls_map,
+                lb_dps->nb_ls_map.n_elems, lb_dps->nb_ls_map.map,
                 ods_size(ls_datapaths), true,
                 ls_datapaths, lr_datapaths);
         }
@@ -809,10 +809,10 @@ sync_sb_lb_record(struct sb_lb_record *sb_lb,
     }
 
 
-    if (lb_dps->n_nb_lr) {
+    if (lb_dps->nb_lr_map.n_elems) {
         sb_lb->lr_dpg = ovn_dp_group_get(&sb_lbs->lr_dp_groups,
-                                         lb_dps->n_nb_lr,
-                                         lb_dps->nb_lr_map,
+                                         lb_dps->nb_lr_map.n_elems,
+                                         lb_dps->nb_lr_map.map,
                                          ods_size(lr_datapaths));
         if (sb_lb->lr_dpg) {
             /* Update the dpg's sb dp_group. */
@@ -842,7 +842,7 @@ sync_sb_lb_record(struct sb_lb_record *sb_lb,
         } else {
             sb_lb->lr_dpg = ovn_dp_group_create(
                 ovnsb_txn, &sb_lbs->lr_dp_groups, sbrec_lr_dp_group,
-                lb_dps->n_nb_lr, lb_dps->nb_lr_map,
+                lb_dps->nb_lr_map.n_elems, lb_dps->nb_lr_map.map,
                 ods_size(lr_datapaths), false,
                 ls_datapaths, lr_datapaths);
         }
@@ -919,7 +919,8 @@ sync_changed_lbs(struct sb_lb_table *sb_lbs,
 
         sb_lb = sb_lb_table_find(&sb_lbs->entries, nb_uuid);
 
-        if (!sb_lb && !lb_dps->n_nb_ls && !lb_dps->n_nb_lr) {
+        if (!sb_lb && !lb_dps->nb_ls_map.n_elems &&
+            !lb_dps->nb_lr_map.n_elems) {
             continue;
         }
 
@@ -933,7 +934,8 @@ sync_changed_lbs(struct sb_lb_table *sb_lbs,
                 sbrec_load_balancer_table_get_for_uuid(sb_lb_table, nb_uuid);
         }
 
-        if (sb_lb && !lb_dps->n_nb_ls && !lb_dps->n_nb_lr) {
+        if (sb_lb && !lb_dps->nb_ls_map.n_elems &&
+            !lb_dps->nb_lr_map.n_elems) {
             const struct sbrec_load_balancer *sbrec_lb =
                 sbrec_load_balancer_table_get_for_uuid(sb_lb_table, nb_uuid);
             if (sbrec_lb) {
diff --git a/northd/lb.c b/northd/lb.c
index b11896cf1..d8327c2fc 100644
--- a/northd/lb.c
+++ b/northd/lb.c
@@ -578,8 +578,8 @@ ovn_lb_datapaths_create(const struct ovn_northd_lb *lb, 
size_t n_ls_datapaths,
 {
     struct ovn_lb_datapaths *lb_dps = xzalloc(sizeof *lb_dps);
     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->nb_ls_map.map = bitmap_allocate(n_ls_datapaths);
+    lb_dps->nb_lr_map.map = bitmap_allocate(n_lr_datapaths);
     lb_dps->lflow_ref = lflow_ref_create();
     hmapx_init(&lb_dps->ls_lb_with_stateless_mode);
     return lb_dps;
@@ -588,8 +588,8 @@ ovn_lb_datapaths_create(const struct ovn_northd_lb *lb, 
size_t n_ls_datapaths,
 void
 ovn_lb_datapaths_destroy(struct ovn_lb_datapaths *lb_dps)
 {
-    bitmap_free(lb_dps->nb_lr_map);
-    bitmap_free(lb_dps->nb_ls_map);
+    bitmap_free(lb_dps->nb_lr_map.map);
+    bitmap_free(lb_dps->nb_ls_map.map);
     lflow_ref_destroy(lb_dps->lflow_ref);
     hmapx_destroy(&lb_dps->ls_lb_with_stateless_mode);
     free(lb_dps);
@@ -600,9 +600,9 @@ ovn_lb_datapaths_add_lr(struct ovn_lb_datapaths *lb_dps, 
size_t n,
                         struct ovn_datapath **ods)
 {
     for (size_t i = 0; i < n; i++) {
-        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++;
+        if (!bitmap_is_set(lb_dps->nb_lr_map.map, ods[i]->index)) {
+            bitmap_set1(lb_dps->nb_lr_map.map, ods[i]->index);
+            lb_dps->nb_lr_map.n_elems++;
         }
     }
 }
@@ -612,9 +612,9 @@ ovn_lb_datapaths_add_ls(struct ovn_lb_datapaths *lb_dps, 
size_t n,
                         struct ovn_datapath **ods)
 {
     for (size_t i = 0; i < n; i++) {
-        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++;
+        if (!bitmap_is_set(lb_dps->nb_ls_map.map, ods[i]->index)) {
+            bitmap_set1(lb_dps->nb_ls_map.map, ods[i]->index);
+            lb_dps->nb_ls_map.n_elems++;
         }
     }
 }
diff --git a/northd/lb.h b/northd/lb.h
index eb1942bd4..1d6152a1d 100644
--- a/northd/lb.h
+++ b/northd/lb.h
@@ -132,15 +132,20 @@ void ovn_lb_group_reinit(
     const struct hmap *lbs);
 
 struct lflow_ref;
+
+struct dynamic_bitmap {
+    unsigned long *map;
+    size_t n_elems;
+    size_t capacity;
+};
+
 struct ovn_lb_datapaths {
     struct hmap_node hmap_node;
 
     const struct ovn_northd_lb *lb;
-    size_t n_nb_ls;
-    unsigned long *nb_ls_map;
 
-    size_t n_nb_lr;
-    unsigned long *nb_lr_map;
+    struct dynamic_bitmap nb_ls_map;
+    struct dynamic_bitmap nb_lr_map;
 
     struct hmapx ls_lb_with_stateless_mode;
 
diff --git a/northd/northd.c b/northd/northd.c
index 9df8f10e0..95cd67a5a 100644
--- a/northd/northd.c
+++ b/northd/northd.c
@@ -3775,7 +3775,8 @@ build_lswitch_lbs_from_lrouter(struct ovn_datapaths 
*lr_datapaths,
     size_t index;
 
     HMAP_FOR_EACH (lb_dps, hmap_node, lb_dps_map) {
-        BITMAP_FOR_EACH_1 (index, ods_size(lr_datapaths), lb_dps->nb_lr_map) {
+        BITMAP_FOR_EACH_1 (index, ods_size(lr_datapaths),
+                           lb_dps->nb_lr_map.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));
@@ -3809,8 +3810,10 @@ build_lb_count_dps(struct hmap *lb_dps_map,
     struct ovn_lb_datapaths *lb_dps;
 
     HMAP_FOR_EACH (lb_dps, hmap_node, lb_dps_map) {
-        lb_dps->n_nb_lr = bitmap_count1(lb_dps->nb_lr_map, n_lr_datapaths);
-        lb_dps->n_nb_ls = bitmap_count1(lb_dps->nb_ls_map, n_ls_datapaths);
+        lb_dps->nb_lr_map.n_elems = bitmap_count1(lb_dps->nb_lr_map.map,
+                                                  n_lr_datapaths);
+        lb_dps->nb_ls_map.n_elems = bitmap_count1(lb_dps->nb_ls_map.map,
+                                                  n_ls_datapaths);
     }
 }
 
@@ -5262,7 +5265,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) {
+                           lb_dps->nb_ls_map.map) {
             od = ls_datapaths->array[index];
 
             /* Add the ls datapath to the northd tracked data. */
@@ -5396,7 +5399,7 @@ northd_handle_lb_data_changes(struct tracked_lb_data 
*trk_lb_data,
         ovs_assert(lb_dps);
         size_t index;
         BITMAP_FOR_EACH_1 (index, ods_size(ls_datapaths),
-                           lb_dps->nb_ls_map) {
+                           lb_dps->nb_ls_map.map) {
             od = ls_datapaths->array[index];
 
             /* Add the ls datapath to the northd tracked data. */
@@ -7839,7 +7842,7 @@ build_lb_rules_pre_stateful(struct lflow_table *lflows,
                             const struct ovn_datapaths *ls_datapaths,
                             struct ds *match, struct ds *action)
 {
-    if (!lb_dps->n_nb_ls) {
+    if (!lb_dps->nb_ls_map.n_elems) {
         return;
     }
 
@@ -7880,7 +7883,7 @@ build_lb_rules_pre_stateful(struct lflow_table *lflows,
         }
 
         ovn_lflow_add_with_dp_group(
-            lflows, lb_dps->nb_ls_map, ods_size(ls_datapaths),
+            lflows, lb_dps->nb_ls_map.map, ods_size(ls_datapaths),
             S_SWITCH_IN_PRE_STATEFUL, 120, ds_cstr(match), ds_cstr(action),
             &lb->nlb->header_, lb_dps->lflow_ref);
 
@@ -8137,7 +8140,7 @@ build_lb_affinity_ls_flows(struct lflow_table *lflows,
                            const struct ovn_datapaths *ls_datapaths,
                            struct lflow_ref *lflow_ref)
 {
-    if (!lb_dps->lb->affinity_timeout || !lb_dps->n_nb_ls) {
+    if (!lb_dps->lb->affinity_timeout || !lb_dps->nb_ls_map.n_elems) {
         return;
     }
 
@@ -8158,7 +8161,7 @@ build_lb_affinity_ls_flows(struct lflow_table *lflows,
     static char *aff_check = REGBIT_KNOWN_LB_SESSION" = chk_lb_aff(); next;";
 
     ovn_lflow_add_with_dp_group(
-        lflows, lb_dps->nb_ls_map, ods_size(ls_datapaths),
+        lflows, lb_dps->nb_ls_map.map, ods_size(ls_datapaths),
         S_SWITCH_IN_LB_AFF_CHECK, 100, ds_cstr(&new_lb_match), aff_check,
         &lb_dps->lb->nlb->header_, lflow_ref);
     ds_destroy(&new_lb_match);
@@ -8240,14 +8243,14 @@ build_lb_affinity_ls_flows(struct lflow_table *lflows,
 
         /* Forward to OFTABLE_CHK_LB_AFFINITY table to store flow tuple. */
         ovn_lflow_add_with_dp_group(
-            lflows, lb_dps->nb_ls_map, ods_size(ls_datapaths),
+            lflows, lb_dps->nb_ls_map.map, ods_size(ls_datapaths),
             S_SWITCH_IN_LB_AFF_LEARN, 100, ds_cstr(&aff_match_learn),
             ds_cstr(&aff_action_learn), &lb->nlb->header_,
             lflow_ref);
 
         /* Use already selected backend within affinity timeslot. */
         ovn_lflow_add_with_dp_group(
-            lflows, lb_dps->nb_ls_map, ods_size(ls_datapaths),
+            lflows, lb_dps->nb_ls_map.map, ods_size(ls_datapaths),
             S_SWITCH_IN_LB, 150, ds_cstr(&aff_match), ds_cstr(&aff_action),
             &lb->nlb->header_, lflow_ref);
 
@@ -8328,10 +8331,10 @@ build_lb_rules(struct lflow_table *lflows, struct 
ovn_lb_datapaths *lb_dps,
         if (reject) {
             size_t index;
 
-            dp_non_meter = bitmap_clone(lb_dps->nb_ls_map,
+            dp_non_meter = bitmap_clone(lb_dps->nb_ls_map.map,
                                         ods_size(ls_datapaths));
             BITMAP_FOR_EACH_1 (index, ods_size(ls_datapaths),
-                               lb_dps->nb_ls_map) {
+                               lb_dps->nb_ls_map.map) {
                 struct ovn_datapath *od = ls_datapaths->array[index];
 
                 meter = copp_meter_get(COPP_REJECT, od->nbs->copp,
@@ -8350,7 +8353,7 @@ build_lb_rules(struct lflow_table *lflows, struct 
ovn_lb_datapaths *lb_dps,
         }
         if (!reject || build_non_meter) {
             ovn_lflow_add_with_dp_group(
-                lflows, dp_non_meter ? dp_non_meter : lb_dps->nb_ls_map,
+                lflows, dp_non_meter ? dp_non_meter : lb_dps->nb_ls_map.map,
                 ods_size(ls_datapaths), S_SWITCH_IN_LB, priority,
                 ds_cstr(match), ds_cstr(action), &lb->nlb->header_,
                 lb_dps->lflow_ref);
@@ -12355,7 +12358,7 @@ build_lrouter_nat_flows_for_lb(
     size_t index;
     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) {
+    BITMAP_FOR_EACH_1 (index, bitmap_len, lb_dps->nb_lr_map.map) {
         struct ovn_datapath *od = lr_datapaths->array[index];
         enum lrouter_nat_lb_flow_type type;
 
@@ -12440,7 +12443,7 @@ build_lswitch_flows_for_lb(struct ovn_lb_datapaths 
*lb_dps,
                            const struct hmap *svc_monitor_map,
                            struct ds *match, struct ds *action)
 {
-    if (!lb_dps->n_nb_ls) {
+    if (!lb_dps->nb_ls_map.n_elems) {
         return;
     }
 
@@ -12454,7 +12457,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) {
+        BITMAP_FOR_EACH_1 (index, ods_size(ls_datapaths),
+                           lb_dps->nb_ls_map.map) {
             struct ovn_datapath *od = ls_datapaths->array[index];
 
             ovn_lflow_add_with_hint__(lflows, od,
@@ -12498,7 +12502,7 @@ build_lrouter_defrag_flows_for_lb(struct 
ovn_lb_datapaths *lb_dps,
                                   const struct ovn_datapaths *lr_datapaths,
                                   struct ds *match)
 {
-    if (!lb_dps->n_nb_lr) {
+    if (!lb_dps->nb_lr_map.n_elems) {
         return;
     }
 
@@ -12512,7 +12516,7 @@ build_lrouter_defrag_flows_for_lb(struct 
ovn_lb_datapaths *lb_dps,
                       lb_vip->vip_str);
 
         ovn_lflow_add_with_dp_group(
-            lflows, lb_dps->nb_lr_map, ods_size(lr_datapaths),
+            lflows, lb_dps->nb_lr_map.map, ods_size(lr_datapaths),
             S_ROUTER_IN_DEFRAG, prio, ds_cstr(match), "ct_dnat;",
             &lb_dps->lb->nlb->header_, lb_dps->lflow_ref);
     }
@@ -12532,7 +12536,7 @@ build_lrouter_allow_vip_traffic_template(struct 
lflow_table *lflows,
     struct ds match = DS_EMPTY_INITIALIZER;
 
     size_t index;
-    BITMAP_FOR_EACH_1 (index, ods_size(lr_dps), lb_dps->nb_lr_map) {
+    BITMAP_FOR_EACH_1 (index, ods_size(lr_dps), lb_dps->nb_lr_map.map) {
         struct ovn_datapath *od = lr_dps->array[index];
         /* Do not drop ip traffic with destination the template VIP. */
         ds_clear(&match);
@@ -12558,7 +12562,7 @@ build_lrouter_flows_for_lb(struct ovn_lb_datapaths 
*lb_dps,
 {
     size_t index;
 
-    if (!lb_dps->n_nb_lr) {
+    if (!lb_dps->nb_lr_map.n_elems) {
         return;
     }
 
@@ -12578,7 +12582,8 @@ build_lrouter_flows_for_lb(struct ovn_lb_datapaths 
*lb_dps,
             continue;
         }
 
-        BITMAP_FOR_EACH_1 (index, ods_size(lr_datapaths), lb_dps->nb_lr_map) {
+        BITMAP_FOR_EACH_1 (index, ods_size(lr_datapaths),
+                           lb_dps->nb_lr_map.map) {
             struct ovn_datapath *od = lr_datapaths->array[index];
 
             ovn_lflow_add_with_hint__(lflows, od, S_ROUTER_IN_DNAT,
@@ -12592,7 +12597,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) {
+        BITMAP_FOR_EACH_1 (index, ods_size(lr_datapaths),
+                           lb_dps->nb_lr_map.map) {
             struct ovn_datapath *od = lr_datapaths->array[index];
 
             ovn_lflow_add(lflows, od, S_ROUTER_OUT_SNAT, 120,
-- 
2.50.1

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

Reply via email to