<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/18763">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">bsc: add MSC pooling tests<br><br>The MSC pooling feature is implemented in osmo-bsc<br>Ifbdea197b26e88751a391c8a80c41f04e7d5e047.<br><br>A VTY command ('mscpool roundrobin next') that allows deterministic testing is<br>added in I2155d906505a26744966f442ffb1e87a6a9b494c.<br><br>osmo-bsc.cfg changes needed for these tests to succeed are in docker-playground<br>I1986e4ef43beee161c82193694421b56136c1afe<br><br>The new tests will fail until the above have been merged.<br><br>Change-Id: I21cbab193cd0de2e5692665442eae113d5f61904<br>---<br>M bsc/BSC_Tests.ttcn<br>M bsc/MSC_ConnectionHandler.ttcn<br>M library/L3_Templates.ttcn<br>3 files changed, 799 insertions(+), 2 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/63/18763/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/bsc/BSC_Tests.ttcn b/bsc/BSC_Tests.ttcn</span><br><span>index fb7ee25..0a6bc28 100644</span><br><span>--- a/bsc/BSC_Tests.ttcn</span><br><span>+++ b/bsc/BSC_Tests.ttcn</span><br><span>@@ -20,6 +20,7 @@</span><br><span>  * level testing.</span><br><span>  */</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+import from Misc_Helpers all;</span><br><span> import from General_Types all;</span><br><span> import from Osmocom_Types all;</span><br><span> import from GSM_Types all;</span><br><span>@@ -369,6 +370,14 @@</span><br><span>                         "sccp-timer iar " & int2str(g_bsc_sccp_timer_iar)});</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+private function f_logp(charstring log_msg) runs on MSC_ConnHdlr</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    // log on TTCN3 log output</span><br><span style="color: hsl(120, 100%, 40%);">+    log(log_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ // log in stderr log</span><br><span style="color: hsl(120, 100%, 40%);">+  f_vty_transceive(BSCVTY, "logp lglobal notice " & log_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* global initialization function</span><br><span>  * \param nr_bts Number of BTSs we should start/bring up</span><br><span>  * \param handler_mode Start an RSL_Emulation_CT component (true) or not (false) */</span><br><span>@@ -4443,6 +4452,707 @@</span><br><span>     vc_conn.done;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/***********************************************************************</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC Pooling</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%);">+function f_tmsi_nri(integer nri_v, octetstring base_tmsi := '42000023'O, integer nri_bitlen := 10) return octetstring</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       return int2oct( oct2int('42000023'O) + bit2int( (int2bit(nri_v, 32) << ( 24 - nri_bitlen)) ),</span><br><span style="color: hsl(120, 100%, 40%);">+                   4);</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%);">+template MobileIdentityLV ts_MI_TMSI_NRI_LV(integer nri_v, integer nri_bitlen := 10) :=</span><br><span style="color: hsl(120, 100%, 40%);">+     ts_MI_TMSI_LV(tmsi := f_tmsi_nri(nri_v, nri_bitlen := nri_bitlen));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_perform_clear() runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+      f_logp("MSC instructs BSC to clear channel");</span><br><span style="color: hsl(120, 100%, 40%);">+       BSSAP.send(ts_BSSMAP_ClearCommand(0));</span><br><span style="color: hsl(120, 100%, 40%);">+        interleave {</span><br><span style="color: hsl(120, 100%, 40%);">+  [] RSL.receive(tr_RSL_DATA_REQ(g_chan_nr, ?, decmatch tr_RRM_RR_RELEASE)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   f_logp("Got RSL RR Release");</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] RSL.receive(tr_RSL_DEACT_SACCH(g_chan_nr)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       f_logp("Got RSL Deact SACCH");</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] BSSAP.receive(tr_BSSMAP_ClearComplete) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   f_logp("Got BSSMAP Clear Complete");</span><br><span style="color: hsl(120, 100%, 40%);">+                        /* Also drop the SCCP connection */</span><br><span style="color: hsl(120, 100%, 40%);">+                   BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] RSL.receive(tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 f_logp("Got RSL RF Chan Rel, sending Rel Ack");</span><br><span style="color: hsl(120, 100%, 40%);">+                     RSL.send(ts_RSL_RF_CHAN_REL_ACK(g_chan_nr));</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%);">+private function f_perform_clear_on_RSL1() runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+     f_logp("MSC instructs BSC to clear channel");</span><br><span style="color: hsl(120, 100%, 40%);">+       BSSAP.send(ts_BSSMAP_ClearCommand(0));</span><br><span style="color: hsl(120, 100%, 40%);">+        interleave {</span><br><span style="color: hsl(120, 100%, 40%);">+  [] RSL1.receive(tr_RSL_DATA_REQ(g_chan_nr, ?, decmatch tr_RRM_RR_RELEASE)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  f_logp("Got RSL RR Release");</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] RSL1.receive(tr_RSL_DEACT_SACCH(g_chan_nr)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      f_logp("Got RSL Deact SACCH");</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] BSSAP.receive(tr_BSSMAP_ClearComplete) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   f_logp("Got BSSMAP Clear Complete");</span><br><span style="color: hsl(120, 100%, 40%);">+                        /* Also drop the SCCP connection */</span><br><span style="color: hsl(120, 100%, 40%);">+                   BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] RSL1.receive(tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        f_logp("Got RSL RF Chan Rel, sending Rel Ack");</span><br><span style="color: hsl(120, 100%, 40%);">+                     RSL1.send(ts_RSL_RF_CHAN_REL_ACK(g_chan_nr));</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%);">+private function f_perform_clear_on_RSL2() runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+     f_logp("MSC instructs BSC to clear channel");</span><br><span style="color: hsl(120, 100%, 40%);">+       BSSAP.send(ts_BSSMAP_ClearCommand(0));</span><br><span style="color: hsl(120, 100%, 40%);">+        interleave {</span><br><span style="color: hsl(120, 100%, 40%);">+  [] RSL2.receive(tr_RSL_DATA_REQ(g_chan_nr, ?, decmatch tr_RRM_RR_RELEASE)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  f_logp("Got RSL RR Release");</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] RSL2.receive(tr_RSL_DEACT_SACCH(g_chan_nr)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      f_logp("Got RSL Deact SACCH");</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] BSSAP.receive(tr_BSSMAP_ClearComplete) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   f_logp("Got BSSMAP Clear Complete");</span><br><span style="color: hsl(120, 100%, 40%);">+                        /* Also drop the SCCP connection */</span><br><span style="color: hsl(120, 100%, 40%);">+                   BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] RSL2.receive(tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        f_logp("Got RSL RF Chan Rel, sending Rel Ack");</span><br><span style="color: hsl(120, 100%, 40%);">+                     RSL2.send(ts_RSL_RF_CHAN_REL_ACK(g_chan_nr));</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%);">+private function f_perform_compl_l3(template PDU_ML3_MS_NW l3_info, boolean do_clear := true)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ timer T := 10.0;</span><br><span style="color: hsl(120, 100%, 40%);">+      var octetstring l3_enc := enc_PDU_ML3_MS_NW(valueof(l3_info));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_logp("establish channel, send Complete Layer 3 Info");</span><br><span style="color: hsl(120, 100%, 40%);">+    f_create_bssmap_exp(l3_enc);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* RSL_Emulation.f_chan_est() on RSL: */</span><br><span style="color: hsl(120, 100%, 40%);">+      //RSL_Emulation.f_chan_est(g_pars.ra, l3_enc, g_pars.link_id, g_pars.fn);</span><br><span style="color: hsl(120, 100%, 40%);">+     var RSL_Message rx_rsl;</span><br><span style="color: hsl(120, 100%, 40%);">+       var GsmRrMessage rr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* request a channel to be established */</span><br><span style="color: hsl(120, 100%, 40%);">+     RSL.send(ts_RSLDC_ChanRqd(g_pars.ra, g_pars.fn));</span><br><span style="color: hsl(120, 100%, 40%);">+     /* expect immediate assignment */</span><br><span style="color: hsl(120, 100%, 40%);">+     //rx_rsl := f_rx_or_fail(tr_RSL_IMM_ASSIGN);</span><br><span style="color: hsl(120, 100%, 40%);">+  timer Tt := 10.0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* request a channel to be established */</span><br><span style="color: hsl(120, 100%, 40%);">+     Tt.start;</span><br><span style="color: hsl(120, 100%, 40%);">+     alt {</span><br><span style="color: hsl(120, 100%, 40%);">+         [] RSL.receive(tr_RSL_IMM_ASSIGN) -> value rx_rsl {</span><br><span style="color: hsl(120, 100%, 40%);">+                        Tt.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+             [] RSL.receive {</span><br><span style="color: hsl(120, 100%, 40%);">+                      setverdict(fail, "Unexpected RSL message on DCHAN");</span><br><span style="color: hsl(120, 100%, 40%);">+                        mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+             [] Tt.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                       setverdict(fail, "Timeout waiting for RSL on DCHAN");</span><br><span style="color: hsl(120, 100%, 40%);">+                       mtc.stop;</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%);">+     rr := dec_GsmRrMessage(rx_rsl.ies[1].body.full_imm_ass_info.payload);</span><br><span style="color: hsl(120, 100%, 40%);">+ g_chan_nr := rr.payload.imm_ass.chan_desc.chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+    RSL.send(ts_RSL_EST_IND(g_chan_nr, valueof(g_pars.link_id), l3_enc));</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%);">+     f_logp("expect BSSAP Complete Layer 3 Info at MSC");</span><br><span style="color: hsl(120, 100%, 40%);">+        var template PDU_BSSAP exp_l3_compl;</span><br><span style="color: hsl(120, 100%, 40%);">+  exp_l3_compl := tr_BSSMAP_ComplL3()</span><br><span style="color: hsl(120, 100%, 40%);">+   if (g_pars.aoip == false) {</span><br><span style="color: hsl(120, 100%, 40%);">+           exp_l3_compl.pdu.bssmap.completeLayer3Information.codecList := omit;</span><br><span style="color: hsl(120, 100%, 40%);">+  } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              exp_l3_compl.pdu.bssmap.completeLayer3Information.codecList := ?;</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%);">+   var PDU_BSSAP bssap;</span><br><span style="color: hsl(120, 100%, 40%);">+  T.start;</span><br><span style="color: hsl(120, 100%, 40%);">+      alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BSSAP.receive(exp_l3_compl) -> value bssap {</span><br><span style="color: hsl(120, 100%, 40%);">+            f_logp("received expected Complete Layer 3 Info at MSC");</span><br><span style="color: hsl(120, 100%, 40%);">+           log("rx exp_l3_compl = ", bssap);</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] BSSAP.receive(tr_BSSMAP_ComplL3) {</span><br><span style="color: hsl(120, 100%, 40%);">+         Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Received non-matching COMPLETE LAYER 3 INFORMATION");</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Timeout waiting for COMPLETE LAYER 3 INFORMATION");</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%);">+   /* start ciphering, if requested */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (ispresent(g_pars.encr)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         f_logp("start ciphering");</span><br><span style="color: hsl(120, 100%, 40%);">+          f_cipher_mode(g_pars.encr.enc_alg, g_pars.encr.enc_key);</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%);">+   if (do_clear) {</span><br><span style="color: hsl(120, 100%, 40%);">+               f_perform_clear();</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_sleep(1.0);</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_perform_compl_l3_on_RSL1(template PDU_ML3_MS_NW l3_info, boolean do_clear := true)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+     timer T := 10.0;</span><br><span style="color: hsl(120, 100%, 40%);">+      var octetstring l3_enc := enc_PDU_ML3_MS_NW(valueof(l3_info));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_logp("establish channel, send Complete Layer 3 Info");</span><br><span style="color: hsl(120, 100%, 40%);">+    f_create_bssmap_exp(l3_enc);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* RSL_Emulation.f_chan_est() on RSL1: */</span><br><span style="color: hsl(120, 100%, 40%);">+     //RSL_Emulation.f_chan_est(g_pars.ra, l3_enc, g_pars.link_id, g_pars.fn);</span><br><span style="color: hsl(120, 100%, 40%);">+     var RSL_Message rx_rsl;</span><br><span style="color: hsl(120, 100%, 40%);">+       var GsmRrMessage rr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* request a channel to be established */</span><br><span style="color: hsl(120, 100%, 40%);">+     RSL1.send(ts_RSLDC_ChanRqd(g_pars.ra, g_pars.fn));</span><br><span style="color: hsl(120, 100%, 40%);">+    /* expect immediate assignment */</span><br><span style="color: hsl(120, 100%, 40%);">+     //rx_rsl := f_rx_or_fail(tr_RSL_IMM_ASSIGN);</span><br><span style="color: hsl(120, 100%, 40%);">+  timer Tt := 10.0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* request a channel to be established */</span><br><span style="color: hsl(120, 100%, 40%);">+     Tt.start;</span><br><span style="color: hsl(120, 100%, 40%);">+     alt {</span><br><span style="color: hsl(120, 100%, 40%);">+         [] RSL1.receive(tr_RSL_IMM_ASSIGN) -> value rx_rsl {</span><br><span style="color: hsl(120, 100%, 40%);">+                       Tt.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+             [] RSL1.receive {</span><br><span style="color: hsl(120, 100%, 40%);">+                     setverdict(fail, "Unexpected RSL message on DCHAN");</span><br><span style="color: hsl(120, 100%, 40%);">+                        mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+             [] Tt.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                       setverdict(fail, "Timeout waiting for RSL on DCHAN");</span><br><span style="color: hsl(120, 100%, 40%);">+                       mtc.stop;</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%);">+     rr := dec_GsmRrMessage(rx_rsl.ies[1].body.full_imm_ass_info.payload);</span><br><span style="color: hsl(120, 100%, 40%);">+ g_chan_nr := rr.payload.imm_ass.chan_desc.chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+    RSL1.send(ts_RSL_EST_IND(g_chan_nr, valueof(g_pars.link_id), l3_enc));</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%);">+    f_logp("expect BSSAP Complete Layer 3 Info at MSC");</span><br><span style="color: hsl(120, 100%, 40%);">+        var template PDU_BSSAP exp_l3_compl;</span><br><span style="color: hsl(120, 100%, 40%);">+  exp_l3_compl := tr_BSSMAP_ComplL3()</span><br><span style="color: hsl(120, 100%, 40%);">+   if (g_pars.aoip == false) {</span><br><span style="color: hsl(120, 100%, 40%);">+           exp_l3_compl.pdu.bssmap.completeLayer3Information.codecList := omit;</span><br><span style="color: hsl(120, 100%, 40%);">+  } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              exp_l3_compl.pdu.bssmap.completeLayer3Information.codecList := ?;</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%);">+   var PDU_BSSAP bssap;</span><br><span style="color: hsl(120, 100%, 40%);">+  T.start;</span><br><span style="color: hsl(120, 100%, 40%);">+      alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BSSAP.receive(exp_l3_compl) -> value bssap {</span><br><span style="color: hsl(120, 100%, 40%);">+            f_logp("received expected Complete Layer 3 Info at MSC");</span><br><span style="color: hsl(120, 100%, 40%);">+           log("rx exp_l3_compl = ", bssap);</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] BSSAP.receive(tr_BSSMAP_ComplL3) {</span><br><span style="color: hsl(120, 100%, 40%);">+         Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Received non-matching COMPLETE LAYER 3 INFORMATION");</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Timeout waiting for COMPLETE LAYER 3 INFORMATION");</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%);">+   /* start ciphering, if requested */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (ispresent(g_pars.encr)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         f_logp("start ciphering");</span><br><span style="color: hsl(120, 100%, 40%);">+          f_cipher_mode(g_pars.encr.enc_alg, g_pars.encr.enc_key);</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%);">+   if (do_clear) {</span><br><span style="color: hsl(120, 100%, 40%);">+               f_perform_clear_on_RSL1();</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_sleep(1.0);</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_perform_compl_l3_on_RSL2(template PDU_ML3_MS_NW l3_info, boolean do_clear := true)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+     timer T := 10.0;</span><br><span style="color: hsl(120, 100%, 40%);">+      var octetstring l3_enc := enc_PDU_ML3_MS_NW(valueof(l3_info));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_logp("establish channel, send Complete Layer 3 Info");</span><br><span style="color: hsl(120, 100%, 40%);">+    f_create_bssmap_exp(l3_enc);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* RSL_Emulation.f_chan_est() on RSL2: */</span><br><span style="color: hsl(120, 100%, 40%);">+     //RSL_Emulation.f_chan_est(g_pars.ra, l3_enc, g_pars.link_id, g_pars.fn);</span><br><span style="color: hsl(120, 100%, 40%);">+     var RSL_Message rx_rsl;</span><br><span style="color: hsl(120, 100%, 40%);">+       var GsmRrMessage rr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* request a channel to be established */</span><br><span style="color: hsl(120, 100%, 40%);">+     RSL2.send(ts_RSLDC_ChanRqd(g_pars.ra, g_pars.fn));</span><br><span style="color: hsl(120, 100%, 40%);">+    /* expect immediate assignment */</span><br><span style="color: hsl(120, 100%, 40%);">+     //rx_rsl := f_rx_or_fail(tr_RSL_IMM_ASSIGN);</span><br><span style="color: hsl(120, 100%, 40%);">+  timer Tt := 10.0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* request a channel to be established */</span><br><span style="color: hsl(120, 100%, 40%);">+     Tt.start;</span><br><span style="color: hsl(120, 100%, 40%);">+     alt {</span><br><span style="color: hsl(120, 100%, 40%);">+         [] RSL2.receive(tr_RSL_IMM_ASSIGN) -> value rx_rsl {</span><br><span style="color: hsl(120, 100%, 40%);">+                       Tt.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+             [] RSL2.receive {</span><br><span style="color: hsl(120, 100%, 40%);">+                     setverdict(fail, "Unexpected RSL message on DCHAN");</span><br><span style="color: hsl(120, 100%, 40%);">+                        mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+             [] Tt.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                       setverdict(fail, "Timeout waiting for RSL on DCHAN");</span><br><span style="color: hsl(120, 100%, 40%);">+                       mtc.stop;</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%);">+     rr := dec_GsmRrMessage(rx_rsl.ies[1].body.full_imm_ass_info.payload);</span><br><span style="color: hsl(120, 100%, 40%);">+ g_chan_nr := rr.payload.imm_ass.chan_desc.chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+    RSL2.send(ts_RSL_EST_IND(g_chan_nr, valueof(g_pars.link_id), l3_enc));</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%);">+    f_logp("expect BSSAP Complete Layer 3 Info at MSC");</span><br><span style="color: hsl(120, 100%, 40%);">+        var template PDU_BSSAP exp_l3_compl;</span><br><span style="color: hsl(120, 100%, 40%);">+  exp_l3_compl := tr_BSSMAP_ComplL3()</span><br><span style="color: hsl(120, 100%, 40%);">+   if (g_pars.aoip == false) {</span><br><span style="color: hsl(120, 100%, 40%);">+           exp_l3_compl.pdu.bssmap.completeLayer3Information.codecList := omit;</span><br><span style="color: hsl(120, 100%, 40%);">+  } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              exp_l3_compl.pdu.bssmap.completeLayer3Information.codecList := ?;</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%);">+   var PDU_BSSAP bssap;</span><br><span style="color: hsl(120, 100%, 40%);">+  T.start;</span><br><span style="color: hsl(120, 100%, 40%);">+      alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BSSAP.receive(exp_l3_compl) -> value bssap {</span><br><span style="color: hsl(120, 100%, 40%);">+            f_logp("received expected Complete Layer 3 Info at MSC");</span><br><span style="color: hsl(120, 100%, 40%);">+           log("rx exp_l3_compl = ", bssap);</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] BSSAP.receive(tr_BSSMAP_ComplL3) {</span><br><span style="color: hsl(120, 100%, 40%);">+         Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Received non-matching COMPLETE LAYER 3 INFORMATION");</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Timeout waiting for COMPLETE LAYER 3 INFORMATION");</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%);">+   /* start ciphering, if requested */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (ispresent(g_pars.encr)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         f_logp("start ciphering");</span><br><span style="color: hsl(120, 100%, 40%);">+          f_cipher_mode(g_pars.encr.enc_alg, g_pars.encr.enc_key);</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%);">+   if (do_clear) {</span><br><span style="color: hsl(120, 100%, 40%);">+               f_perform_clear_on_RSL2();</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_sleep(1.0);</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_tc_mscpool_compl_l3(charstring id) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+      f_MscConnHdlr_init(g_pars.media_nr, "127.0.0.2", "127.0.0.3", FR_AMR);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (g_pars.mscpool.rsl_idx == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+            f_perform_compl_l3(g_pars.mscpool.l3_info);</span><br><span style="color: hsl(120, 100%, 40%);">+   } else if (g_pars.mscpool.rsl_idx == 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+             f_perform_compl_l3_on_RSL1(g_pars.mscpool.l3_info);</span><br><span style="color: hsl(120, 100%, 40%);">+   } else if (g_pars.mscpool.rsl_idx == 2) {</span><br><span style="color: hsl(120, 100%, 40%);">+             f_perform_compl_l3_on_RSL2(g_pars.mscpool.l3_info);</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%);">+/* Various Complete Layer 3 by IMSI all end up with the first MSC, because the other MSCs are not connected. */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_mscpool_L3Compl_on_1_msc(charstring id) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_MscConnHdlr_init(g_pars.media_nr, "127.0.0.2", "127.0.0.3", FR_AMR);</span><br><span style="color: hsl(120, 100%, 40%);">+    f_perform_compl_l3( ts_LU_REQ(LU_Type_IMSI_Attach, valueof(ts_MI_IMSI_LV('001010000000001'H))) );</span><br><span style="color: hsl(120, 100%, 40%);">+     f_perform_compl_l3( ts_CM_SERV_REQ(CM_TYPE_MO_SMS, valueof(ts_MI_IMSI_LV('001010000000002'H))) );</span><br><span style="color: hsl(120, 100%, 40%);">+     f_perform_compl_l3( ts_PAG_RESP(valueof(ts_MI_IMSI_LV('001010000000003'H))) );</span><br><span style="color: hsl(120, 100%, 40%);">+        f_perform_compl_l3( ts_ML3_MO_MM_IMSI_DET_Ind(valueof(ts_MI_IMSI_LV('001010000000004'H))) );</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_mscpool_L3Compl_on_1_msc() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init(1, true);</span><br><span style="color: hsl(120, 100%, 40%);">+      f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ var MSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     var TestHdlrParams pars := f_gen_test_hdlr_pars();</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_conn := f_start_handler(refers(f_tc_mscpool_L3Compl_on_1_msc), pars);</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%);">+/* Three Layer 3 Complete by IMSI are round-robin'ed across two connected MSCs */</span><br><span style="color: hsl(120, 100%, 40%);">+/* FIXME: each run is using a separate RSLem: RSL, RSL1, RSL2. It should work</span><br><span style="color: hsl(120, 100%, 40%);">+ * just as well using only RSL, and callong f_perform_location_updating() three</span><br><span style="color: hsl(120, 100%, 40%);">+ * times, but that fails. */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_mscpool_L3Complete_by_imsi_round_robin() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     f_init(nr_bts := 3, handler_mode := true, nr_msc := 2);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Control which MSC gets chosen next by the round-robin, otherwise</span><br><span style="color: hsl(120, 100%, 40%);">+    * would be randomly affected by which other tests ran before this. */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_vty_transceive(BSCVTY, "mscpool roundrobin next 0");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    var MSC_ConnHdlr vc_conn1;</span><br><span style="color: hsl(120, 100%, 40%);">+    var TestHdlrParams pars1 := f_gen_test_hdlr_pars(bssap_idx := 0);</span><br><span style="color: hsl(120, 100%, 40%);">+     pars1.mscpool.rsl_idx := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   pars1.mscpool.l3_info := valueof(ts_LU_REQ(LU_Type_IMSI_Attach, valueof(ts_MI_IMSI_LV('001010000000001'H))));</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn1 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars1);</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_conn1.done;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      var MSC_ConnHdlr vc_conn2;</span><br><span style="color: hsl(120, 100%, 40%);">+    var TestHdlrParams pars2 := f_gen_test_hdlr_pars(bssap_idx := 1);</span><br><span style="color: hsl(120, 100%, 40%);">+     pars2.mscpool.rsl_idx := 1;</span><br><span style="color: hsl(120, 100%, 40%);">+   pars2.mscpool.l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_MO_CALL, valueof(ts_MI_IMSI_LV('001010000000002'H))));</span><br><span style="color: hsl(120, 100%, 40%);">+        vc_conn2 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars2);</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_conn2.done;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Test round-robin wrap to the first MSC */</span><br><span style="color: hsl(120, 100%, 40%);">+  var MSC_ConnHdlr vc_conn3;</span><br><span style="color: hsl(120, 100%, 40%);">+    var TestHdlrParams pars3 := f_gen_test_hdlr_pars(bssap_idx := 0);</span><br><span style="color: hsl(120, 100%, 40%);">+     pars3.mscpool.rsl_idx := 2;</span><br><span style="color: hsl(120, 100%, 40%);">+   pars3.mscpool.l3_info := valueof(ts_PAG_RESP(valueof(ts_MI_IMSI_LV('001010000000003'H))));</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_conn3 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars3);</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_conn3.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%);">+/* Three LU by TMSI are round-robin'ed across two connected MSCs, because they contain the NULL-NRI 0</span><br><span style="color: hsl(120, 100%, 40%);">+ * (configured in osmo-bsc.cfg). */</span><br><span style="color: hsl(120, 100%, 40%);">+/* FIXME: each run is using a separate RSLem: RSL, RSL1, RSL2. It should work</span><br><span style="color: hsl(120, 100%, 40%);">+ * just as well using only RSL, and callong f_perform_location_updating() three</span><br><span style="color: hsl(120, 100%, 40%);">+ * times, but that fails. */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_mscpool_LU_by_tmsi_null_nri_0_round_robin() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init(nr_bts := 3, handler_mode := true, nr_msc := 2);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Control which MSC gets chosen next by the round-robin, otherwise</span><br><span style="color: hsl(120, 100%, 40%);">+    * would be randomly affected by which other tests ran before this. */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_vty_transceive(BSCVTY, "mscpool roundrobin next 0");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    var MSC_ConnHdlr vc_conn1;</span><br><span style="color: hsl(120, 100%, 40%);">+    var TestHdlrParams pars1 := f_gen_test_hdlr_pars(bssap_idx := 0);</span><br><span style="color: hsl(120, 100%, 40%);">+     pars1.mscpool.rsl_idx := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   pars1.mscpool.l3_info := valueof(ts_LU_REQ(LU_Type_IMSI_Attach, valueof(ts_MI_TMSI_NRI_LV(0))));</span><br><span style="color: hsl(120, 100%, 40%);">+      vc_conn1 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars1);</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_conn1.done;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      var MSC_ConnHdlr vc_conn2;</span><br><span style="color: hsl(120, 100%, 40%);">+    var TestHdlrParams pars2 := f_gen_test_hdlr_pars(bssap_idx := 1);</span><br><span style="color: hsl(120, 100%, 40%);">+     pars2.mscpool.rsl_idx := 1;</span><br><span style="color: hsl(120, 100%, 40%);">+   pars2.mscpool.l3_info := valueof(ts_LU_REQ(LU_Type_IMSI_Attach, valueof(ts_MI_TMSI_NRI_LV(0))));</span><br><span style="color: hsl(120, 100%, 40%);">+      vc_conn2 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars2);</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_conn2.done;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Test round-robin wrap to the first MSC */</span><br><span style="color: hsl(120, 100%, 40%);">+  var MSC_ConnHdlr vc_conn3;</span><br><span style="color: hsl(120, 100%, 40%);">+    var TestHdlrParams pars3 := f_gen_test_hdlr_pars(bssap_idx := 0);</span><br><span style="color: hsl(120, 100%, 40%);">+     pars3.mscpool.rsl_idx := 2;</span><br><span style="color: hsl(120, 100%, 40%);">+   pars3.mscpool.l3_info := valueof(ts_LU_REQ(LU_Type_IMSI_Attach, valueof(ts_MI_TMSI_NRI_LV(0))));</span><br><span style="color: hsl(120, 100%, 40%);">+      vc_conn3 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars3);</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_conn3.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%);">+/* Three LU by TMSI are round-robin'ed across two connected MSCs, because they contain the NULL-NRI 1</span><br><span style="color: hsl(120, 100%, 40%);">+ * (configured in osmo-bsc.cfg). In this case, one of the MSC also has the NULL-NRI as part of its owned NRIs, but the</span><br><span style="color: hsl(120, 100%, 40%);">+ * NULL-NRI setting is stronger than that. */</span><br><span style="color: hsl(120, 100%, 40%);">+/* FIXME: each run is using a separate RSLem: RSL, RSL1, RSL2. It should work</span><br><span style="color: hsl(120, 100%, 40%);">+ * just as well using only RSL, and callong f_perform_location_updating() three</span><br><span style="color: hsl(120, 100%, 40%);">+ * times, but that fails. */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_mscpool_LU_by_tmsi_null_nri_1_round_robin() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init(nr_bts := 3, handler_mode := true, nr_msc := 2);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Control which MSC gets chosen next by the round-robin, otherwise</span><br><span style="color: hsl(120, 100%, 40%);">+    * would be randomly affected by which other tests ran before this. */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_vty_transceive(BSCVTY, "mscpool roundrobin next 0");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    var MSC_ConnHdlr vc_conn1;</span><br><span style="color: hsl(120, 100%, 40%);">+    var TestHdlrParams pars1 := f_gen_test_hdlr_pars(bssap_idx := 0);</span><br><span style="color: hsl(120, 100%, 40%);">+     pars1.mscpool.rsl_idx := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   pars1.mscpool.l3_info := valueof(ts_LU_REQ(LU_Type_IMSI_Attach, valueof(ts_MI_TMSI_NRI_LV(1))));</span><br><span style="color: hsl(120, 100%, 40%);">+      vc_conn1 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars1);</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_conn1.done;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      var MSC_ConnHdlr vc_conn2;</span><br><span style="color: hsl(120, 100%, 40%);">+    var TestHdlrParams pars2 := f_gen_test_hdlr_pars(bssap_idx := 1);</span><br><span style="color: hsl(120, 100%, 40%);">+     pars2.mscpool.rsl_idx := 1;</span><br><span style="color: hsl(120, 100%, 40%);">+   pars2.mscpool.l3_info := valueof(ts_LU_REQ(LU_Type_IMSI_Attach, valueof(ts_MI_TMSI_NRI_LV(1))));</span><br><span style="color: hsl(120, 100%, 40%);">+      vc_conn2 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars2);</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_conn2.done;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Test round-robin wrap to the first MSC */</span><br><span style="color: hsl(120, 100%, 40%);">+  var MSC_ConnHdlr vc_conn3;</span><br><span style="color: hsl(120, 100%, 40%);">+    var TestHdlrParams pars3 := f_gen_test_hdlr_pars(bssap_idx := 0);</span><br><span style="color: hsl(120, 100%, 40%);">+     pars3.mscpool.rsl_idx := 2;</span><br><span style="color: hsl(120, 100%, 40%);">+   pars3.mscpool.l3_info := valueof(ts_LU_REQ(LU_Type_IMSI_Attach, valueof(ts_MI_TMSI_NRI_LV(1))));</span><br><span style="color: hsl(120, 100%, 40%);">+      vc_conn3 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars3);</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_conn3.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%);">+/* Three Layer 3 Complete by TMSI are round-robin'ed across two connected MSCs, because they contain an NRI not</span><br><span style="color: hsl(120, 100%, 40%);">+ * assigned to any MSC (configured in osmo-bsc.cfg). */</span><br><span style="color: hsl(120, 100%, 40%);">+/* FIXME: each run is using a separate RSLem: RSL, RSL1, RSL2. It should work</span><br><span style="color: hsl(120, 100%, 40%);">+ * just as well using only RSL, and callong f_perform_location_updating() three</span><br><span style="color: hsl(120, 100%, 40%);">+ * times, but that fails. */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_mscpool_L3Complete_by_tmsi_unassigned_nri_round_robin() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init(nr_bts := 3, handler_mode := true, nr_msc := 2);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Control which MSC gets chosen next by the round-robin, otherwise</span><br><span style="color: hsl(120, 100%, 40%);">+    * would be randomly affected by which other tests ran before this. */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_vty_transceive(BSCVTY, "mscpool roundrobin next 0");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    var MSC_ConnHdlr vc_conn1;</span><br><span style="color: hsl(120, 100%, 40%);">+    var TestHdlrParams pars1 := f_gen_test_hdlr_pars(bssap_idx := 0);</span><br><span style="color: hsl(120, 100%, 40%);">+     pars1.mscpool.rsl_idx := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* An NRI that is not assigned to any MSC */</span><br><span style="color: hsl(120, 100%, 40%);">+  pars1.mscpool.l3_info := valueof(ts_ML3_MO_MM_IMSI_DET_Ind(valueof(ts_MI_TMSI_NRI_LV(1023))));</span><br><span style="color: hsl(120, 100%, 40%);">+        vc_conn1 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars1);</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_conn1.done;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      var MSC_ConnHdlr vc_conn2;</span><br><span style="color: hsl(120, 100%, 40%);">+    var TestHdlrParams pars2 := f_gen_test_hdlr_pars(bssap_idx := 1);</span><br><span style="color: hsl(120, 100%, 40%);">+     pars2.mscpool.rsl_idx := 1;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* An NRI that is not assigned to any MSC */</span><br><span style="color: hsl(120, 100%, 40%);">+  pars2.mscpool.l3_info := valueof(ts_LU_REQ(LU_Type_IMSI_Attach, valueof(ts_MI_TMSI_NRI_LV(768))));</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_conn2 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars2);</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_conn2.done;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Test round-robin wrap to the first MSC */</span><br><span style="color: hsl(120, 100%, 40%);">+  var MSC_ConnHdlr vc_conn3;</span><br><span style="color: hsl(120, 100%, 40%);">+    var TestHdlrParams pars3 := f_gen_test_hdlr_pars(bssap_idx := 0);</span><br><span style="color: hsl(120, 100%, 40%);">+     pars3.mscpool.rsl_idx := 2;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* An NRI that is not assigned to any MSC */</span><br><span style="color: hsl(120, 100%, 40%);">+  pars3.mscpool.l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_SS_ACT, valueof(ts_MI_TMSI_NRI_LV(819))));</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_conn3 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars3);</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_conn3.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%);">+/* Three Layer 3 Complete by TMSI are round-robin'ed across two connected MSCs, because they contain an NRI</span><br><span style="color: hsl(120, 100%, 40%);">+ * assigned to an MSC that is currently not connected (configured in osmo-bsc.cfg). */</span><br><span style="color: hsl(120, 100%, 40%);">+/* FIXME: each run is using a separate RSLem: RSL, RSL1, RSL2. It should work</span><br><span style="color: hsl(120, 100%, 40%);">+ * just as well using only RSL, and callong f_perform_location_updating() three</span><br><span style="color: hsl(120, 100%, 40%);">+ * times, but that fails. */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_mscpool_L3Complete_by_tmsi_valid_nri_msc_not_connected_round_robin() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init(nr_bts := 3, handler_mode := true, nr_msc := 2);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Control which MSC gets chosen next by the round-robin, otherwise</span><br><span style="color: hsl(120, 100%, 40%);">+    * would be randomly affected by which other tests ran before this. */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_vty_transceive(BSCVTY, "mscpool roundrobin next 0");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    var MSC_ConnHdlr vc_conn1;</span><br><span style="color: hsl(120, 100%, 40%);">+    var TestHdlrParams pars1 := f_gen_test_hdlr_pars(bssap_idx := 0);</span><br><span style="color: hsl(120, 100%, 40%);">+     pars1.mscpool.rsl_idx := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* An NRI that is assigned to an unconnected MSC */</span><br><span style="color: hsl(120, 100%, 40%);">+   pars1.mscpool.l3_info := valueof(ts_PAG_RESP(valueof(ts_MI_TMSI_NRI_LV(512))));</span><br><span style="color: hsl(120, 100%, 40%);">+       vc_conn1 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars1);</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_conn1.done;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      var MSC_ConnHdlr vc_conn2;</span><br><span style="color: hsl(120, 100%, 40%);">+    var TestHdlrParams pars2 := f_gen_test_hdlr_pars(bssap_idx := 1);</span><br><span style="color: hsl(120, 100%, 40%);">+     pars2.mscpool.rsl_idx := 1;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* An NRI that is assigned to an unconnected MSC */</span><br><span style="color: hsl(120, 100%, 40%);">+   pars2.mscpool.l3_info := valueof(ts_ML3_MO_MM_IMSI_DET_Ind(valueof(ts_MI_TMSI_NRI_LV(767))));</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn2 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars2);</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_conn2.done;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Test round-robin wrap to the first MSC */</span><br><span style="color: hsl(120, 100%, 40%);">+  var MSC_ConnHdlr vc_conn3;</span><br><span style="color: hsl(120, 100%, 40%);">+    var TestHdlrParams pars3 := f_gen_test_hdlr_pars(bssap_idx := 0);</span><br><span style="color: hsl(120, 100%, 40%);">+     pars3.mscpool.rsl_idx := 2;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* An NRI that is assigned to an unconnected MSC */</span><br><span style="color: hsl(120, 100%, 40%);">+   pars3.mscpool.l3_info := valueof(ts_LU_REQ(LU_Type_IMSI_Attach, valueof(ts_MI_TMSI_NRI_LV(750))));</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_conn3 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars3);</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_conn3.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%);">+/* Three Layer 3 Complete by TMSI with valid NRI for the second MSC are all directed to the second MSC (configured in</span><br><span style="color: hsl(120, 100%, 40%);">+ * osmo-bsc.cfg). */</span><br><span style="color: hsl(120, 100%, 40%);">+/* FIXME: each run is using a separate RSLem: RSL, RSL1, RSL2. It should work</span><br><span style="color: hsl(120, 100%, 40%);">+ * just as well using only RSL, and callong f_perform_location_updating() three</span><br><span style="color: hsl(120, 100%, 40%);">+ * times, but that fails. */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_mscpool_L3Complete_by_tmsi_valid_nri_1() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init(nr_bts := 3, handler_mode := true, nr_msc := 2);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* All TMSIs in this test point at the second MSC, set the round robin to point at the first MSC to make sure</span><br><span style="color: hsl(120, 100%, 40%);">+  * this is not using round-robin. */</span><br><span style="color: hsl(120, 100%, 40%);">+  f_vty_transceive(BSCVTY, "mscpool roundrobin next 0");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    var MSC_ConnHdlr vc_conn1;</span><br><span style="color: hsl(120, 100%, 40%);">+    var TestHdlrParams pars1 := f_gen_test_hdlr_pars(bssap_idx := 1);</span><br><span style="color: hsl(120, 100%, 40%);">+     pars1.mscpool.rsl_idx := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* An NRI of the second MSC's range (256-511) */</span><br><span style="color: hsl(120, 100%, 40%);">+  pars1.mscpool.l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_MO_SMS, valueof(ts_MI_TMSI_NRI_LV(256))));</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_conn1 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars1);</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_conn1.done;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      var MSC_ConnHdlr vc_conn2;</span><br><span style="color: hsl(120, 100%, 40%);">+    var TestHdlrParams pars2 := f_gen_test_hdlr_pars(bssap_idx := 1);</span><br><span style="color: hsl(120, 100%, 40%);">+     pars2.mscpool.rsl_idx := 1;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* An NRI of the second MSC's range (256-511) */</span><br><span style="color: hsl(120, 100%, 40%);">+  pars2.mscpool.l3_info := valueof(ts_PAG_RESP(valueof(ts_MI_TMSI_NRI_LV(260))));</span><br><span style="color: hsl(120, 100%, 40%);">+       vc_conn2 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars2);</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_conn2.done;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      var MSC_ConnHdlr vc_conn3;</span><br><span style="color: hsl(120, 100%, 40%);">+    var TestHdlrParams pars3 := f_gen_test_hdlr_pars(bssap_idx := 1);</span><br><span style="color: hsl(120, 100%, 40%);">+     pars3.mscpool.rsl_idx := 2;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* An NRI of the second MSC's range (256-511) */</span><br><span style="color: hsl(120, 100%, 40%);">+  pars3.mscpool.l3_info := valueof(ts_ML3_MO_MM_IMSI_DET_Ind(valueof(ts_MI_TMSI_NRI_LV(511))));</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn3 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars3);</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_conn3.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%);">+/* Layer 3 Complete by TMSI with valid NRI for the third MSC are directed to the third MSC (configured in osmo-bsc.cfg),</span><br><span style="color: hsl(120, 100%, 40%);">+ * while a round-robin remains unaffected by that. */</span><br><span style="color: hsl(120, 100%, 40%);">+/* FIXME: each run is using a separate RSLem: RSL, RSL1, RSL2. It should work</span><br><span style="color: hsl(120, 100%, 40%);">+ * just as well using only RSL, and callong f_perform_location_updating() three</span><br><span style="color: hsl(120, 100%, 40%);">+ * times, but that fails. */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_mscpool_L3Complete_by_tmsi_valid_nri_2() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  f_init(nr_bts := 3, handler_mode := true, nr_msc := 3);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* All TMSIs in this test point at the third MSC, set the round robin to point at the second MSC to make sure</span><br><span style="color: hsl(120, 100%, 40%);">+  * this is not using round-robin. */</span><br><span style="color: hsl(120, 100%, 40%);">+  f_vty_transceive(BSCVTY, "mscpool roundrobin next 1");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    var MSC_ConnHdlr vc_conn1;</span><br><span style="color: hsl(120, 100%, 40%);">+    var TestHdlrParams pars1 := f_gen_test_hdlr_pars(bssap_idx := 2);</span><br><span style="color: hsl(120, 100%, 40%);">+     pars1.mscpool.rsl_idx := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* An NRI of the third MSC's range (512-767) */</span><br><span style="color: hsl(120, 100%, 40%);">+   pars1.mscpool.l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_MO_SMS, valueof(ts_MI_TMSI_NRI_LV(512))));</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_conn1 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars1);</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_conn1.done;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      var MSC_ConnHdlr vc_conn2;</span><br><span style="color: hsl(120, 100%, 40%);">+    var TestHdlrParams pars2 := f_gen_test_hdlr_pars(bssap_idx := 2);</span><br><span style="color: hsl(120, 100%, 40%);">+     pars2.mscpool.rsl_idx := 1;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* An NRI of the third MSC's range (512-767) */</span><br><span style="color: hsl(120, 100%, 40%);">+   pars2.mscpool.l3_info := valueof(ts_PAG_RESP(valueof(ts_MI_TMSI_NRI_LV(678))));</span><br><span style="color: hsl(120, 100%, 40%);">+       vc_conn2 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars2);</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_conn2.done;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* The above forwardings to third MSC have not affected the round robin, which still points at the second MSC */</span><br><span style="color: hsl(120, 100%, 40%);">+      var MSC_ConnHdlr vc_conn3;</span><br><span style="color: hsl(120, 100%, 40%);">+    var TestHdlrParams pars3 := f_gen_test_hdlr_pars(bssap_idx := 1);</span><br><span style="color: hsl(120, 100%, 40%);">+     pars3.mscpool.rsl_idx := 2;</span><br><span style="color: hsl(120, 100%, 40%);">+   pars3.mscpool.l3_info := valueof(ts_LU_REQ(LU_Type_IMSI_Attach, valueof(ts_MI_IMSI_LV('001010000000013'H))));</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn3 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars3);</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_conn3.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%);">+/* Make sure that whichever MSC paged a subscriber will also get the Paging Response. Page by IMSI, which would be</span><br><span style="color: hsl(120, 100%, 40%);">+ * round-robined to another MSC, to make sure the Paging->Response relation is stronger than the NRI->MSC mapping. */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_mscpool_paging_imsi(charstring id) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ var template BSSMAP_FIELD_CellIdentificationList cid_list := { cIl_CI := { ts_BSSMAP_CI_CI(0) } };</span><br><span style="color: hsl(120, 100%, 40%);">+    //cid_list := { cIl_allInBSS := ''O };</span><br><span style="color: hsl(120, 100%, 40%);">+        var RSL_ChanNeeded rsl_chneed := RSL_CHANNEED_SDCCH;</span><br><span style="color: hsl(120, 100%, 40%);">+  var template BSSMAP_IE_ChannelNeeded bssmap_chneed := ts_BSSMAP_IE_ChanNeeded(int2bit(enum2int(valueof(rsl_chneed)),2));</span><br><span style="color: hsl(120, 100%, 40%);">+      var BSSAP_N_UNITDATA_req paging;</span><br><span style="color: hsl(120, 100%, 40%);">+      var hexstring imsi := '001010000000123'H;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_MscConnHdlr_init(g_pars.media_nr, "127.0.0.2", "127.0.0.3", FR_AMR);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  paging := valueof(ts_BSSAP_UNITDATA_req(g_pars.mscpool.sccp_addr_bsc, g_pars.mscpool.sccp_addr_msc,</span><br><span style="color: hsl(120, 100%, 40%);">+                                           valueof(ts_BSSMAP_Paging(imsi, cid_list, omit, bssmap_chneed))));</span><br><span style="color: hsl(120, 100%, 40%);">+     BSSAP.send(paging);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Register any RSL conn so that the Paging Command gets received here. With the current RSL_Emulation's main()</span><br><span style="color: hsl(120, 100%, 40%);">+    * handling of '[bts_role] IPA_PT.receive(tr_ASP_RSL_UD(tr_RSL_PAGING_CMD()))' it doesn't matter at all which</span><br><span style="color: hsl(120, 100%, 40%);">+      * channel number is picked here. */</span><br><span style="color: hsl(120, 100%, 40%);">+  var RslChannelNr new_chan_nr := valueof(t_RslChanNr0(0, RSL_CHAN_NR_INVALID));</span><br><span style="color: hsl(120, 100%, 40%);">+        f_rslem_register(0, new_chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+     RSL.receive(tr_RSL_PAGING_CMD(tr_MI_IMSI(imsi)));</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rslem_unregister(0, new_chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Despite the round robin pointing at the second MSC ('roundrobin next 1'), the earlier Paging for the same IMSI</span><br><span style="color: hsl(120, 100%, 40%);">+      * causes this Paging Response to go to the first MSC (bssap_idx := 0). */</span><br><span style="color: hsl(120, 100%, 40%);">+    f_perform_compl_l3( ts_PAG_RESP(valueof(ts_MI_IMSI_LV(imsi))) );</span><br><span style="color: hsl(120, 100%, 40%);">+      setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_mscpool_paging_and_response_imsi() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    f_init(nr_bts := 1, handler_mode := true, nr_msc := 3);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Testing a Paging on the first MSC to get a Paging Response back to the first MSC. Set round robin to the</span><br><span style="color: hsl(120, 100%, 40%);">+    * second MSC to make sure we're getting the Paging logic, not a coincidental round robin match. */</span><br><span style="color: hsl(120, 100%, 40%);">+       f_vty_transceive(BSCVTY, "mscpool roundrobin next 1");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    var MSC_ConnHdlr vc_conn1;</span><br><span style="color: hsl(120, 100%, 40%);">+    var TestHdlrParams pars1 := f_gen_test_hdlr_pars(bssap_idx := 0);</span><br><span style="color: hsl(120, 100%, 40%);">+     pars1.mscpool.rsl_idx := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   pars1.mscpool.sccp_addr_bsc := g_bssap[pars1.mscpool.bssap_idx].sccp_addr_peer;</span><br><span style="color: hsl(120, 100%, 40%);">+       pars1.mscpool.sccp_addr_msc := g_bssap[pars1.mscpool.bssap_idx].sccp_addr_own;</span><br><span style="color: hsl(120, 100%, 40%);">+        vc_conn1 := f_start_handler(refers(f_tc_mscpool_paging_imsi), pars1);</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn1.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%);">+/* Make sure that whichever MSC paged a subscriber will also get the Paging Response.  Page by TMSI with an NRI value</span><br><span style="color: hsl(120, 100%, 40%);">+ * that matches a different MSC, to make sure the Paging->Response relation is stronger than the NRI->MSC mapping. */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_mscpool_paging_tmsi(charstring id) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+      var template BSSMAP_FIELD_CellIdentificationList cid_list := { cIl_CI := { ts_BSSMAP_CI_CI(0) } };</span><br><span style="color: hsl(120, 100%, 40%);">+    //cid_list := { cIl_allInBSS := ''O };</span><br><span style="color: hsl(120, 100%, 40%);">+        var RSL_ChanNeeded rsl_chneed := RSL_CHANNEED_SDCCH;</span><br><span style="color: hsl(120, 100%, 40%);">+  var template BSSMAP_IE_ChannelNeeded bssmap_chneed := ts_BSSMAP_IE_ChanNeeded(int2bit(enum2int(valueof(rsl_chneed)),2));</span><br><span style="color: hsl(120, 100%, 40%);">+      var integer nri_v := 300; /* <-- second MSC's NRI */</span><br><span style="color: hsl(120, 100%, 40%);">+   var octetstring tmsi := f_tmsi_nri(nri_v);</span><br><span style="color: hsl(120, 100%, 40%);">+    var BSSAP_N_UNITDATA_req paging;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    f_MscConnHdlr_init(g_pars.media_nr, "127.0.0.2", "127.0.0.3", FR_AMR);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  paging := valueof(ts_BSSAP_UNITDATA_req(g_pars.mscpool.sccp_addr_bsc, g_pars.mscpool.sccp_addr_msc,</span><br><span style="color: hsl(120, 100%, 40%);">+                                           valueof(ts_BSSMAP_Paging('001010000000011'H, cid_list, tmsi, bssmap_chneed))));</span><br><span style="color: hsl(120, 100%, 40%);">+       BSSAP.send(paging);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Register any RSL conn so that the Paging Command gets received here. With the current RSL_Emulation's main()</span><br><span style="color: hsl(120, 100%, 40%);">+    * handling of '[bts_role] IPA_PT.receive(tr_ASP_RSL_UD(tr_RSL_PAGING_CMD()))' it doesn't matter at all which</span><br><span style="color: hsl(120, 100%, 40%);">+      * channel number is picked here. */</span><br><span style="color: hsl(120, 100%, 40%);">+  var RslChannelNr new_chan_nr := valueof(t_RslChanNr0(0, RSL_CHAN_NR_INVALID));</span><br><span style="color: hsl(120, 100%, 40%);">+        f_rslem_register(0, new_chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+     RSL.receive(tr_RSL_PAGING_CMD(t_MI_TMSI(tmsi)));</span><br><span style="color: hsl(120, 100%, 40%);">+      f_rslem_unregister(0, new_chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Despite the NRI matching the second MSC (NRI from 'msc 1' in osmo-bsc.cfg) and round robin pointing at the</span><br><span style="color: hsl(120, 100%, 40%);">+  * third MSC ('roundrobin next 2'), the earlier Paging for the same TMSI causes this Paging Response to go to</span><br><span style="color: hsl(120, 100%, 40%);">+  * the first MSC (bssap_idx := 0). */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_compl_l3( ts_PAG_RESP(valueof(ts_MI_TMSI_NRI_LV(nri_v))) );</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_mscpool_paging_and_response_tmsi() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    f_init(nr_bts := 1, handler_mode := true, nr_msc := 3);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Testing a Paging on the first MSC to get a Paging Response back to the first MSC. Set round robin to the</span><br><span style="color: hsl(120, 100%, 40%);">+    * third MSC to make sure we're getting the Paging logic, not a coincidental round robin match. */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_vty_transceive(BSCVTY, "mscpool roundrobin next 2");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    var MSC_ConnHdlr vc_conn1;</span><br><span style="color: hsl(120, 100%, 40%);">+    var TestHdlrParams pars1 := f_gen_test_hdlr_pars(bssap_idx := 0);</span><br><span style="color: hsl(120, 100%, 40%);">+     pars1.mscpool.rsl_idx := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   pars1.mscpool.sccp_addr_bsc := g_bssap[pars1.mscpool.bssap_idx].sccp_addr_peer;</span><br><span style="color: hsl(120, 100%, 40%);">+       pars1.mscpool.sccp_addr_msc := g_bssap[pars1.mscpool.bssap_idx].sccp_addr_own;</span><br><span style="color: hsl(120, 100%, 40%);">+        vc_conn1 := f_start_handler(refers(f_tc_mscpool_paging_tmsi), pars1);</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn1.done;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Dyn PDCH todo:</span><br><span>    * activate OSMO as TCH/F</span><br><span>    * activate OSMO as TCH/H</span><br><span>@@ -4614,10 +5324,22 @@</span><br><span> </span><br><span>         /* Power control related */</span><br><span>  execute( TC_assignment_verify_ms_power_params_ie() );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* MSC pooling */</span><br><span style="color: hsl(120, 100%, 40%);">+     execute( TC_mscpool_L3Compl_on_1_msc() );</span><br><span style="color: hsl(120, 100%, 40%);">+     execute( TC_mscpool_L3Complete_by_imsi_round_robin() );</span><br><span style="color: hsl(120, 100%, 40%);">+       execute( TC_mscpool_LU_by_tmsi_null_nri_0_round_robin() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_mscpool_LU_by_tmsi_null_nri_1_round_robin() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_mscpool_L3Complete_by_tmsi_unassigned_nri_round_robin() );</span><br><span style="color: hsl(120, 100%, 40%);">+        execute( TC_mscpool_L3Complete_by_tmsi_valid_nri_msc_not_connected_round_robin() );</span><br><span style="color: hsl(120, 100%, 40%);">+   execute( TC_mscpool_L3Complete_by_tmsi_valid_nri_1() );</span><br><span style="color: hsl(120, 100%, 40%);">+       execute( TC_mscpool_L3Complete_by_tmsi_valid_nri_2() );</span><br><span style="color: hsl(120, 100%, 40%);">+       execute( TC_mscpool_paging_and_response_imsi() );</span><br><span style="color: hsl(120, 100%, 40%);">+     execute( TC_mscpool_paging_and_response_tmsi() );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* at bottom as they might crash OsmoBSC before OS#3182 is fixed */</span><br><span>  execute( TC_early_conn_fail() );</span><br><span>     execute( TC_late_conn_fail() );</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> }</span><br><span> </span><br><span> }</span><br><span>diff --git a/bsc/MSC_ConnectionHandler.ttcn b/bsc/MSC_ConnectionHandler.ttcn</span><br><span>index 593f4d6..fece825 100644</span><br><span>--- a/bsc/MSC_ConnectionHandler.ttcn</span><br><span>+++ b/bsc/MSC_ConnectionHandler.ttcn</span><br><span>@@ -482,7 +482,7 @@</span><br><span> }</span><br><span> </span><br><span> /* register an expect with the BSSMAP core */</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_create_bssmap_exp(octetstring l3_enc) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+function f_create_bssmap_exp(octetstring l3_enc) runs on MSC_ConnHdlr {</span><br><span>   RAN.call(RAN_register:{l3_enc, self}) {</span><br><span>              [] RAN.getreply(RAN_register:{?, ?}) {};</span><br><span>     }</span><br><span>@@ -516,6 +516,8 @@</span><br><span> </span><br><span> type record TestHdlrParamsMSCPool {</span><br><span>   integer bssap_idx,</span><br><span style="color: hsl(120, 100%, 40%);">+    SCCP_PAR_Address sccp_addr_msc optional,</span><br><span style="color: hsl(120, 100%, 40%);">+      SCCP_PAR_Address sccp_addr_bsc optional,</span><br><span>     integer rsl_idx,</span><br><span>     PDU_ML3_MS_NW l3_info optional</span><br><span> }</span><br><span>@@ -566,6 +568,8 @@</span><br><span>    use_osmux := false,</span><br><span>  mscpool := {</span><br><span>                 bssap_idx := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+               sccp_addr_msc := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                sccp_addr_bsc := omit,</span><br><span>               rsl_idx := 0,</span><br><span>                l3_info := omit</span><br><span>      }</span><br><span>diff --git a/library/L3_Templates.ttcn b/library/L3_Templates.ttcn</span><br><span>index ba91180..d36f9dc 100644</span><br><span>--- a/library/L3_Templates.ttcn</span><br><span>+++ b/library/L3_Templates.ttcn</span><br><span>@@ -278,6 +278,77 @@</span><br><span>    }</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+template LocationUpdatingType LU_Type_Normal := {</span><br><span style="color: hsl(120, 100%, 40%);">+        lut := '00'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ spare1_1 := '0'B,</span><br><span style="color: hsl(120, 100%, 40%);">+     fop := '0'B</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%);">+template LocationUpdatingType LU_Type_Periodic := {</span><br><span style="color: hsl(120, 100%, 40%);">+        lut := '01'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ spare1_1 := '0'B,</span><br><span style="color: hsl(120, 100%, 40%);">+     fop := '0'B</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%);">+template LocationUpdatingType LU_Type_IMSI_Attach := {</span><br><span style="color: hsl(120, 100%, 40%);">+     lut := '10'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ spare1_1 := '0'B,</span><br><span style="color: hsl(120, 100%, 40%);">+     fop := '0'B</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%);">+/* Send template for LOCATION UPDATING REQUEST */</span><br><span style="color: hsl(120, 100%, 40%);">+template PDU_ML3_MS_NW ts_LU_REQ(template LocationUpdatingType lu_type, MobileIdentityLV mi_lv) := {</span><br><span style="color: hsl(120, 100%, 40%);">+    discriminator := '0000'B, /* overwritten */</span><br><span style="color: hsl(120, 100%, 40%);">+   tiOrSkip := {</span><br><span style="color: hsl(120, 100%, 40%);">+         skipIndicator := '0000'B</span><br><span style="color: hsl(120, 100%, 40%);">+      },</span><br><span style="color: hsl(120, 100%, 40%);">+    msgs := {</span><br><span style="color: hsl(120, 100%, 40%);">+             mm := {</span><br><span style="color: hsl(120, 100%, 40%);">+                       locationUpdateRequest := {</span><br><span style="color: hsl(120, 100%, 40%);">+                            messageType := '000000'B, /* overwritten */</span><br><span style="color: hsl(120, 100%, 40%);">+                           nsd := '00'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                         locationUpdatingType := lu_type,</span><br><span style="color: hsl(120, 100%, 40%);">+                              cipheringKeySequenceNumber := { '000'B, '0'B },</span><br><span style="color: hsl(120, 100%, 40%);">+                               locationAreaIdentification := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                               mcc_mnc := '123456'O,</span><br><span style="color: hsl(120, 100%, 40%);">+                                         lac := '172A'O</span><br><span style="color: hsl(120, 100%, 40%);">+                                        },</span><br><span style="color: hsl(120, 100%, 40%);">+                            mobileStationClassmark1 := ts_CM1,</span><br><span style="color: hsl(120, 100%, 40%);">+                            mobileIdentityLV := mi_lv,</span><br><span style="color: hsl(120, 100%, 40%);">+                            classmarkInformationType2_forUMTS := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                            additionalUpdateParameterTV := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                          deviceProperties := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                             mS_NetworkFeatureSupport := omit</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 style="color: hsl(120, 100%, 40%);">+template PDU_ML3_NW_MS ts_LU_ACCEPT(template MobileIdentityTLV mi_tlv := omit) := {</span><br><span style="color: hsl(120, 100%, 40%);">+   discriminator := '0000'B, /* overwritten */</span><br><span style="color: hsl(120, 100%, 40%);">+   tiOrSkip := {</span><br><span style="color: hsl(120, 100%, 40%);">+         skipIndicator := '0000'B</span><br><span style="color: hsl(120, 100%, 40%);">+      },</span><br><span style="color: hsl(120, 100%, 40%);">+    msgs := {</span><br><span style="color: hsl(120, 100%, 40%);">+             mm := {</span><br><span style="color: hsl(120, 100%, 40%);">+                       locationUpdateAccept := {</span><br><span style="color: hsl(120, 100%, 40%);">+                             messageType := '000000'B, /* overwritten */</span><br><span style="color: hsl(120, 100%, 40%);">+                           nsd := '00'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                         locationAreaIdentification := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                               mcc_mnc := '123456'O,</span><br><span style="color: hsl(120, 100%, 40%);">+                                         lac := '172A'O</span><br><span style="color: hsl(120, 100%, 40%);">+                                        },</span><br><span style="color: hsl(120, 100%, 40%);">+                            mobileIdentityTLV := mi_tlv,</span><br><span style="color: hsl(120, 100%, 40%);">+                          followOnProceed := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                              cTS_Permission := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                               equivalentPLMNs := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                              emergencyNumberList := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                          perMS_T3212 := omit</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> /* Send template for CM SERVICE REQUEST */</span><br><span> template (value) PDU_ML3_MS_NW ts_CM_SERV_REQ(CmServiceType serv_type, MobileIdentityLV mi_lv) := {</span><br><span>  discriminator := '0000'B, /* overwritten */</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/18763">change 18763</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/+/18763"/><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: I21cbab193cd0de2e5692665442eae113d5f61904 </div>
<div style="display:none"> Gerrit-Change-Number: 18763 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>