<p>pespin <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/14412">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, approved
  osmith: Looks good to me, but someone else must approve
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">bscnat: Refactor MSC side code to allow different actions per test<br><br>Each test can now plug in different acctions to be done by the emulated<br>MSC, by passing a BssmapCreateCallback RAN_Emaulation callback to<br>f_init(). Old hardcoded behaviour (main()) is renamed and used in<br>laready existing tests.<br><br>New infrastructure provides a generic BssmapCreateCallback taking care<br>of required boilerplate, so new tests/users only need to define a new<br>callback calling that generic one with a function pointer where all test<br>logic is implemented.<br><br>Change-Id: Ic429420d0d95b6aacb6e5c44031b49c942ed544d<br>---<br>M bsc-nat/BSCNAT_Tests.ttcn<br>M bsc-nat/MSC_ConnectionHandler.ttcn<br>M bsc-nat/MSC_Simulation.ttcn<br>3 files changed, 71 insertions(+), 22 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 fda065a..47d894b 100644</span><br><span>--- a/bsc-nat/BSCNAT_Tests.ttcn</span><br><span>+++ b/bsc-nat/BSCNAT_Tests.ttcn</span><br><span>@@ -16,6 +16,7 @@</span><br><span> import from IPL4asp_Types all;</span><br><span> </span><br><span> import from IPA_Emulation all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RAN_Emulation all;</span><br><span> </span><br><span> import from MTP3asp_Types all;</span><br><span> </span><br><span>@@ -24,6 +25,7 @@</span><br><span> import from SCCP_Emulation all;</span><br><span> </span><br><span> import from MSC_Simulation all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from MSC_ConnectionHandler all;</span><br><span> import from BSC_MS_Simulation all;</span><br><span> import from BSC_MS_ConnectionHandler all;</span><br><span> </span><br><span>@@ -136,7 +138,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(void_fn_bsc_ms fn_bsc_ms, 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, BssmapCreateCallback cb_msc, 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>@@ -147,7 +149,9 @@</span><br><span>                 f_init_MscState(msc[i], mp_msc_pc +i, mp_bsc_pc, mp_msc_ssn, mp_bsc_ssn);</span><br><span>            id := "MSC" & int2str(i);</span><br><span>              msc[i].MSC := MSC_CT.create(id);</span><br><span style="color: hsl(0, 100%, 40%);">-                msc[i].MSC.start(MSC_Simulation.main(mp_msc_ip, mp_msc_port + i, msc[i].sccp_pars, msc[i].sccp_addr_own, id));</span><br><span style="color: hsl(120, 100%, 40%);">+                msc[i].MSC.start(MSC_Simulation.main(mp_msc_ip, mp_msc_port + i,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   msc[i].sccp_pars, msc[i].sccp_addr_own,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               cb_msc, id));</span><br><span>   }</span><br><span> </span><br><span>        /* Wait for bsc_nat to attach to MSC. Before that all BSC connections will be dropped */</span><br><span>@@ -186,7 +190,9 @@</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(refers(bsc_ms_establish_fully), use_osmux);</span><br><span style="color: hsl(120, 100%, 40%);">+    f_init(refers(bsc_ms_establish_fully),</span><br><span style="color: hsl(120, 100%, 40%);">+               refers(CreateCallback_establish_fully),</span><br><span style="color: hsl(120, 100%, 40%);">+               use_osmux);</span><br><span> </span><br><span>       f_wait_finish(T);</span><br><span> }</span><br><span>diff --git a/bsc-nat/MSC_ConnectionHandler.ttcn b/bsc-nat/MSC_ConnectionHandler.ttcn</span><br><span>index c8cb005..e4d3816 100644</span><br><span>--- a/bsc-nat/MSC_ConnectionHandler.ttcn</span><br><span>+++ b/bsc-nat/MSC_ConnectionHandler.ttcn</span><br><span>@@ -21,6 +21,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_msc(charstring id) runs on MSC_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>@@ -32,24 +34,38 @@</span><br><span>      var MgcpEndpoint g_ep_name;</span><br><span>  var MgcpCallId g_call_id;</span><br><span>    var MgcpConnectionId g_mgcp_conn_id;</span><br><span style="color: hsl(120, 100%, 40%);">+  var MSC_TestHdlrParams g_pars;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Callback function from general BSSMAP_Emulation whenever a new incoming</span><br><span style="color: hsl(0, 100%, 40%);">- * SCCP connection arrivces. Must create + start a new component */</span><br><span style="color: hsl(0, 100%, 40%);">-private function CreateCallback(BSSAP_N_CONNECT_ind conn_ind, charstring id)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on RAN_Emulation_CT return RAN_ConnHdlr {</span><br><span style="color: hsl(0, 100%, 40%);">-  var MSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Create a new RAN_ConnHdlr component */</span><br><span style="color: hsl(0, 100%, 40%);">-       vc_conn := MSC_ConnHdlr.create(g_ran_id & "-Conn-" & int2str(conn_ind.connectionId));</span><br><span style="color: hsl(0, 100%, 40%);">- /* connect it to the port */</span><br><span style="color: hsl(120, 100%, 40%);">+type record MSC_TestHdlrParams {</span><br><span style="color: hsl(120, 100%, 40%);">+        integer connection_id,</span><br><span style="color: hsl(120, 100%, 40%);">+        integer e1_timeslot</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%);">+/* helper function to create and connect a MSC_ConnHdlr component */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_connect_handler(inout MSC_ConnHdlr vc_conn) runs on RAN_Emulation_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    /* connect client BSSAP port to BSSAP dispatcher */</span><br><span>  connect(vc_conn:BSSAP, self:CLIENT);</span><br><span style="color: hsl(0, 100%, 40%);">-    /* start it */</span><br><span style="color: hsl(0, 100%, 40%);">-  vc_conn.start(MSC_ConnectionHandler.main(conn_ind.connectionId, g_next_e1_ts));</span><br><span style="color: hsl(0, 100%, 40%);">- /* increment next E1 timeslot */</span><br><span style="color: hsl(0, 100%, 40%);">-        g_next_e1_ts := g_next_e1_ts + 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%);">+private function f_msc_start_handler(void_fn_msc fn, charstring id, template (omit) MSC_TestHdlrParams pars := omit)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on RAN_Emulation_CT return MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+  var MSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     vc_conn := MSC_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>         return vc_conn;</span><br><span> }</span><br><span> </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_msc fn, charstring id, template (omit) MSC_TestHdlrParams pars := omit)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on MSC_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> /* Callback function from general BSSMAP_Emulation whenever a connectionless</span><br><span>  * BSSMAP message arrives.  Can retunr a PDU_BSSAP that should be sent in return */</span><br><span> private function UnitdataCallback(PDU_BSSAP bssap)</span><br><span>@@ -63,8 +79,25 @@</span><br><span>         return resp;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Callback function from general BSSMAP_Emulation whenever a new incoming</span><br><span style="color: hsl(120, 100%, 40%);">+ * SCCP connection arrivces. Must create + start a new component */</span><br><span style="color: hsl(120, 100%, 40%);">+private function CreateCallback_generic(void_fn_msc fn, BSSAP_N_CONNECT_ind conn_ind, charstring id)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on RAN_Emulation_CT return RAN_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+  var MSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     var MSC_TestHdlrParams pars;</span><br><span style="color: hsl(120, 100%, 40%);">+  pars.connection_id := conn_ind.connectionId;</span><br><span style="color: hsl(120, 100%, 40%);">+  pars.e1_timeslot := g_next_e1_ts;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Create a new RAN_ConnHdlr component */</span><br><span style="color: hsl(120, 100%, 40%);">+     vc_conn := f_msc_start_handler(fn, g_ran_id & "-Conn-" & int2str(conn_ind.connectionId), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* increment next E1 timeslot */</span><br><span style="color: hsl(120, 100%, 40%);">+      g_next_e1_ts := g_next_e1_ts + 1;</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> const RanOps MSC_RanOps := {</span><br><span style="color: hsl(0, 100%, 40%);">-    create_cb := refers(CreateCallback),</span><br><span style="color: hsl(120, 100%, 40%);">+  create_cb := omit,</span><br><span>   unitdata_cb := refers(UnitdataCallback),</span><br><span>     decode_dtap := false,</span><br><span>        role_ms := false,</span><br><span>@@ -84,14 +117,20 @@</span><br><span>     MSC_STATE_WAIT_DLCX_ACK</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Callback function from general BSSMAP_Emulation whenever a new incoming</span><br><span style="color: hsl(120, 100%, 40%);">+ * SCCP connection arrivces. Must create + start a new component */</span><br><span style="color: hsl(120, 100%, 40%);">+function CreateCallback_establish_fully(BSSAP_N_CONNECT_ind conn_ind, charstring id)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on RAN_Emulation_CT return RAN_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+       return CreateCallback_generic(refers(f_msc_establish_fully), conn_ind, id);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> /* main function processing various incoming events */</span><br><span style="color: hsl(0, 100%, 40%);">-function main(integer connection_id, integer e1_timeslot) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+function f_msc_establish_fully(charstring id) runs on MSC_ConnHdlr {</span><br><span>       var MgcpResponse mgcp_rsp;</span><br><span>   timer T := 5.0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     g_sccp_conn_id := connection_id;</span><br><span style="color: hsl(120, 100%, 40%);">+      g_sccp_conn_id := g_pars.connection_id;</span><br><span>      g_call_id := f_mgcp_alloc_call_id();</span><br><span style="color: hsl(0, 100%, 40%);">-    g_ep_name := hex2str(int2hex(e1_timeslot, 1)) & "@mgw";</span><br><span style="color: hsl(120, 100%, 40%);">+ g_ep_name := hex2str(int2hex(g_pars.e1_timeslot, 1)) & "@mgw";</span><br><span> </span><br><span>     /* we just accepted an incoming SCCP connection, start guard timer */</span><br><span>        T.start;</span><br><span>@@ -103,7 +142,7 @@</span><br><span>               [g_state == MSC_STATE_NONE] BSSAP.receive(tr_BSSMAP_ComplL3) -> value bssap {</span><br><span>                     /* respond with ASSIGNMENT CMD  */</span><br><span>                   g_state := MSC_STATE_WAIT_ASS_COMPL;</span><br><span style="color: hsl(0, 100%, 40%);">-                    BSSAP.send(ts_BSSMAP_AssignmentReq(ts_BSSMAP_IE_CIC(0, e1_timeslot)));</span><br><span style="color: hsl(120, 100%, 40%);">+                        BSSAP.send(ts_BSSMAP_AssignmentReq(ts_BSSMAP_IE_CIC(0, g_pars.e1_timeslot)));</span><br><span>                        }</span><br><span>            [g_state == MSC_STATE_WAIT_ASS_COMPL] BSSAP.receive(tr_BSSMAP_AssignmentComplete(?,*)) {</span><br><span>                     /* FIXME: Send MGCP CRCX */</span><br><span>diff --git a/bsc-nat/MSC_Simulation.ttcn b/bsc-nat/MSC_Simulation.ttcn</span><br><span>index bc47f89..14229cc 100755</span><br><span>--- a/bsc-nat/MSC_Simulation.ttcn</span><br><span>+++ b/bsc-nat/MSC_Simulation.ttcn</span><br><span>@@ -38,7 +38,8 @@</span><br><span> </span><br><span> function main(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, charstring id) runs on MSC_CT</span><br><span style="color: hsl(120, 100%, 40%);">+         SCCP_PAR_Address sccp_addr_own,</span><br><span style="color: hsl(120, 100%, 40%);">+       BssmapCreateCallback cb, charstring id) runs on MSC_CT</span><br><span> {</span><br><span>    /* create components */</span><br><span>      vc_IPA := IPA_Emulation_CT.create(id & "-IPA");</span><br><span>@@ -64,7 +65,10 @@</span><br><span> </span><br><span>       vc_IPA.start(IPA_Emulation.main_server(local_ip, local_port));</span><br><span>       vc_SCCP.start(SCCPStart(sccp_pars));</span><br><span style="color: hsl(0, 100%, 40%);">-    vc_BSSMAP.start(RAN_Emulation.main(MSC_ConnectionHandler.MSC_RanOps, id & "-BSSMAP"));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        var RanOps ranops := MSC_ConnectionHandler.MSC_RanOps;</span><br><span style="color: hsl(120, 100%, 40%);">+        ranops.create_cb := cb;</span><br><span style="color: hsl(120, 100%, 40%);">+       vc_BSSMAP.start(RAN_Emulation.main(ranops, id & "-BSSMAP"));</span><br><span> </span><br><span>       /* wait until termination of respective components */</span><br><span>        vc_IPA.done;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/14412">change 14412</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/+/14412"/><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: Ic429420d0d95b6aacb6e5c44031b49c942ed544d </div>
<div style="display:none"> Gerrit-Change-Number: 14412 </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: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>