<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/20998">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  pespin: 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;">PCU_Tests: verify CS paging of multiple subscribers<br><br>The change introduces three new test cases:<br><br>  - TC_paging_cs_multi_ms_imsi,<br>  - TC_paging_cs_multi_ms_tmsi,<br>  - TC_paging_cs_multi_ms_imsi_tmsi.<br><br>Each of these establishes 56 Uplink TBFs, and then enqueues 56 CS<br>PAGING requests from the SGSN side.  The main idea is to verify<br>encoding and compositing of the paging MIs in PACCH massages.<br><br>Change-Id: Ie8b4006f969598c9b0c452002d559f985d108a66<br>Related: OS#4838<br>---<br>M pcu/PCU_Tests.ttcn<br>1 file changed, 163 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/pcu/PCU_Tests.ttcn b/pcu/PCU_Tests.ttcn</span><br><span>index 44314f3..79a5564 100644</span><br><span>--- a/pcu/PCU_Tests.ttcn</span><br><span>+++ b/pcu/PCU_Tests.ttcn</span><br><span>@@ -2535,6 +2535,166 @@</span><br><span>    f_shutdown(__BFILE__, __LINE__, final := true);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_paging_cs_multi_ms(template (value) TsTrxBtsNum nr,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    boolean exp_imsi, boolean exp_tmsi)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var bitstring mask := f_pad_bit(''B, lengthof(g_ms), '0'B);</span><br><span style="color: hsl(120, 100%, 40%);">+   var integer pending := lengthof(g_ms);</span><br><span style="color: hsl(120, 100%, 40%);">+        var RlcmacDlBlock dl_block;</span><br><span style="color: hsl(120, 100%, 40%);">+   var boolean f1, f2;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ while (pending > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              var uint32_t poll_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               /* Obtain a Downlink block and make sure it is a paging request */</span><br><span style="color: hsl(120, 100%, 40%);">+            f_rx_rlcmac_dl_block(dl_block, poll_fn, nr := nr);</span><br><span style="color: hsl(120, 100%, 40%);">+            if (not match(dl_block, tr_RLCMAC_PACKET_PAG_REQ)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  setverdict(fail, "Rx unexpected DL block: ", dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+                     break;</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%);">+           /* This should not happen in general, but who knows... */</span><br><span style="color: hsl(120, 100%, 40%);">+             var PacketPagingReq req := dl_block.ctrl.payload.u.paging;</span><br><span style="color: hsl(120, 100%, 40%);">+            if (not ispresent(req.repeated_pageinfo)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   setverdict(fail, "Repeated Page Info IE is absent?!?");</span><br><span style="color: hsl(120, 100%, 40%);">+                     break;</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%);">+           /* A single message may contain several MIs depending on their type */</span><br><span style="color: hsl(120, 100%, 40%);">+                for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 f1 := exp_imsi and f_pkt_paging_match_imsi(req, g_ms[i].imsi,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                            ps_domain := false);</span><br><span style="color: hsl(120, 100%, 40%);">+                       f2 := exp_tmsi and f_pkt_paging_match_tmsi(req, oct2int(g_ms[i].tlli),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                   ps_domain := false);</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (not f1 and not f2)</span><br><span style="color: hsl(120, 100%, 40%);">+                                { continue; }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                       /* Detect duplicate MIs */</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (mask[i] == '1'B) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                setverdict(fail, "MS is paged twice: ", g_ms[i].imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+                              continue;</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%);">+                   mask[i] := '1'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%);">+           pending := pending - lengthof(req.repeated_pageinfo);</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 (var integer i := 0; i < lengthof(mask); i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+         if (mask[i] != '1'B) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        setverdict(fail, "MS was not paged at all: ", g_ms[i].imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+                        log("===== mask := ", mask);</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%);">+   /* All messages must have been received by now, expect a dummy block */</span><br><span style="color: hsl(120, 100%, 40%);">+       f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := 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%);">+private function f_TC_paging_cs_multi_ms_init(BIT8 pdch_mask)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);</span><br><span style="color: hsl(120, 100%, 40%);">+        const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Initialize NS/BSSGP side */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init_bssgp();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Explicitly set the given PDCH slot-mask to all transceivers */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_PCUIF_ver_INFO_PDCHMask_set(info_ind, pdch_mask);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Allocate 56 GprsMS instances (maximum for 8 PDCH slots) */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_gprs_ms(7 * 8);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init_raw(testcasename(), info_ind);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Establish BSSGP connection to the PCU */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_bssgp_establish();</span><br><span style="color: hsl(120, 100%, 40%);">+  f_multi_ms_bssgp_register();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Establish an Uplink TBF for each GprsMS instance */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_multi_ms_establish_tbf(do_activate := true);</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%);">+testcase TC_paging_cs_multi_ms_imsi() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Common part: send INFO.ind, establish TBFs... */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Enqueue multiple CS PAGING requests at a time (IMSI only) */</span><br><span style="color: hsl(120, 100%, 40%);">+       for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+         BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));</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%);">+   /* FIXME: work around a race condition between PCUIF and BSSGP */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_sleep(0.2); /* i.e. give the IUT some time to process everything */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.</span><br><span style="color: hsl(120, 100%, 40%);">+      * The IUT is expected to page on all PDCH slots of all transceivers. */</span><br><span style="color: hsl(120, 100%, 40%);">+      for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+          var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+             f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := false);</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_shutdown(__BFILE__, __LINE__, final := true);</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%);">+testcase TC_paging_cs_multi_ms_tmsi() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Common part: send INFO.ind, establish TBFs... */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Enqueue multiple CS PAGING requests at a time (P-TMSI only) */</span><br><span style="color: hsl(120, 100%, 40%);">+     for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+         var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */</span><br><span style="color: hsl(120, 100%, 40%);">+               BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));</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%);">+   /* FIXME: work around a race condition between PCUIF and BSSGP */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_sleep(0.2); /* i.e. give the IUT some time to process everything */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.</span><br><span style="color: hsl(120, 100%, 40%);">+      * The IUT is expected to page on all PDCH slots of all transceivers. */</span><br><span style="color: hsl(120, 100%, 40%);">+      for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+          var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+             f_TC_paging_cs_multi_ms(nr, exp_imsi := false, exp_tmsi := true);</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_shutdown(__BFILE__, __LINE__, final := true);</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%);">+testcase TC_paging_cs_multi_ms_imsi_tmsi() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Common part: send INFO.ind, establish TBFs... */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Enqueue multiple CS PAGING requests at a time (IMSI & P-TMSI) */</span><br><span style="color: hsl(120, 100%, 40%);">+       for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+         var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */</span><br><span style="color: hsl(120, 100%, 40%);">+               if (i mod 3 == 0) { /* One PDU fits: 1 IMSI and 2 P-TMSI MIs */</span><br><span style="color: hsl(120, 100%, 40%);">+                       BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));</span><br><span style="color: hsl(120, 100%, 40%);">+            } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));</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%);">+   /* FIXME: work around a race condition between PCUIF and BSSGP */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_sleep(0.2); /* i.e. give the IUT some time to process everything */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.</span><br><span style="color: hsl(120, 100%, 40%);">+      * The IUT is expected to page on all PDCH slots of all transceivers. */</span><br><span style="color: hsl(120, 100%, 40%);">+      for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+          var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+             f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := true);</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_shutdown(__BFILE__, __LINE__, final := true);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> control {</span><br><span>    execute( TC_pcuif_suspend() );</span><br><span>       execute( TC_ta_ptcch_idle() );</span><br><span>@@ -2565,6 +2725,9 @@</span><br><span>       execute( TC_paging_ps_from_sgsn_sign_ptmsi() );</span><br><span>      execute( TC_paging_ps_from_sgsn_sign() );</span><br><span>    execute( TC_paging_ps_from_sgsn_ptp() );</span><br><span style="color: hsl(120, 100%, 40%);">+      execute( TC_paging_cs_multi_ms_imsi_tmsi() );</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_paging_cs_multi_ms_imsi() );</span><br><span style="color: hsl(120, 100%, 40%);">+      execute( TC_paging_cs_multi_ms_tmsi() );</span><br><span>     execute( TC_bssgp_dl_unitdata_with_valid_imsi() );</span><br><span>   execute( TC_bssgp_dl_unitdata_with_invalid_imsi() );</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/20998">change 20998</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/+/20998"/><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: Ie8b4006f969598c9b0c452002d559f985d108a66 </div>
<div style="display:none"> Gerrit-Change-Number: 20998 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@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: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>