<p>lynxis lazus <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/24123">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;">gprs_ns2_sns: implement outbound SNS ADD procedures<br><br>When adding a bind, the remote side needs to be<br>informed via the SNS ADD procedure.<br><br>Related: OS#5036<br>Change-Id: I71c33200bd1f0307ceb943ee958db5ebe3623d36<br>---<br>M src/gb/gprs_ns2_sns.c<br>1 file changed, 193 insertions(+), 36 deletions(-)<br><br></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 9e30f62..0cb24c5 100644</span><br><span>--- a/src/gb/gprs_ns2_sns.c</span><br><span>+++ b/src/gb/gprs_ns2_sns.c</span><br><span>@@ -93,6 +93,8 @@</span><br><span>        { 0, NULL }</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define GPRS_SNS_FLAG_KEEP_SELECT_ENDPOINT_ORDER (void *) 1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> enum sns_procedure {</span><br><span>         SNS_PROC_NONE,          /*!< used as invalid/idle value */</span><br><span>        SNS_PROC_ADD,</span><br><span>@@ -1473,6 +1475,12 @@</span><br><span> </span><br><span>   /* also takes care of retransmitting */</span><br><span>      switch (gss->current_procedure->procedure) {</span><br><span style="color: hsl(120, 100%, 40%);">+    case SNS_PROC_ADD:</span><br><span style="color: hsl(120, 100%, 40%);">+            if (gss->family == AF_INET)</span><br><span style="color: hsl(120, 100%, 40%);">+                        ns2_tx_sns_add(gss->sns_nsvc, gss->current_procedure->trans_id, &gss->current_procedure->ip4, 1, NULL, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+         else</span><br><span style="color: hsl(120, 100%, 40%);">+                  ns2_tx_sns_add(gss->sns_nsvc, gss->current_procedure->trans_id, NULL, 0, &gss->current_procedure->ip6, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span>       case SNS_PROC_CHANGE_WEIGHT:</span><br><span>                 if (gss->family == AF_INET)</span><br><span>                       ns2_tx_sns_change_weight(gss->sns_nsvc, gss->current_procedure->trans_id, &gss->current_procedure->ip4, 1, NULL, 0);</span><br><span>@@ -1484,6 +1492,65 @@</span><br><span>     }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void create_nsvc_for_new_sbind(struct ns2_sns_state *gss, struct ns2_sns_bind *sbind)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gprs_ns2_nse *nse = gss->nse;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gprs_ns2_vc_bind *bind = sbind->bind;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gprs_ns2_vc *nsvc;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct osmo_sockaddr remote = { };</span><br><span style="color: hsl(120, 100%, 40%);">+    unsigned int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* iterate over all remote IPv4 endpoints */</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 style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         remote.u.sin.sin_family = AF_INET;</span><br><span style="color: hsl(120, 100%, 40%);">+            remote.u.sin.sin_addr.s_addr = ip4->ip_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+               remote.u.sin.sin_port = ip4->udp_port;</span><br><span style="color: hsl(120, 100%, 40%);">+             /* we only care about UDP binds */</span><br><span style="color: hsl(120, 100%, 40%);">+            if (bind->ll != GPRS_NS2_LL_UDP)</span><br><span style="color: hsl(120, 100%, 40%);">+                   continue;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           nsvc = nsvc_for_bind_and_remote(nse, bind, &remote);</span><br><span style="color: hsl(120, 100%, 40%);">+              if (!nsvc) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  nsvc = gprs_ns2_ip_connect_inactive(bind, &remote, nse, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (!nsvc) {</span><br><span style="color: hsl(120, 100%, 40%);">+                          /* TODO: add to a list to send back a NS-STATUS */</span><br><span style="color: hsl(120, 100%, 40%);">+                            continue;</span><br><span style="color: hsl(120, 100%, 40%);">+                     }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           /* update data / signalling weight */</span><br><span style="color: hsl(120, 100%, 40%);">+         nsvc->data_weight = ip4->data_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+           nsvc->sig_weight = ip4->sig_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+             nsvc->sns_only = false;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* iterate over all remote IPv4 endpoints */</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 style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         remote.u.sin6.sin6_family = AF_INET6;</span><br><span style="color: hsl(120, 100%, 40%);">+         remote.u.sin6.sin6_addr = ip6->ip_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+            remote.u.sin6.sin6_port = ip6->udp_port;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         /* we only care about UDP binds */</span><br><span style="color: hsl(120, 100%, 40%);">+            nsvc = nsvc_for_bind_and_remote(nse, bind, &remote);</span><br><span style="color: hsl(120, 100%, 40%);">+              if (!nsvc) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  nsvc = gprs_ns2_ip_connect_inactive(bind, &remote, nse, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (!nsvc) {</span><br><span style="color: hsl(120, 100%, 40%);">+                          /* TODO: add to a list to send back a NS-STATUS */</span><br><span style="color: hsl(120, 100%, 40%);">+                            continue;</span><br><span style="color: hsl(120, 100%, 40%);">+                     }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           /* update data / signalling weight */</span><br><span style="color: hsl(120, 100%, 40%);">+         nsvc->data_weight = ip6->data_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+           nsvc->sig_weight = ip6->sig_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+             nsvc->sns_only = false;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void ns2_sns_st_local_procedure(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span>  struct ns2_sns_state *gss = (struct ns2_sns_state *) fi->priv;</span><br><span>@@ -1523,6 +1590,18 @@</span><br><span>           }</span><br><span> </span><br><span>                switch (gss->current_procedure->procedure) {</span><br><span style="color: hsl(120, 100%, 40%);">+            case SNS_PROC_ADD:</span><br><span style="color: hsl(120, 100%, 40%);">+                    switch (gss->family) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     case AF_INET:</span><br><span style="color: hsl(120, 100%, 40%);">+                         add_ip4_elem(gss, &gss->local, &gss->current_procedure->ip4);</span><br><span style="color: hsl(120, 100%, 40%);">+                                break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        case AF_INET6:</span><br><span style="color: hsl(120, 100%, 40%);">+                                add_ip6_elem(gss, &gss->local, &gss->current_procedure->ip6);</span><br><span style="color: hsl(120, 100%, 40%);">+                                break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        }</span><br><span style="color: hsl(120, 100%, 40%);">+                     create_nsvc_for_new_sbind(gss, gss->current_procedure->sbind);</span><br><span style="color: hsl(120, 100%, 40%);">+                  gprs_ns2_start_alive_all_nsvcs(nse);</span><br><span style="color: hsl(120, 100%, 40%);">+                  break;</span><br><span>               case SNS_PROC_CHANGE_WEIGHT:</span><br><span>                         switch (gss->family) {</span><br><span>                    case AF_INET:</span><br><span>@@ -1758,7 +1837,6 @@</span><br><span>                OSMO_ASSERT(0);</span><br><span>      }</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static void ns2_add_procedure(struct ns2_sns_state *gss, struct ns2_sns_bind *sbind,</span><br><span>                             enum sns_procedure procedure_type)</span><br><span> {</span><br><span>@@ -1766,10 +1844,11 @@</span><br><span>      const struct osmo_sockaddr *saddr;</span><br><span>   saddr = gprs_ns2_ip_bind_sockaddr(sbind->bind);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  if (saddr->u.sa.sa_family != gss->family)</span><br><span style="color: hsl(0, 100%, 40%);">-         return;</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_ASSERT(saddr->u.sa.sa_family == gss->family);</span><br><span> </span><br><span>         switch (procedure_type) {</span><br><span style="color: hsl(120, 100%, 40%);">+     case SNS_PROC_ADD:</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span>       case SNS_PROC_CHANGE_WEIGHT:</span><br><span>                 llist_for_each_entry(procedure, &gss->procedures, list) {</span><br><span>                     if (procedure->sbind == sbind && procedure->procedure == procedure_type &&</span><br><span>@@ -1791,47 +1870,76 @@</span><br><span>                           return;</span><br><span>                      }</span><br><span>            }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               procedure = talloc_zero(gss, struct ns2_sns_procedure);</span><br><span style="color: hsl(0, 100%, 40%);">-         if (!procedure)</span><br><span style="color: hsl(0, 100%, 40%);">-                 return;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-         procedure->sbind = sbind;</span><br><span style="color: hsl(0, 100%, 40%);">-            procedure->procedure = procedure_type;</span><br><span style="color: hsl(0, 100%, 40%);">-               procedure->sig_weight = sbind->bind->sns_sig_weight;</span><br><span style="color: hsl(0, 100%, 40%);">-           procedure->data_weight = sbind->bind->sns_data_weight;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-         switch(gss->family) {</span><br><span style="color: hsl(0, 100%, 40%);">-                case AF_INET:</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                   procedure->ip4.ip_addr = saddr->u.sin.sin_addr.s_addr;</span><br><span style="color: hsl(0, 100%, 40%);">-                    procedure->ip4.udp_port = saddr->u.sin.sin_port;</span><br><span style="color: hsl(0, 100%, 40%);">-                  procedure->ip4.sig_weight = sbind->bind->sns_sig_weight;</span><br><span style="color: hsl(0, 100%, 40%);">-                       procedure->ip4.data_weight = sbind->bind->sns_data_weight;</span><br><span style="color: hsl(0, 100%, 40%);">-                     break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case AF_INET6:</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                  memcpy(&procedure->ip6.ip_addr, &saddr->u.sin6.sin6_addr, sizeof(struct in6_addr));</span><br><span style="color: hsl(0, 100%, 40%);">-                       procedure->ip6.udp_port = saddr->u.sin.sin_port;</span><br><span style="color: hsl(0, 100%, 40%);">-                  procedure->ip6.sig_weight = sbind->bind->sns_sig_weight;</span><br><span style="color: hsl(0, 100%, 40%);">-                       procedure->ip6.data_weight = sbind->bind->sns_data_weight;</span><br><span style="color: hsl(0, 100%, 40%);">-                     break;</span><br><span style="color: hsl(0, 100%, 40%);">-          default:</span><br><span style="color: hsl(0, 100%, 40%);">-                        OSMO_ASSERT(0);</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               llist_add_tail(&procedure->list, &gss->procedures);</span><br><span>            break;</span><br><span>       default:</span><br><span>             return;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ procedure = talloc_zero(gss, struct ns2_sns_procedure);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!procedure)</span><br><span style="color: hsl(120, 100%, 40%);">+               return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     llist_add_tail(&procedure->list, &gss->procedures);</span><br><span style="color: hsl(120, 100%, 40%);">+     procedure->sbind = sbind;</span><br><span style="color: hsl(120, 100%, 40%);">+  procedure->procedure = procedure_type;</span><br><span style="color: hsl(120, 100%, 40%);">+     procedure->sig_weight = sbind->bind->sns_sig_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+ procedure->data_weight = sbind->bind->sns_data_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     switch(gss->family) {</span><br><span style="color: hsl(120, 100%, 40%);">+      case AF_INET:</span><br><span style="color: hsl(120, 100%, 40%);">+         procedure->ip4.ip_addr = saddr->u.sin.sin_addr.s_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+          procedure->ip4.udp_port = saddr->u.sin.sin_port;</span><br><span style="color: hsl(120, 100%, 40%);">+                procedure->ip4.sig_weight = sbind->bind->sns_sig_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+             procedure->ip4.data_weight = sbind->bind->sns_data_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+           break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case AF_INET6:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              memcpy(&procedure->ip6.ip_addr, &saddr->u.sin6.sin6_addr, sizeof(struct in6_addr));</span><br><span style="color: hsl(120, 100%, 40%);">+             procedure->ip6.udp_port = saddr->u.sin.sin_port;</span><br><span style="color: hsl(120, 100%, 40%);">+                procedure->ip6.sig_weight = sbind->bind->sns_sig_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+             procedure->ip6.data_weight = sbind->bind->sns_data_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+           break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              OSMO_ASSERT(0);</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (gss->nse->bss_sns_fi->state == GPRS_SNS_ST_CONFIGURED) {</span><br><span>                osmo_fsm_inst_state_chg(gss->nse->bss_sns_fi, GPRS_SNS_ST_LOCAL_PROCEDURE,</span><br><span>                                     gss->nse->nsi->timeout[NS_TOUT_TSNS_PROV], 5);</span><br><span>      }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* add an entrypoint to sns_endpoints */</span><br><span style="color: hsl(120, 100%, 40%);">+static int ns2_sns_add_elements(struct ns2_sns_state *gss, struct ns2_sns_bind *sbind,</span><br><span style="color: hsl(120, 100%, 40%);">+                          struct ns2_sns_elems *elems)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       const struct osmo_sockaddr *saddr;</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%);">+       struct gprs_ns_ie_ip6_elem ip6;</span><br><span style="color: hsl(120, 100%, 40%);">+       int rc = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        saddr = gprs_ns2_ip_bind_sockaddr(sbind->bind);</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(saddr->u.sa.sa_family == gss->family);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    switch (gss->family) {</span><br><span style="color: hsl(120, 100%, 40%);">+     case AF_INET:</span><br><span style="color: hsl(120, 100%, 40%);">+         ip4.ip_addr = saddr->u.sin.sin_addr.s_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+                ip4.udp_port= saddr->u.sin.sin_port;</span><br><span style="color: hsl(120, 100%, 40%);">+               ip4.sig_weight = sbind->bind->sns_sig_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+           ip4.data_weight = sbind->bind->sns_data_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+         rc = add_ip4_elem(gss, elems, &ip4);</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case AF_INET6:</span><br><span style="color: hsl(120, 100%, 40%);">+                memcpy(&ip6.ip_addr, &saddr->u.sin6.sin6_addr, sizeof(struct in6_addr));</span><br><span style="color: hsl(120, 100%, 40%);">+           ip6.udp_port= saddr->u.sin.sin_port;</span><br><span style="color: hsl(120, 100%, 40%);">+               ip6.sig_weight = sbind->bind->sns_sig_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+           ip6.data_weight = sbind->bind->sns_data_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+         rc = add_ip6_elem(gss, elems, &ip6);</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> /* common allstate-action for both roles */</span><br><span> static void ns2_sns_st_all_action(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span>@@ -1846,15 +1954,63 @@</span><br><span>                sbind = data;</span><br><span>                switch (fi->state) {</span><br><span>              case GPRS_SNS_ST_UNCONFIGURED:</span><br><span style="color: hsl(0, 100%, 40%);">-                  osmo_fsm_inst_dispatch(nse->bss_sns_fi, NS2_SNS_EV_REQ_SELECT_ENDPOINT, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (gss->role == GPRS_SNS_ROLE_BSS)</span><br><span style="color: hsl(120, 100%, 40%);">+                                osmo_fsm_inst_dispatch(nse->bss_sns_fi, NS2_SNS_EV_REQ_SELECT_ENDPOINT, NULL);</span><br><span>                    break;</span><br><span>               case GPRS_SNS_ST_BSS_SIZE:</span><br><span style="color: hsl(0, 100%, 40%);">-                      /* TODO: add the ip4 element to the list */</span><br><span style="color: hsl(120, 100%, 40%);">+                   switch (gss->family) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     case AF_INET:</span><br><span style="color: hsl(120, 100%, 40%);">+                         if (gss->num_max_ip4_remote <= gss->local.num_ip4 ||</span><br><span style="color: hsl(120, 100%, 40%);">+                                  gss->num_max_ip4_remote * (gss->local.num_ip4 + 1) > gss->num_max_nsvcs) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                       osmo_fsm_inst_dispatch(nse->bss_sns_fi, NS2_SNS_EV_REQ_SELECT_ENDPOINT, GPRS_SNS_FLAG_KEEP_SELECT_ENDPOINT_ORDER);</span><br><span style="color: hsl(120, 100%, 40%);">+                                 return;</span><br><span style="color: hsl(120, 100%, 40%);">+                               }</span><br><span style="color: hsl(120, 100%, 40%);">+                             break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        case AF_INET6:</span><br><span style="color: hsl(120, 100%, 40%);">+                                if (gss->num_max_ip6_remote <= gss->local.num_ip6 ||</span><br><span style="color: hsl(120, 100%, 40%);">+                                         gss->num_max_ip6_remote * (gss->local.num_ip6 + 1) > gss->num_max_nsvcs) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                        osmo_fsm_inst_dispatch(nse->bss_sns_fi, NS2_SNS_EV_REQ_SELECT_ENDPOINT, GPRS_SNS_FLAG_KEEP_SELECT_ENDPOINT_ORDER);</span><br><span style="color: hsl(120, 100%, 40%);">+                                 return;</span><br><span style="color: hsl(120, 100%, 40%);">+                               }</span><br><span style="color: hsl(120, 100%, 40%);">+                             break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        }</span><br><span style="color: hsl(120, 100%, 40%);">+                     ns2_sns_add_elements(gss, sbind, &gss->local);</span><br><span>                        break;</span><br><span>               case GPRS_SNS_ST_BSS_CONFIG_BSS:</span><br><span>             case GPRS_SNS_ST_BSS_CONFIG_SGSN:</span><br><span>            case GPRS_SNS_ST_CONFIGURED:</span><br><span style="color: hsl(0, 100%, 40%);">-                    /* TODO: add to SNS-IP procedure queue & add nsvc() */</span><br><span style="color: hsl(120, 100%, 40%);">+                    switch (gss->family) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     case AF_INET:</span><br><span style="color: hsl(120, 100%, 40%);">+                         if (gss->num_max_ip4_remote <= gss->local.num_ip4) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                 LOGPFSML(fi, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               "NSE %d: ignoring bind %s because there are too many endpoints for the SNS.\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                                             nse->nsei, sbind->bind->name);</span><br><span style="color: hsl(120, 100%, 40%);">+                                      return;</span><br><span style="color: hsl(120, 100%, 40%);">+                               }</span><br><span style="color: hsl(120, 100%, 40%);">+                             if (gss->remote.num_ip4 * (gss->local.num_ip4 + 1) > gss->num_max_nsvcs) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                        LOGPFSML(fi, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               "NSE %d: ignoring bind %s because there are too many endpoints for the SNS.\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                                             nse->nsei, sbind->bind->name);</span><br><span style="color: hsl(120, 100%, 40%);">+                                      return;</span><br><span style="color: hsl(120, 100%, 40%);">+                               }</span><br><span style="color: hsl(120, 100%, 40%);">+                             break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        case AF_INET6:</span><br><span style="color: hsl(120, 100%, 40%);">+                                if (gss->num_max_ip6_remote <= gss->local.num_ip6) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                 LOGPFSML(fi, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               "NSE %d: ignoring bind %s because there are too many endpoints for the SNS.\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                                             nse->nsei, sbind->bind->name);</span><br><span style="color: hsl(120, 100%, 40%);">+                                      return;</span><br><span style="color: hsl(120, 100%, 40%);">+                               }</span><br><span style="color: hsl(120, 100%, 40%);">+                             if (gss->remote.num_ip6 * (gss->local.num_ip6 + 1) > gss->num_max_nsvcs) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                        LOGPFSML(fi, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               "NSE %d: ignoring bind %s because there are too many endpoints for the SNS.\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                                             nse->nsei, sbind->bind->name);</span><br><span style="color: hsl(120, 100%, 40%);">+                                      return;</span><br><span style="color: hsl(120, 100%, 40%);">+                               }</span><br><span style="color: hsl(120, 100%, 40%);">+                             break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        }</span><br><span style="color: hsl(120, 100%, 40%);">+                     ns2_sns_add_elements(gss, sbind, &gss->local_procedure);</span><br><span style="color: hsl(120, 100%, 40%);">+                       ns2_add_procedure(gss, sbind, SNS_PROC_ADD);</span><br><span>                         break;</span><br><span>               }</span><br><span>            break;</span><br><span>@@ -1975,6 +2131,7 @@</span><br><span>               break;</span><br><span>       case NS2_SNS_EV_REQ_FREE_NSVCS:</span><br><span>      case NS2_SNS_EV_REQ_SELECT_ENDPOINT:</span><br><span style="color: hsl(120, 100%, 40%);">+          /* TODO: keep the order of binds when data == GPRS_SNS_FLAG_KEEP_SELECT_ENDPOINT_ORDER */</span><br><span>            /* tear down previous state</span><br><span>           * gprs_ns2_free_nsvcs() will trigger NO_NSVC, prevent this from triggering a reselection */</span><br><span>                 gss->reselection_running = true;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/24123">change 24123</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/+/24123"/><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: I71c33200bd1f0307ceb943ee958db5ebe3623d36 </div>
<div style="display:none"> Gerrit-Change-Number: 24123 </div>
<div style="display:none"> Gerrit-PatchSet: 14 </div>
<div style="display:none"> Gerrit-Owner: lynxis lazus <lynxis@fe80.eu> </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-Reviewer: lynxis lazus <lynxis@fe80.eu> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-CC: daniel <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>