<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/23245">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, approved
  pespin: Looks good to me, but someone else must approve
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gprs_ns2_sns: Unify handling of SNS-CONFIG for IPv4 + IPv6<br><br>Related: OS#3373<br>Change-Id: I49e5ca4a09bc772ef5a0cd5c2a76c8b200e56d1b<br>---<br>M src/gb/gprs_ns2_sns.c<br>1 file changed, 74 insertions(+), 110 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 1d4d069..7e2453a 100644</span><br><span>--- a/src/gb/gprs_ns2_sns.c</span><br><span>+++ b/src/gb/gprs_ns2_sns.c</span><br><span>@@ -3,7 +3,7 @@</span><br><span>  * 3GPP TS 08.16 version 8.0.1 Release 1999 / ETSI TS 101 299 V8.0.1 (2002-05)</span><br><span>  * as well as its successor 3GPP TS 48.016 */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* (C) 2018 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2018-2021 by Harald Welte <laforge@gnumonks.org></span><br><span>  * (C) 2020 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de></span><br><span>  * Author: Alexander Couzens <lynxis@fe80.eu></span><br><span>  *</span><br><span>@@ -205,6 +205,14 @@</span><br><span> #define ip6_weight_sum_data(x,y)    ip6_weight_sum(x, y, true)</span><br><span> #define ip6_weight_sum_sig(x,y)           ip6_weight_sum(x, y, false)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static int nss_weight_sum(const struct ns2_sns_state *nss, bool data_weight)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      return ip4_weight_sum(nss->ip4_remote, nss->num_ip4_remote, data_weight) +</span><br><span style="color: hsl(120, 100%, 40%);">+             ip6_weight_sum(nss->ip6_remote, nss->num_ip6_remote, data_weight);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+#define nss_weight_sum_data(nss)    nss_weight_sum(nss, true)</span><br><span style="color: hsl(120, 100%, 40%);">+#define nss_weight_sum_sig(nss)              nss_weight_sum(nss, false)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static struct gprs_ns2_vc *nsvc_by_ip4_elem(struct gprs_ns2_nse *nse,</span><br><span>                                            const struct gprs_ns_ie_ip4_elem *ip4)</span><br><span> {</span><br><span>@@ -926,106 +934,54 @@</span><br><span>     return secs;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void ns_sns_st_config_sgsn_ip4(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+/* append the remote endpoints from the parsed TLV array to the ns2_sns_state */</span><br><span style="color: hsl(120, 100%, 40%);">+static int ns_sns_append_remote_eps(struct osmo_fsm_inst *fi, const struct tlv_parsed *tp)</span><br><span> {</span><br><span>  struct ns2_sns_state *gss = (struct ns2_sns_state *) fi->priv;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct gprs_ns2_nse *nse = nse_inst_from_fi(fi);</span><br><span style="color: hsl(0, 100%, 40%);">-        const struct gprs_ns_ie_ip4_elem *v4_list;</span><br><span style="color: hsl(0, 100%, 40%);">-      unsigned int num_v4;</span><br><span style="color: hsl(0, 100%, 40%);">-    struct tlv_parsed *tp = NULL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       uint8_t cause;</span><br><span style="color: hsl(120, 100%, 40%);">+        if (TLVP_PRESENT(tp, NS_IE_IPv4_LIST)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              const struct gprs_ns_ie_ip4_elem *v4_list;</span><br><span style="color: hsl(120, 100%, 40%);">+            unsigned int num_v4;</span><br><span style="color: hsl(120, 100%, 40%);">+          v4_list = (const struct gprs_ns_ie_ip4_elem *) TLVP_VAL(tp, NS_IE_IPv4_LIST);</span><br><span style="color: hsl(120, 100%, 40%);">+         num_v4 = TLVP_LEN(tp, NS_IE_IPv4_LIST) / sizeof(*v4_list);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  tp = (struct tlv_parsed *) data;</span><br><span style="color: hsl(120, 100%, 40%);">+              if (num_v4 && gss->ip6_remote)</span><br><span style="color: hsl(120, 100%, 40%);">+                     return -NS_CAUSE_INVAL_NR_IPv4_EP;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  if (!TLVP_PRESENT(tp, NS_IE_IPv4_LIST)) {</span><br><span style="color: hsl(0, 100%, 40%);">-               cause = NS_CAUSE_INVAL_NR_IPv4_EP;</span><br><span style="color: hsl(0, 100%, 40%);">-              ns2_tx_sns_config_ack(gss->sns_nsvc, &cause);</span><br><span style="color: hsl(0, 100%, 40%);">-            osmo_fsm_inst_state_chg(fi, GPRS_SNS_ST_UNCONFIGURED, 0, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-            return;</span><br><span style="color: hsl(120, 100%, 40%);">+               /* realloc to the new size */</span><br><span style="color: hsl(120, 100%, 40%);">+         gss->ip4_remote = talloc_realloc(gss, gss->ip4_remote,</span><br><span style="color: hsl(120, 100%, 40%);">+                                           struct gprs_ns_ie_ip4_elem,</span><br><span style="color: hsl(120, 100%, 40%);">+                                           gss->num_ip4_remote + num_v4);</span><br><span style="color: hsl(120, 100%, 40%);">+            /* append the new entries to the end of the list */</span><br><span style="color: hsl(120, 100%, 40%);">+           memcpy(&gss->ip4_remote[gss->num_ip4_remote], v4_list, num_v4*sizeof(*v4_list));</span><br><span style="color: hsl(120, 100%, 40%);">+            gss->num_ip4_remote += num_v4;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGPFSML(fi, LOGL_INFO, "Rx SNS-CONFIG: Remote IPv4 list now %u entries\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                  gss->num_ip4_remote);</span><br><span>    }</span><br><span style="color: hsl(0, 100%, 40%);">-       v4_list = (const struct gprs_ns_ie_ip4_elem *) TLVP_VAL(tp, NS_IE_IPv4_LIST);</span><br><span style="color: hsl(0, 100%, 40%);">-   num_v4 = TLVP_LEN(tp, NS_IE_IPv4_LIST) / sizeof(*v4_list);</span><br><span style="color: hsl(0, 100%, 40%);">-      /* 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(0, 100%, 40%);">-                                     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(0, 100%, 40%);">-        /* 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> </span><br><span style="color: hsl(0, 100%, 40%);">-   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(0, 100%, 40%);">-       if (event == GPRS_SNS_EV_RX_CONFIG_END) {</span><br><span style="color: hsl(0, 100%, 40%);">-               /* check if sum of data / sig weights == 0 */</span><br><span style="color: hsl(0, 100%, 40%);">-           if (ip4_weight_sum_data(gss->ip4_remote, gss->num_ip4_remote) == 0 ||</span><br><span style="color: hsl(0, 100%, 40%);">-                             ip4_weight_sum_sig(gss->ip4_remote, gss->num_ip4_remote) == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  cause = NS_CAUSE_INVAL_WEIGH;</span><br><span style="color: hsl(0, 100%, 40%);">-                   ns2_tx_sns_config_ack(gss->sns_nsvc, &cause);</span><br><span style="color: hsl(0, 100%, 40%);">-                    osmo_fsm_inst_state_chg(fi, GPRS_SNS_ST_UNCONFIGURED, 0, 0);</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%);">-               create_missing_nsvcs(fi);</span><br><span style="color: hsl(0, 100%, 40%);">-               ns2_tx_sns_config_ack(gss->sns_nsvc, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-          /* start the test procedure on ALL NSVCs! */</span><br><span style="color: hsl(0, 100%, 40%);">-            gprs_ns2_start_alive_all_nsvcs(nse);</span><br><span style="color: hsl(0, 100%, 40%);">-            osmo_fsm_inst_state_chg(fi, GPRS_SNS_ST_CONFIGURED, ns_sns_configured_timeout(fi), 4);</span><br><span style="color: hsl(0, 100%, 40%);">-  } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                /* just send CONFIG-ACK */</span><br><span style="color: hsl(0, 100%, 40%);">-              ns2_tx_sns_config_ack(gss->sns_nsvc, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-          osmo_timer_schedule(&fi->timer, nse->nsi->timeout[NS_TOUT_TSNS_PROV], 0);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (TLVP_PRESENT(tp, NS_IE_IPv6_LIST)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              const struct gprs_ns_ie_ip6_elem *v6_list;</span><br><span style="color: hsl(120, 100%, 40%);">+            unsigned int num_v6;</span><br><span style="color: hsl(120, 100%, 40%);">+          v6_list = (const struct gprs_ns_ie_ip6_elem *) TLVP_VAL(tp, NS_IE_IPv6_LIST);</span><br><span style="color: hsl(120, 100%, 40%);">+         num_v6 = TLVP_LEN(tp, NS_IE_IPv6_LIST) / sizeof(*v6_list);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          if (num_v6 && gss->ip4_remote)</span><br><span style="color: hsl(120, 100%, 40%);">+                     return -NS_CAUSE_INVAL_NR_IPv6_EP;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          /* realloc to the new size */</span><br><span style="color: hsl(120, 100%, 40%);">+         gss->ip6_remote = talloc_realloc(gss, gss->ip6_remote,</span><br><span style="color: hsl(120, 100%, 40%);">+                                           struct gprs_ns_ie_ip6_elem,</span><br><span style="color: hsl(120, 100%, 40%);">+                                           gss->num_ip6_remote + num_v6);</span><br><span style="color: hsl(120, 100%, 40%);">+            /* append the new entries to the end of the list */</span><br><span style="color: hsl(120, 100%, 40%);">+           memcpy(&gss->ip6_remote[gss->num_ip6_remote], v6_list, num_v6*sizeof(*v6_list));</span><br><span style="color: hsl(120, 100%, 40%);">+            gss->num_ip6_remote += num_v6;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGPFSML(fi, LOGL_INFO, "Rx SNS-CONFIG: Remote IPv6 list now %u entries\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                  gss->num_ip6_remote);</span><br><span>    }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void ns_sns_st_config_sgsn_ip6(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      struct ns2_sns_state *gss = (struct ns2_sns_state *) fi->priv;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct gprs_ns2_nse *nse = nse_inst_from_fi(fi);</span><br><span style="color: hsl(0, 100%, 40%);">-        const struct gprs_ns_ie_ip6_elem *v6_list;</span><br><span style="color: hsl(0, 100%, 40%);">-      unsigned int num_v6;</span><br><span style="color: hsl(0, 100%, 40%);">-    struct tlv_parsed *tp = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   uint8_t cause;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  tp = (struct tlv_parsed *) data;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (!TLVP_PRESENT(tp, NS_IE_IPv6_LIST)) {</span><br><span style="color: hsl(0, 100%, 40%);">-               cause = NS_CAUSE_INVAL_NR_IPv6_EP;</span><br><span style="color: hsl(0, 100%, 40%);">-              ns2_tx_sns_config_ack(gss->sns_nsvc, &cause);</span><br><span style="color: hsl(0, 100%, 40%);">-            osmo_fsm_inst_state_chg(fi, GPRS_SNS_ST_UNCONFIGURED, 0, 0);</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%);">-       v6_list = (const struct gprs_ns_ie_ip6_elem *) TLVP_VAL(tp, NS_IE_IPv6_LIST);</span><br><span style="color: hsl(0, 100%, 40%);">-   num_v6 = TLVP_LEN(tp, NS_IE_IPv6_LIST) / sizeof(*v6_list);</span><br><span style="color: hsl(0, 100%, 40%);">-      /* 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(0, 100%, 40%);">-                                     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(0, 100%, 40%);">-        /* 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(0, 100%, 40%);">-</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(0, 100%, 40%);">-       if (event == GPRS_SNS_EV_RX_CONFIG_END) {</span><br><span style="color: hsl(0, 100%, 40%);">-               /* check if sum of data / sig weights == 0 */</span><br><span style="color: hsl(0, 100%, 40%);">-           if (ip6_weight_sum_data(gss->ip6_remote, gss->num_ip6_remote) == 0 ||</span><br><span style="color: hsl(0, 100%, 40%);">-                             ip6_weight_sum_sig(gss->ip6_remote, gss->num_ip6_remote) == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  cause = NS_CAUSE_INVAL_WEIGH;</span><br><span style="color: hsl(0, 100%, 40%);">-                   ns2_tx_sns_config_ack(gss->sns_nsvc, &cause);</span><br><span style="color: hsl(0, 100%, 40%);">-                    osmo_fsm_inst_state_chg(fi, GPRS_SNS_ST_UNCONFIGURED, 0, 0);</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%);">-               create_missing_nsvcs(fi);</span><br><span style="color: hsl(0, 100%, 40%);">-               ns2_tx_sns_config_ack(gss->sns_nsvc, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-          /* start the test procedure on ALL NSVCs! */</span><br><span style="color: hsl(0, 100%, 40%);">-            gprs_ns2_start_alive_all_nsvcs(nse);</span><br><span style="color: hsl(0, 100%, 40%);">-            osmo_fsm_inst_state_chg(fi, GPRS_SNS_ST_CONFIGURED, 0, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-      } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                /* just send CONFIG-ACK */</span><br><span style="color: hsl(0, 100%, 40%);">-              ns2_tx_sns_config_ack(gss->sns_nsvc, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-          osmo_timer_schedule(&fi->timer, nse->nsi->timeout[NS_TOUT_TSNS_PROV], 0);</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(120, 100%, 40%);">+     return 0;</span><br><span> }</span><br><span> </span><br><span> static void ns2_sns_st_config_sgsn_onenter(struct osmo_fsm_inst *fi, uint32_t old_state)</span><br><span>@@ -1039,29 +995,37 @@</span><br><span> static void ns2_sns_st_config_sgsn(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 style="color: hsl(120, 100%, 40%);">+     struct gprs_ns2_nse *nse = nse_inst_from_fi(fi);</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t cause;</span><br><span style="color: hsl(120, 100%, 40%);">+        int rc;</span><br><span> </span><br><span>  switch (event) {</span><br><span>     case GPRS_SNS_EV_RX_CONFIG_END:</span><br><span>      case GPRS_SNS_EV_RX_CONFIG:</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#if 0                /* part of incoming SNS-SIZE (doesn't happen on BSS side */</span><br><span style="color: hsl(0, 100%, 40%);">-         if (TLVP_PRESENT(tp, NS_IE_RESET_FLAG)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       /* reset all existing config */</span><br><span style="color: hsl(0, 100%, 40%);">-                 if (gss->ip4_remote)</span><br><span style="color: hsl(0, 100%, 40%);">-                         talloc_free(gss->ip4_remote);</span><br><span style="color: hsl(0, 100%, 40%);">-                        gss->num_ip4_remote = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+           rc = ns_sns_append_remote_eps(fi, data);</span><br><span style="color: hsl(120, 100%, 40%);">+              if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      cause = -rc;</span><br><span style="color: hsl(120, 100%, 40%);">+                  ns2_tx_sns_config_ack(gss->sns_nsvc, &cause);</span><br><span style="color: hsl(120, 100%, 40%);">+                  osmo_fsm_inst_state_chg(fi, GPRS_SNS_ST_UNCONFIGURED, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                  return;</span><br><span>              }</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-         /* TODO: reject IPv6 elements on IPv4 mode and vice versa */</span><br><span style="color: hsl(0, 100%, 40%);">-            switch (gss->ip) {</span><br><span style="color: hsl(0, 100%, 40%);">-           case IPv4:</span><br><span style="color: hsl(0, 100%, 40%);">-                      ns_sns_st_config_sgsn_ip4(fi, event, data);</span><br><span style="color: hsl(0, 100%, 40%);">-                     break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case IPv6:</span><br><span style="color: hsl(0, 100%, 40%);">-                      ns_sns_st_config_sgsn_ip6(fi, event, data);</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(120, 100%, 40%);">+               if (event == GPRS_SNS_EV_RX_CONFIG_END) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     /* check if sum of data / sig weights == 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+                 if (nss_weight_sum_data(gss) == 0 || nss_weight_sum_sig(gss) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                          cause = NS_CAUSE_INVAL_WEIGH;</span><br><span style="color: hsl(120, 100%, 40%);">+                         ns2_tx_sns_config_ack(gss->sns_nsvc, &cause);</span><br><span style="color: hsl(120, 100%, 40%);">+                          osmo_fsm_inst_state_chg(fi, GPRS_SNS_ST_UNCONFIGURED, 0, 0);</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%);">+                     create_missing_nsvcs(fi);</span><br><span style="color: hsl(120, 100%, 40%);">+                     ns2_tx_sns_config_ack(gss->sns_nsvc, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+                        /* start the test procedure on ALL NSVCs! */</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%);">+                  osmo_fsm_inst_state_chg(fi, GPRS_SNS_ST_CONFIGURED, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+            } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      /* just send CONFIG-ACK */</span><br><span style="color: hsl(120, 100%, 40%);">+                    ns2_tx_sns_config_ack(gss->sns_nsvc, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+                        osmo_timer_schedule(&fi->timer, nse->nsi->timeout[NS_TOUT_TSNS_PROV], 0);</span><br><span>               }</span><br><span>            break;</span><br><span>       default:</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/23245">change 23245</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/+/23245"/><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: I49e5ca4a09bc772ef5a0cd5c2a76c8b200e56d1b </div>
<div style="display:none"> Gerrit-Change-Number: 23245 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </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: daniel <dwillmann@sysmocom.de> </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-MessageType: merged </div>