<p>dexter has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/9204">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">MSC_Tests: add test to try two LU from different BSCs<br><br>Currently we are only able to simulate a Location Update from a<br>single BSC. However, as a preperation for inter BSC handover tests<br>we need to be able to communicate to the MSC from two independed<br>BSC instances. A location update is a simple operation to try out<br>the multi-bsc functionality<br><br>- Add support to create multiple BSC instances in independed ports<br>- Add test to simulate a LU from two different BSCs<br><br>Change-Id: Ib3eabf8537066f43faed8fb983d9e1f4092ec515<br>Related: OS#1609<br>---<br>M library/BSSMAP_Emulation.ttcn<br>M msc/BSC_ConnectionHandler.ttcn<br>M msc/MSC_Tests.ttcn<br>M msc/expected-results.xml<br>4 files changed, 69 insertions(+), 23 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/04/9204/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/library/BSSMAP_Emulation.ttcn b/library/BSSMAP_Emulation.ttcn</span><br><span>index 95b39f3..74c6ed0 100644</span><br><span>--- a/library/BSSMAP_Emulation.ttcn</span><br><span>+++ b/library/BSSMAP_Emulation.ttcn</span><br><span>@@ -47,8 +47,11 @@</span><br><span> type component BSSAP_ConnHdlr {</span><br><span>        /* port towards MSC Emulator core / SCCP connection dispatchar */</span><br><span>    port BSSAP_Conn_PT BSSAP;</span><br><span style="color: hsl(120, 100%, 40%);">+     port BSSAP_Conn_PT BSSAP_1;</span><br><span style="color: hsl(120, 100%, 40%);">+   </span><br><span>     /* procedure based port to register for incoming connections */</span><br><span>      port BSSMAPEM_PROC_PT BSSAP_PROC;</span><br><span style="color: hsl(120, 100%, 40%);">+     port BSSMAPEM_PROC_PT BSSAP_PROC_1;</span><br><span> }</span><br><span> </span><br><span> /* Auxiliary primitive that can happen on the port between per-connection client and this dispatcher */</span><br><span>diff --git a/msc/BSC_ConnectionHandler.ttcn b/msc/BSC_ConnectionHandler.ttcn</span><br><span>index b7a4f50..69608bd 100644</span><br><span>--- a/msc/BSC_ConnectionHandler.ttcn</span><br><span>+++ b/msc/BSC_ConnectionHandler.ttcn</span><br><span>@@ -44,10 +44,16 @@</span><br><span>   boolean expect_ciph</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-type record BSC_ConnHdlrPars {</span><br><span style="color: hsl(120, 100%, 40%);">+type record BSC_ConnHdlrBscPars {</span><br><span>        SCCP_PAR_Address sccp_addr_own,</span><br><span>      SCCP_PAR_Address sccp_addr_peer,</span><br><span style="color: hsl(0, 100%, 40%);">-        BSSMAP_IE_CellIdentifier cell_id,</span><br><span style="color: hsl(120, 100%, 40%);">+     BSSMAP_IE_CellIdentifier cell_id</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%);">+type record of BSC_ConnHdlrBscPars BSC_ConnHdlrBscParsTable;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record BSC_ConnHdlrPars {</span><br><span style="color: hsl(120, 100%, 40%);">+ BSC_ConnHdlrBscParsTable bsc,</span><br><span>        hexstring imei,</span><br><span>      hexstring imsi,</span><br><span>      hexstring msisdn,</span><br><span>@@ -173,15 +179,16 @@</span><br><span> };</span><br><span> </span><br><span> /* Encode 'l3' and ask BSSMAP_Emulation to create new connection with COMPL L3 INFO */</span><br><span style="color: hsl(0, 100%, 40%);">-function f_bssap_compl_l3(PDU_ML3_MS_NW l3)</span><br><span style="color: hsl(120, 100%, 40%);">+function f_bssap_compl_l3(PDU_ML3_MS_NW l3, integer bsc_num := 0, BSSAP_Conn_PT BSSAP_PT := BSSAP)</span><br><span> runs on BSC_ConnHdlr {</span><br><span>       log("Sending COMPL L3: ", l3);</span><br><span>     var octetstring l3_enc := enc_PDU_ML3_MS_NW(l3);</span><br><span style="color: hsl(0, 100%, 40%);">-        BSSAP.send(ts_BSSAP_Conn_Req(g_pars.sccp_addr_peer, g_pars.sccp_addr_own,</span><br><span style="color: hsl(0, 100%, 40%);">-                                    valueof(ts_BSSMAP_ComplL3(g_pars.cell_id, l3_enc))));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  BSSAP_PT.send(ts_BSSAP_Conn_Req(g_pars.bsc[bsc_num].sccp_addr_peer, g_pars.bsc[bsc_num].sccp_addr_own,</span><br><span style="color: hsl(120, 100%, 40%);">+                                        valueof(ts_BSSMAP_ComplL3(g_pars.bsc[bsc_num].cell_id, l3_enc))));</span><br><span>   alt {</span><br><span style="color: hsl(0, 100%, 40%);">-   [] BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_CONF_IND) {}</span><br><span style="color: hsl(0, 100%, 40%);">-     [] BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {</span><br><span style="color: hsl(120, 100%, 40%);">+    [] BSSAP_PT.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_CONF_IND) {}</span><br><span style="color: hsl(120, 100%, 40%);">+        [] BSSAP_PT.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {</span><br><span>                        setverdict(fail, "DISC.ind from SCCP");</span><br><span>                    self.stop;</span><br><span>           }</span><br><span>@@ -297,7 +304,7 @@</span><br><span>      }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-function f_perform_lu()</span><br><span style="color: hsl(120, 100%, 40%);">+function f_perform_lu(integer bsc_num := 0, BSSAP_Conn_PT BSSAP_PT := BSSAP)</span><br><span> runs on BSC_ConnHdlr {</span><br><span>    var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi)</span><br><span>      var PDU_DTAP_MT dtap_mt;</span><br><span>@@ -306,10 +313,10 @@</span><br><span>     f_create_gsup_expect(hex2str(g_pars.imsi));</span><br><span> </span><br><span>      /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */</span><br><span style="color: hsl(0, 100%, 40%);">-     f_bssap_compl_l3(l3_lu);</span><br><span style="color: hsl(120, 100%, 40%);">+      f_bssap_compl_l3(l3_lu, bsc_num, BSSAP_PT);</span><br><span> </span><br><span>      if (g_pars.send_early_cm) {</span><br><span style="color: hsl(0, 100%, 40%);">-             BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));</span><br><span style="color: hsl(120, 100%, 40%);">+           BSSAP_PT.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));</span><br><span>       }</span><br><span> </span><br><span>        f_mm_common();</span><br><span>@@ -321,7 +328,7 @@</span><br><span>         GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));</span><br><span> </span><br><span>  alt {</span><br><span style="color: hsl(0, 100%, 40%);">-   [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Acc)) -> value dtap_mt {</span><br><span style="color: hsl(120, 100%, 40%);">+      [] BSSAP_PT.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Acc)) -> value dtap_mt {</span><br><span>          var PDU_ML3_LocationUpdateAccept lu_acc := dtap_mt.dtap.msgs.mm.locationUpdateAccept;</span><br><span>                if (g_pars.net.expect_tmsi) {</span><br><span>                        if (not ispresent(lu_acc.mobileIdentityTLV) or</span><br><span>@@ -330,7 +337,7 @@</span><br><span>                                 self.stop;</span><br><span>                   } else {</span><br><span>                             g_pars.tmsi := lu_acc.mobileIdentityTLV.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets;</span><br><span style="color: hsl(0, 100%, 40%);">-                         BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_TmsiRealloc_Cmpl));</span><br><span style="color: hsl(120, 100%, 40%);">+                               BSSAP_PT.send(ts_PDU_DTAP_MO(ts_ML3_MO_TmsiRealloc_Cmpl));</span><br><span>                   }</span><br><span>            } else {</span><br><span>                     if (ispresent(lu_acc.mobileIdentityTLV) and</span><br><span>@@ -340,15 +347,15 @@</span><br><span>                  }</span><br><span>            }</span><br><span>            }</span><br><span style="color: hsl(0, 100%, 40%);">-       [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej)) {</span><br><span style="color: hsl(120, 100%, 40%);">+  [] BSSAP_PT.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej)) {</span><br><span>              setverdict(fail, "Expected LU ACK, but received LU REJ");</span><br><span>          self.stop;</span><br><span>           }</span><br><span>    }</span><br><span>    /* FIXME: there could be pending SMS or other common procedures by the MSC, let's ignore them */</span><br><span style="color: hsl(0, 100%, 40%);">-    BSSAP.receive(tr_BSSMAP_ClearCommand);</span><br><span style="color: hsl(0, 100%, 40%);">-  BSSAP.send(ts_BSSMAP_ClearComplete);</span><br><span style="color: hsl(0, 100%, 40%);">-    BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);</span><br><span style="color: hsl(120, 100%, 40%);">+        BSSAP_PT.receive(tr_BSSMAP_ClearCommand);</span><br><span style="color: hsl(120, 100%, 40%);">+     BSSAP_PT.send(ts_BSSMAP_ClearComplete);</span><br><span style="color: hsl(120, 100%, 40%);">+       BSSAP_PT.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);</span><br><span>    setverdict(pass);</span><br><span> }</span><br><span> </span><br><span>diff --git a/msc/MSC_Tests.ttcn b/msc/MSC_Tests.ttcn</span><br><span>index edaa61b..ebf0081 100644</span><br><span>--- a/msc/MSC_Tests.ttcn</span><br><span>+++ b/msc/MSC_Tests.ttcn</span><br><span>@@ -434,10 +434,22 @@</span><br><span>              expect_auth := false,</span><br><span>                expect_ciph := false</span><br><span>         };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  var BSC_ConnHdlrBscParsTable bsc_pars := {</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span style="color: hsl(120, 100%, 40%);">+                     sccp_addr_own := g_bssap[0].sccp_addr_own,</span><br><span style="color: hsl(120, 100%, 40%);">+                    sccp_addr_peer := g_bssap[0].sccp_addr_peer,</span><br><span style="color: hsl(120, 100%, 40%);">+                  cell_id := valueof(ts_CellId_CGI('262'H, '42'H, 23, 42))</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%);">+                     sccp_addr_own := g_bssap[1].sccp_addr_own,</span><br><span style="color: hsl(120, 100%, 40%);">+                    sccp_addr_peer := g_bssap[1].sccp_addr_peer,</span><br><span style="color: hsl(120, 100%, 40%);">+                  cell_id := valueof(ts_CellId_CGI('262'H, '42'H, 24, 43))</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>  var BSC_ConnHdlrPars pars := {</span><br><span style="color: hsl(0, 100%, 40%);">-          sccp_addr_own := g_bssap[0].sccp_addr_own,</span><br><span style="color: hsl(0, 100%, 40%);">-              sccp_addr_peer := g_bssap[0].sccp_addr_peer,</span><br><span style="color: hsl(0, 100%, 40%);">-            cell_id := valueof(ts_CellId_CGI('262'H, '42'H, 23, 42)),</span><br><span style="color: hsl(120, 100%, 40%);">+             bsc := bsc_pars,</span><br><span>             imei := f_gen_imei(imsi_suffix),</span><br><span>             imsi := f_gen_imsi(imsi_suffix),</span><br><span>             msisdn := f_gen_msisdn(imsi_suffix),</span><br><span>@@ -449,6 +461,9 @@</span><br><span>           net := net_pars,</span><br><span>             send_early_cm := true</span><br><span>        };</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>      return pars;</span><br><span> }</span><br><span> </span><br><span>@@ -460,6 +475,8 @@</span><br><span>  /* BSSMAP part / A interface */</span><br><span>      connect(vc_conn:BSSAP, g_bssap[0].vc_BSSMAP:CLIENT);</span><br><span>         connect(vc_conn:BSSAP_PROC, g_bssap[0].vc_BSSMAP:PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+       connect(vc_conn:BSSAP_1, g_bssap[1].vc_BSSMAP:CLIENT);</span><br><span style="color: hsl(120, 100%, 40%);">+        connect(vc_conn:BSSAP_PROC_1, g_bssap[1].vc_BSSMAP:PROC);</span><br><span>    /* MNCC part */</span><br><span>      connect(vc_conn:MNCC, vc_MNCC:MNCC_CLIENT);</span><br><span>  connect(vc_conn:MNCC_PROC, vc_MNCC:MNCC_PROC);</span><br><span>@@ -1106,8 +1123,8 @@</span><br><span>       f_init_handler(pars);</span><br><span> </span><br><span>    /* Send Complete L3 Info with empty L3 frame */</span><br><span style="color: hsl(0, 100%, 40%);">- BSSAP.send(ts_BSSAP_Conn_Req(g_pars.sccp_addr_peer, g_pars.sccp_addr_own,</span><br><span style="color: hsl(0, 100%, 40%);">-                                       valueof(ts_BSSMAP_ComplL3(g_pars.cell_id, ''O))));</span><br><span style="color: hsl(120, 100%, 40%);">+    BSSAP.send(ts_BSSAP_Conn_Req(g_pars.bsc[0].sccp_addr_peer, g_pars.bsc[0].sccp_addr_own,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       valueof(ts_BSSMAP_ComplL3(g_pars.bsc[0].cell_id, ''O))));</span><br><span> </span><br><span>        timer T := 5.0;</span><br><span>      T.start;</span><br><span>@@ -1140,8 +1157,8 @@</span><br><span>     var octetstring payl := f_rnd_octstring(len);</span><br><span> </span><br><span>    /* Send Complete L3 Info with empty L3 frame */</span><br><span style="color: hsl(0, 100%, 40%);">- BSSAP.send(ts_BSSAP_Conn_Req(g_pars.sccp_addr_peer, g_pars.sccp_addr_own,</span><br><span style="color: hsl(0, 100%, 40%);">-                                       valueof(ts_BSSMAP_ComplL3(g_pars.cell_id, payl))));</span><br><span style="color: hsl(120, 100%, 40%);">+   BSSAP.send(ts_BSSAP_Conn_Req(g_pars.bsc[0].sccp_addr_peer, g_pars.bsc[0].sccp_addr_own,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       valueof(ts_BSSMAP_ComplL3(g_pars.bsc[0].cell_id, payl))));</span><br><span> </span><br><span>       timer T := 5.0;</span><br><span>      T.start;</span><br><span>@@ -1847,6 +1864,23 @@</span><br><span>    setverdict(pass);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_lu_two(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ pars.net.expect_tmsi := false;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init_handler(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_lu(0, BSSAP);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_perform_lu(1, BSSAP_1);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_lu_two() runs on MTC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Like TC_lu_imsi_noauth_notmsi, but with two different BSC */</span><br><span style="color: hsl(120, 100%, 40%);">+       var BSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     f_init(2);</span><br><span style="color: hsl(120, 100%, 40%);">+    f_vty_config(MSCVTY, "msc", "no assign-tmsi");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  vc_conn := f_start_handler(refers(f_tc_lu_two), 2);</span><br><span style="color: hsl(120, 100%, 40%);">+   vc_conn.done;</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> /***********************************************************************</span><br><span>  * SMS Testing</span><br><span>  ***********************************************************************/</span><br><span>@@ -2173,6 +2207,7 @@</span><br><span>      execute( TC_mo_release_timeout() );</span><br><span>  execute( TC_lu_and_mt_call_no_dlcx_resp() );</span><br><span>         execute( TC_reset_two() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_lu_two() );</span><br><span> </span><br><span>  execute( TC_lu_and_mt_call() );</span><br><span> </span><br><span>diff --git a/msc/expected-results.xml b/msc/expected-results.xml</span><br><span>index 0b192d0..cade469 100644</span><br><span>--- a/msc/expected-results.xml</span><br><span>+++ b/msc/expected-results.xml</span><br><span>@@ -70,6 +70,7 @@</span><br><span>   <testcase classname='MSC_Tests' name='TC_mo_release_timeout' time='MASKED'/></span><br><span>   <testcase classname='MSC_Tests' name='TC_lu_and_mt_call_no_dlcx_resp' time='MASKED'/></span><br><span>   <testcase classname='MSC_Tests' name='TC_reset_two' time='MASKED'/></span><br><span style="color: hsl(120, 100%, 40%);">+  <testcase classname='MSC_Tests' name='TC_lu_two' time='MASKED'/></span><br><span>   <testcase classname='MSC_Tests' name='TC_lu_and_mt_call' time='MASKED'/></span><br><span>   <testcase classname='MSC_Tests' name='TC_lu_and_mo_sms' time='MASKED'/></span><br><span>   <testcase classname='MSC_Tests' name='TC_lu_and_mt_sms' time='MASKED'/></span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/9204">change 9204</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/9204"/><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-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Ib3eabf8537066f43faed8fb983d9e1f4092ec515 </div>
<div style="display:none"> Gerrit-Change-Number: 9204 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>