<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/13025">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  Harald Welte: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Optionally Use the NS Sub-Network-Service (SNS) on Gb<br><br>This change add support for the recently-introduced GPRS Gb interface<br>auto-configuration using the NS IP Sub-Network Service (SNS) procedures.<br><br>It requires a Change-Id I84786c3b43a8ae34ef3b3ba84b33c90042d234ea of<br>libosmocore.<br><br>Related: OS#3372<br>Depends: I84786c3b43a8ae34ef3b3ba84b33c90042d234ea (libosmcore)<br>Change-Id: I256b40ac592d3b6e75dd581bf7b9512f69b11e83<br>---<br>M src/bts.h<br>M src/gprs_bssgp_pcu.cpp<br>M src/pcu_vty.c<br>3 files changed, 50 insertions(+), 7 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/bts.h b/src/bts.h</span><br><span>index 51760e2..578cece 100644</span><br><span>--- a/src/bts.h</span><br><span>+++ b/src/bts.h</span><br><span>@@ -159,6 +159,9 @@</span><br><span> </span><br><span>        /* Path to be used for the pcu-bts socket */</span><br><span>         char *pcu_sock_path;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Are we talking Gb with IP-SNS (true) or classic Gb? */</span><br><span style="color: hsl(120, 100%, 40%);">+     bool gb_dialect_sns;</span><br><span> };</span><br><span> </span><br><span> #ifdef __cplusplus</span><br><span>diff --git a/src/gprs_bssgp_pcu.cpp b/src/gprs_bssgp_pcu.cpp</span><br><span>index 8bf6b7f..f63fac3 100644</span><br><span>--- a/src/gprs_bssgp_pcu.cpp</span><br><span>+++ b/src/gprs_bssgp_pcu.cpp</span><br><span>@@ -541,12 +541,20 @@</span><br><span>            return -EINVAL;</span><br><span> </span><br><span>  nssd = (struct ns_signal_data *)signal_data;</span><br><span style="color: hsl(0, 100%, 40%);">-    if (nssd->nsvc != the_pcu.nsvc) {</span><br><span style="color: hsl(120, 100%, 40%);">+  if (signal != S_SNS_CONFIGURED &&  nssd->nsvc != the_pcu.nsvc) {</span><br><span>          LOGP(DPCU, LOGL_ERROR, "Signal received of unknown NSVC\n");</span><br><span>               return -EINVAL;</span><br><span>      }</span><br><span> </span><br><span>        switch (signal) {</span><br><span style="color: hsl(120, 100%, 40%);">+     case S_SNS_CONFIGURED:</span><br><span style="color: hsl(120, 100%, 40%);">+                the_pcu.bvc_sig_reset = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+            the_pcu.bvc_reset = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                /* There's no NS-RESET / NS-UNBLOCK procedure on IP SNS based NS-VCs */</span><br><span style="color: hsl(120, 100%, 40%);">+           the_pcu.nsvc_unblocked = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DPCU, LOGL_NOTICE, "NS-VC %d is unblocked.\n", the_pcu.nsvc->nsvci);</span><br><span style="color: hsl(120, 100%, 40%);">+                bvc_timeout(NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span>       case S_NS_UNBLOCK:</span><br><span>           if (!the_pcu.nsvc_unblocked) {</span><br><span>                       the_pcu.nsvc_unblocked = 1;</span><br><span>@@ -872,9 +880,10 @@</span><br><span>           return -EBADF;</span><br><span>       }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   nsvc2 = gprs_ns_nsip_connect(bssgp_nsi, &nsvc->ip.bts_addr,</span><br><span style="color: hsl(0, 100%, 40%);">-              nsvc->nsei, nsvc->nsvci);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+       if (the_pcu.bts->gb_dialect_sns)</span><br><span style="color: hsl(120, 100%, 40%);">+           nsvc2 = gprs_ns_nsip_connect_sns(bssgp_nsi, &nsvc->ip.bts_addr, nsvc->nsei, nsvc->nsvci);</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+          nsvc2 = gprs_ns_nsip_connect(bssgp_nsi, &nsvc->ip.bts_addr, nsvc->nsei, nsvc->nsvci);</span><br><span>   if (!nsvc2) {</span><br><span>                LOGP(DBSSGP, LOGL_ERROR, "Failed to reconnect NSVC\n");</span><br><span>            return -EIO;</span><br><span>@@ -905,8 +914,13 @@</span><br><span>          return NULL;</span><br><span>         }</span><br><span>    gprs_ns_vty_init(bssgp_nsi);</span><br><span style="color: hsl(0, 100%, 40%);">-    bssgp_nsi->nsip.remote_port = sgsn_port;</span><br><span style="color: hsl(0, 100%, 40%);">-     bssgp_nsi->nsip.remote_ip = sgsn_ip;</span><br><span style="color: hsl(120, 100%, 40%);">+       /* don't specify remote IP/port if SNS dialect is in use; Doing so would</span><br><span style="color: hsl(120, 100%, 40%);">+   * issue a connect() on the socket, which prevents us to dynamically communicate</span><br><span style="color: hsl(120, 100%, 40%);">+       * with any number of IP-SNS endpoints on the SGSN side */</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!bts->gb_dialect_sns) {</span><br><span style="color: hsl(120, 100%, 40%);">+                bssgp_nsi->nsip.remote_port = sgsn_port;</span><br><span style="color: hsl(120, 100%, 40%);">+           bssgp_nsi->nsip.remote_ip = sgsn_ip;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span>    bssgp_nsi->nsip.local_port = local_port;</span><br><span>  rc = gprs_ns_nsip_listen(bssgp_nsi);</span><br><span>         if (rc < 0) {</span><br><span>@@ -920,7 +934,10 @@</span><br><span>      dest.sin_port = htons(sgsn_port);</span><br><span>    dest.sin_addr.s_addr = htonl(sgsn_ip);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      the_pcu.nsvc = gprs_ns_nsip_connect(bssgp_nsi, &dest, nsei, nsvci);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (bts->gb_dialect_sns)</span><br><span style="color: hsl(120, 100%, 40%);">+           the_pcu.nsvc = gprs_ns_nsip_connect_sns(bssgp_nsi, &dest, nsei, nsvci);</span><br><span style="color: hsl(120, 100%, 40%);">+   else</span><br><span style="color: hsl(120, 100%, 40%);">+          the_pcu.nsvc = gprs_ns_nsip_connect(bssgp_nsi, &dest, nsei, nsvci);</span><br><span>      if (!the_pcu.nsvc) {</span><br><span>                 LOGP(DBSSGP, LOGL_ERROR, "Failed to create NSVCt\n");</span><br><span>              gprs_ns_destroy(bssgp_nsi);</span><br><span>diff --git a/src/pcu_vty.c b/src/pcu_vty.c</span><br><span>index 6f50bf1..960c90d 100644</span><br><span>--- a/src/pcu_vty.c</span><br><span>+++ b/src/pcu_vty.c</span><br><span>@@ -265,6 +265,11 @@</span><br><span>          }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (bts->gb_dialect_sns)</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, " gb-dialect ip-sns%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+  else</span><br><span style="color: hsl(120, 100%, 40%);">+          vty_out(vty, " gb-dialect classic%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>      return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -1059,6 +1064,23 @@</span><br><span>        return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_pcu_gb_dialect,</span><br><span style="color: hsl(120, 100%, 40%);">+      cfg_pcu_gb_dialect_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "gb-dialect (classic|ip-sns)",</span><br><span style="color: hsl(120, 100%, 40%);">+      "Select which Gb interface dialect to use\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "Classic Gb interface with NS-{RESET,BLOCK,UNBLOCK} and static configuration\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "Modern Gb interface with IP-SNS (Sub Network Service) and dynamic configuration\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts = bts_main_data();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      if (!strcmp(argv[0], "ip-sns"))</span><br><span style="color: hsl(120, 100%, 40%);">+             bts->gb_dialect_sns = true;</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+          bts->gb_dialect_sns = 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(show_tbf,</span><br><span>       show_tbf_cmd,</span><br><span>       "show tbf all",</span><br><span>@@ -1189,6 +1211,7 @@</span><br><span>        install_element(PCU_NODE, &cfg_pcu_gsmtap_categ_cmd);</span><br><span>    install_element(PCU_NODE, &cfg_pcu_no_gsmtap_categ_cmd);</span><br><span>         install_element(PCU_NODE, &cfg_pcu_sock_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+     install_element(PCU_NODE, &cfg_pcu_gb_dialect_cmd);</span><br><span> </span><br><span>  install_element_ve(&show_bts_stats_cmd);</span><br><span>         install_element_ve(&show_tbf_cmd);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13025">change 13025</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/13025"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-pcu </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I256b40ac592d3b6e75dd581bf7b9512f69b11e83 </div>
<div style="display:none"> Gerrit-Change-Number: 13025 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-CC: Pau Espin Pedrol <pespin@sysmocom.de> </div>