<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/21222">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: Allow dynamic connect/disconnect of ConnHdlr at runtime<br><br>We want to move a virtual subscriber between BVC with one NSE,<br>but also to other NSE/PCU at runtime.  The number of BVC and NSE<br>may be large in a given test config, and we really don't need<br>hundreds of test ports per component;  Instead, reconnect the<br>test ports to whichever BVC we want at runtime.<br><br>Change-Id: I56b088b582f2d070547ee24f2d7a175d84fb5861<br>---<br>M gbproxy/GBProxy_Tests.ttcn<br>1 file changed, 50 insertions(+), 23 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/gbproxy/GBProxy_Tests.ttcn b/gbproxy/GBProxy_Tests.ttcn</span><br><span>index 7dd2c17..242b7e9 100644</span><br><span>--- a/gbproxy/GBProxy_Tests.ttcn</span><br><span>+++ b/gbproxy/GBProxy_Tests.ttcn</span><br><span>@@ -219,12 +219,19 @@</span><br><span> };</span><br><span> </span><br><span> type component BSSGP_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+      /* array of per-BVC ports on the PCU side */</span><br><span>         port BSSGP_PT PCU[NUM_PCU];</span><br><span>  port BSSGP_PT PCU_SIG[NUM_PCU];</span><br><span>      port BSSGP_PROC_PT PCU_PROC[NUM_PCU];</span><br><span style="color: hsl(120, 100%, 40%);">+ /* component reference to the component to which we're currently connected */</span><br><span style="color: hsl(120, 100%, 40%);">+     var BSSGP_BVC_CT pcu_ct[NUM_PCU];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* array of per-BVC ports on the SGSN side */</span><br><span>        port BSSGP_PT SGSN[NUM_SGSN];</span><br><span>        port BSSGP_PT SGSN_SIG[NUM_SGSN];</span><br><span>    port BSSGP_PROC_PT SGSN_PROC[NUM_SGSN];</span><br><span style="color: hsl(120, 100%, 40%);">+       /* component reference to the component to which we're currently connected */</span><br><span style="color: hsl(120, 100%, 40%);">+     var BSSGP_BVC_CT sgsn_ct[NUM_PCU];</span><br><span> </span><br><span>       var BSSGP_ConnHdlrPars g_pars;</span><br><span>       timer g_Tguard;</span><br><span>@@ -252,6 +259,7 @@</span><br><span>        OCT4 tlli_old optional,</span><br><span>      RoutingAreaIdentificationV ra optional,</span><br><span>      GbInstances pcu,</span><br><span style="color: hsl(120, 100%, 40%);">+      GbInstances sgsn,</span><br><span>    float t_guard</span><br><span> };</span><br><span> </span><br><span>@@ -428,29 +436,50 @@</span><br><span>              tlli_old := omit,</span><br><span>            ra := omit,</span><br><span>          pcu := g_pcu,</span><br><span style="color: hsl(120, 100%, 40%);">+         sgsn := g_sgsn,</span><br><span>              t_guard := t_guard</span><br><span>   };</span><br><span> </span><br><span>       vc_conn := BSSGP_ConnHdlr.create(id);</span><br><span style="color: hsl(0, 100%, 40%);">-   // PDU side</span><br><span style="color: hsl(0, 100%, 40%);">-     connect(vc_conn:PCU[0], pcu[0].vc_BSSGP_BVC[0]:BSSGP_SP);</span><br><span style="color: hsl(0, 100%, 40%);">-       connect(vc_conn:PCU_SIG[0], pcu[0].vc_BSSGP_BVC[0]:BSSGP_SP_SIG);</span><br><span style="color: hsl(0, 100%, 40%);">-       connect(vc_conn:PCU_PROC[0], pcu[0].vc_BSSGP_BVC[0]:BSSGP_PROC);</span><br><span style="color: hsl(0, 100%, 40%);">-        connect(vc_conn:PCU[1], pcu[1].vc_BSSGP_BVC[0]:BSSGP_SP);</span><br><span style="color: hsl(0, 100%, 40%);">-       connect(vc_conn:PCU_SIG[1], pcu[1].vc_BSSGP_BVC[0]:BSSGP_SP_SIG);</span><br><span style="color: hsl(0, 100%, 40%);">-       connect(vc_conn:PCU_PROC[1], pcu[1].vc_BSSGP_BVC[0]:BSSGP_PROC);</span><br><span style="color: hsl(0, 100%, 40%);">-        connect(vc_conn:PCU[2], pcu[2].vc_BSSGP_BVC[0]:BSSGP_SP);</span><br><span style="color: hsl(0, 100%, 40%);">-       connect(vc_conn:PCU_SIG[2], pcu[2].vc_BSSGP_BVC[0]:BSSGP_SP_SIG);</span><br><span style="color: hsl(0, 100%, 40%);">-       connect(vc_conn:PCU_PROC[2], pcu[2].vc_BSSGP_BVC[0]:BSSGP_PROC);</span><br><span style="color: hsl(0, 100%, 40%);">-        // SGSN side</span><br><span style="color: hsl(0, 100%, 40%);">-    connect(vc_conn:SGSN[0], sgsn[0].vc_BSSGP_BVC[0]:BSSGP_SP);</span><br><span style="color: hsl(0, 100%, 40%);">-     connect(vc_conn:SGSN_SIG[0], sgsn[0].vc_BSSGP_BVC[0]:BSSGP_SP_SIG);</span><br><span style="color: hsl(0, 100%, 40%);">-     connect(vc_conn:SGSN_PROC[0], sgsn[0].vc_BSSGP_BVC[0]:BSSGP_PROC);</span><br><span> </span><br><span>       vc_conn.start(f_handler_init(fn, id, pars));</span><br><span>         return vc_conn;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Connect the PCU-side per-BVC ports (PCU/PCU_SIG/PCU_PROC) array slot 'port_idx' to specified per-BVC component */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_connect_to_pcu_bvc(integer port_idx, BSSGP_BVC_CT bvc_ct) runs on BSSGP_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (PCU[port_idx].checkstate("Connected")) {</span><br><span style="color: hsl(120, 100%, 40%);">+                /* unregister + disconnect from old BVC */</span><br><span style="color: hsl(120, 100%, 40%);">+            f_client_unregister(g_pars.imsi, PCU_PROC[port_idx]);</span><br><span style="color: hsl(120, 100%, 40%);">+         disconnect(self:PCU[port_idx], pcu_ct[port_idx]:BSSGP_SP);</span><br><span style="color: hsl(120, 100%, 40%);">+            disconnect(self:PCU_SIG[port_idx], pcu_ct[port_idx]:BSSGP_SP_SIG);</span><br><span style="color: hsl(120, 100%, 40%);">+            disconnect(self:PCU_PROC[port_idx], pcu_ct[port_idx]:BSSGP_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* connect to new BVC and register us */</span><br><span style="color: hsl(120, 100%, 40%);">+      connect(self:PCU[port_idx], bvc_ct:BSSGP_SP);</span><br><span style="color: hsl(120, 100%, 40%);">+ connect(self:PCU_SIG[port_idx], bvc_ct:BSSGP_SP_SIG);</span><br><span style="color: hsl(120, 100%, 40%);">+ connect(self:PCU_PROC[port_idx], bvc_ct:BSSGP_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+  f_client_register(g_pars.imsi, g_pars.tlli, PCU_PROC[port_idx]);</span><br><span style="color: hsl(120, 100%, 40%);">+      pcu_ct[port_idx] := bvc_ct;</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%);">+/* Connect the SGSN-side per-BVC ports (SGSN/SGSN_SIG/SGSN_PROC) array slot 'port_idx' to specified per-BVC component */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_connect_to_sgsn_bvc(integer port_idx, BSSGP_BVC_CT bvc_ct) runs on BSSGP_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+    if (SGSN[port_idx].checkstate("Connected")) {</span><br><span style="color: hsl(120, 100%, 40%);">+               /* unregister + disconnect from old BVC */</span><br><span style="color: hsl(120, 100%, 40%);">+            f_client_unregister(g_pars.imsi, SGSN_PROC[port_idx]);</span><br><span style="color: hsl(120, 100%, 40%);">+                disconnect(self:SGSN[port_idx], sgsn_ct[port_idx]:BSSGP_SP);</span><br><span style="color: hsl(120, 100%, 40%);">+          disconnect(self:SGSN_SIG[port_idx], sgsn_ct[port_idx]:BSSGP_SP_SIG);</span><br><span style="color: hsl(120, 100%, 40%);">+          disconnect(self:SGSN_PROC[port_idx], sgsn_ct[port_idx]:BSSGP_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* connect to new BVC and register us */</span><br><span style="color: hsl(120, 100%, 40%);">+      connect(self:SGSN[port_idx], bvc_ct:BSSGP_SP);</span><br><span style="color: hsl(120, 100%, 40%);">+        connect(self:SGSN_SIG[port_idx], bvc_ct:BSSGP_SP_SIG);</span><br><span style="color: hsl(120, 100%, 40%);">+        connect(self:SGSN_PROC[port_idx], bvc_ct:BSSGP_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_client_register(g_pars.imsi, g_pars.tlli, SGSN_PROC[port_idx]);</span><br><span style="color: hsl(120, 100%, 40%);">+     sgsn_ct[port_idx] := bvc_ct;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> private altstep as_Tguard() runs on BSSGP_ConnHdlr {</span><br><span>    [] g_Tguard.timeout {</span><br><span>                setverdict(fail, "Tguard timeout");</span><br><span>@@ -467,16 +496,14 @@</span><br><span> </span><br><span>    llc := f_llc_create(false);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* register for our IMSI + TLLI */</span><br><span style="color: hsl(0, 100%, 40%);">-      for (i := 0; i < sizeof(SGSN_PROC); i := i+1) {</span><br><span style="color: hsl(0, 100%, 40%);">-              if (SGSN_PROC[i].checkstate("Connected")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   f_client_register(g_pars.imsi, g_pars.tlli, SGSN_PROC[i]);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* default connections on PCU side: First BVC of each NSE/PCU */</span><br><span style="color: hsl(120, 100%, 40%);">+      for (i := 0; i < lengthof(g_pars.pcu); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+         f_connect_to_pcu_bvc(i, g_pars.pcu[i].vc_BSSGP_BVC[0]);</span><br><span>      }</span><br><span style="color: hsl(0, 100%, 40%);">-       for (i := 0; i < sizeof(PCU_PROC); i := i+1) {</span><br><span style="color: hsl(0, 100%, 40%);">-               if (PCU_PROC[i].checkstate("Connected")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    f_client_register(g_pars.imsi, g_pars.tlli, PCU_PROC[i]);</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* default connections on SGSN side: First BVC of each NSE/SGSN */</span><br><span style="color: hsl(120, 100%, 40%);">+    for (i := 0; i < lengthof(g_pars.sgsn); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                f_connect_to_sgsn_bvc(i, g_pars.sgsn[i].vc_BSSGP_BVC[0]);</span><br><span>    }</span><br><span> </span><br><span>        g_Tguard.start(pars.t_guard);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/21222">change 21222</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/+/21222"/><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: I56b088b582f2d070547ee24f2d7a175d84fb5861 </div>
<div style="display:none"> Gerrit-Change-Number: 21222 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </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-CC: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>