<p>lynxis lazus has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/24582">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gprs_ns2_sns: refactor local and remote entries into a struct<br><br>The IPv4/IPv6 elemens are the same for local and remote.<br>Refactor the entries into a struct to use function to manipulate<br>them with a single function.<br><br>Related: OS#5036<br>Change-Id: I05e053a9eb3328655502dfe2981c8f402104e292<br>---<br>M src/gb/gprs_ns2_sns.c<br>1 file changed, 102 insertions(+), 105 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/82/24582/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/gb/gprs_ns2_sns.c b/src/gb/gprs_ns2_sns.c</span><br><span>index 9865acd..66dd421 100644</span><br><span>--- a/src/gb/gprs_ns2_sns.c</span><br><span>+++ b/src/gb/gprs_ns2_sns.c</span><br><span>@@ -122,6 +122,13 @@</span><br><span>         struct gprs_ns2_vc_bind *bind;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct ns2_sns_elems {</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gprs_ns_ie_ip4_elem *ip4;</span><br><span style="color: hsl(120, 100%, 40%);">+      unsigned int num_ip4;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gprs_ns_ie_ip6_elem *ip6;</span><br><span style="color: hsl(120, 100%, 40%);">+      unsigned int num_ip6;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct ns2_sns_state {</span><br><span>        struct gprs_ns2_nse *nse;</span><br><span> </span><br><span>@@ -150,26 +157,16 @@</span><br><span>        bool alive;</span><br><span> </span><br><span>      /* local configuration to send to the remote end */</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gprs_ns_ie_ip4_elem *ip4_local;</span><br><span style="color: hsl(0, 100%, 40%);">-  size_t num_ip4_local;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ns2_sns_elems local;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* local configuration to send to the remote end */</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gprs_ns_ie_ip6_elem *ip6_local;</span><br><span style="color: hsl(0, 100%, 40%);">-  size_t num_ip6_local;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* remote configuration as received */</span><br><span style="color: hsl(120, 100%, 40%);">+        struct ns2_sns_elems remote;</span><br><span> </span><br><span>     /* local configuration about our capabilities in terms of connections to</span><br><span>      * remote (SGSN) side */</span><br><span>     size_t num_max_nsvcs;</span><br><span>        size_t num_max_ip4_remote;</span><br><span>   size_t num_max_ip6_remote;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* remote configuration as received */</span><br><span style="color: hsl(0, 100%, 40%);">-  struct gprs_ns_ie_ip4_elem *ip4_remote;</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int num_ip4_remote;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /* remote configuration as received */</span><br><span style="color: hsl(0, 100%, 40%);">-  struct gprs_ns_ie_ip6_elem *ip6_remote;</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int num_ip6_remote;</span><br><span> };</span><br><span> </span><br><span> static inline struct gprs_ns2_nse *nse_inst_from_fi(struct osmo_fsm_inst *fi)</span><br><span>@@ -216,8 +213,8 @@</span><br><span> </span><br><span> static int nss_weight_sum(const struct ns2_sns_state *nss, bool data_weight)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  return ip4_weight_sum(nss->ip4_remote, nss->num_ip4_remote, data_weight) +</span><br><span style="color: hsl(0, 100%, 40%);">-               ip6_weight_sum(nss->ip6_remote, nss->num_ip6_remote, data_weight);</span><br><span style="color: hsl(120, 100%, 40%);">+       return ip4_weight_sum(nss->remote.ip4, nss->remote.num_ip4, data_weight) +</span><br><span style="color: hsl(120, 100%, 40%);">+             ip6_weight_sum(nss->remote.ip6, nss->remote.num_ip6, data_weight);</span><br><span> }</span><br><span> #define nss_weight_sum_data(nss)        nss_weight_sum(nss, true)</span><br><span> #define nss_weight_sum_sig(nss)            nss_weight_sum(nss, false)</span><br><span>@@ -300,20 +297,20 @@</span><br><span> </span><br><span> static void ns2_clear_ipv46_entries_local(struct ns2_sns_state *gss)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     TALLOC_FREE(gss->ip4_local);</span><br><span style="color: hsl(0, 100%, 40%);">- TALLOC_FREE(gss->ip6_local);</span><br><span style="color: hsl(120, 100%, 40%);">+       TALLOC_FREE(gss->local.ip4);</span><br><span style="color: hsl(120, 100%, 40%);">+       TALLOC_FREE(gss->local.ip6);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     gss->num_ip4_local = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-      gss->num_ip6_local = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+    gss->local.num_ip4 = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+    gss->local.num_ip6 = 0;</span><br><span> }</span><br><span> </span><br><span> static void ns2_clear_ipv46_entries_remote(struct ns2_sns_state *gss)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       TALLOC_FREE(gss->ip4_remote);</span><br><span style="color: hsl(0, 100%, 40%);">-        TALLOC_FREE(gss->ip6_remote);</span><br><span style="color: hsl(120, 100%, 40%);">+      TALLOC_FREE(gss->remote.ip4);</span><br><span style="color: hsl(120, 100%, 40%);">+      TALLOC_FREE(gss->remote.ip6);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    gss->num_ip4_remote = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-     gss->num_ip6_remote = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   gss->remote.num_ip4 = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   gss->remote.num_ip6 = 0;</span><br><span> }</span><br><span> </span><br><span> static void ns2_vc_create_ip(struct osmo_fsm_inst *fi, struct gprs_ns2_nse *nse, const struct osmo_sockaddr *remote,</span><br><span>@@ -393,8 +390,8 @@</span><br><span>   unsigned int i;</span><br><span> </span><br><span>  /* iterate over all remote IPv4 endpoints */</span><br><span style="color: hsl(0, 100%, 40%);">-    for (i = 0; i < gss->num_ip4_remote; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-               const struct gprs_ns_ie_ip4_elem *ip4 = &gss->ip4_remote[i];</span><br><span style="color: hsl(120, 100%, 40%);">+   for (i = 0; i < gss->remote.num_ip4; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+             const struct gprs_ns_ie_ip4_elem *ip4 = &gss->remote.ip4[i];</span><br><span> </span><br><span>              remote.u.sin.sin_family = AF_INET;</span><br><span>           remote.u.sin.sin_addr.s_addr = ip4->ip_addr;</span><br><span>@@ -425,8 +422,8 @@</span><br><span>        }</span><br><span> </span><br><span>        /* iterate over all remote IPv4 endpoints */</span><br><span style="color: hsl(0, 100%, 40%);">-    for (i = 0; i < gss->num_ip6_remote; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-               const struct gprs_ns_ie_ip6_elem *ip6 = &gss->ip6_remote[i];</span><br><span style="color: hsl(120, 100%, 40%);">+   for (i = 0; i < gss->remote.num_ip6; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+             const struct gprs_ns_ie_ip6_elem *ip6 = &gss->remote.ip6[i];</span><br><span> </span><br><span>              remote.u.sin6.sin6_family = AF_INET6;</span><br><span>                remote.u.sin6.sin6_addr = ip6->ip_addr;</span><br><span>@@ -465,21 +462,21 @@</span><br><span> {</span><br><span>      unsigned int i;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     if (gss->num_ip4_remote >= gss->num_max_ip4_remote)</span><br><span style="color: hsl(120, 100%, 40%);">+  if (gss->remote.num_ip4 >= gss->num_max_ip4_remote)</span><br><span>                 return -NS_CAUSE_INVAL_NR_NS_VC;</span><br><span> </span><br><span>         /* check for duplicates */</span><br><span style="color: hsl(0, 100%, 40%);">-      for (i = 0; i < gss->num_ip4_remote; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-               if (memcmp(&gss->ip4_remote[i], ip4, sizeof(*ip4)))</span><br><span style="color: hsl(120, 100%, 40%);">+    for (i = 0; i < gss->remote.num_ip4; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+             if (memcmp(&gss->remote.ip4[i], ip4, sizeof(*ip4)))</span><br><span>                   continue;</span><br><span>            /* TODO: log message duplicate */</span><br><span>            return -NS_CAUSE_PROTO_ERR_UNSPEC;</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   gss->ip4_remote = talloc_realloc(gss, gss->ip4_remote, struct gprs_ns_ie_ip4_elem,</span><br><span style="color: hsl(0, 100%, 40%);">-                                         gss->num_ip4_remote+1);</span><br><span style="color: hsl(0, 100%, 40%);">-     gss->ip4_remote[gss->num_ip4_remote] = *ip4;</span><br><span style="color: hsl(0, 100%, 40%);">-      gss->num_ip4_remote += 1;</span><br><span style="color: hsl(120, 100%, 40%);">+  gss->remote.ip4 = talloc_realloc(gss, gss->remote.ip4, struct gprs_ns_ie_ip4_elem,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       gss->remote.num_ip4+1);</span><br><span style="color: hsl(120, 100%, 40%);">+   gss->remote.ip4[gss->remote.num_ip4] = *ip4;</span><br><span style="color: hsl(120, 100%, 40%);">+    gss->remote.num_ip4 += 1;</span><br><span>         return 0;</span><br><span> }</span><br><span> </span><br><span>@@ -488,12 +485,12 @@</span><br><span> {</span><br><span>      unsigned int i;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     for (i = 0; i < gss->num_ip4_remote; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-               if (memcmp(&gss->ip4_remote[i], ip4, sizeof(*ip4)))</span><br><span style="color: hsl(120, 100%, 40%);">+    for (i = 0; i < gss->remote.num_ip4; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+             if (memcmp(&gss->remote.ip4[i], ip4, sizeof(*ip4)))</span><br><span>                   continue;</span><br><span>            /* all array elements < i remain as they are; all > i are shifted left by one */</span><br><span style="color: hsl(0, 100%, 40%);">-          memmove(&gss->ip4_remote[i], &gss->ip4_remote[i+1], gss->num_ip4_remote-i-1);</span><br><span style="color: hsl(0, 100%, 40%);">-          gss->num_ip4_remote -= 1;</span><br><span style="color: hsl(120, 100%, 40%);">+          memmove(&gss->remote.ip4[i], &gss->remote.ip4[i+1], gss->remote.num_ip4-i-1);</span><br><span style="color: hsl(120, 100%, 40%);">+                gss->remote.num_ip4 -= 1;</span><br><span>                 return 0;</span><br><span>    }</span><br><span>    return -1;</span><br><span>@@ -504,13 +501,13 @@</span><br><span> {</span><br><span>      unsigned int i;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     for (i = 0; i < gss->num_ip4_remote; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-               if (gss->ip4_remote[i].ip_addr != ip4->ip_addr ||</span><br><span style="color: hsl(0, 100%, 40%);">-             gss->ip4_remote[i].udp_port != ip4->udp_port)</span><br><span style="color: hsl(120, 100%, 40%);">+       for (i = 0; i < gss->remote.num_ip4; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+             if (gss->remote.ip4[i].ip_addr != ip4->ip_addr ||</span><br><span style="color: hsl(120, 100%, 40%);">+                   gss->remote.ip4[i].udp_port != ip4->udp_port)</span><br><span>                      continue;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           gss->ip4_remote[i].sig_weight = ip4->sig_weight;</span><br><span style="color: hsl(0, 100%, 40%);">-          gss->ip4_remote[i].data_weight = ip4->data_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+              gss->remote.ip4[i].sig_weight = ip4->sig_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+                gss->remote.ip4[i].data_weight = ip4->data_weight;</span><br><span>             return 0;</span><br><span>    }</span><br><span>    return -1;</span><br><span>@@ -519,13 +516,13 @@</span><br><span> /* Add a given remote IPv6 element to gprs_sns_state */</span><br><span> static int add_remote_ip6_elem(struct ns2_sns_state *gss, const struct gprs_ns_ie_ip6_elem *ip6)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  if (gss->num_ip6_remote >= gss->num_max_ip6_remote)</span><br><span style="color: hsl(120, 100%, 40%);">+  if (gss->remote.num_ip6 >= gss->num_max_ip6_remote)</span><br><span>                 return -NS_CAUSE_INVAL_NR_NS_VC;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    gss->ip6_remote = talloc_realloc(gss, gss->ip6_remote, struct gprs_ns_ie_ip6_elem,</span><br><span style="color: hsl(0, 100%, 40%);">-                                         gss->num_ip6_remote+1);</span><br><span style="color: hsl(0, 100%, 40%);">-     gss->ip6_remote[gss->num_ip6_remote] = *ip6;</span><br><span style="color: hsl(0, 100%, 40%);">-      gss->num_ip6_remote += 1;</span><br><span style="color: hsl(120, 100%, 40%);">+  gss->remote.ip6 = talloc_realloc(gss, gss->remote.ip6, struct gprs_ns_ie_ip6_elem,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       gss->remote.num_ip6+1);</span><br><span style="color: hsl(120, 100%, 40%);">+   gss->remote.ip6[gss->remote.num_ip6] = *ip6;</span><br><span style="color: hsl(120, 100%, 40%);">+    gss->remote.num_ip6 += 1;</span><br><span>         return 0;</span><br><span> }</span><br><span> </span><br><span>@@ -534,12 +531,12 @@</span><br><span> {</span><br><span>      unsigned int i;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     for (i = 0; i < gss->num_ip6_remote; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-               if (memcmp(&gss->ip6_remote[i], ip6, sizeof(*ip6)))</span><br><span style="color: hsl(120, 100%, 40%);">+    for (i = 0; i < gss->remote.num_ip6; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+             if (memcmp(&gss->remote.ip6[i], ip6, sizeof(*ip6)))</span><br><span>                   continue;</span><br><span>            /* all array elements < i remain as they are; all > i are shifted left by one */</span><br><span style="color: hsl(0, 100%, 40%);">-          memmove(&gss->ip6_remote[i], &gss->ip6_remote[i+1], gss->num_ip6_remote-i-1);</span><br><span style="color: hsl(0, 100%, 40%);">-          gss->num_ip6_remote -= 1;</span><br><span style="color: hsl(120, 100%, 40%);">+          memmove(&gss->remote.ip6[i], &gss->remote.ip6[i+1], gss->remote.num_ip6-i-1);</span><br><span style="color: hsl(120, 100%, 40%);">+                gss->remote.num_ip6 -= 1;</span><br><span>                 return 0;</span><br><span>    }</span><br><span>    return -1;</span><br><span>@@ -550,12 +547,12 @@</span><br><span> {</span><br><span>      unsigned int i;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     for (i = 0; i < gss->num_ip6_remote; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-               if (memcmp(&gss->ip6_remote[i].ip_addr, &ip6->ip_addr, sizeof(ip6->ip_addr)) ||</span><br><span style="color: hsl(0, 100%, 40%);">-                    gss->ip6_remote[i].udp_port != ip6->udp_port)</span><br><span style="color: hsl(120, 100%, 40%);">+       for (i = 0; i < gss->remote.num_ip6; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+             if (memcmp(&gss->remote.ip6[i].ip_addr, &ip6->ip_addr, sizeof(ip6->ip_addr)) ||</span><br><span style="color: hsl(120, 100%, 40%);">+                  gss->remote.ip6[i].udp_port != ip6->udp_port)</span><br><span>                      continue;</span><br><span style="color: hsl(0, 100%, 40%);">-               gss->ip6_remote[i].sig_weight = ip6->sig_weight;</span><br><span style="color: hsl(0, 100%, 40%);">-          gss->ip6_remote[i].data_weight = ip6->data_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+              gss->remote.ip6[i].sig_weight = ip6->sig_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+                gss->remote.ip6[i].data_weight = ip6->data_weight;</span><br><span>             return 0;</span><br><span>    }</span><br><span>    return -1;</span><br><span>@@ -811,11 +808,11 @@</span><br><span> </span><br><span>       switch (gss->ip) {</span><br><span>        case IPv4:</span><br><span style="color: hsl(0, 100%, 40%);">-              ip4_elems = talloc_realloc(fi, gss->ip4_local, struct gprs_ns_ie_ip4_elem, count);</span><br><span style="color: hsl(120, 100%, 40%);">+         ip4_elems = talloc_realloc(fi, gss->local.ip4, struct gprs_ns_ie_ip4_elem, count);</span><br><span>                if (!ip4_elems)</span><br><span>                      return;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-             gss->ip4_local = ip4_elems;</span><br><span style="color: hsl(120, 100%, 40%);">+                gss->local.ip4 = ip4_elems;</span><br><span>               llist_for_each_entry(sbind, &gss->binds, list) {</span><br><span>                      bind = sbind->bind;</span><br><span>                       sa = gprs_ns2_ip_bind_sockaddr(bind);</span><br><span>@@ -841,16 +838,16 @@</span><br><span>                        ip4_elems++;</span><br><span>                 }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           gss->num_ip4_local = count;</span><br><span style="color: hsl(0, 100%, 40%);">-          gss->num_max_nsvcs = OSMO_MAX(gss->num_max_ip4_remote * gss->num_ip4_local, 8);</span><br><span style="color: hsl(120, 100%, 40%);">+              gss->local.num_ip4 = count;</span><br><span style="color: hsl(120, 100%, 40%);">+                gss->num_max_nsvcs = OSMO_MAX(gss->num_max_ip4_remote * gss->local.num_ip4, 8);</span><br><span>             break;</span><br><span>       case IPv6:</span><br><span>           /* IPv6 */</span><br><span style="color: hsl(0, 100%, 40%);">-              ip6_elems = talloc_realloc(fi, gss->ip6_local, struct gprs_ns_ie_ip6_elem, count);</span><br><span style="color: hsl(120, 100%, 40%);">+         ip6_elems = talloc_realloc(fi, gss->local.ip6, struct gprs_ns_ie_ip6_elem, count);</span><br><span>                if (!ip6_elems)</span><br><span>                      return;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-             gss->ip6_local = ip6_elems;</span><br><span style="color: hsl(120, 100%, 40%);">+                gss->local.ip6 = ip6_elems;</span><br><span> </span><br><span>           llist_for_each_entry(sbind, &gss->binds, list) {</span><br><span>                      bind = sbind->bind;</span><br><span>@@ -877,8 +874,8 @@</span><br><span> </span><br><span>                     ip6_elems++;</span><br><span>                 }</span><br><span style="color: hsl(0, 100%, 40%);">-               gss->num_ip6_local = count;</span><br><span style="color: hsl(0, 100%, 40%);">-          gss->num_max_nsvcs = OSMO_MAX(gss->num_max_ip6_remote * gss->num_ip6_local, 8);</span><br><span style="color: hsl(120, 100%, 40%);">+              gss->local.num_ip6 = count;</span><br><span style="color: hsl(120, 100%, 40%);">+                gss->num_max_nsvcs = OSMO_MAX(gss->num_max_ip6_remote * gss->local.num_ip6, 8);</span><br><span>             break;</span><br><span>       }</span><br><span> }</span><br><span>@@ -924,9 +921,9 @@</span><br><span>         }</span><br><span> </span><br><span>        if (gss->num_max_ip4_remote > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          ns2_tx_sns_size(gss->sns_nsvc, true, gss->num_max_nsvcs, gss->num_ip4_local, -1);</span><br><span style="color: hsl(120, 100%, 40%);">+            ns2_tx_sns_size(gss->sns_nsvc, true, gss->num_max_nsvcs, gss->local.num_ip4, -1);</span><br><span>   else</span><br><span style="color: hsl(0, 100%, 40%);">-            ns2_tx_sns_size(gss->sns_nsvc, true, gss->num_max_nsvcs, -1, gss->num_ip6_local);</span><br><span style="color: hsl(120, 100%, 40%);">+            ns2_tx_sns_size(gss->sns_nsvc, true, gss->num_max_nsvcs, -1, gss->local.num_ip6);</span><br><span> }</span><br><span> </span><br><span> static void ns2_sns_st_bss_config_bss(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span>@@ -966,13 +963,13 @@</span><br><span>   switch (gss->ip) {</span><br><span>        case IPv4:</span><br><span>           ns2_tx_sns_config(gss->sns_nsvc, true,</span><br><span style="color: hsl(0, 100%, 40%);">-                                 gss->ip4_local, gss->num_ip4_local,</span><br><span style="color: hsl(120, 100%, 40%);">+                             gss->local.ip4, gss->local.num_ip4,</span><br><span>                            NULL, 0);</span><br><span>          break;</span><br><span>       case IPv6:</span><br><span>           ns2_tx_sns_config(gss->sns_nsvc, true,</span><br><span>                              NULL, 0,</span><br><span style="color: hsl(0, 100%, 40%);">-                                gss->ip6_local, gss->num_ip6_local);</span><br><span style="color: hsl(120, 100%, 40%);">+                            gss->local.ip6, gss->local.num_ip6);</span><br><span>                 break;</span><br><span>       }</span><br><span> }</span><br><span>@@ -1001,19 +998,19 @@</span><br><span>              v4_list = (const struct gprs_ns_ie_ip4_elem *) TLVP_VAL(tp, NS_IE_IPv4_LIST);</span><br><span>                num_v4 = TLVP_LEN(tp, NS_IE_IPv4_LIST) / sizeof(*v4_list);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-          if (num_v4 && gss->ip6_remote)</span><br><span style="color: hsl(120, 100%, 40%);">+             if (num_v4 && gss->remote.ip6)</span><br><span>                    return -NS_CAUSE_INVAL_NR_IPv4_EP;</span><br><span> </span><br><span>               /* realloc to the new size */</span><br><span style="color: hsl(0, 100%, 40%);">-           gss->ip4_remote = talloc_realloc(gss, gss->ip4_remote,</span><br><span style="color: hsl(120, 100%, 40%);">+          gss->remote.ip4 = talloc_realloc(gss, gss->remote.ip4,</span><br><span>                                                  struct gprs_ns_ie_ip4_elem,</span><br><span style="color: hsl(0, 100%, 40%);">-                                             gss->num_ip4_remote + num_v4);</span><br><span style="color: hsl(120, 100%, 40%);">+                                             gss->remote.num_ip4 + num_v4);</span><br><span>           /* append the new entries to the end of the list */</span><br><span style="color: hsl(0, 100%, 40%);">-             memcpy(&gss->ip4_remote[gss->num_ip4_remote], v4_list, num_v4*sizeof(*v4_list));</span><br><span style="color: hsl(0, 100%, 40%);">-              gss->num_ip4_remote += num_v4;</span><br><span style="color: hsl(120, 100%, 40%);">+             memcpy(&gss->remote.ip4[gss->remote.num_ip4], v4_list, num_v4*sizeof(*v4_list));</span><br><span style="color: hsl(120, 100%, 40%);">+            gss->remote.num_ip4 += num_v4;</span><br><span> </span><br><span>                LOGPFSML(fi, LOGL_INFO, "Rx SNS-CONFIG: Remote IPv4 list now %u entries\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                    gss->num_ip4_remote);</span><br><span style="color: hsl(120, 100%, 40%);">+                      gss->remote.num_ip4);</span><br><span>    }</span><br><span> </span><br><span>        if (TLVP_PRESENT(tp, NS_IE_IPv6_LIST)) {</span><br><span>@@ -1022,19 +1019,19 @@</span><br><span>           v6_list = (const struct gprs_ns_ie_ip6_elem *) TLVP_VAL(tp, NS_IE_IPv6_LIST);</span><br><span>                num_v6 = TLVP_LEN(tp, NS_IE_IPv6_LIST) / sizeof(*v6_list);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-          if (num_v6 && gss->ip4_remote)</span><br><span style="color: hsl(120, 100%, 40%);">+             if (num_v6 && gss->remote.ip4)</span><br><span>                    return -NS_CAUSE_INVAL_NR_IPv6_EP;</span><br><span> </span><br><span>               /* realloc to the new size */</span><br><span style="color: hsl(0, 100%, 40%);">-           gss->ip6_remote = talloc_realloc(gss, gss->ip6_remote,</span><br><span style="color: hsl(120, 100%, 40%);">+          gss->remote.ip6 = talloc_realloc(gss, gss->remote.ip6,</span><br><span>                                                  struct gprs_ns_ie_ip6_elem,</span><br><span style="color: hsl(0, 100%, 40%);">-                                             gss->num_ip6_remote + num_v6);</span><br><span style="color: hsl(120, 100%, 40%);">+                                             gss->remote.num_ip6 + num_v6);</span><br><span>           /* append the new entries to the end of the list */</span><br><span style="color: hsl(0, 100%, 40%);">-             memcpy(&gss->ip6_remote[gss->num_ip6_remote], v6_list, num_v6*sizeof(*v6_list));</span><br><span style="color: hsl(0, 100%, 40%);">-              gss->num_ip6_remote += num_v6;</span><br><span style="color: hsl(120, 100%, 40%);">+             memcpy(&gss->remote.ip6[gss->remote.num_ip6], v6_list, num_v6*sizeof(*v6_list));</span><br><span style="color: hsl(120, 100%, 40%);">+            gss->remote.num_ip6 += num_v6;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           LOGPFSML(fi, LOGL_INFO, "Rx SNS-CONFIG: Remote IPv6 list now %u entries\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                    gss->num_ip6_remote);</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGPFSML(fi, LOGL_INFO, "Rx SNS-CONFIG: Remote IPv6 list now %d entries\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                  gss->remote.num_ip6);</span><br><span>    }</span><br><span> </span><br><span>        return 0;</span><br><span>@@ -1204,9 +1201,9 @@</span><br><span>                            return;</span><br><span>                      }</span><br><span>                    /* make a copy as do_sns_delete() will change the array underneath us */</span><br><span style="color: hsl(0, 100%, 40%);">-                        ip4_remote = talloc_memdup(fi, gss->ip4_remote,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                 gss->num_ip4_remote * sizeof(*v4_list));</span><br><span style="color: hsl(0, 100%, 40%);">-                  for (i = 0; i < gss->num_ip4_remote; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     ip4_remote = talloc_memdup(fi, gss->remote.ip4,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               gss->remote.num_ip4 * sizeof(*v4_list));</span><br><span style="color: hsl(120, 100%, 40%);">+                        for (i = 0; i < gss->remote.num_ip4; i++) {</span><br><span>                            if (ip4_remote[i].ip_addr == ip_addr) {</span><br><span>                                      rc = do_sns_delete(fi, &ip4_remote[i], NULL);</span><br><span>                                    if (rc < 0) {</span><br><span>@@ -1255,9 +1252,9 @@</span><br><span>                     }</span><br><span>                    memcpy(&ip6_addr, (ie+1), sizeof(struct in6_addr));</span><br><span>                      /* make a copy as do_sns_delete() will change the array underneath us */</span><br><span style="color: hsl(0, 100%, 40%);">-                        ip6_remote = talloc_memdup(fi, gss->ip6_remote,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                 gss->num_ip6_remote * sizeof(*v4_list));</span><br><span style="color: hsl(0, 100%, 40%);">-                  for (i = 0; i < gss->num_ip6_remote; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     ip6_remote = talloc_memdup(fi, gss->remote.ip6,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               gss->remote.num_ip6 * sizeof(*v4_list));</span><br><span style="color: hsl(120, 100%, 40%);">+                        for (i = 0; i < gss->remote.num_ip6; i++) {</span><br><span>                            if (!memcmp(&ip6_remote[i].ip_addr, &ip6_addr, sizeof(struct in6_addr))) {</span><br><span>                                   rc = do_sns_delete(fi, NULL, &ip6_remote[i]);</span><br><span>                                    if (rc < 0) {</span><br><span>@@ -1774,24 +1771,24 @@</span><br><span>   vty_out(vty, "%sMaximum number of remote  NS-VCs: %zu, IPv4 Endpoints: %zu, IPv6 Endpoints: %zu%s",</span><br><span>                prefix, gss->num_max_nsvcs, gss->num_max_ip4_remote, gss->num_max_ip6_remote, VTY_NEWLINE);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        if (gss->num_ip4_local && gss->num_ip4_remote) {</span><br><span style="color: hsl(120, 100%, 40%);">+        if (gss->local.num_ip4 && gss->remote.num_ip4) {</span><br><span>               vty_out(vty, "%sLocal IPv4 Endpoints:%s", prefix, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-               for (i = 0; i < gss->num_ip4_local; i++)</span><br><span style="color: hsl(0, 100%, 40%);">-                  vty_dump_sns_ip4(vty, prefix, &gss->ip4_local[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+             for (i = 0; i < gss->local.num_ip4; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+                        vty_dump_sns_ip4(vty, prefix, &gss->local.ip4[i]);</span><br><span> </span><br><span>                vty_out(vty, "%sRemote IPv4 Endpoints:%s", prefix, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-              for (i = 0; i < gss->num_ip4_remote; i++)</span><br><span style="color: hsl(0, 100%, 40%);">-                 vty_dump_sns_ip4(vty, prefix, &gss->ip4_remote[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+            for (i = 0; i < gss->remote.num_ip4; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+                       vty_dump_sns_ip4(vty, prefix, &gss->remote.ip4[i]);</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (gss->num_ip6_local && gss->num_ip6_remote) {</span><br><span style="color: hsl(120, 100%, 40%);">+        if (gss->local.num_ip6 && gss->remote.num_ip6) {</span><br><span>               vty_out(vty, "%sLocal IPv6 Endpoints:%s", prefix, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-               for (i = 0; i < gss->num_ip6_local; i++)</span><br><span style="color: hsl(0, 100%, 40%);">-                  vty_dump_sns_ip6(vty, prefix, &gss->ip6_local[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+             for (i = 0; i < gss->local.num_ip6; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+                        vty_dump_sns_ip6(vty, prefix, &gss->local.ip6[i]);</span><br><span> </span><br><span>                vty_out(vty, "%sRemote IPv6 Endpoints:%s", prefix, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-              for (i = 0; i < gss->num_ip6_remote; i++)</span><br><span style="color: hsl(0, 100%, 40%);">-                 vty_dump_sns_ip6(vty, prefix, &gss->ip6_remote[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+            for (i = 0; i < gss->remote.num_ip6; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+                       vty_dump_sns_ip6(vty, prefix, &gss->remote.ip6[i]);</span><br><span>   }</span><br><span> }</span><br><span> </span><br><span>@@ -2052,8 +2049,8 @@</span><br><span>   return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Update SNS weights</span><br><span style="color: hsl(0, 100%, 40%);">- * \param[in] nsvc the NSVC which should be updated</span><br><span style="color: hsl(120, 100%, 40%);">+/* Update SNS weights for a bind (local endpoint).</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] bind the bind which has been updated</span><br><span>  */</span><br><span> void ns2_sns_update_weights(struct gprs_ns2_vc_bind *bind)</span><br><span> {</span><br><span>@@ -2121,8 +2118,8 @@</span><br><span>         OSMO_ASSERT(gss->role == GPRS_SNS_ROLE_SGSN);</span><br><span> </span><br><span>         /* transmit SGSN-oriented SNS-CONFIG */</span><br><span style="color: hsl(0, 100%, 40%);">- ns2_tx_sns_config(gss->sns_nsvc, true, gss->ip4_local, gss->num_ip4_local,</span><br><span style="color: hsl(0, 100%, 40%);">-                       gss->ip6_local, gss->num_ip6_local);</span><br><span style="color: hsl(120, 100%, 40%);">+  ns2_tx_sns_config(gss->sns_nsvc, true, gss->local.ip4, gss->local.num_ip4,</span><br><span style="color: hsl(120, 100%, 40%);">+                     gss->local.ip6, gss->local.num_ip6);</span><br><span> }</span><br><span> </span><br><span> /* We're waiting for SNS-CONFIG-ACK from the BSS (in response to our outbound SNS-CONFIG) */</span><br><span>@@ -2253,15 +2250,15 @@</span><br><span>          if (gss->num_max_ip6_remote && ns2_sns_count_num_local_ep(fi, IPv6)) {</span><br><span>                    gss->ip = IPv6;</span><br><span>                   ns2_sns_compute_local_ep_from_binds(fi);</span><br><span style="color: hsl(0, 100%, 40%);">-                        num_local_eps = gss->num_ip6_local;</span><br><span style="color: hsl(120, 100%, 40%);">+                        num_local_eps = gss->local.num_ip6;</span><br><span>                       num_remote_eps = gss->num_max_ip6_remote;</span><br><span>                 } else if (gss->num_max_ip4_remote && ns2_sns_count_num_local_ep(fi, IPv4)) {</span><br><span>                     gss->ip = IPv4;</span><br><span>                   ns2_sns_compute_local_ep_from_binds(fi);</span><br><span style="color: hsl(0, 100%, 40%);">-                        num_local_eps = gss->num_ip4_local;</span><br><span style="color: hsl(120, 100%, 40%);">+                        num_local_eps = gss->local.num_ip4;</span><br><span>                       num_remote_eps = gss->num_max_ip4_remote;</span><br><span>                 } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        if (gss->num_ip4_local && !gss->num_max_ip4_remote)</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (gss->local.num_ip4 && !gss->num_max_ip4_remote)</span><br><span>                            cause = NS_CAUSE_INVAL_NR_IPv4_EP;</span><br><span>                   else</span><br><span>                                 cause = NS_CAUSE_INVAL_NR_IPv6_EP;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/24582">change 24582</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/libosmocore/+/24582"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I05e053a9eb3328655502dfe2981c8f402104e292 </div>
<div style="display:none"> Gerrit-Change-Number: 24582 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: lynxis lazus <lynxis@fe80.eu> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>