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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">NS: Optionally disable NS-{RESET,BLOCK,UNBLOCK} when using UDP/IP<br><br>3GPP TS 48.016 is quite clear in that no NS-{RESET,BLOCK,UNBLOCK}<br>procedures shall be used over an IP based transport.  They are only<br>for use in Frame Relay based transport.<br><br>However, as libosmogb was first developed against ip.access nanoBTS,<br>and their Gb implementation mandates those procedures, we<br>unconditionally implemented those procedures back then.  Let's<br>give the user the option of disabling this behavior to become<br>more spec compliant (and interoperate with more other vendors out<br>there).<br><br>Change-Id: Ic4eba1b4dcbeac00f5879db295e0a9f1a50f71d8<br>---<br>M include/osmocom/gprs/gprs_ns.h<br>M src/gb/gprs_ns.c<br>M src/gb/gprs_ns_vty.c<br>3 files changed, 57 insertions(+), 24 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/gprs/gprs_ns.h b/include/osmocom/gprs/gprs_ns.h</span><br><span>index 02faa50..94d3036 100644</span><br><span>--- a/include/osmocom/gprs/gprs_ns.h</span><br><span>+++ b/include/osmocom/gprs/gprs_ns.h</span><br><span>@@ -97,6 +97,8 @@</span><br><span>              uint32_t remote_ip;</span><br><span>          uint16_t remote_port;</span><br><span>                int dscp;</span><br><span style="color: hsl(120, 100%, 40%);">+             /*! IPA compatibility: NS-RESET/BLOCK/UNBLOCK even on IP-SNS */</span><br><span style="color: hsl(120, 100%, 40%);">+               bool use_reset_block_unblock;</span><br><span>        } nsip;</span><br><span>      /*! NS-over-FR-over-GRE-over-IP specific bits */</span><br><span>     struct {</span><br><span>diff --git a/src/gb/gprs_ns.c b/src/gb/gprs_ns.c</span><br><span>index 4e584ad..f1b36f4 100644</span><br><span>--- a/src/gb/gprs_ns.c</span><br><span>+++ b/src/gb/gprs_ns.c</span><br><span>@@ -327,7 +327,7 @@</span><br><span>  nsvc->nsvci = nsvci;</span><br><span>      nsvc->nsvci_is_valid = 1;</span><br><span>         /* before RESET procedure: BLOCKED and DEAD */</span><br><span style="color: hsl(0, 100%, 40%);">-  if (nsi->bss_sns_fi)</span><br><span style="color: hsl(120, 100%, 40%);">+       if (nsi->bss_sns_fi || !nsi->nsip.use_reset_block_unblock)</span><br><span>             ns_set_state(nsvc, 0);</span><br><span>       else</span><br><span>                 ns_set_state(nsvc, NSE_S_BLOCKED);</span><br><span>@@ -793,7 +793,7 @@</span><br><span>                     nsvc->nsi->timeout[NS_TOUT_TNS_ALIVE_RETRIES]) {</span><br><span>                       /* mark as dead (and blocked unless IP-SNS) */</span><br><span>                       rate_ctr_inc(&nsvc->ctrg->ctr[NS_CTR_DEAD]);</span><br><span style="color: hsl(0, 100%, 40%);">-                  if (!nsvc->nsi->bss_sns_fi) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   if (!nsvc->nsi->bss_sns_fi && nsvc->nsi->nsip.use_reset_block_unblock) {</span><br><span>                                 ns_set_state(nsvc, NSE_S_BLOCKED);</span><br><span>                           rate_ctr_inc(&nsvc->ctrg->ctr[NS_CTR_BLOCKED]);</span><br><span>                    } else</span><br><span>@@ -804,7 +804,7 @@</span><br><span>                                 nsvc->nsi->timeout[NS_TOUT_TNS_ALIVE_RETRIES]);</span><br><span>                        ns_osmo_signal_dispatch(nsvc, S_NS_ALIVE_EXP, 0);</span><br><span>                    /* FIXME: should we send this signal in case of SNS? */</span><br><span style="color: hsl(0, 100%, 40%);">-                 if (!nsvc->nsi->bss_sns_fi)</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (!nsvc->nsi->bss_sns_fi && nsvc->nsi->nsip.use_reset_block_unblock)</span><br><span>                           ns_osmo_signal_dispatch(nsvc, S_NS_BLOCK, NS_CAUSE_NSVC_BLOCKED);</span><br><span>                    return;</span><br><span>              }</span><br><span>@@ -1758,8 +1758,12 @@</span><br><span>            * fine. */</span><br><span>          if ((*nsvc)->state == NSE_S_BLOCKED)</span><br><span>                      rc = gprs_nsvc_reset((*nsvc), NS_CAUSE_PDU_INCOMP_PSTATE);</span><br><span style="color: hsl(0, 100%, 40%);">-              else if (!((*nsvc)->state & NSE_S_RESET))</span><br><span style="color: hsl(120, 100%, 40%);">+              else if (!((*nsvc)->state & NSE_S_RESET)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    /* if we're not alive, we cannot transmit the ACK; set ALIVE */</span><br><span style="color: hsl(120, 100%, 40%);">+                   if (!((*nsvc)->state & NSE_S_ALIVE))</span><br><span style="color: hsl(120, 100%, 40%);">+                           ns_mark_alive(*nsvc);</span><br><span>                        rc = gprs_ns_tx_alive_ack(*nsvc);</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span>            break;</span><br><span>       case NS_PDUT_ALIVE_ACK:</span><br><span>              ns_mark_alive(*nsvc);</span><br><span>@@ -1915,6 +1919,11 @@</span><br><span>       llist_del(&nsi->unknown_nsvc->list);</span><br><span>       INIT_LLIST_HEAD(&nsi->unknown_nsvc->list);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+      /* By default we are in IPA compatible mode, that is we use NS-RESET, NS-BLOCK</span><br><span style="color: hsl(120, 100%, 40%);">+         * and NS-UNBLOCK procedures even for an IP/UDP based Gb interface, in violation</span><br><span style="color: hsl(120, 100%, 40%);">+       * of 3GPP TS 48.016. */</span><br><span style="color: hsl(120, 100%, 40%);">+      nsi->nsip.use_reset_block_unblock = true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       return nsi;</span><br><span> }</span><br><span> </span><br><span>diff --git a/src/gb/gprs_ns_vty.c b/src/gb/gprs_ns_vty.c</span><br><span>index 9cffb71..bd53f2f 100644</span><br><span>--- a/src/gb/gprs_ns_vty.c</span><br><span>+++ b/src/gb/gprs_ns_vty.c</span><br><span>@@ -90,6 +90,32 @@</span><br><span> </span><br><span>   vty_out(vty, "ns%s", VTY_NEWLINE);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+      /* global configuration must be written first, as some of it may be</span><br><span style="color: hsl(120, 100%, 40%);">+    * relevant when creating the NSE/NSVC later below */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (vty_nsi->nsip.local_ip) {</span><br><span style="color: hsl(120, 100%, 40%);">+              ia.s_addr = osmo_htonl(vty_nsi->nsip.local_ip);</span><br><span style="color: hsl(120, 100%, 40%);">+            vty_out(vty, " encapsulation udp local-ip %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                    inet_ntoa(ia), VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (vty_nsi->nsip.local_port)</span><br><span style="color: hsl(120, 100%, 40%);">+              vty_out(vty, " encapsulation udp local-port %u%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                  vty_nsi->nsip.local_port, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (vty_nsi->nsip.dscp)</span><br><span style="color: hsl(120, 100%, 40%);">+            vty_out(vty, " encapsulation udp dscp %d%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                        vty_nsi->nsip.dscp, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        vty_out(vty, " encapsulation udp use-reset-block-unblock %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+             vty_nsi->nsip.use_reset_block_unblock ? "enabled" : "disabled", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        vty_out(vty, " encapsulation framerelay-gre enabled %u%s",</span><br><span style="color: hsl(120, 100%, 40%);">+          vty_nsi->frgre.enabled ? 1 : 0, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (vty_nsi->frgre.local_ip) {</span><br><span style="color: hsl(120, 100%, 40%);">+             ia.s_addr = osmo_htonl(vty_nsi->frgre.local_ip);</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, " encapsulation framerelay-gre local-ip %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                 inet_ntoa(ia), VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  llist_for_each_entry(nsvc, &vty_nsi->gprs_nsvcs, list) {</span><br><span>              if (!nsvc->persistent)</span><br><span>                    continue;</span><br><span>@@ -130,26 +156,6 @@</span><br><span>                     get_value_string(gprs_ns_timer_strs, i),</span><br><span>                     vty_nsi->timeout[i], VTY_NEWLINE);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       if (vty_nsi->nsip.local_ip) {</span><br><span style="color: hsl(0, 100%, 40%);">-                ia.s_addr = osmo_htonl(vty_nsi->nsip.local_ip);</span><br><span style="color: hsl(0, 100%, 40%);">-              vty_out(vty, " encapsulation udp local-ip %s%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                      inet_ntoa(ia), VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-       if (vty_nsi->nsip.local_port)</span><br><span style="color: hsl(0, 100%, 40%);">-                vty_out(vty, " encapsulation udp local-port %u%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                    vty_nsi->nsip.local_port, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (vty_nsi->nsip.dscp)</span><br><span style="color: hsl(0, 100%, 40%);">-              vty_out(vty, " encapsulation udp dscp %d%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                  vty_nsi->nsip.dscp, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    vty_out(vty, " encapsulation framerelay-gre enabled %u%s",</span><br><span style="color: hsl(0, 100%, 40%);">-            vty_nsi->frgre.enabled ? 1 : 0, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-        if (vty_nsi->frgre.local_ip) {</span><br><span style="color: hsl(0, 100%, 40%);">-               ia.s_addr = osmo_htonl(vty_nsi->frgre.local_ip);</span><br><span style="color: hsl(0, 100%, 40%);">-             vty_out(vty, " encapsulation framerelay-gre local-ip %s%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                   inet_ntoa(ia), VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>    return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -500,6 +506,21 @@</span><br><span>  return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_nsip_res_block_unblock, cfg_nsip_res_block_unblock_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+       "encapsulation udp use-reset-block-unblock (enabled|disabled)",</span><br><span style="color: hsl(120, 100%, 40%);">+     ENCAPS_STR "NS over UDP Encapsulation\n"</span><br><span style="color: hsl(120, 100%, 40%);">+    "Use NS-{RESET,BLOCK,UNBLOCK} procedures in violation of 3GPP TS 48.016\n"</span><br><span style="color: hsl(120, 100%, 40%);">+  "Enable NS-{RESET,BLOCK,UNBLOCK}\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ "Disable NS-{RESET,BLOCK,UNBLOCK}\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!strcmp(argv[0], "enabled"))</span><br><span style="color: hsl(120, 100%, 40%);">+            vty_nsi->nsip.use_reset_block_unblock = true;</span><br><span style="color: hsl(120, 100%, 40%);">+      else</span><br><span style="color: hsl(120, 100%, 40%);">+          vty_nsi->nsip.use_reset_block_unblock = false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> DEFUN(cfg_frgre_local_ip, cfg_frgre_local_ip_cmd,</span><br><span>       "encapsulation framerelay-gre local-ip A.B.C.D",</span><br><span>    ENCAPS_STR "NS over Frame Relay over GRE Encapsulation\n"</span><br><span>@@ -643,6 +664,7 @@</span><br><span>    install_element(L_NS_NODE, &cfg_nsip_local_ip_cmd);</span><br><span>      install_element(L_NS_NODE, &cfg_nsip_local_port_cmd);</span><br><span>    install_element(L_NS_NODE, &cfg_nsip_dscp_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+   install_element(L_NS_NODE, &cfg_nsip_res_block_unblock_cmd);</span><br><span>     install_element(L_NS_NODE, &cfg_frgre_enable_cmd);</span><br><span>       install_element(L_NS_NODE, &cfg_frgre_local_ip_cmd);</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/18706">change 18706</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/+/18706"/><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: Ic4eba1b4dcbeac00f5879db295e0a9f1a50f71d8 </div>
<div style="display:none"> Gerrit-Change-Number: 18706 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </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-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>