<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-sgsn/+/21551">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gbproxy: convert nse->bvcs from llist_head to hashtable<br><br>For the common lookup-by-bvci, this should reduce the computational<br>complexity significantly.<br><br>Depends: libosmocore.git I8ef73a62fe9846ce45058eb21cf999dd3eed5741<br>Change-Id: Ic8e9279fd61a3c514fc3203429f36a468f0e81d3<br>---<br>M include/osmocom/sgsn/gb_proxy.h<br>M src/gbproxy/gb_proxy.c<br>M src/gbproxy/gb_proxy_ctrl.c<br>M src/gbproxy/gb_proxy_peer.c<br>M src/gbproxy/gb_proxy_vty.c<br>M tests/gbproxy/gbproxy_test.c<br>M tests/gbproxy/gbproxy_test.ok<br>7 files changed, 79 insertions(+), 64 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/sgsn/gb_proxy.h b/include/osmocom/sgsn/gb_proxy.h</span><br><span>index b0ab83d..95a3331 100644</span><br><span>--- a/include/osmocom/sgsn/gb_proxy.h</span><br><span>+++ b/include/osmocom/sgsn/gb_proxy.h</span><br><span>@@ -150,7 +150,7 @@</span><br><span> /* One BVC inside an NSE */</span><br><span> struct gbproxy_bvc {</span><br><span>   /* linked to gbproxy_nse.bvcs */</span><br><span style="color: hsl(0, 100%, 40%);">-        struct llist_head list;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct hlist_node list;</span><br><span> </span><br><span>  /* The NSE this BVC belongs to */</span><br><span>    struct gbproxy_nse *nse;</span><br><span>@@ -186,7 +186,7 @@</span><br><span>       uint16_t nsei;</span><br><span> </span><br><span>   /* List of all BVCs in this NSE */</span><br><span style="color: hsl(0, 100%, 40%);">-      struct llist_head bvcs;</span><br><span style="color: hsl(120, 100%, 40%);">+       DECLARE_HASHTABLE(bvcs, 10);</span><br><span> };</span><br><span> </span><br><span> struct gbproxy_tlli_state {</span><br><span>diff --git a/src/gbproxy/gb_proxy.c b/src/gbproxy/gb_proxy.c</span><br><span>index c37b21a..4cf7e41 100644</span><br><span>--- a/src/gbproxy/gb_proxy.c</span><br><span>+++ b/src/gbproxy/gb_proxy.c</span><br><span>@@ -1184,7 +1184,7 @@</span><br><span>   struct gbproxy_bvc *bvc;</span><br><span>     unsigned int n_nses = 0;</span><br><span>     int errctr = GBPROX_GLOB_CTR_PROTO_ERR_SGSN;</span><br><span style="color: hsl(0, 100%, 40%);">-    int i;</span><br><span style="color: hsl(120, 100%, 40%);">+        int i, j;</span><br><span> </span><br><span>        /* FIXME: Handle paging logic to only page each matching NSE */</span><br><span> </span><br><span>@@ -1206,7 +1206,7 @@</span><br><span>          errctr = GBPROX_GLOB_CTR_INV_RAI;</span><br><span>            /* iterate over all bvcs and dispatch the paging to each matching one */</span><br><span>             hash_for_each(cfg->bss_nses, i, nse, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 llist_for_each_entry(bvc, &nse->bvcs, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  hash_for_each(nse->bvcs, j, bvc, list) {</span><br><span>                          if (!memcmp(bvc->ra, TLVP_VAL(tp, BSSGP_IE_ROUTEING_AREA), 6)) {</span><br><span>                                  LOGPNSE(nse, LOGL_INFO, "routing to NSE (RAI match)\n");</span><br><span>                                   gbprox_relay2nse(msg, nse, ns_bvci);</span><br><span>@@ -1220,7 +1220,7 @@</span><br><span>                 errctr = GBPROX_GLOB_CTR_INV_LAI;</span><br><span>            /* iterate over all bvcs and dispatch the paging to each matching one */</span><br><span>             hash_for_each(cfg->bss_nses, i, nse, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 llist_for_each_entry(bvc, &nse->bvcs, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  hash_for_each(nse->bvcs, j, bvc, list) {</span><br><span>                          if (!memcmp(bvc->ra, TLVP_VAL(tp, BSSGP_IE_LOCATION_AREA), 5)) {</span><br><span>                                  LOGPNSE(nse, LOGL_INFO, "routing to NSE (LAI match)\n");</span><br><span>                                   gbprox_relay2nse(msg, nse, ns_bvci);</span><br><span>@@ -1233,7 +1233,7 @@</span><br><span>         } else if (TLVP_PRES_LEN(tp, BSSGP_IE_BSS_AREA_ID, 1)) {</span><br><span>             /* iterate over all bvcs and dispatch the paging to each matching one */</span><br><span>             hash_for_each(cfg->bss_nses, i, nse, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 llist_for_each_entry(bvc, &nse->bvcs, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  hash_for_each(nse->bvcs, j, bvc, list) {</span><br><span>                          LOGPNSE(nse, LOGL_INFO, "routing to NSE (broadcast)\n");</span><br><span>                           gbprox_relay2nse(msg, nse, ns_bvci);</span><br><span>                                 n_nses++;</span><br><span>@@ -1265,7 +1265,7 @@</span><br><span>    struct gbproxy_nse *nse;</span><br><span>     struct gbproxy_bvc *bvc;</span><br><span>     uint16_t ptp_bvci;</span><br><span style="color: hsl(0, 100%, 40%);">-      int i;</span><br><span style="color: hsl(120, 100%, 40%);">+        int i, j;</span><br><span> </span><br><span>        if (!TLVP_PRES_LEN(tp, BSSGP_IE_BVCI, 2)) {</span><br><span>          rate_ctr_inc(&cfg->ctrg-></span><br><span>@@ -1295,7 +1295,7 @@</span><br><span>   * among all the BSS's that we multiplex, it needs to</span><br><span>     * be relayed  */</span><br><span>    hash_for_each(cfg->bss_nses, i, nse, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-         llist_for_each_entry(bvc, &nse->bvcs, list)</span><br><span style="color: hsl(120, 100%, 40%);">+            hash_for_each(nse->bvcs, j, bvc, list)</span><br><span>                    gbprox_relay2peer(msg, bvc, ns_bvci);</span><br><span>        }</span><br><span> </span><br><span>@@ -1624,11 +1624,12 @@</span><br><span> {</span><br><span>         struct gbproxy_nse *nse;</span><br><span>     struct hlist_node *ntmp;</span><br><span style="color: hsl(0, 100%, 40%);">-        int i;</span><br><span style="color: hsl(120, 100%, 40%);">+        int i, j;</span><br><span> </span><br><span>        hash_for_each_safe(cfg->bss_nses, i, ntmp, nse, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-              struct gbproxy_bvc *bvc, *tmp;</span><br><span style="color: hsl(0, 100%, 40%);">-          llist_for_each_entry_safe(bvc, tmp, &nse->bvcs, list)</span><br><span style="color: hsl(120, 100%, 40%);">+          struct gbproxy_bvc *bvc;</span><br><span style="color: hsl(120, 100%, 40%);">+              struct hlist_node *tmp;</span><br><span style="color: hsl(120, 100%, 40%);">+               hash_for_each_safe(nse->bvcs, j, tmp, bvc, list)</span><br><span>                  gbproxy_bvc_free(bvc);</span><br><span> </span><br><span>           gbproxy_nse_free(nse);</span><br><span>diff --git a/src/gbproxy/gb_proxy_ctrl.c b/src/gbproxy/gb_proxy_ctrl.c</span><br><span>index 8290412..157695d 100644</span><br><span>--- a/src/gbproxy/gb_proxy_ctrl.c</span><br><span>+++ b/src/gbproxy/gb_proxy_ctrl.c</span><br><span>@@ -85,13 +85,13 @@</span><br><span> {</span><br><span>   struct gbproxy_config *cfg = data;</span><br><span>   struct gbproxy_nse *nse_peer;</span><br><span style="color: hsl(0, 100%, 40%);">-   int i;</span><br><span style="color: hsl(120, 100%, 40%);">+        int i, j;</span><br><span> </span><br><span>        cmd->reply = talloc_strdup(cmd, "");</span><br><span> </span><br><span>        hash_for_each(cfg->bss_nses, i, nse_peer, list) {</span><br><span>                 struct gbproxy_bvc *bvc;</span><br><span style="color: hsl(0, 100%, 40%);">-                llist_for_each_entry(bvc, &nse_peer->bvcs, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+             hash_for_each(nse_peer->bvcs, j, bvc, list) {</span><br><span>                     struct gprs_ra_id raid;</span><br><span>                      gsm48_parse_ra(&raid, bvc->ra);</span><br><span> </span><br><span>@@ -112,11 +112,14 @@</span><br><span> {</span><br><span>      struct gbproxy_config *cfg = data;</span><br><span>   struct gbproxy_nse *nse_peer;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gbproxy_bvc *bvc;</span><br><span>     uint32_t count = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-     int i;</span><br><span style="color: hsl(120, 100%, 40%);">+        int i, j;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   hash_for_each(cfg->bss_nses, i, nse_peer, list)</span><br><span style="color: hsl(0, 100%, 40%);">-              count += llist_count(&nse_peer->bvcs);</span><br><span style="color: hsl(120, 100%, 40%);">+ hash_for_each(cfg->bss_nses, i, nse_peer, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+          hash_for_each(nse_peer->bvcs, j, bvc, list)</span><br><span style="color: hsl(120, 100%, 40%);">+                        count++;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span> </span><br><span>        cmd->reply = talloc_strdup(cmd, "");</span><br><span>    cmd->reply = talloc_asprintf_append(cmd->reply, "%u", count);</span><br><span>diff --git a/src/gbproxy/gb_proxy_peer.c b/src/gbproxy/gb_proxy_peer.c</span><br><span>index 00bff20..f5a4376 100644</span><br><span>--- a/src/gbproxy/gb_proxy_peer.c</span><br><span>+++ b/src/gbproxy/gb_proxy_peer.c</span><br><span>@@ -90,7 +90,7 @@</span><br><span> </span><br><span>       hash_for_each(cfg->bss_nses, i, nse, list) {</span><br><span>              struct gbproxy_bvc *bvc;</span><br><span style="color: hsl(0, 100%, 40%);">-                llist_for_each_entry(bvc, &nse->bvcs, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+          hash_for_each_possible(nse->bvcs, bvc, list, bvci) {</span><br><span>                      if (bvc->bvci == bvci)</span><br><span>                            return bvc;</span><br><span>          }</span><br><span>@@ -104,9 +104,15 @@</span><br><span>                                       uint16_t nsei)</span><br><span> {</span><br><span>        struct gbproxy_nse *nse = gbproxy_nse_by_nsei(cfg, nsei);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gbproxy_bvc *bvc;</span><br><span style="color: hsl(120, 100%, 40%);">+      int i;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      if (nse && !llist_empty(&nse->bvcs))</span><br><span style="color: hsl(0, 100%, 40%);">-             return llist_first_entry(&nse->bvcs, struct gbproxy_bvc, list);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!nse || hash_empty(nse->bvcs))</span><br><span style="color: hsl(120, 100%, 40%);">+         return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* return the first entry we find */</span><br><span style="color: hsl(120, 100%, 40%);">+  hash_for_each(nse->bvcs, i, bvc, list)</span><br><span style="color: hsl(120, 100%, 40%);">+             return bvc;</span><br><span> </span><br><span>      return NULL;</span><br><span> }</span><br><span>@@ -117,11 +123,11 @@</span><br><span>                                     const uint8_t *ra)</span><br><span> {</span><br><span>     struct gbproxy_nse *nse;</span><br><span style="color: hsl(0, 100%, 40%);">-        int i;</span><br><span style="color: hsl(120, 100%, 40%);">+        int i, j;</span><br><span> </span><br><span>        hash_for_each(cfg->bss_nses, i, nse, list) {</span><br><span>              struct gbproxy_bvc *bvc;</span><br><span style="color: hsl(0, 100%, 40%);">-                llist_for_each_entry(bvc, &nse->bvcs, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+          hash_for_each(nse->bvcs, j, bvc, list) {</span><br><span>                  if (!memcmp(bvc->ra, ra, 6))</span><br><span>                              return bvc;</span><br><span>          }</span><br><span>@@ -136,11 +142,11 @@</span><br><span>                                     const uint8_t *la)</span><br><span> {</span><br><span>     struct gbproxy_nse *nse;</span><br><span style="color: hsl(0, 100%, 40%);">-        int i;</span><br><span style="color: hsl(120, 100%, 40%);">+        int i, j;</span><br><span> </span><br><span>        hash_for_each(cfg->bss_nses, i, nse, list) {</span><br><span>              struct gbproxy_bvc *bvc;</span><br><span style="color: hsl(0, 100%, 40%);">-                llist_for_each_entry(bvc, &nse->bvcs, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+          hash_for_each(nse->bvcs, j, bvc, list) {</span><br><span>                  if (!memcmp(bvc->ra, la, 5))</span><br><span>                              return bvc;</span><br><span>          }</span><br><span>@@ -154,11 +160,11 @@</span><br><span>                                     const uint8_t *la)</span><br><span> {</span><br><span>     struct gbproxy_nse *nse;</span><br><span style="color: hsl(0, 100%, 40%);">-        int i;</span><br><span style="color: hsl(120, 100%, 40%);">+        int i, j;</span><br><span> </span><br><span>        hash_for_each(cfg->bss_nses, i, nse, list) {</span><br><span>              struct gbproxy_bvc *bvc;</span><br><span style="color: hsl(0, 100%, 40%);">-                llist_for_each_entry(bvc, &nse->bvcs, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+          hash_for_each(nse->bvcs, j, bvc, list) {</span><br><span>                  if (!memcmp(bvc->ra + 3, la + 3, 2))</span><br><span>                              return bvc;</span><br><span>          }</span><br><span>@@ -232,7 +238,7 @@</span><br><span>      }</span><br><span>    bvc->nse = nse;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  llist_add(&bvc->list, &nse->bvcs);</span><br><span style="color: hsl(120, 100%, 40%);">+      hash_add(nse->bvcs, &bvc->list, bvc->bvci);</span><br><span> </span><br><span>         INIT_LLIST_HEAD(&bvc->patch_state.logical_links);</span><br><span> </span><br><span>@@ -249,7 +255,7 @@</span><br><span>   if (!bvc)</span><br><span>            return;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     llist_del(&bvc->list);</span><br><span style="color: hsl(120, 100%, 40%);">+ hash_del(&bvc->list);</span><br><span>         osmo_timer_del(&bvc->clean_stale_timer);</span><br><span>      gbproxy_delete_link_infos(bvc);</span><br><span> </span><br><span>@@ -261,8 +267,8 @@</span><br><span> </span><br><span> void gbproxy_bvc_move(struct gbproxy_bvc *bvc, struct gbproxy_nse *nse)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   llist_del(&bvc->list);</span><br><span style="color: hsl(0, 100%, 40%);">-   llist_add(&bvc->list, &nse->bvcs);</span><br><span style="color: hsl(120, 100%, 40%);">+      hash_del(&bvc->list);</span><br><span style="color: hsl(120, 100%, 40%);">+  hash_add(nse->bvcs, &bvc->list, bvc->bvci);</span><br><span>     bvc->nse = nse;</span><br><span> }</span><br><span> </span><br><span>@@ -272,16 +278,17 @@</span><br><span>  *  \param[in] bvci if 0: remove all BVCs; if != 0: BVCI of the single BVC to clean up */</span><br><span> int gbproxy_cleanup_bvcs(struct gbproxy_config *cfg, uint16_t nsei, uint16_t bvci)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     int i, counter = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   int i, j, counter = 0;</span><br><span>       struct gbproxy_nse *nse;</span><br><span>     struct hlist_node *ntmp;</span><br><span>     OSMO_ASSERT(cfg);</span><br><span> </span><br><span>        hash_for_each_safe(cfg->bss_nses, i, ntmp, nse, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-              struct gbproxy_bvc *bvc, *tmp;</span><br><span style="color: hsl(120, 100%, 40%);">+                struct gbproxy_bvc *bvc;</span><br><span style="color: hsl(120, 100%, 40%);">+              struct hlist_node *btmp;</span><br><span>             if (nse->nsei != nsei)</span><br><span>                    continue;</span><br><span style="color: hsl(0, 100%, 40%);">-               llist_for_each_entry_safe(bvc, tmp, &nse->bvcs, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                hash_for_each_safe(nse->bvcs, j, btmp, bvc, list) {</span><br><span>                       if (bvci && bvc->bvci != bvci)</span><br><span>                            continue;</span><br><span> </span><br><span>@@ -307,20 +314,23 @@</span><br><span> </span><br><span>    hash_add(cfg->bss_nses, &nse->list, nsei);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        INIT_LLIST_HEAD(&nse->bvcs);</span><br><span style="color: hsl(120, 100%, 40%);">+   hash_init(nse->bvcs);</span><br><span> </span><br><span>         return nse;</span><br><span> }</span><br><span> </span><br><span> void gbproxy_nse_free(struct gbproxy_nse *nse)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gbproxy_bvc *bvc, *tmp;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gbproxy_bvc *bvc;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct hlist_node *tmp;</span><br><span style="color: hsl(120, 100%, 40%);">+       int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     if (!nse)</span><br><span>            return;</span><br><span> </span><br><span>  hash_del(&nse->list);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        llist_for_each_entry_safe(bvc, tmp, &nse->bvcs, list)</span><br><span style="color: hsl(120, 100%, 40%);">+  hash_for_each_safe(nse->bvcs, i, tmp, bvc, list)</span><br><span>          gbproxy_bvc_free(bvc);</span><br><span> </span><br><span>   talloc_free(nse);</span><br><span>diff --git a/src/gbproxy/gb_proxy_vty.c b/src/gbproxy/gb_proxy_vty.c</span><br><span>index da8afdc..47ac9b9 100644</span><br><span>--- a/src/gbproxy/gb_proxy_vty.c</span><br><span>+++ b/src/gbproxy/gb_proxy_vty.c</span><br><span>@@ -422,7 +422,7 @@</span><br><span>       "Frequency at which the periodic timer is fired (in seconds)\n")</span><br><span> {</span><br><span>        struct gbproxy_nse *nse;</span><br><span style="color: hsl(0, 100%, 40%);">-        int i;</span><br><span style="color: hsl(120, 100%, 40%);">+        int i, j;</span><br><span>    g_cfg->clean_stale_timer_freq = (unsigned int) atoi(argv[0]);</span><br><span> </span><br><span>         /* Re-schedule running timers soon in case prev frequency was really big</span><br><span>@@ -431,7 +431,7 @@</span><br><span>          the same time */</span><br><span>  hash_for_each(g_cfg->bss_nses, i, nse, list) {</span><br><span>            struct gbproxy_bvc *bvc;</span><br><span style="color: hsl(0, 100%, 40%);">-                llist_for_each_entry(bvc, &nse->bvcs, list)</span><br><span style="color: hsl(120, 100%, 40%);">+            hash_for_each(nse->bvcs, j, bvc, list)</span><br><span>                    osmo_timer_schedule(&bvc->clean_stale_timer,</span><br><span>                                          random() % 5, random() % 1000000);</span><br><span>   }</span><br><span>@@ -446,12 +446,12 @@</span><br><span> </span><br><span> {</span><br><span>   struct gbproxy_nse *nse;</span><br><span style="color: hsl(0, 100%, 40%);">-        int i;</span><br><span style="color: hsl(120, 100%, 40%);">+        int i, j;</span><br><span>    g_cfg->clean_stale_timer_freq = 0;</span><br><span> </span><br><span>    hash_for_each(g_cfg->bss_nses, i, nse, list) {</span><br><span>            struct gbproxy_bvc *bvc;</span><br><span style="color: hsl(0, 100%, 40%);">-                llist_for_each_entry(bvc, &nse->bvcs, list)</span><br><span style="color: hsl(120, 100%, 40%);">+            hash_for_each(nse->bvcs, j, bvc, list)</span><br><span>                    osmo_timer_del(&bvc->clean_stale_timer);</span><br><span>      }</span><br><span> </span><br><span>@@ -582,14 +582,14 @@</span><br><span> {</span><br><span>   struct gbproxy_nse *nse;</span><br><span>     int show_stats = argc >= 1;</span><br><span style="color: hsl(0, 100%, 40%);">-  int i;</span><br><span style="color: hsl(120, 100%, 40%);">+        int i, j;</span><br><span> </span><br><span>        if (show_stats)</span><br><span>              vty_out_rate_ctr_group(vty, "", g_cfg->ctrg);</span><br><span> </span><br><span>       hash_for_each(g_cfg->bss_nses, i, nse, list) {</span><br><span>            struct gbproxy_bvc *bvc;</span><br><span style="color: hsl(0, 100%, 40%);">-                llist_for_each_entry(bvc, &nse->bvcs, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+          hash_for_each(nse->bvcs, j, bvc, list) {</span><br><span>                  gbprox_vty_print_bvc(vty, bvc);</span><br><span> </span><br><span>                  if (show_stats)</span><br><span>@@ -605,14 +605,14 @@</span><br><span>      struct gbproxy_nse *nse;</span><br><span>     time_t now;</span><br><span>  struct timespec ts = {0,};</span><br><span style="color: hsl(0, 100%, 40%);">-      int i;</span><br><span style="color: hsl(120, 100%, 40%);">+        int i, j;</span><br><span> </span><br><span>        osmo_clock_gettime(CLOCK_MONOTONIC, &ts);</span><br><span>        now = ts.tv_sec;</span><br><span> </span><br><span>         hash_for_each(g_cfg->bss_nses, i, nse, list) {</span><br><span>            struct gbproxy_bvc *bvc;</span><br><span style="color: hsl(0, 100%, 40%);">-                llist_for_each_entry(bvc, &nse->bvcs, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+          hash_for_each(nse->bvcs, j, bvc, list) {</span><br><span>                  struct gbproxy_link_info *link_info;</span><br><span>                         struct gbproxy_patch_state *state = &bvc->patch_state;</span><br><span> </span><br><span>@@ -707,12 +707,12 @@</span><br><span>            } else {</span><br><span>                     struct gbproxy_nse *nse;</span><br><span>                     struct gbproxy_bvc *bvc;</span><br><span style="color: hsl(0, 100%, 40%);">-                        int i;</span><br><span style="color: hsl(120, 100%, 40%);">+                        int i, j;</span><br><span>                    counter = 0;</span><br><span>                         hash_for_each(g_cfg->bss_nses, i, nse, list) {</span><br><span>                            if (nse->nsei != nsei)</span><br><span>                                    continue;</span><br><span style="color: hsl(0, 100%, 40%);">-                               llist_for_each_entry(bvc, &nse->bvcs, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                          hash_for_each(nse->bvcs, j, bvc, list) {</span><br><span>                                  vty_out(vty, "BVC: ");</span><br><span>                                     gbprox_vty_print_bvc(vty, bvc);</span><br><span>                                      counter += 1;</span><br><span>diff --git a/tests/gbproxy/gbproxy_test.c b/tests/gbproxy/gbproxy_test.c</span><br><span>index bd5c8b5..c47bb34 100644</span><br><span>--- a/tests/gbproxy/gbproxy_test.c</span><br><span>+++ b/tests/gbproxy/gbproxy_test.c</span><br><span>@@ -131,7 +131,8 @@</span><br><span> </span><br><span>         hash_for_each(cfg->bss_nses, _nse, nse, list) {</span><br><span>           struct gbproxy_bvc *peer;</span><br><span style="color: hsl(0, 100%, 40%);">-               llist_for_each_entry(peer, &nse->bvcs, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+         int _peer;</span><br><span style="color: hsl(120, 100%, 40%);">+            hash_for_each(nse->bvcs, _peer, peer, list) {</span><br><span>                     struct gbproxy_link_info *link_info;</span><br><span>                         struct gbproxy_patch_state *state = &peer->patch_state;</span><br><span>                       gsm48_parse_ra(&raid, peer->ra);</span><br><span>diff --git a/tests/gbproxy/gbproxy_test.ok b/tests/gbproxy/gbproxy_test.ok</span><br><span>index fbd5366..978d91f 100644</span><br><span>--- a/tests/gbproxy/gbproxy_test.ok</span><br><span>+++ b/tests/gbproxy/gbproxy_test.ok</span><br><span>@@ -116,10 +116,10 @@</span><br><span> Peers:</span><br><span>   NSEI 8192, BVCI 8194, not blocked, RAI 112-332-16464-96</span><br><span>     TLLI-Cache: 0</span><br><span style="color: hsl(0, 100%, 40%);">-  NSEI 4096, BVCI 4114, not blocked, RAI 112-332-16464-96</span><br><span style="color: hsl(0, 100%, 40%);">-    TLLI-Cache: 0</span><br><span>   NSEI 4096, BVCI 4098, not blocked, RAI 112-332-16464-96</span><br><span>     TLLI-Cache: 0</span><br><span style="color: hsl(120, 100%, 40%);">+  NSEI 4096, BVCI 4114, not blocked, RAI 112-332-16464-96</span><br><span style="color: hsl(120, 100%, 40%);">+    TLLI-Cache: 0</span><br><span> PROCESSING BVC_RESET_ACK from NSEI 256</span><br><span> 23 04 82 10 12 </span><br><span> </span><br><span>@@ -151,10 +151,10 @@</span><br><span> Peers:</span><br><span>   NSEI 8192, BVCI 8194, not blocked, RAI 112-332-16464-96</span><br><span>     TLLI-Cache: 0</span><br><span style="color: hsl(0, 100%, 40%);">-  NSEI 4096, BVCI 4114, not blocked, RAI 112-332-16464-96</span><br><span style="color: hsl(0, 100%, 40%);">-    TLLI-Cache: 0</span><br><span>   NSEI 4096, BVCI 4098, not blocked, RAI 112-332-16464-96</span><br><span>     TLLI-Cache: 0</span><br><span style="color: hsl(120, 100%, 40%);">+  NSEI 4096, BVCI 4114, not blocked, RAI 112-332-16464-96</span><br><span style="color: hsl(120, 100%, 40%);">+    TLLI-Cache: 0</span><br><span> PROCESSING BVC_RESET_ACK from NSEI 256</span><br><span> 23 04 82 10 02 </span><br><span> </span><br><span>@@ -186,10 +186,10 @@</span><br><span> Peers:</span><br><span>   NSEI 8192, BVCI 8194, not blocked, RAI 112-332-16464-96</span><br><span>     TLLI-Cache: 0</span><br><span style="color: hsl(0, 100%, 40%);">-  NSEI 4096, BVCI 4114, not blocked, RAI 112-332-16464-96</span><br><span style="color: hsl(0, 100%, 40%);">-    TLLI-Cache: 0</span><br><span>   NSEI 4096, BVCI 4098, not blocked, RAI 112-332-16464-96</span><br><span>     TLLI-Cache: 0</span><br><span style="color: hsl(120, 100%, 40%);">+  NSEI 4096, BVCI 4114, not blocked, RAI 112-332-16464-96</span><br><span style="color: hsl(120, 100%, 40%);">+    TLLI-Cache: 0</span><br><span> PROCESSING BVC_RESET_ACK from NSEI 256</span><br><span> 23 04 82 10 02 </span><br><span> </span><br><span>@@ -306,10 +306,10 @@</span><br><span>   NSEI 8192, BVCI 8194, not blocked, RAI 112-332-16464-96</span><br><span>     NSEI mismatch                   : 1</span><br><span>     TLLI-Cache: 0</span><br><span style="color: hsl(0, 100%, 40%);">-  NSEI 4096, BVCI 4114, not blocked, RAI 112-332-16464-96</span><br><span style="color: hsl(0, 100%, 40%);">-    TLLI-Cache: 0</span><br><span>   NSEI 4096, BVCI 4098, not blocked, RAI 112-332-16464-96</span><br><span>     TLLI-Cache: 0</span><br><span style="color: hsl(120, 100%, 40%);">+  NSEI 4096, BVCI 4114, not blocked, RAI 112-332-16464-96</span><br><span style="color: hsl(120, 100%, 40%);">+    TLLI-Cache: 0</span><br><span> Gbproxy global:</span><br><span> PROCESSING BVC_RESET_ACK from NSEI 256</span><br><span> 23 04 82 10 02 </span><br><span>@@ -453,10 +453,10 @@</span><br><span> [L2]> [L3]> 23 04 82 20 02 </span><br><span> </span><br><span> Peers:</span><br><span style="color: hsl(0, 100%, 40%);">-  NSEI 4096, BVCI 8194, not blocked, RAI 112-332-16464-96</span><br><span style="color: hsl(0, 100%, 40%);">-    TLLI-Cache: 0</span><br><span>   NSEI 4096, BVCI 4098, not blocked, RAI 112-332-16464-96</span><br><span>     TLLI-Cache: 0</span><br><span style="color: hsl(120, 100%, 40%);">+  NSEI 4096, BVCI 8194, not blocked, RAI 112-332-16464-96</span><br><span style="color: hsl(120, 100%, 40%);">+    TLLI-Cache: 0</span><br><span> --- Send message from BSS 1 to SGSN and back, BVCI 1 ---</span><br><span> </span><br><span> PROCESSING (null) from NSEI 4096</span><br><span>@@ -587,11 +587,11 @@</span><br><span> [L2]> [L3]> 23 04 82 30 02 </span><br><span> </span><br><span> Peers:</span><br><span style="color: hsl(0, 100%, 40%);">-  NSEI 8192, BVCI 12290, not blocked, RAI 112-332-16464-96</span><br><span style="color: hsl(0, 100%, 40%);">-    TLLI-Cache: 0</span><br><span>   NSEI 8192, BVCI 4098, not blocked, RAI 112-332-16464-96</span><br><span>     NSEI mismatch                   : 1</span><br><span>     TLLI-Cache: 0</span><br><span style="color: hsl(120, 100%, 40%);">+  NSEI 8192, BVCI 12290, not blocked, RAI 112-332-16464-96</span><br><span style="color: hsl(120, 100%, 40%);">+    TLLI-Cache: 0</span><br><span>   NSEI 4096, BVCI 8194, not blocked, RAI 112-332-16464-96</span><br><span>     TLLI-Cache: 0</span><br><span> --- Send message from BSS 1 to SGSN and back, BVCI 1 ---</span><br><span>@@ -635,11 +635,11 @@</span><br><span> [L2]> [L3]> </span><br><span> </span><br><span> Peers:</span><br><span style="color: hsl(0, 100%, 40%);">-  NSEI 8192, BVCI 12290, not blocked, RAI 112-332-16464-96</span><br><span style="color: hsl(0, 100%, 40%);">-    TLLI-Cache: 0</span><br><span>   NSEI 8192, BVCI 4098, not blocked, RAI 112-332-16464-96</span><br><span>     NSEI mismatch                   : 1</span><br><span>     TLLI-Cache: 0</span><br><span style="color: hsl(120, 100%, 40%);">+  NSEI 8192, BVCI 12290, not blocked, RAI 112-332-16464-96</span><br><span style="color: hsl(120, 100%, 40%);">+    TLLI-Cache: 0</span><br><span>   NSEI 4096, BVCI 8194, not blocked, RAI 112-332-16464-96</span><br><span>     NSEI mismatch                   : 1</span><br><span>     TLLI-Cache: 0</span><br><span>@@ -656,11 +656,11 @@</span><br><span> [L2]> [L3]> </span><br><span> </span><br><span> Peers:</span><br><span style="color: hsl(0, 100%, 40%);">-  NSEI 8192, BVCI 12290, not blocked, RAI 112-332-16464-96</span><br><span style="color: hsl(0, 100%, 40%);">-    TLLI-Cache: 0</span><br><span>   NSEI 8192, BVCI 4098, not blocked, RAI 112-332-16464-96</span><br><span>     NSEI mismatch                   : 1</span><br><span>     TLLI-Cache: 0</span><br><span style="color: hsl(120, 100%, 40%);">+  NSEI 8192, BVCI 12290, not blocked, RAI 112-332-16464-96</span><br><span style="color: hsl(120, 100%, 40%);">+    TLLI-Cache: 0</span><br><span>   NSEI 4096, BVCI 8194, not blocked, RAI 112-332-16464-96</span><br><span>     NSEI mismatch                   : 1</span><br><span>     TLLI-Cache: 0</span><br><span>@@ -692,10 +692,10 @@</span><br><span> </span><br><span> Gbproxy global:</span><br><span> Peers:</span><br><span style="color: hsl(0, 100%, 40%);">-  NSEI 8192, BVCI 12290, not blocked, RAI 112-332-16464-96</span><br><span style="color: hsl(120, 100%, 40%);">+  NSEI 8192, BVCI 4098, not blocked, RAI 112-332-16464-96</span><br><span>     NSEI mismatch                   : 1</span><br><span>     TLLI-Cache: 0</span><br><span style="color: hsl(0, 100%, 40%);">-  NSEI 8192, BVCI 4098, not blocked, RAI 112-332-16464-96</span><br><span style="color: hsl(120, 100%, 40%);">+  NSEI 8192, BVCI 12290, not blocked, RAI 112-332-16464-96</span><br><span>     NSEI mismatch                   : 1</span><br><span>     TLLI-Cache: 0</span><br><span>   NSEI 4096, BVCI 8194, not blocked, RAI 112-332-16464-96</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-sgsn/+/21551">change 21551</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-sgsn/+/21551"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-sgsn </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ic8e9279fd61a3c514fc3203429f36a468f0e81d3 </div>
<div style="display:none"> Gerrit-Change-Number: 21551 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>