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

</div><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, 736 insertions(+), 3 deletions(-)<br><br></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 364254c..377b193 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>@@ -4445,6 +4454,628 @@</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(base_tmsi) + 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(RSL_DCHAN_PT rsl) 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_compl_l3(RSL_DCHAN_PT rsl, 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%);">+  * This is basically code dup with s/RSL/rsl from:</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%);">+     */</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%);">+        * Code dup with s/RSL/rsl from:</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%);">+  */</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(rsl);</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(RSL, 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(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(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(RSL, ts_LU_REQ(LU_Type_IMSI_Attach, valueof(ts_MI_IMSI_LV('001010000000001'H)), '00F110'O) );</span><br><span style="color: hsl(120, 100%, 40%);">+      f_perform_compl_l3(RSL, 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(RSL, ts_PAG_RESP(valueof(ts_MI_IMSI_LV('001010000000003'H))) );</span><br><span style="color: hsl(120, 100%, 40%);">+    f_perform_compl_l3(RSL, 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. */</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)), '00F110'O));</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. */</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)), '00F110'O));</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)), '00F110'O));</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)), '00F110'O));</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. */</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)), '00F110'O));</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)), '00F110'O));</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)), '00F110'O));</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. */</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)), '00F110'O));</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. */</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)), '00F110'O));</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. */</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_LU_REQ(LU_Type_IMSI_Attach, valueof(ts_MI_TMSI_NRI_LV(511)), '00F110'O));</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. */</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)), '00F110'O));</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%);">+/* LU with a TMSI but indicating a different PLMN in its previous LAI: ignore the NRI. */</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. */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_mscpool_LU_by_tmsi_from_other_PLMN() 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%);">+       /* The TMSIs in this test points at the second MSC, but since it is from a different PLMN, round-robin is used</span><br><span style="color: hsl(120, 100%, 40%);">+         * instead, and hits msc 0. */</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%);">+    /* An NRI of the second MSC's range (256-511), but a PLMN that doesn't match with osmo-bsc.cfg */</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(260)), '99F999'O));</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%);">+      /* An NRI of the third MSC's range (512-767) and a matching PLMN gets directed by NRI. */</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%);">+   pars2.mscpool.l3_info := valueof(ts_LU_REQ(LU_Type_IMSI_Attach, valueof(ts_MI_TMSI_NRI_LV(555)), '00F110'O));</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%);">+</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(RSL, 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(RSL, 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 style="color: hsl(120, 100%, 40%);">+/* For round-robin, skip an MSC that has 'no allow-attach' set. */</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. */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_mscpool_no_allow_attach_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 := 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%);">+       /* 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%);">+    /* Mark the second MSC as offloading, round-robin should skip this MSC now. */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_vty_enter_cfg_msc(BSCVTY, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_vty_transceive(BSCVTY, "no allow-attach");</span><br><span style="color: hsl(120, 100%, 40%);">+        f_vty_transceive(BSCVTY, "exit");</span><br><span style="color: hsl(120, 100%, 40%);">+   f_vty_transceive(BSCVTY, "exit");</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)), '00F110'O));</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%);">+   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%);">+      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%);">+      f_vty_enter_cfg_msc(BSCVTY, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_vty_transceive(BSCVTY, "allow-attach");</span><br><span style="color: hsl(120, 100%, 40%);">+   f_vty_transceive(BSCVTY, "exit");</span><br><span style="color: hsl(120, 100%, 40%);">+   f_vty_transceive(BSCVTY, "exit");</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%);">+/* An MSC that has 'no allow-attach' set should still serve subscribers that are already attached according to their</span><br><span style="color: hsl(120, 100%, 40%);">+ * TMSI NRI. */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_mscpool_no_allow_attach_valid_nri() 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%);">+       /* 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%);">+    /* Mark the second MSC as offloading, round-robin should skip this MSC now. */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_vty_enter_cfg_msc(BSCVTY, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_vty_transceive(BSCVTY, "no allow-attach");</span><br><span style="color: hsl(120, 100%, 40%);">+        f_vty_transceive(BSCVTY, "exit");</span><br><span style="color: hsl(120, 100%, 40%);">+   f_vty_transceive(BSCVTY, "exit");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Round robin points at msc 0, but the valid NRI directs to msc 1, even though msc 1 has 'no allow-attach'. */</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_CALL, valueof(ts_MI_TMSI_NRI_LV(260))));</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 := 0);</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%);">+      var MSC_ConnHdlr vc_conn3;</span><br><span style="color: hsl(120, 100%, 40%);">+    var TestHdlrParams pars3 := f_gen_test_hdlr_pars(bssap_idx := 2);</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_CM_SERV_REQ(CM_TYPE_MO_CALL, 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%);">+      f_vty_enter_cfg_msc(BSCVTY, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_vty_transceive(BSCVTY, "allow-attach");</span><br><span style="color: hsl(120, 100%, 40%);">+   f_vty_transceive(BSCVTY, "exit");</span><br><span style="color: hsl(120, 100%, 40%);">+   f_vty_transceive(BSCVTY, "exit");</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>@@ -4616,6 +5247,28 @@</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%);">+     /* FIXME: in SCCPlite, indicating how many MSCs should be connected does currently not work. Since</span><br><span style="color: hsl(120, 100%, 40%);">+     * RESET->RESET-ACK is unconditionally negotiated for all configured MSCs, they always all appear as connected</span><br><span style="color: hsl(120, 100%, 40%);">+      * to osmo-bsc. The MSC pooling tests however require disconnecting selected MSCs, and hence don't work out as</span><br><span style="color: hsl(120, 100%, 40%);">+     * intended on SCCPlite. So for now, run these only for SCCP/M3UA. */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (mp_bssap_cfg[0].transport == BSSAP_TRANSPORT_AoIP) {</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_LU_by_tmsi_from_other_PLMN() );</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%);">+             execute( TC_mscpool_no_allow_attach_round_robin() );</span><br><span style="color: hsl(120, 100%, 40%);">+          execute( TC_mscpool_no_allow_attach_valid_nri() );</span><br><span style="color: hsl(120, 100%, 40%);">+    }</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>diff --git a/bsc/MSC_ConnectionHandler.ttcn b/bsc/MSC_ConnectionHandler.ttcn</span><br><span>index feedc6f..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>@@ -515,7 +515,11 @@</span><br><span> }</span><br><span> </span><br><span> type record TestHdlrParamsMSCPool {</span><br><span style="color: hsl(0, 100%, 40%);">-        integer bssap_idx</span><br><span style="color: hsl(120, 100%, 40%);">+     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 style="color: hsl(120, 100%, 40%);">+      integer rsl_idx,</span><br><span style="color: hsl(120, 100%, 40%);">+      PDU_ML3_MS_NW l3_info optional</span><br><span> }</span><br><span> </span><br><span> type record TestHdlrParams {</span><br><span>@@ -563,7 +567,11 @@</span><br><span>       aoip := true,</span><br><span>        use_osmux := false,</span><br><span>  mscpool := {</span><br><span style="color: hsl(0, 100%, 40%);">-            bssap_idx := 0</span><br><span style="color: hsl(120, 100%, 40%);">+                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 style="color: hsl(120, 100%, 40%);">+                rsl_idx := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+         l3_info := omit</span><br><span>      }</span><br><span> }</span><br><span> </span><br><span>diff --git a/library/L3_Templates.ttcn b/library/L3_Templates.ttcn</span><br><span>index ba91180..8b09572 100644</span><br><span>--- a/library/L3_Templates.ttcn</span><br><span>+++ b/library/L3_Templates.ttcn</span><br><span>@@ -278,6 +278,78 @@</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%);">+                          OCT3 mcc_mnc := '123456'O) := {</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 := mcc_mnc,</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: 9 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>