<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/21698">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;">gbproxy: Configure a Second SGSN<br><br>This adds the required code changes and minimal configuration to both<br>osmo-gbproxy.cfg and GBProxy_Tests to have osmo-gbproxy connect to two<br>SGSNs.<br><br>No NRI mappings are configured and hence the second SGSN isn't really<br>used for anything except for bringing the NS-VCs and BVCs up.<br><br>Related: OS#4472, SYS#5002<br>Change-Id: Ib70f7c1a29f089957f882df0e9b05ee526224611<br>---<br>M gbproxy/GBProxy_Tests.cfg<br>M gbproxy/GBProxy_Tests.ttcn<br>M gbproxy/osmo-gbproxy.cfg<br>M gbproxy/osmo-gbproxy.fr.cfg<br>4 files changed, 83 insertions(+), 21 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/gbproxy/GBProxy_Tests.cfg b/gbproxy/GBProxy_Tests.cfg</span><br><span>index 0e442d1..e1e1eff 100644</span><br><span>--- a/gbproxy/GBProxy_Tests.cfg</span><br><span>+++ b/gbproxy/GBProxy_Tests.cfg</span><br><span>@@ -15,7 +15,10 @@</span><br><span> GBProxy_Tests.mp_nsconfig_sgsn := {</span><br><span>       {</span><br><span>            handle_sns := true</span><br><span style="color: hsl(120, 100%, 40%);">+    }, {</span><br><span style="color: hsl(120, 100%, 40%);">+          handle_sns := true</span><br><span>   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> }</span><br><span> </span><br><span> GBProxy_Tests.mp_nsconfig_pcu := {</span><br><span>diff --git a/gbproxy/GBProxy_Tests.ttcn b/gbproxy/GBProxy_Tests.ttcn</span><br><span>index 62daaf4..44b2ac9 100644</span><br><span>--- a/gbproxy/GBProxy_Tests.ttcn</span><br><span>+++ b/gbproxy/GBProxy_Tests.ttcn</span><br><span>@@ -66,6 +66,24 @@</span><br><span>                                         nsvci := 101</span><br><span>                                 }</span><br><span>                    }</span><br><span style="color: hsl(120, 100%, 40%);">+             }, {</span><br><span style="color: hsl(120, 100%, 40%);">+                  nsei := 102,</span><br><span style="color: hsl(120, 100%, 40%);">+                  role_sgsn := true,</span><br><span style="color: hsl(120, 100%, 40%);">+                    handle_sns := false,</span><br><span style="color: hsl(120, 100%, 40%);">+                  nsvc := {</span><br><span style="color: hsl(120, 100%, 40%);">+                             {</span><br><span style="color: hsl(120, 100%, 40%);">+                                     provider := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                         ip := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                       address_family := AF_INET,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    local_udp_port := 8888,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                       local_ip := "127.0.0.1",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    remote_udp_port := 23000,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     remote_ip := "127.0.0.1"</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%);">+                                    nsvci := 102</span><br><span style="color: hsl(120, 100%, 40%);">+                          }</span><br><span style="color: hsl(120, 100%, 40%);">+                     }</span><br><span>            }</span><br><span>    };</span><br><span>   /* BSS NSEI start at 2000 + x</span><br><span>@@ -263,7 +281,7 @@</span><br><span> type record of NSConfiguration NSConfigurations;</span><br><span> type record of BssgpCellId BssgpCellIds;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-const integer NUM_SGSN := 1;</span><br><span style="color: hsl(120, 100%, 40%);">+const integer NUM_SGSN := 2;</span><br><span> </span><br><span> type component test_CT {</span><br><span>    var GbInstances g_pcu;</span><br><span>@@ -370,11 +388,14 @@</span><br><span>       gb.vc_BSSGP.start(BssgpStart(gb.cfg, bssgp_id));</span><br><span> </span><br><span>         for (var integer i := 0; i < lengthof(gb.cfg.bvc); i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           /* obtain the component reference of the BSSGP_BVC_CT for each PTP BVC */</span><br><span>            connect(self:PROC, gb.vc_BSSGP:PROC);</span><br><span>                gb.vc_BSSGP_BVC[i] := f_bssgp_get_bvci_ct(gb.cfg.bvc[i].bvci, PROC);</span><br><span>                 disconnect(self:PROC, gb.vc_BSSGP:PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+              /* connect all of the per-BVC MGMT ports to our PCU_MGMT port (1:N) */</span><br><span>               connect(self:PCU_MGMT, gb.vc_BSSGP_BVC[i]:MGMT);</span><br><span>     }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* connect all of the BSSGP/NSE global MGMT port to our PCU_MGMT port (1:N) */</span><br><span>       connect(self:PCU_MGMT, gb.vc_BSSGP:MGMT);</span><br><span> }</span><br><span> </span><br><span>@@ -390,11 +411,14 @@</span><br><span>   gb.vc_BSSGP.start(BssgpStart(gb.cfg, bssgp_id));</span><br><span> </span><br><span>         for (var integer i := 0; i < lengthof(gb.cfg.bvc); i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           /* obtain the component reference of the BSSGP_BVC_CT for each PTP BVC */</span><br><span>            connect(self:PROC, gb.vc_BSSGP:PROC);</span><br><span>                gb.vc_BSSGP_BVC[i] := f_bssgp_get_bvci_ct(gb.cfg.bvc[i].bvci, PROC);</span><br><span>                 disconnect(self:PROC, gb.vc_BSSGP:PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+              /* connect all of the per-BVC MGMT ports to our SGSN_MGMT port (1:N) */</span><br><span>              connect(self:SGSN_MGMT, gb.vc_BSSGP_BVC[i]:MGMT);</span><br><span>    }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* connect all of the BSSGP/NSE global MGMT port to our SGSN_MGMT port (1:N) */</span><br><span>      connect(self:SGSN_MGMT, gb.vc_BSSGP:MGMT);</span><br><span> }</span><br><span> </span><br><span>@@ -425,8 +449,25 @@</span><br><span>   return false;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+private type record of ro_integer roro_integer;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* count the number of unblocked BVCI for each SGSN NSE */</span><br><span style="color: hsl(120, 100%, 40%);">+private altstep as_count_unblocked4nse(integer sgsn_idx, inout roro_integer bvci_unblocked)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var BssgpStatusIndication bsi;</span><br><span style="color: hsl(120, 100%, 40%);">+        [] SGSN_MGMT.receive(BssgpStatusIndication:{g_sgsn[sgsn_idx].cfg.nsei, ?, BVC_S_UNBLOCKED}) -> value bsi {</span><br><span style="color: hsl(120, 100%, 40%);">+         bvci_unblocked[sgsn_idx] := bvci_unblocked[sgsn_idx] & { bsi.bvci };</span><br><span style="color: hsl(120, 100%, 40%);">+              /* 'repeat' until sufficient number of BVC-rest has been received on all SGSNs */</span><br><span style="color: hsl(120, 100%, 40%);">+             for (var integer i := 0; i < lengthof(bvci_unblocked); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 if (lengthof(bvci_unblocked[i]) < lengthof(g_sgsn[i].cfg.bvc)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                           repeat;</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%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> function f_init(float t_guard := 30.0) runs on test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-      var ro_integer bvci_unblocked := {};</span><br><span style="color: hsl(120, 100%, 40%);">+  var roro_integer bvci_unblocked;</span><br><span>     var BssgpStatusIndication bsi;</span><br><span>       var integer i;</span><br><span> </span><br><span>@@ -438,17 +479,21 @@</span><br><span>   g_Tguard.start(t_guard);</span><br><span>     activate(as_gTguard(g_Tguard));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     g_sgsn[0].cfg := {</span><br><span style="color: hsl(0, 100%, 40%);">-              nsei := mp_nsconfig_sgsn[0].nsei,</span><br><span style="color: hsl(0, 100%, 40%);">-               sgsn_role := true,</span><br><span style="color: hsl(0, 100%, 40%);">-              bvc := { }</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(120, 100%, 40%);">+     var BssgpBvcConfigs bvcs := { };</span><br><span>     for (i := 0; i < lengthof(mp_gbconfigs); i := i+1) {</span><br><span>              g_pcu[i].cfg := mp_gbconfigs[i];</span><br><span>             /* make sure all have a proper crate_cb, which cannot be specified in config file */</span><br><span>                 f_fix_create_cb(g_pcu[i].cfg);</span><br><span>               /* concatenate all the PCU-side BVCs for the SGSN side */</span><br><span style="color: hsl(0, 100%, 40%);">-               g_sgsn[0].cfg.bvc := g_sgsn[0].cfg.bvc & g_pcu[i].cfg.bvc;</span><br><span style="color: hsl(120, 100%, 40%);">+                bvcs := bvcs & g_pcu[i].cfg.bvc;</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%);">+   for (i := 0; i < lengthof(mp_nsconfig_sgsn); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           g_sgsn[i].cfg := {</span><br><span style="color: hsl(120, 100%, 40%);">+                    nsei := mp_nsconfig_sgsn[i].nsei,</span><br><span style="color: hsl(120, 100%, 40%);">+                     sgsn_role := true,</span><br><span style="color: hsl(120, 100%, 40%);">+                    bvc := bvcs</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span>    }</span><br><span> </span><br><span>        f_init_vty();</span><br><span>@@ -468,16 +513,18 @@</span><br><span>                f_init_gb_pcu(g_pcu[i], "GbProxy_Test", i);</span><br><span>        }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ for (i := 0; i < lengthof(mp_nsconfig_sgsn); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           bvci_unblocked[i] := {};</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* wait until all BVC are unblocked on both sides */</span><br><span>         timer T := 15.0;</span><br><span>     T.start;</span><br><span>     alt {</span><br><span style="color: hsl(0, 100%, 40%);">-   [] SGSN_MGMT.receive(BssgpStatusIndication:{*, ?, BVC_S_UNBLOCKED}) -> value bsi {</span><br><span style="color: hsl(0, 100%, 40%);">-           bvci_unblocked := bvci_unblocked & { bsi.bvci };</span><br><span style="color: hsl(0, 100%, 40%);">-            if (lengthof(bvci_unblocked) != lengthof(g_sgsn[0].cfg.bvc)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  repeat;</span><br><span style="color: hsl(0, 100%, 40%);">-                 }</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* TODO: We need to add more lines if NUM_SGSN increases.  Activating default altsteps</span><br><span style="color: hsl(120, 100%, 40%);">+         * unfortunately doesn't work as we want to access the local variable bvci_unblocked.  */</span><br><span style="color: hsl(120, 100%, 40%);">+ [] as_count_unblocked4nse(0, bvci_unblocked);</span><br><span style="color: hsl(120, 100%, 40%);">+ [lengthof(g_sgsn) > 1] as_count_unblocked4nse(1, bvci_unblocked);</span><br><span>         [] SGSN_MGMT.receive(BssgpStatusIndication:{*, ?, ?}) {</span><br><span>              repeat;</span><br><span>              }</span><br><span>@@ -505,17 +552,19 @@</span><br><span> </span><br><span>        [] T.timeout {</span><br><span>               setverdict(fail, "Timeout waiting for unblock of all BVCs on SGSN side; ",</span><br><span style="color: hsl(0, 100%, 40%);">-                       "unblocked so far: ", bvci_unblocked, "expected: ", g_sgsn[0].cfg.bvc);</span><br><span style="color: hsl(120, 100%, 40%);">+                           "unblocked so far: ", bvci_unblocked);</span><br><span>          /* don't stop here but print below analysis */</span><br><span>           }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* iterate over list and check all BVCI */</span><br><span style="color: hsl(0, 100%, 40%);">-      for (i := 0; i < lengthof(g_sgsn[0].cfg.bvc); i := i+1) {</span><br><span style="color: hsl(0, 100%, 40%);">-            var BssgpBvci bvci := g_sgsn[0].cfg.bvc[i].bvci;</span><br><span style="color: hsl(0, 100%, 40%);">-                if (not ro_integer_contains(bvci_unblocked, bvci)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    setverdict(fail, "BVCI=", bvci, " was not unblocked during start-up");</span><br><span style="color: hsl(0, 100%, 40%);">-                      mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+     for (i := 0; i < lengthof(mp_nsconfig_sgsn); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           /* iterate over list and check all BVCI */</span><br><span style="color: hsl(120, 100%, 40%);">+            for (var integer j := 0; j < lengthof(g_sgsn[i].cfg.bvc); j := j+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      var BssgpBvci bvci := g_sgsn[i].cfg.bvc[j].bvci;</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (not ro_integer_contains(bvci_unblocked[i], bvci)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                               setverdict(fail, "SGSN ", i, " BVCI=", bvci, " was not unblocked during start-up");</span><br><span style="color: hsl(120, 100%, 40%);">+                             mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+                     }</span><br><span>            }</span><br><span>    }</span><br><span> </span><br><span>diff --git a/gbproxy/osmo-gbproxy.cfg b/gbproxy/osmo-gbproxy.cfg</span><br><span>index 5ce0dfc..1c6caa9 100644</span><br><span>--- a/gbproxy/osmo-gbproxy.cfg</span><br><span>+++ b/gbproxy/osmo-gbproxy.cfg</span><br><span>@@ -7,12 +7,17 @@</span><br><span> !</span><br><span> gbproxy</span><br><span> sgsn nsei 101</span><br><span style="color: hsl(120, 100%, 40%);">+ name first</span><br><span style="color: hsl(120, 100%, 40%);">+sgsn nsei 102</span><br><span style="color: hsl(120, 100%, 40%);">+ name second</span><br><span> ns</span><br><span>  bind udp local</span><br><span>   listen 127.0.0.1 23000</span><br><span>   accept-ipaccess</span><br><span>  nse 101</span><br><span>   ip-sns 127.0.0.1 7777</span><br><span style="color: hsl(120, 100%, 40%);">+ nse 102</span><br><span style="color: hsl(120, 100%, 40%);">+  ip-sns 127.0.0.1 8888</span><br><span>  timer tns-block 3</span><br><span>  timer tns-block-retries 3</span><br><span>  timer tns-reset 3</span><br><span>diff --git a/gbproxy/osmo-gbproxy.fr.cfg b/gbproxy/osmo-gbproxy.fr.cfg</span><br><span>index 0898acc..e350526 100644</span><br><span>--- a/gbproxy/osmo-gbproxy.fr.cfg</span><br><span>+++ b/gbproxy/osmo-gbproxy.fr.cfg</span><br><span>@@ -35,6 +35,8 @@</span><br><span>  timer tns-alive-retries 10</span><br><span>  nse 101</span><br><span>   ip-sns 127.0.0.1 7777</span><br><span style="color: hsl(120, 100%, 40%);">+ nse 102</span><br><span style="color: hsl(120, 100%, 40%);">+  ip-sns 127.0.0.1 8888</span><br><span>  nse 2001</span><br><span>   nsvc fr hdlcnet1 dlci 16 nsvci 1</span><br><span>   nsvc fr hdlcnet2 dlci 17 nsvci 2</span><br><span>@@ -48,3 +50,6 @@</span><br><span>   nsvc fr hdlcnet8 dlci 23 nsvci 8</span><br><span> gbproxy</span><br><span> sgsn nsei 101</span><br><span style="color: hsl(120, 100%, 40%);">+ name first</span><br><span style="color: hsl(120, 100%, 40%);">+sgsn nsei 102</span><br><span style="color: hsl(120, 100%, 40%);">+ name second</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/21698">change 21698</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/osmo-ttcn3-hacks/+/21698"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-ttcn3-hacks </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ib70f7c1a29f089957f882df0e9b05ee526224611 </div>
<div style="display:none"> Gerrit-Change-Number: 21698 </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>