<p>pespin <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/14411">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;">bscnat: Refactor BSC_MS side code to allow different actions per test<br><br>Each test can now plug in different actions to be done by the emulated<br>BSC_MS, by passing a function to f_init(). Old hardcoded behaviour (main())<br>is renamed and used in already existing tests.<br><br>Change-Id: Ic82ca333267535c5859e6439deacbf3b1d1fe391<br>---<br>M bsc-nat/BSCNAT_Tests.ttcn<br>M bsc-nat/BSC_MS_ConnectionHandler.ttcn<br>M bsc-nat/BSC_MS_Simulation.ttcn<br>3 files changed, 54 insertions(+), 28 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/bsc-nat/BSCNAT_Tests.ttcn b/bsc-nat/BSCNAT_Tests.ttcn</span><br><span>index 6b0c757..fda065a 100644</span><br><span>--- a/bsc-nat/BSCNAT_Tests.ttcn</span><br><span>+++ b/bsc-nat/BSCNAT_Tests.ttcn</span><br><span>@@ -25,6 +25,7 @@</span><br><span> </span><br><span> import from MSC_Simulation all;</span><br><span> import from BSC_MS_Simulation all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from BSC_MS_ConnectionHandler all;</span><br><span> </span><br><span> import from Osmocom_VTY_Functions all;</span><br><span> import from TELNETasp_PortType all;</span><br><span>@@ -135,7 +136,7 @@</span><br><span>       f_vty_transceive(BSCNATVTY, "enable");</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-function f_init(boolean use_osmux) runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+function f_init(void_fn_bsc_ms fn_bsc_ms, boolean use_osmux) runs on test_CT {</span><br><span>        var integer i;</span><br><span>       var charstring id;</span><br><span> </span><br><span>@@ -156,9 +157,12 @@</span><br><span>                f_init_BscState(bsc[i], mp_bsc_pc +i, mp_msc_pc, mp_bsc_ssn, mp_msc_ssn);</span><br><span>            id := "BSC" & int2str(i);</span><br><span>              bsc[i].BSC := BSC_CT.create(id);</span><br><span style="color: hsl(120, 100%, 40%);">+              var BSC_MS_TestHdlrParams pars;</span><br><span style="color: hsl(120, 100%, 40%);">+               pars.sccp_addr_own := bsc[i].sccp_addr_own;</span><br><span style="color: hsl(120, 100%, 40%);">+           pars.sccp_addr_remote := bsc[i].sccp_addr_peer;</span><br><span style="color: hsl(120, 100%, 40%);">+               pars.use_osmux := use_osmux;</span><br><span>                 bsc[i].BSC.start(BSC_MS_Simulation.main(mp_nat_ip, mp_nat_port, mp_bsc_ip, mp_bsc_port+i,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                       bsc[i].sccp_pars, bsc[i].sccp_addr_own,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                 bsc[i].sccp_addr_peer, use_osmux, id));</span><br><span style="color: hsl(120, 100%, 40%);">+                                                       bsc[i].sccp_pars, pars, fn_bsc_ms, id));</span><br><span>     }</span><br><span> </span><br><span> }</span><br><span>@@ -182,7 +186,7 @@</span><br><span> function f_TC_recv_dump(boolean use_osmux := false) runs on test_CT {</span><br><span>    timer T := 30.0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    f_init(use_osmux);</span><br><span style="color: hsl(120, 100%, 40%);">+    f_init(refers(bsc_ms_establish_fully), use_osmux);</span><br><span> </span><br><span>       f_wait_finish(T);</span><br><span> }</span><br><span>diff --git a/bsc-nat/BSC_MS_ConnectionHandler.ttcn b/bsc-nat/BSC_MS_ConnectionHandler.ttcn</span><br><span>index 7f2ebcd..f7126fd 100644</span><br><span>--- a/bsc-nat/BSC_MS_ConnectionHandler.ttcn</span><br><span>+++ b/bsc-nat/BSC_MS_ConnectionHandler.ttcn</span><br><span>@@ -25,6 +25,8 @@</span><br><span> import from MGCP_Templates all;</span><br><span> import from SDP_Types all;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+type function void_fn_bsc_ms(charstring id) runs on BSC_MS_ConnHdlr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* this component represents a single subscriber connection at the MSC.</span><br><span>  * There is a 1:1 mapping between SCCP connections and RAN_ConnHdlr components.</span><br><span>  * We inherit all component variables, ports, functions, ... from RAN_ConnHdlr */</span><br><span>@@ -34,8 +36,15 @@</span><br><span>     var MgcpConnectionId g_mgcp_conn_id;</span><br><span>         var SDP_Message g_sdp;</span><br><span>       var BSC_State g_state;</span><br><span style="color: hsl(120, 100%, 40%);">+        var BSC_MS_TestHdlrParams g_pars;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+type record BSC_MS_TestHdlrParams {</span><br><span style="color: hsl(120, 100%, 40%);">+       SCCP_PAR_Address sccp_addr_own,</span><br><span style="color: hsl(120, 100%, 40%);">+       SCCP_PAR_Address sccp_addr_remote,</span><br><span style="color: hsl(120, 100%, 40%);">+    boolean use_osmux</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Callback function from general RAN_Emulation whenever a new incoming</span><br><span>  * SCCP connection arrivces. Must create + start a new component */</span><br><span> private function CreateCallback(BSSAP_N_CONNECT_ind conn_ind, charstring id)</span><br><span>@@ -90,7 +99,7 @@</span><br><span> }</span><br><span> </span><br><span> /* main function processing various incoming events */</span><br><span style="color: hsl(0, 100%, 40%);">-function main(SCCP_PAR_Address sccp_addr_own, SCCP_PAR_Address sccp_addr_remote, boolean use_osmux)</span><br><span style="color: hsl(120, 100%, 40%);">+function bsc_ms_establish_fully(charstring id)</span><br><span> runs on BSC_MS_ConnHdlr {</span><br><span>     var PDU_BSSAP bssap;</span><br><span>         var MgcpCommand mgcp_cmd;</span><br><span>@@ -104,8 +113,8 @@</span><br><span>      /* generate and send the Complete Layer3 Info */</span><br><span>     bssap := f_gen_cl3('901770123456789'H);</span><br><span>      var BSSAP_Conn_Req creq := {</span><br><span style="color: hsl(0, 100%, 40%);">-            addr_peer := sccp_addr_remote,</span><br><span style="color: hsl(0, 100%, 40%);">-          addr_own := sccp_addr_own,</span><br><span style="color: hsl(120, 100%, 40%);">+            addr_peer := g_pars.sccp_addr_remote,</span><br><span style="color: hsl(120, 100%, 40%);">+         addr_own := g_pars.sccp_addr_own,</span><br><span>            bssap := bssap</span><br><span>       }</span><br><span>    g_state := BSC_STATE_WAIT_ASS_REQ;</span><br><span>@@ -130,12 +139,12 @@</span><br><span>                   /* respond with CRCX_ACK */</span><br><span>                  g_state := BSC_STATE_WAIT_MDCX;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                     if (use_osmux != f_MgcpCmd_contains_par(mgcp_cmd, "X-OSMUX")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                               setverdict(fail, log2str("Received Osmux CID presence doesn't match presence expectancy (", use_osmux, ")"));</span><br><span style="color: hsl(120, 100%, 40%);">+                 if (g_pars.use_osmux != f_MgcpCmd_contains_par(mgcp_cmd, "X-OSMUX")) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              setverdict(fail, log2str("Received Osmux CID presence doesn't match presence expectancy (", g_pars.use_osmux, ")"));</span><br><span>                                 self.stop;</span><br><span>                   }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                   if (use_osmux) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (g_pars.use_osmux) {</span><br><span>                              osmux_cid := f_MgcpCmd_extract_osmux_cid(mgcp_cmd);</span><br><span>                          mgcp_resp := ts_CRCX_ACK_osmux(mgcp_cmd.line.trans_id, g_mgcp_conn_id, osmux_cid, g_sdp);</span><br><span>                    } else {</span><br><span>diff --git a/bsc-nat/BSC_MS_Simulation.ttcn b/bsc-nat/BSC_MS_Simulation.ttcn</span><br><span>index d4e37a4..5feaf0e 100644</span><br><span>--- a/bsc-nat/BSC_MS_Simulation.ttcn</span><br><span>+++ b/bsc-nat/BSC_MS_Simulation.ttcn</span><br><span>@@ -31,9 +31,7 @@</span><br><span>    /* test port to SCCP emulation */</span><br><span>    port SCCPasp_PT SCCP;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       var SCCP_PAR_Address g_sccp_addr_own;</span><br><span style="color: hsl(0, 100%, 40%);">-   var SCCP_PAR_Address g_sccp_addr_remote;</span><br><span style="color: hsl(0, 100%, 40%);">-        var boolean g_use_osmux;</span><br><span style="color: hsl(120, 100%, 40%);">+      var BSC_MS_TestHdlrParams g_pars;</span><br><span> </span><br><span>        var charstring g_bsc_num_str;</span><br><span> }</span><br><span>@@ -42,21 +40,41 @@</span><br><span>     integer mp_num_iterations := 10;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* helper function to create and connect a BSC_MS_ConnHdlr component */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_connect_handler(inout BSC_MS_ConnHdlr vc_conn) runs on BSC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        /* connect client BSSAP port to BSSAP dispatcher */</span><br><span style="color: hsl(120, 100%, 40%);">+   connect(vc_conn:BSSAP, vc_BSSMAP:CLIENT);</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%);">+private function f_start_handler(void_fn_bsc_ms fn, charstring id, template (omit) BSC_MS_TestHdlrParams pars := omit)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on BSC_CT return BSC_MS_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+       var BSC_MS_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+  vc_conn := BSC_MS_ConnHdlr.create(id);</span><br><span style="color: hsl(120, 100%, 40%);">+        f_connect_handler(vc_conn);</span><br><span style="color: hsl(120, 100%, 40%);">+   vc_conn.start(f_handler_init(fn, id, pars));</span><br><span style="color: hsl(120, 100%, 40%);">+  return vc_conn;</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%);">+/* first function inside ConnHdlr component; sets g_pars + starts function */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_handler_init(void_fn_bsc_ms fn, charstring id, template (omit) BSC_MS_TestHdlrParams pars := omit)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on BSC_MS_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (isvalue(pars)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          g_pars := valueof(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     fn.apply(id);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> function main(charstring remote_ip, PortNumber remote_port,</span><br><span>            charstring local_ip, PortNumber local_port,</span><br><span>          MSC_SCCP_MTP3_parameters sccp_pars,</span><br><span style="color: hsl(0, 100%, 40%);">-             SCCP_PAR_Address sccp_addr_own,</span><br><span style="color: hsl(0, 100%, 40%);">-         SCCP_PAR_Address sccp_addr_remote,</span><br><span style="color: hsl(0, 100%, 40%);">-              boolean use_osmux, charstring id) runs on BSC_CT</span><br><span style="color: hsl(120, 100%, 40%);">+              BSC_MS_TestHdlrParams pars,</span><br><span style="color: hsl(120, 100%, 40%);">+           void_fn_bsc_ms fn, charstring id) runs on BSC_CT</span><br><span> {</span><br><span>        var integer i := 0;</span><br><span>  timer T := 1.0;</span><br><span>      var IPA_CCM_Parameters ccm_pars := IPA_Emulation.c_IPA_default_ccm_pars;</span><br><span>     ccm_pars.name := id;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    g_sccp_addr_own := sccp_addr_own;</span><br><span style="color: hsl(0, 100%, 40%);">-       g_sccp_addr_remote := sccp_addr_remote;</span><br><span style="color: hsl(0, 100%, 40%);">- g_use_osmux := use_osmux;</span><br><span style="color: hsl(120, 100%, 40%);">+     g_pars := pars;</span><br><span> </span><br><span>  /* create components for IPA/SCCP/BSS[M]AP stack */</span><br><span>  vc_IPA := IPA_Emulation_CT.create(id & "-IPA");</span><br><span>@@ -84,7 +102,7 @@</span><br><span>   T.timeout;</span><br><span> </span><br><span>       for (i := 0; i < mp_num_iterations; i := i+1) {</span><br><span style="color: hsl(0, 100%, 40%);">-              f_start_BSC_MS(id & "-MS-" & int2str(i));</span><br><span style="color: hsl(120, 100%, 40%);">+           f_start_BSC_MS(fn, id & "-MS-" & int2str(i));</span><br><span>      }</span><br><span> </span><br><span>        /* explicitly stop all components that we started above */</span><br><span>@@ -93,15 +111,10 @@</span><br><span>    vc_SCCP.stop;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-function f_start_BSC_MS(charstring id) runs on BSC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+function f_start_BSC_MS(void_fn_bsc_ms fn, charstring id) runs on BSC_CT {</span><br><span>    var BSC_MS_ConnHdlr vc_conn;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /* start new component */</span><br><span style="color: hsl(0, 100%, 40%);">-       vc_conn := BSC_MS_ConnHdlr.create(id);</span><br><span style="color: hsl(0, 100%, 40%);">-  /* connect client BSSAP port to BSSAP dispatcher */</span><br><span style="color: hsl(0, 100%, 40%);">-     connect(vc_conn:BSSAP, vc_BSSMAP:CLIENT);</span><br><span>    /* start component */</span><br><span style="color: hsl(0, 100%, 40%);">-   vc_conn.start(BSC_MS_ConnectionHandler.main(g_sccp_addr_own, g_sccp_addr_remote, g_use_osmux));</span><br><span style="color: hsl(120, 100%, 40%);">+       vc_conn := f_start_handler(fn, id, g_pars);</span><br><span>  /* blocking wait until component terminates.  If you want to start MSs in parallel,</span><br><span>   * you have to remove this statement here */</span><br><span>         vc_conn.done;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/14411">change 14411</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/+/14411"/><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: Ic82ca333267535c5859e6439deacbf3b1d1fe391 </div>
<div style="display:none"> Gerrit-Change-Number: 14411 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>