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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gpborxy: Implement variety of paging tests for PS-PAGING and CS-PAGING<br><br>Change-Id: Ida44b62dfdb9c4ce2755de63d51a9907d34f247f<br>---<br>M gbproxy/GBProxy_Tests.ttcn<br>M library/Osmocom_Gb_Types.ttcn<br>2 files changed, 578 insertions(+), 7 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/gbproxy/GBProxy_Tests.ttcn b/gbproxy/GBProxy_Tests.ttcn</span><br><span>index 1cb841f..5e4555d 100644</span><br><span>--- a/gbproxy/GBProxy_Tests.ttcn</span><br><span>+++ b/gbproxy/GBProxy_Tests.ttcn</span><br><span>@@ -153,9 +153,9 @@</span><br><span>                                           ra_id := {</span><br><span>                                                   lai := {</span><br><span>                                                             mcc_mnc := c_mcc_mnc,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                           lac := 13200</span><br><span style="color: hsl(120, 100%, 40%);">+                                                          lac := 13135</span><br><span>                                                         },</span><br><span style="color: hsl(0, 100%, 40%);">-                                                      rac := 0</span><br><span style="color: hsl(120, 100%, 40%);">+                                                      rac := 1</span><br><span>                                             },</span><br><span>                                           cell_id := 20961</span><br><span>                                     },</span><br><span>@@ -225,6 +225,8 @@</span><br><span>     port BSSGP_PROC_PT PCU_PROC[NUM_PCU];</span><br><span>        /* component reference to the component to which we're currently connected */</span><br><span>    var BSSGP_BVC_CT pcu_ct[NUM_PCU];</span><br><span style="color: hsl(120, 100%, 40%);">+     /* BSSGP BVC configuration of the component to which we're currently connected */</span><br><span style="color: hsl(120, 100%, 40%);">+ var BssgpBvcConfig pcu_bvc_cfg[NUM_PCU];</span><br><span> </span><br><span>         /* array of per-BVC ports on the SGSN side */</span><br><span>        port BSSGP_PT SGSN[NUM_SGSN];</span><br><span>@@ -236,6 +238,8 @@</span><br><span>  var BSSGP_ConnHdlrPars g_pars;</span><br><span>       timer g_Tguard;</span><br><span>      var LLC_Entities llc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       var ro_integer g_roi := {};</span><br><span> }</span><br><span> </span><br><span> type record SGSN_ConnHdlrNetworkPars {</span><br><span>@@ -448,7 +452,9 @@</span><br><span> }</span><br><span> </span><br><span> /* Connect the PCU-side per-BVC ports (PCU/PCU_SIG/PCU_PROC) array slot 'port_idx' to specified per-BVC component */</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_connect_to_pcu_bvc(integer port_idx, BSSGP_BVC_CT bvc_ct) runs on BSSGP_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_connect_to_pcu_bvc(integer port_idx, integer nse_idx, integer bvc_idx)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on BSSGP_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+       var BSSGP_BVC_CT bvc_ct := g_pars.pcu[nse_idx].vc_BSSGP_BVC[bvc_idx]</span><br><span>         if (PCU[port_idx].checkstate("Connected")) {</span><br><span>               /* unregister + disconnect from old BVC */</span><br><span>           f_client_unregister(g_pars.imsi, PCU_PROC[port_idx]);</span><br><span>@@ -462,6 +468,7 @@</span><br><span>  connect(self:PCU_PROC[port_idx], bvc_ct:BSSGP_PROC);</span><br><span>         f_client_register(g_pars.imsi, g_pars.tlli, PCU_PROC[port_idx]);</span><br><span>     pcu_ct[port_idx] := bvc_ct;</span><br><span style="color: hsl(120, 100%, 40%);">+   pcu_bvc_cfg[port_idx] := g_pars.pcu[nse_idx].cfg.bvc[bvc_idx];</span><br><span> }</span><br><span> </span><br><span> /* Connect the SGSN-side per-BVC ports (SGSN/SGSN_SIG/SGSN_PROC) array slot 'port_idx' to specified per-BVC component */</span><br><span>@@ -499,7 +506,7 @@</span><br><span> </span><br><span>        /* default connections on PCU side: First BVC of each NSE/PCU */</span><br><span>     for (i := 0; i < lengthof(g_pars.pcu); i := i+1) {</span><br><span style="color: hsl(0, 100%, 40%);">-           f_connect_to_pcu_bvc(i, g_pars.pcu[i].vc_BSSGP_BVC[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+               f_connect_to_pcu_bvc(port_idx := i, nse_idx := i, bvc_idx := 0);</span><br><span>     }</span><br><span> </span><br><span>        /* default connections on SGSN side: First BVC of each NSE/SGSN */</span><br><span>@@ -934,6 +941,500 @@</span><br><span> };</span><br><span> </span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/***********************************************************************</span><br><span style="color: hsl(120, 100%, 40%);">+ * PAGING PS procedure</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_send_paging_ps(template (value) Paging_Field4 p4, integer sgsn_idx := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                          boolean use_sig := false)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on BSSGP_ConnHdlr return template (present) PDU_BSSGP {</span><br><span style="color: hsl(120, 100%, 40%);">+       var template (value) PDU_BSSGP pdu_tx;</span><br><span style="color: hsl(120, 100%, 40%);">+        var template (present) PDU_BSSGP pdu_rx;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* we always specify '0' as BVCI in the templates below, as we override it with</span><br><span style="color: hsl(120, 100%, 40%);">+        * 'p4' later anyway */</span><br><span style="color: hsl(120, 100%, 40%);">+       pdu_rx := tr_BSSGP_PS_PAGING(0);</span><br><span style="color: hsl(120, 100%, 40%);">+      pdu_rx.pDU_BSSGP_PAGING_PS.iMSI := tr_BSSGP_IMSI(g_pars.imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (ispresent(g_pars.p_tmsi)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               pdu_tx := ts_BSSGP_PS_PAGING_PTMSI(0, g_pars.imsi, oct2int(g_pars.p_tmsi));</span><br><span style="color: hsl(120, 100%, 40%);">+           pdu_rx.pDU_BSSGP_PAGING_PS.pTMSI := tr_BSSGP_TMSI(oct2int(g_pars.p_tmsi));</span><br><span style="color: hsl(120, 100%, 40%);">+    } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              pdu_tx := ts_BSSGP_PS_PAGING_IMSI(0, g_pars.imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+            pdu_rx.pDU_BSSGP_PAGING_PS.pTMSI := omit;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     pdu_tx.pDU_BSSGP_PAGING_PS.paging_Field4 := p4;</span><br><span style="color: hsl(120, 100%, 40%);">+       pdu_rx.pDU_BSSGP_PAGING_PS.paging_Field4 := p4;</span><br><span style="color: hsl(120, 100%, 40%);">+       if (use_sig == false) {</span><br><span style="color: hsl(120, 100%, 40%);">+               SGSN[sgsn_idx].send(pdu_tx);</span><br><span style="color: hsl(120, 100%, 40%);">+  } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              SGSN_SIG[sgsn_idx].send(pdu_tx);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     return pdu_rx;</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 paging defined by 'p4' on given SGSN-side index (ptp or signaling) and expect one paging to arrive on</span><br><span style="color: hsl(120, 100%, 40%);">+ * specified PCU index */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_send_paging_ps_exp_one_bss(template (value) Paging_Field4 p4, integer sgsn_idx := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                              boolean use_sig := false,integer pcu_idx := 0)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on BSSGP_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+        var template (present) PDU_BSSGP exp_rx;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* doesn't really make sense: Sending to a single BVCI means the message ends up</span><br><span style="color: hsl(120, 100%, 40%);">+   * at that BVC (cell) only, and paging all over the BSS area is not possible */</span><br><span style="color: hsl(120, 100%, 40%);">+       exp_rx := f_send_paging_ps(p4, sgsn_idx, use_sig);</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Expect paging to propagate to the one BSS addressed by the BVCI only */</span><br><span style="color: hsl(120, 100%, 40%);">+    timer T := 2.0;</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%);">+ [not use_sig] PCU[pcu_idx].receive(exp_rx) {</span><br><span style="color: hsl(120, 100%, 40%);">+          setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+             repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     [not use_sig] PCU_SIG[pcu_idx].receive(exp_rx) {</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(fail, "Received paging on SIGNALING BVC, expected PTP BVC");</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     [use_sig] PCU_SIG[pcu_idx].receive(exp_rx) {</span><br><span style="color: hsl(120, 100%, 40%);">+          setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+             repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     [use_sig] PCU[pcu_idx].receive(exp_rx) {</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(fail, "Received paging on PTP BVC, expected SIGNALING BVC");</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] any from PCU.receive(exp_rx) {</span><br><span style="color: hsl(120, 100%, 40%);">+             setverdict(fail, "Paging received on unexpected BVC");</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] any from PCU_SIG.receive(exp_rx) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Paging received on unexpected BVC");</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] any from PCU.receive(PDU_BSSGP:{pDU_BSSGP_PAGING_PS:=?}) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Different Paging than expected received PTP BVC");</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] any from PCU_SIG.receive(PDU_BSSGP:{pDU_BSSGP_PAGING_PS:=?}) {</span><br><span style="color: hsl(120, 100%, 40%);">+             setverdict(fail, "Different Paging than expected on SIGNALING BVC");</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%);">+ }</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_paging_ps_ptp_bss(charstring id) runs on BSSGP_ConnHdlr</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      /* doesn't really make sense: Sending to a single BVCI means the message ends up</span><br><span style="color: hsl(120, 100%, 40%);">+   * at that BVC (cell) only, and paging all over the BSS area is not possible */</span><br><span style="color: hsl(120, 100%, 40%);">+       f_send_paging_ps_exp_one_bss(ts_BssgpP4BssArea, 0, false, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_paging_ps_ptp_bss() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   var BSSGP_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   vc_conn := f_start_handler(refers(f_TC_paging_ps_ptp_bss), testcasename(), g_pcu, g_sgsn, 9);</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%);">+       f_cleanup();</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%);">+/* PS-PAGING on PTP-BVC for Location Area */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_paging_ps_ptp_lac(charstring id) runs on BSSGP_ConnHdlr</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     var template (present) PDU_BSSGP exp_rx;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* doesn't really make sense: Sending to a single BVCI means the message ends up</span><br><span style="color: hsl(120, 100%, 40%);">+   * at that BVC (cell) only, and paging all over the BSS area is not possible */</span><br><span style="color: hsl(120, 100%, 40%);">+       f_send_paging_ps_exp_one_bss(ts_BssgpP4LAC(pcu_bvc_cfg[0].cell_id.ra_id.lai), 0, false, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_paging_ps_ptp_lac() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     var BSSGP_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   vc_conn := f_start_handler(refers(f_TC_paging_ps_ptp_lac), testcasename(), g_pcu, g_sgsn, 10);</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%);">+       f_cleanup();</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%);">+/* PS-PAGING on PTP-BVC for Routeing Area */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_paging_ps_ptp_rac(charstring id) runs on BSSGP_ConnHdlr</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     /* doesn't really make sense: Sending to a single BVCI means the message ends up</span><br><span style="color: hsl(120, 100%, 40%);">+   * at that BVC (cell) only, and paging all over the BSS area is not possible */</span><br><span style="color: hsl(120, 100%, 40%);">+       f_send_paging_ps_exp_one_bss(ts_BssgpP4RAC(pcu_bvc_cfg[0].cell_id.ra_id), 0, false, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_paging_ps_ptp_rac() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var BSSGP_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   vc_conn := f_start_handler(refers(f_TC_paging_ps_ptp_rac), testcasename(), g_pcu, g_sgsn, 11);</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%);">+       f_cleanup();</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%);">+/* PS-PAGING on PTP-BVC for BVCI (one cell) */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_paging_ps_ptp_bvci(charstring id) runs on BSSGP_ConnHdlr</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  /* this should be the normal case for MS in READY MM state after a lower layer failure */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_send_paging_ps_exp_one_bss(ts_BssgpP4Bvci(pcu_bvc_cfg[0].bvci), 0, false, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_paging_ps_ptp_bvci() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        var BSSGP_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   vc_conn := f_start_handler(refers(f_TC_paging_ps_ptp_bvci), testcasename(), g_pcu, g_sgsn, 12);</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%);">+       f_cleanup();</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%);">+/* altstep for expecting BSSGP PDU on signaling BVC of given pcu_idx + storing in 'roi' */</span><br><span style="color: hsl(120, 100%, 40%);">+private altstep as_paging_sig_pcu(integer pcu_idx, template (present) PDU_BSSGP exp_rx, inout ro_integer roi)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on BSSGP_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+[] PCU_SIG[pcu_idx].receive(exp_rx) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ro_integer_contains(roi, pcu_idx)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(fail, "Received multiple paging on same SIG BVC");</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     roi := roi & { pcu_idx };</span><br><span style="color: hsl(120, 100%, 40%);">+ repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+[] PCU[pcu_idx].receive(exp_rx) {</span><br><span style="color: hsl(120, 100%, 40%);">+  setverdict(fail, "Received paging on PTP BVC, expected SIGNALING BVC");</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+[] PCU_SIG[pcu_idx].receive(PDU_BSSGP:{pDU_BSSGP_PAGING_PS:=?}) {</span><br><span style="color: hsl(120, 100%, 40%);">+  setverdict(fail, "Different Paging than expected received SIGNALING BVC");</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+[] PCU[pcu_idx].receive(PDU_BSSGP:{pDU_BSSGP_PAGING_PS:=?}) {</span><br><span style="color: hsl(120, 100%, 40%);">+      setverdict(fail, "Different Paging than expected received PTP BVC");</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%);">+type record of default ro_default;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* send PS-PAGING on SIG BVC, expect it to arrive on given list of PCU indexes */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_send_paging_ps_exp_multi(template (value) Paging_Field4 p4, integer sgsn_idx := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                            ro_integer exp_on_pcu_idx) runs on BSSGP_ConnHdlr</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      var template (present) PDU_BSSGP exp_rx;</span><br><span style="color: hsl(120, 100%, 40%);">+      exp_rx := f_send_paging_ps(p4, 0, true);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* FIXME: make sure the relevant BVCs/BSS are connected to the ports! */</span><br><span style="color: hsl(120, 100%, 40%);">+      var ro_default defaults := {};</span><br><span style="color: hsl(120, 100%, 40%);">+        for (var integer i := 0; i < lengthof(mp_nsconfig_pcu); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                var default d := activate(as_paging_sig_pcu(i, exp_rx, g_roi));</span><br><span style="color: hsl(120, 100%, 40%);">+               defaults := defaults & { d };</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     f_sleep(2.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ for (var integer i := 0; i < lengthof(defaults); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+               deactivate(defaults[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     log("Paging received on PCU ", g_roi);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    for (var integer i := 0; i < lengthof(mp_nsconfig_pcu); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                var boolean rx_on_i := ro_integer_contains(g_roi, i);</span><br><span style="color: hsl(120, 100%, 40%);">+         var boolean exp_on_i := ro_integer_contains(exp_on_pcu_idx, i);</span><br><span style="color: hsl(120, 100%, 40%);">+               if (exp_on_i and not rx_on_i) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       setverdict(fail, "PS-PAGING not received on ", mp_nsconfig_pcu[i].nsei);</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+             if (not exp_on_i and rx_on_i) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       setverdict(fail, "PS-PAGING not expected but received on ", mp_nsconfig_pcu[i].nsei);</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%);">+     setverdict(pass);</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%);">+/* PS-PAGING on SIG-BVC for BSS Area */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_paging_ps_sig_bss(charstring id) runs on BSSGP_ConnHdlr</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     /* we expect the paging to arrive on all three NSE */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_send_paging_ps_exp_multi(ts_BssgpP4BssArea, 0, {0, 1, 2});</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_paging_ps_sig_bss() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    var BSSGP_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   vc_conn := f_start_handler(refers(f_TC_paging_ps_sig_bss), testcasename(), g_pcu, g_sgsn, 13);</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%);">+       f_cleanup();</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%);">+/* PS-PAGING on SIG-BVC for Location Area */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_paging_ps_sig_lac(charstring id) runs on BSSGP_ConnHdlr</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Both PCU index 0 and 1 have a BVC within the LAC */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_send_paging_ps_exp_multi(ts_BssgpP4LAC(pcu_bvc_cfg[0].cell_id.ra_id.lai), 0, {0, 1});</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_paging_ps_sig_lac() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var BSSGP_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   vc_conn := f_start_handler(refers(f_TC_paging_ps_sig_lac), testcasename(), g_pcu, g_sgsn, 14);</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%);">+       f_cleanup();</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%);">+/* PS-PAGING on SIG-BVC for Routeing Area */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_paging_ps_sig_rac(charstring id) runs on BSSGP_ConnHdlr</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Only PCU index 0 has a matching BVC within the LAC */</span><br><span style="color: hsl(120, 100%, 40%);">+      f_send_paging_ps_exp_multi(ts_BssgpP4RAC(pcu_bvc_cfg[0].cell_id.ra_id), 0, {0});</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_paging_ps_sig_rac() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        var BSSGP_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   vc_conn := f_start_handler(refers(f_TC_paging_ps_sig_rac), testcasename(), g_pcu, g_sgsn, 15);</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%);">+       f_cleanup();</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%);">+/* PS-PAGING on SIG-BVC for BVCI (one cell) */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_paging_ps_sig_bvci(charstring id) runs on BSSGP_ConnHdlr</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  f_send_paging_ps_exp_multi(ts_BssgpP4Bvci(pcu_bvc_cfg[0].bvci), 0, {0});</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_paging_ps_sig_bvci() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var BSSGP_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   vc_conn := f_start_handler(refers(f_TC_paging_ps_sig_bvci), testcasename(), g_pcu, g_sgsn, 16);</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%);">+       f_cleanup();</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%);">+ * PAGING CS procedure</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_send_paging_cs(template (value) Paging_Field4 p4, integer sgsn_idx := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 boolean use_sig := false)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on BSSGP_ConnHdlr return template (present) PDU_BSSGP {</span><br><span style="color: hsl(120, 100%, 40%);">+     var template (value) PDU_BSSGP pdu_tx;</span><br><span style="color: hsl(120, 100%, 40%);">+        var template (present) PDU_BSSGP pdu_rx;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* we always specify '0' as BVCI in the templates below, as we override it with</span><br><span style="color: hsl(120, 100%, 40%);">+        * 'p4' later anyway */</span><br><span style="color: hsl(120, 100%, 40%);">+       pdu_rx := tr_BSSGP_CS_PAGING(0);</span><br><span style="color: hsl(120, 100%, 40%);">+      pdu_rx.pDU_BSSGP_PAGING_CS.iMSI := tr_BSSGP_IMSI(g_pars.imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (ispresent(g_pars.p_tmsi)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               pdu_tx := ts_BSSGP_CS_PAGING_PTMSI(0, g_pars.imsi, oct2int(g_pars.p_tmsi));</span><br><span style="color: hsl(120, 100%, 40%);">+           pdu_rx.pDU_BSSGP_PAGING_CS.tMSI := tr_BSSGP_TMSI(oct2int(g_pars.p_tmsi));</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              pdu_tx := ts_BSSGP_CS_PAGING_IMSI(0, g_pars.imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+            pdu_rx.pDU_BSSGP_PAGING_CS.tMSI := omit;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     pdu_tx.pDU_BSSGP_PAGING_CS.paging_Field4 := p4;</span><br><span style="color: hsl(120, 100%, 40%);">+       pdu_rx.pDU_BSSGP_PAGING_CS.paging_Field4 := p4;</span><br><span style="color: hsl(120, 100%, 40%);">+       if (use_sig == false) {</span><br><span style="color: hsl(120, 100%, 40%);">+               SGSN[sgsn_idx].send(pdu_tx);</span><br><span style="color: hsl(120, 100%, 40%);">+  } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              SGSN_SIG[sgsn_idx].send(pdu_tx);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     return pdu_rx;</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 paging defined by 'p4' on given SGSN-side index (ptp or signaling) and expect one paging to arrive on</span><br><span style="color: hsl(120, 100%, 40%);">+ * specified PCU index */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_send_paging_cs_exp_one_bss(template (value) Paging_Field4 p4, integer sgsn_idx := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                              boolean use_sig := false,integer pcu_idx := 0)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on BSSGP_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+        var template (present) PDU_BSSGP exp_rx;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* doesn't really make sense: Sending to a single BVCI means the message ends up</span><br><span style="color: hsl(120, 100%, 40%);">+   * at that BVC (cell) only, and paging all over the BSS area is not possible */</span><br><span style="color: hsl(120, 100%, 40%);">+       exp_rx := f_send_paging_cs(p4, sgsn_idx, use_sig);</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Expect paging to propagate to the one BSS addressed by the BVCI only */</span><br><span style="color: hsl(120, 100%, 40%);">+    timer T := 2.0;</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%);">+ [not use_sig] PCU[pcu_idx].receive(exp_rx) {</span><br><span style="color: hsl(120, 100%, 40%);">+          setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+             repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     [not use_sig] PCU_SIG[pcu_idx].receive(exp_rx) {</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(fail, "Received paging on SIGNALING BVC, expected PTP BVC");</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     [use_sig] PCU_SIG[pcu_idx].receive(exp_rx) {</span><br><span style="color: hsl(120, 100%, 40%);">+          setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+             repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     [use_sig] PCU[pcu_idx].receive(exp_rx) {</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(fail, "Received paging on PTP BVC, expected SIGNALING BVC");</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] any from PCU.receive(exp_rx) {</span><br><span style="color: hsl(120, 100%, 40%);">+             setverdict(fail, "Paging received on unexpected BVC");</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] any from PCU_SIG.receive(exp_rx) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Paging received on unexpected BVC");</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] any from PCU.receive(PDU_BSSGP:{pDU_BSSGP_PAGING_CS:=?}) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Different Paging than expected received PTP BVC");</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] any from PCU_SIG.receive(PDU_BSSGP:{pDU_BSSGP_PAGING_CS:=?}) {</span><br><span style="color: hsl(120, 100%, 40%);">+             setverdict(fail, "Different Paging than expected on SIGNALING BVC");</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%);">+ }</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_paging_cs_ptp_bss(charstring id) runs on BSSGP_ConnHdlr</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      /* doesn't really make sense: Sending to a single BVCI means the message ends up</span><br><span style="color: hsl(120, 100%, 40%);">+   * at that BVC (cell) only, and paging all over the BSS area is not possible */</span><br><span style="color: hsl(120, 100%, 40%);">+       f_send_paging_cs_exp_one_bss(ts_BssgpP4BssArea, 0, false, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_paging_cs_ptp_bss() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   var BSSGP_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   vc_conn := f_start_handler(refers(f_TC_paging_cs_ptp_bss), testcasename(), g_pcu, g_sgsn, 17);</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%);">+       f_cleanup();</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%);">+/* CS-PAGING on PTP-BVC for Location Area */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_paging_cs_ptp_lac(charstring id) runs on BSSGP_ConnHdlr</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     var template (present) PDU_BSSGP exp_rx;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* doesn't really make sense: Sending to a single BVCI means the message ends up</span><br><span style="color: hsl(120, 100%, 40%);">+   * at that BVC (cell) only, and paging all over the BSS area is not possible */</span><br><span style="color: hsl(120, 100%, 40%);">+       f_send_paging_cs_exp_one_bss(ts_BssgpP4LAC(pcu_bvc_cfg[0].cell_id.ra_id.lai), 0, false, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_paging_cs_ptp_lac() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     var BSSGP_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   vc_conn := f_start_handler(refers(f_TC_paging_cs_ptp_lac), testcasename(), g_pcu, g_sgsn, 18);</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%);">+       f_cleanup();</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%);">+/* CS-PAGING on PTP-BVC for Routeing Area */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_paging_cs_ptp_rac(charstring id) runs on BSSGP_ConnHdlr</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     /* doesn't really make sense: Sending to a single BVCI means the message ends up</span><br><span style="color: hsl(120, 100%, 40%);">+   * at that BVC (cell) only, and paging all over the BSS area is not possible */</span><br><span style="color: hsl(120, 100%, 40%);">+       f_send_paging_cs_exp_one_bss(ts_BssgpP4RAC(pcu_bvc_cfg[0].cell_id.ra_id), 0, false, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_paging_cs_ptp_rac() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var BSSGP_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   vc_conn := f_start_handler(refers(f_TC_paging_cs_ptp_rac), testcasename(), g_pcu, g_sgsn, 19);</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%);">+       f_cleanup();</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%);">+/* CS-PAGING on PTP-BVC for BVCI (one cell) */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_paging_cs_ptp_bvci(charstring id) runs on BSSGP_ConnHdlr</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  /* this should be the normal case for MS in READY MM state after a lower layer failure */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_send_paging_cs_exp_one_bss(ts_BssgpP4Bvci(pcu_bvc_cfg[0].bvci), 0, false, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_paging_cs_ptp_bvci() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        var BSSGP_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   vc_conn := f_start_handler(refers(f_TC_paging_cs_ptp_bvci), testcasename(), g_pcu, g_sgsn, 20);</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%);">+       f_cleanup();</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 CS-PAGING on SIG BVC, expect it to arrive on given list of PCU indexes */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_send_paging_cs_exp_multi(template (value) Paging_Field4 p4, integer sgsn_idx := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       ro_integer exp_on_pcu_idx) runs on BSSGP_ConnHdlr</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      var template (present) PDU_BSSGP exp_rx;</span><br><span style="color: hsl(120, 100%, 40%);">+      exp_rx := f_send_paging_cs(p4, 0, true);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* FIXME: make sure the relevant BVCs/BSS are connected to the ports! */</span><br><span style="color: hsl(120, 100%, 40%);">+      var ro_default defaults := {};</span><br><span style="color: hsl(120, 100%, 40%);">+        for (var integer i := 0; i < lengthof(mp_nsconfig_pcu); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                var default d := activate(as_paging_sig_pcu(i, exp_rx, g_roi));</span><br><span style="color: hsl(120, 100%, 40%);">+               defaults := defaults & { d };</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     f_sleep(2.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ for (var integer i := 0; i < lengthof(defaults); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+               deactivate(defaults[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     log("Paging received on PCU ", g_roi);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    for (var integer i := 0; i < lengthof(mp_nsconfig_pcu); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                var boolean rx_on_i := ro_integer_contains(g_roi, i);</span><br><span style="color: hsl(120, 100%, 40%);">+         var boolean exp_on_i := ro_integer_contains(exp_on_pcu_idx, i);</span><br><span style="color: hsl(120, 100%, 40%);">+               if (exp_on_i and not rx_on_i) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       setverdict(fail, "PS-PAGING not received on ", mp_nsconfig_pcu[i].nsei);</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+             if (not exp_on_i and rx_on_i) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       setverdict(fail, "PS-PAGING not expected but received on ", mp_nsconfig_pcu[i].nsei);</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%);">+     setverdict(pass);</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%);">+/* CS-PAGING on SIG-BVC for BSS Area */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_paging_cs_sig_bss(charstring id) runs on BSSGP_ConnHdlr</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     /* we expect the paging to arrive on all three NSE */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_send_paging_cs_exp_multi(ts_BssgpP4BssArea, 0, {0, 1, 2});</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_paging_cs_sig_bss() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    var BSSGP_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   vc_conn := f_start_handler(refers(f_TC_paging_cs_sig_bss), testcasename(), g_pcu, g_sgsn, 13);</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%);">+       f_cleanup();</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%);">+/* CS-PAGING on SIG-BVC for Location Area */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_paging_cs_sig_lac(charstring id) runs on BSSGP_ConnHdlr</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Both PCU index 0 and 1 have a BVC within the LAC */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_send_paging_cs_exp_multi(ts_BssgpP4LAC(pcu_bvc_cfg[0].cell_id.ra_id.lai), 0, {0, 1});</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_paging_cs_sig_lac() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var BSSGP_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   vc_conn := f_start_handler(refers(f_TC_paging_cs_sig_lac), testcasename(), g_pcu, g_sgsn, 14);</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%);">+       f_cleanup();</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%);">+/* CS-PAGING on SIG-BVC for Routeing Area */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_paging_cs_sig_rac(charstring id) runs on BSSGP_ConnHdlr</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Only PCU index 0 has a matching BVC within the LAC */</span><br><span style="color: hsl(120, 100%, 40%);">+      f_send_paging_cs_exp_multi(ts_BssgpP4RAC(pcu_bvc_cfg[0].cell_id.ra_id), 0, {0});</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_paging_cs_sig_rac() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        var BSSGP_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   vc_conn := f_start_handler(refers(f_TC_paging_cs_sig_rac), testcasename(), g_pcu, g_sgsn, 15);</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%);">+       f_cleanup();</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%);">+/* CS-PAGING on SIG-BVC for BVCI (one cell) */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_paging_cs_sig_bvci(charstring id) runs on BSSGP_ConnHdlr</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  f_send_paging_cs_exp_multi(ts_BssgpP4Bvci(pcu_bvc_cfg[0].bvci), 0, {0});</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_paging_cs_sig_bvci() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var BSSGP_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   vc_conn := f_start_handler(refers(f_TC_paging_cs_sig_bvci), testcasename(), g_pcu, g_sgsn, 16);</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%);">+       f_cleanup();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> </span><br><span> control {</span><br><span>   execute( TC_BVC_bringup() );</span><br><span>@@ -948,6 +1449,32 @@</span><br><span>                 /* don't enable this by default, as we don't yet have any automatic test setup for FR with 4 NS-VC */</span><br><span>                execute( TC_load_sharing_dl() );</span><br><span>     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* PAGING-PS over PTP BVC */</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_paging_ps_ptp_bss() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_paging_ps_ptp_lac() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_paging_ps_ptp_rac() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_paging_ps_ptp_bvci() );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* PAGING-PS over SIG BVC */</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_paging_ps_sig_bss() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_paging_ps_sig_lac() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_paging_ps_sig_rac() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_paging_ps_sig_bvci() );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* PAGING-CS over PTP BVC */</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_paging_cs_ptp_bss() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_paging_cs_ptp_lac() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_paging_cs_ptp_rac() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_paging_cs_ptp_bvci() );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* PAGING-CS over SIG BVC */</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_paging_cs_sig_bss() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_paging_cs_sig_lac() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_paging_cs_sig_rac() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_paging_cs_sig_bvci() );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> }</span><br><span> </span><br><span> </span><br><span>diff --git a/library/Osmocom_Gb_Types.ttcn b/library/Osmocom_Gb_Types.ttcn</span><br><span>index 2c82437..ee03a8a 100644</span><br><span>--- a/library/Osmocom_Gb_Types.ttcn</span><br><span>+++ b/library/Osmocom_Gb_Types.ttcn</span><br><span>@@ -829,6 +829,13 @@</span><br><span>                 digits := imsi</span><br><span>       }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ template (present) TMSI_BSSGP tr_BSSGP_TMSI(GsmTmsi tmsi) := {</span><br><span style="color: hsl(120, 100%, 40%);">+                iEI := '20'O,</span><br><span style="color: hsl(120, 100%, 40%);">+         ext := '1'B,</span><br><span style="color: hsl(120, 100%, 40%);">+          lengthIndicator := { length1 := 4 },</span><br><span style="color: hsl(120, 100%, 40%);">+          tMSI_Value := int2oct(tmsi, 4)</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  template TMSI_BSSGP ts_BSSGP_TMSI(GsmTmsi tmsi) := {</span><br><span>                 iEI := '20'O,</span><br><span>                ext := '1'B,</span><br><span>@@ -1556,7 +1563,45 @@</span><br><span>                }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   template (value) Routeing_Area ts_BSSGP_RA_ID(RoutingAreaIdentification input) := {</span><br><span style="color: hsl(120, 100%, 40%);">+   template (value) Paging_Field4 ts_BssgpP4BssArea := {</span><br><span style="color: hsl(120, 100%, 40%);">+         bSS_Area_Indication := {</span><br><span style="color: hsl(120, 100%, 40%);">+                      iEI := '02'O,</span><br><span style="color: hsl(120, 100%, 40%);">+                 ext := '1'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                  lengthIndicator := {</span><br><span style="color: hsl(120, 100%, 40%);">+                          length1 := 1</span><br><span style="color: hsl(120, 100%, 40%);">+                  },</span><br><span style="color: hsl(120, 100%, 40%);">+                    bSS_indicator := '00'O</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 (value) Paging_Field4 ts_BssgpP4LAC(GSM_Types.LocationAreaIdentification lai) := {</span><br><span style="color: hsl(120, 100%, 40%);">+           location_Area := ts_BSSGP_LA_ID(lai)</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 (value) Paging_Field4 ts_BssgpP4RAC(GSM_Types.RoutingAreaIdentification rai) := {</span><br><span style="color: hsl(120, 100%, 40%);">+            routeing_Area := ts_BSSGP_RA_ID(rai)</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 (value) Paging_Field4 ts_BssgpP4Bvci(BssgpBvci bvci) := {</span><br><span style="color: hsl(120, 100%, 40%);">+            bVCI := t_BSSGP_BVCI(bvci)</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 (value) Location_Area ts_BSSGP_LA_ID(GSM_Types.LocationAreaIdentification input) := {</span><br><span style="color: hsl(120, 100%, 40%);">+                iEI := '10'O,</span><br><span style="color: hsl(120, 100%, 40%);">+         ext := '1'B,</span><br><span style="color: hsl(120, 100%, 40%);">+          lengthIndicator := {</span><br><span style="color: hsl(120, 100%, 40%);">+                  length1 := 5</span><br><span style="color: hsl(120, 100%, 40%);">+          },</span><br><span style="color: hsl(120, 100%, 40%);">+            mccDigit1 := input.mcc_mnc[0],</span><br><span style="color: hsl(120, 100%, 40%);">+                mccDigit2 := input.mcc_mnc[1],</span><br><span style="color: hsl(120, 100%, 40%);">+                mccDigit3 := input.mcc_mnc[2],</span><br><span style="color: hsl(120, 100%, 40%);">+                mncDigit3 := input.mcc_mnc[3],</span><br><span style="color: hsl(120, 100%, 40%);">+                mncDigit1 := input.mcc_mnc[4],</span><br><span style="color: hsl(120, 100%, 40%);">+                mncDigit2 := input.mcc_mnc[5],</span><br><span style="color: hsl(120, 100%, 40%);">+                lac := int2oct(input.lac, 2)</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 (value) Routeing_Area ts_BSSGP_RA_ID(GSM_Types.RoutingAreaIdentification input) := {</span><br><span>                iEI := '1B'O,</span><br><span>                ext := '1'B,</span><br><span>                 lengthIndicator := {</span><br><span>@@ -1754,8 +1799,7 @@</span><br><span>                 BSSGP_RADIO_CAUSE_CELL_RESEL_FAILURE    ('04'H)</span><br><span>      } with { variant "FIELDLENGTH(8)" };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      function ts_BSSGP_RADIO_CAUSE(template (omit) BssgpRadioCause cause) return template (omit) Radio_Cause {</span><br><span style="color: hsl(120, 100%, 40%);">+        function ts_BSSGP_RADIO_CAUSE(template (omit) BssgpRadioCause cause) return template (omit) Radio_Cause {</span><br><span>                 var template (omit) Radio_Cause ret;</span><br><span>                 if (istemplatekind(cause, "omit")) {</span><br><span>                       ret := omit;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/21279">change 21279</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/+/21279"/><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: Ida44b62dfdb9c4ce2755de63d51a9907d34f247f </div>
<div style="display:none"> Gerrit-Change-Number: 21279 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: daniel <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>