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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">pcu: Rename PCU*RAW* content to PCU<br><br>Basically what's done here:<br>* mv PCU_Tests_RAW${suffix}.ttcn -> PCU_Tests${suffix}.ttcn<br>* mv PCUIF_RAW_Components.ttcn -> PCUIF_Components.ttcn<br>* Change module names according to file names and fix all references in<br>  code and configuration.<br><br>Change-Id: Iacaddb56e41012ba58ef6d1b9e79d2c012259bed<br>---<br>R pcu/PCUIF_Components.ttcn<br>M pcu/PCU_Tests.cfg<br>M pcu/PCU_Tests.ttcn<br>R pcu/PCU_Tests_NS.ttcn<br>D pcu/PCU_Tests_RAW.ttcn<br>M pcu/PCU_Tests_SNS.cfg<br>R pcu/PCU_Tests_SNS.ttcn<br>M pcu/README.md<br>8 files changed, 1,913 insertions(+), 1,915 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/pcu/PCUIF_RAW_Components.ttcn b/pcu/PCUIF_Components.ttcn</span><br><span>similarity index 99%</span><br><span>rename from pcu/PCUIF_RAW_Components.ttcn</span><br><span>rename to pcu/PCUIF_Components.ttcn</span><br><span>index 4ed57e5..c0266fb 100644</span><br><span>--- a/pcu/PCUIF_RAW_Components.ttcn</span><br><span>+++ b/pcu/PCUIF_Components.ttcn</span><br><span>@@ -1,4 +1,4 @@</span><br><span style="color: hsl(0, 100%, 40%);">-module PCUIF_RAW_Components {</span><br><span style="color: hsl(120, 100%, 40%);">+module PCUIF_Components {</span><br><span> </span><br><span> /*</span><br><span>  * Components for (RAW) PCU test cases.</span><br><span>diff --git a/pcu/PCU_Tests.cfg b/pcu/PCU_Tests.cfg</span><br><span>index 692ebbd..db6f56e 100644</span><br><span>--- a/pcu/PCU_Tests.cfg</span><br><span>+++ b/pcu/PCU_Tests.cfg</span><br><span>@@ -21,5 +21,5 @@</span><br><span> [MAIN_CONTROLLER]</span><br><span> </span><br><span> [EXECUTE]</span><br><span style="color: hsl(0, 100%, 40%);">-PCU_Tests_RAW.control</span><br><span style="color: hsl(0, 100%, 40%);">-PCU_Tests_RAW_NS.control</span><br><span style="color: hsl(120, 100%, 40%);">+PCU_Tests.control</span><br><span style="color: hsl(120, 100%, 40%);">+PCU_Tests_NS.control</span><br><span>diff --git a/pcu/PCU_Tests.ttcn b/pcu/PCU_Tests.ttcn</span><br><span>index 43a6178..24c198e 100644</span><br><span>--- a/pcu/PCU_Tests.ttcn</span><br><span>+++ b/pcu/PCU_Tests.ttcn</span><br><span>@@ -1,2 +1,1906 @@</span><br><span> module PCU_Tests {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* "RAW" PCU tests: Talk directly to the PCU socket of OsmoPCU on the one hand side (emulating</span><br><span style="color: hsl(120, 100%, 40%);">+   the BTS/BSC side PCU socket server) and the Gb interface on the other hand side.  No NS/BSSGP</span><br><span style="color: hsl(120, 100%, 40%);">+   Emulation is used; rather, we simply use the NS_CodecPort to implement both standard and non-</span><br><span style="color: hsl(120, 100%, 40%);">+   standard procedures on the NS and BSSGP level.  The goal of these tests is to test exactly</span><br><span style="color: hsl(120, 100%, 40%);">+   those NS and BSSGP implementations on the BSS (PCU) side. */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2018-2019 Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2019 Vadim Yanitskiy <axilirator@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ * All rights reserved.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Released under the terms of GNU General Public License, Version 2 or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * SPDX-License-Identifier: GPL-2.0-or-later</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%);">+friend module PCU_Tests_NS;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from General_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from Osmocom_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from GSM_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from GSM_RR_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from Osmocom_VTY_Functions all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from TELNETasp_PortType all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from MobileL3_GMM_SM_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RLCMAC_CSN1_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RLCMAC_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from MobileL3_CommonIE_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from L3_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from NS_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from BSSGP_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from Osmocom_Gb_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from BSSGP_Emulation all; /* BssgpConfig */</span><br><span style="color: hsl(120, 100%, 40%);">+import from NS_Emulation all; /* NSConfiguration */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from UD_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from PCUIF_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from PCUIF_CodecPort all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from PCUIF_Components all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from IPL4asp_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from Native_Functions all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from SGSN_Components all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+modulepar {</span><br><span style="color: hsl(120, 100%, 40%);">+  charstring mp_pcu_sock_path := PCU_SOCK_DEFAULT;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    float X2002 := 0.2; /* Timer -2002, IMM ASSIGN confirm delay */</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: make sure to use parameters from mp_gb_cfg.cell_id in the PCU INFO IND */</span><br><span style="color: hsl(120, 100%, 40%);">+private template (value) PCUIF_info_ind ts_PCUIF_INFO_default := {</span><br><span style="color: hsl(120, 100%, 40%);">+       version := PCU_IF_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+    flags := c_PCUIF_Flags_default,</span><br><span style="color: hsl(120, 100%, 40%);">+       trx := valueof(ts_PCUIF_InfoTrxs_def),</span><br><span style="color: hsl(120, 100%, 40%);">+        bsic := 7,</span><br><span style="color: hsl(120, 100%, 40%);">+    mcc := 262,</span><br><span style="color: hsl(120, 100%, 40%);">+   mnc := 42,</span><br><span style="color: hsl(120, 100%, 40%);">+    mnc_3_digits := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+    lac := 13135,</span><br><span style="color: hsl(120, 100%, 40%);">+ rac := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+     nsei := mp_nsconfig.nsei,</span><br><span style="color: hsl(120, 100%, 40%);">+     nse_timer := { 3, 3, 3, 3, 30, 3, 10 },</span><br><span style="color: hsl(120, 100%, 40%);">+       cell_timer := { 3, 3, 3, 3, 3, 10, 3, 10, 3, 10, 3 },</span><br><span style="color: hsl(120, 100%, 40%);">+ cell_id := 20960,</span><br><span style="color: hsl(120, 100%, 40%);">+     repeat_time := 5 * 50,</span><br><span style="color: hsl(120, 100%, 40%);">+        repeat_count := 3,</span><br><span style="color: hsl(120, 100%, 40%);">+    bvci := mp_gb_cfg.bvci,</span><br><span style="color: hsl(120, 100%, 40%);">+       t3142 := 20,</span><br><span style="color: hsl(120, 100%, 40%);">+  t3169 := 5,</span><br><span style="color: hsl(120, 100%, 40%);">+   t3191 := 5,</span><br><span style="color: hsl(120, 100%, 40%);">+   t3193_10ms := 160,</span><br><span style="color: hsl(120, 100%, 40%);">+    t3195 := 5,</span><br><span style="color: hsl(120, 100%, 40%);">+   t3101 := 10,</span><br><span style="color: hsl(120, 100%, 40%);">+  t3103 := 4,</span><br><span style="color: hsl(120, 100%, 40%);">+   t3105 := 8,</span><br><span style="color: hsl(120, 100%, 40%);">+   cv_countdown := 15,</span><br><span style="color: hsl(120, 100%, 40%);">+   dl_tbf_ext := 250 * 10, /* ms */</span><br><span style="color: hsl(120, 100%, 40%);">+      ul_tbf_ext := 250 * 10, /* ms */</span><br><span style="color: hsl(120, 100%, 40%);">+      initial_cs := 2,</span><br><span style="color: hsl(120, 100%, 40%);">+      initial_mcs := 6,</span><br><span style="color: hsl(120, 100%, 40%);">+     nsvci := { mp_nsconfig.nsvci, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+    local_pprt := { mp_nsconfig.remote_udp_port, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+     remote_port := { mp_nsconfig.local_udp_port, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+     remote_ip := { f_inet_haddr(mp_nsconfig.local_ip) , '00000000'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%);">+type record lqual_range {</span><br><span style="color: hsl(120, 100%, 40%);">+     /* component reference to the IPA_Client component used for RSL */</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t low,</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t high</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 component RAW_PCU_Test_CT extends bssgp_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Connection to the BTS component (one for now) */</span><br><span style="color: hsl(120, 100%, 40%);">+   port RAW_PCU_MSG_PT BTS;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Connection to the PCUIF component */</span><br><span style="color: hsl(120, 100%, 40%);">+       port RAW_PCU_MSG_PT PCUIF;</span><br><span style="color: hsl(120, 100%, 40%);">+    /* VTY connection to the PCU */</span><br><span style="color: hsl(120, 100%, 40%);">+       port TELNETasp_PT PCUVTY;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Uplink CS/MCS thresholds, default from pcu_main.c: */</span><br><span style="color: hsl(120, 100%, 40%);">+      var lqual_range g_cs_lqual_ranges[4] := {{low := 0, high := 6},</span><br><span style="color: hsl(120, 100%, 40%);">+                                                {low := 5, high := 8},</span><br><span style="color: hsl(120, 100%, 40%);">+                                                {low := 7, high := 13},</span><br><span style="color: hsl(120, 100%, 40%);">+                                               {low := 12,high := 35}};</span><br><span style="color: hsl(120, 100%, 40%);">+     var lqual_range g_mcs_lqual_ranges[9] := {{low := 0, high := 6},</span><br><span style="color: hsl(120, 100%, 40%);">+                                               {low := 5, high := 8},</span><br><span style="color: hsl(120, 100%, 40%);">+                                                {low := 7, high := 13},</span><br><span style="color: hsl(120, 100%, 40%);">+                                               {low := 12,high := 15},</span><br><span style="color: hsl(120, 100%, 40%);">+                                               {low := 14, high := 17},</span><br><span style="color: hsl(120, 100%, 40%);">+                                              {low := 16, high := 18},</span><br><span style="color: hsl(120, 100%, 40%);">+                                              {low := 17,high := 20},</span><br><span style="color: hsl(120, 100%, 40%);">+                                               {low := 19, high := 24},</span><br><span style="color: hsl(120, 100%, 40%);">+                                              {low := 23,high := 35}};</span><br><span style="color: hsl(120, 100%, 40%);">+     var uint8_t g_cs_initial_dl := 1;</span><br><span style="color: hsl(120, 100%, 40%);">+     var uint8_t g_cs_initial_ul := 1;</span><br><span style="color: hsl(120, 100%, 40%);">+     var uint8_t g_mcs_initial_dl := 1;</span><br><span style="color: hsl(120, 100%, 40%);">+    var uint8_t g_mcs_initial_ul := 1;</span><br><span style="color: hsl(120, 100%, 40%);">+    var uint8_t g_cs_max_dl := 4;</span><br><span style="color: hsl(120, 100%, 40%);">+ var uint8_t g_cs_max_ul := 4;</span><br><span style="color: hsl(120, 100%, 40%);">+ var uint8_t g_mcs_max_dl := 9;</span><br><span style="color: hsl(120, 100%, 40%);">+        var uint8_t g_mcs_max_ul := 9;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      var boolean g_egprs_only := false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Guard timeout */</span><br><span style="color: hsl(120, 100%, 40%);">+   timer g_T_guard := 60.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 altstep as_Tguard_RAW() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     [] g_T_guard.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Timeout of T_guard");</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_pcuvty_set_allowed_cs_mcs() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      f_vty_config2(PCUVTY, {"pcu"}, "cs " & int2str(g_cs_initial_dl) & " " & int2str(g_cs_initial_ul));</span><br><span style="color: hsl(120, 100%, 40%);">+  f_vty_config2(PCUVTY, {"pcu"}, "cs max " & int2str(g_cs_max_dl) & " " & int2str(g_cs_max_ul));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    f_vty_config2(PCUVTY, {"pcu"}, "mcs " & int2str(g_mcs_initial_dl) & " " & int2str(g_mcs_initial_ul));</span><br><span style="color: hsl(120, 100%, 40%);">+       f_vty_config2(PCUVTY, {"pcu"}, "mcs max " & int2str(g_mcs_max_dl) & " " & int2str(g_mcs_max_ul));</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_pcuvty_set_link_quality_ranges() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var charstring cmd;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ cmd := "cs link-quality-ranges" &</span><br><span style="color: hsl(120, 100%, 40%);">+              " cs1 " & int2str(g_cs_lqual_ranges[0].high) &</span><br><span style="color: hsl(120, 100%, 40%);">+              " cs2 " & int2str(g_cs_lqual_ranges[1].low) & " " & int2str(g_cs_lqual_ranges[1].high) &</span><br><span style="color: hsl(120, 100%, 40%);">+          " cs3 " & int2str(g_cs_lqual_ranges[2].low) & " " & int2str(g_cs_lqual_ranges[2].high) &</span><br><span style="color: hsl(120, 100%, 40%);">+          " cs4 " & int2str(g_cs_lqual_ranges[3].low);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_vty_config2(PCUVTY, {"pcu"}, cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      cmd := "mcs link-quality-ranges" &</span><br><span style="color: hsl(120, 100%, 40%);">+             " mcs1 " & int2str(g_mcs_lqual_ranges[0].high) &</span><br><span style="color: hsl(120, 100%, 40%);">+            " mcs2 " & int2str(g_mcs_lqual_ranges[1].low) & " " & int2str(g_mcs_lqual_ranges[1].high) &</span><br><span style="color: hsl(120, 100%, 40%);">+               " mcs3 " & int2str(g_mcs_lqual_ranges[2].low) & " " & int2str(g_mcs_lqual_ranges[2].high) &</span><br><span style="color: hsl(120, 100%, 40%);">+               " mcs4 " & int2str(g_mcs_lqual_ranges[3].low) & " " & int2str(g_mcs_lqual_ranges[3].high) &</span><br><span style="color: hsl(120, 100%, 40%);">+               " mcs5 " & int2str(g_mcs_lqual_ranges[4].low) & " " & int2str(g_mcs_lqual_ranges[4].high) &</span><br><span style="color: hsl(120, 100%, 40%);">+               " mcs6 " & int2str(g_mcs_lqual_ranges[5].low) & " " & int2str(g_mcs_lqual_ranges[5].high) &</span><br><span style="color: hsl(120, 100%, 40%);">+               " mcs7 " & int2str(g_mcs_lqual_ranges[6].low) & " " & int2str(g_mcs_lqual_ranges[6].high) &</span><br><span style="color: hsl(120, 100%, 40%);">+               " mcs8 " & int2str(g_mcs_lqual_ranges[7].low) & " " & int2str(g_mcs_lqual_ranges[7].high) &</span><br><span style="color: hsl(120, 100%, 40%);">+               " mcs9 " & int2str(g_mcs_lqual_ranges[8].low);</span><br><span style="color: hsl(120, 100%, 40%);">+   f_vty_config2(PCUVTY, {"pcu"}, cmd);</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_init_vty(charstring id) runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     map(self:PCUVTY, system:PCUVTY);</span><br><span style="color: hsl(120, 100%, 40%);">+      f_vty_set_prompts(PCUVTY);</span><br><span style="color: hsl(120, 100%, 40%);">+    f_vty_transceive(PCUVTY, "enable");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (g_egprs_only) {</span><br><span style="color: hsl(120, 100%, 40%);">+           f_vty_config2(PCUVTY, {"pcu"}, "egprs only");</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              f_vty_config2(PCUVTY, {"pcu"}, "no egprs");</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_init_raw(charstring id, template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default)</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 RAW_PCUIF_CT vc_PCUIF;</span><br><span style="color: hsl(120, 100%, 40%);">+    var RAW_PCU_BTS_CT vc_BTS;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Start the guard timer */</span><br><span style="color: hsl(120, 100%, 40%);">+   g_T_guard.start;</span><br><span style="color: hsl(120, 100%, 40%);">+      activate(as_Tguard_RAW());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Init PCU interface component */</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_PCUIF := RAW_PCUIF_CT.create("PCUIF-" & id);</span><br><span style="color: hsl(120, 100%, 40%);">+ connect(vc_PCUIF:MTC, self:PCUIF);</span><br><span style="color: hsl(120, 100%, 40%);">+    map(vc_PCUIF:PCU, system:PCU);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Create one BTS component (we may want more some day) */</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_BTS := RAW_PCU_BTS_CT.create("BTS-" & id);</span><br><span style="color: hsl(120, 100%, 40%);">+   connect(vc_BTS:PCUIF, vc_PCUIF:BTS);</span><br><span style="color: hsl(120, 100%, 40%);">+  connect(vc_BTS:TC, self:BTS);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_init_vty(id);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     vc_PCUIF.start(f_PCUIF_CT_handler(mp_pcu_sock_path));</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_BTS.start(f_BTS_CT_handler(0, valueof(info_ind)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Wait until the BTS is ready (SI13 negotiated) */</span><br><span style="color: hsl(120, 100%, 40%);">+   BTS.receive(tr_RAW_PCU_EV(BTS_EV_SI13_NEGO));</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 AckNackDescription t_AckNackDescription_init := {</span><br><span style="color: hsl(120, 100%, 40%);">+        final_ack := '0'B,</span><br><span style="color: hsl(120, 100%, 40%);">+    starting_seq_nr := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ receive_block_bitmap := '0000000000000000000000000000000000000000000000000000000000000000'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%);">+private function f_rlcmac_dl_block_get_tfi(RlcmacDlBlock dl_block) return uint5_t {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ischosen(dl_block.data)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                return dl_block.data.mac_hdr.hdr_ext.tfi;</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              return dl_block.data_egprs.mac_hdr.tfi;</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%);">+/* TS 44.060 sec 12.3 Ack/Nack Description */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_acknackdesc_ack_block(inout AckNackDescription desc, RlcmacDlBlock dl_block, BIT1 final_ack := '0'B)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     var uint7_t bsn;</span><br><span style="color: hsl(120, 100%, 40%);">+      var integer i;</span><br><span style="color: hsl(120, 100%, 40%);">+        var integer inc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (ischosen(dl_block.data)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                bsn := dl_block.data.mac_hdr.hdr_ext.bsn;</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              bsn := dl_block.data_egprs.mac_hdr.bsn1;</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%);">+   inc := bsn - desc.starting_seq_nr + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Filling hole? */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (bsn < desc.starting_seq_nr) {</span><br><span style="color: hsl(120, 100%, 40%);">+          desc.receive_block_bitmap[lengthof(desc.receive_block_bitmap) - (desc.starting_seq_nr - bsn)] := int2bit(1, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+               return;</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%);">+   /* SSN is increased, and so RBB values need to be moved */</span><br><span style="color: hsl(120, 100%, 40%);">+    for (i := 0; i < lengthof(desc.receive_block_bitmap) - inc; i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+            desc.receive_block_bitmap[i] := desc.receive_block_bitmap[i + inc];</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+     for (i := lengthof(desc.receive_block_bitmap) - inc; i < lengthof(desc.receive_block_bitmap) - 1; i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+              desc.receive_block_bitmap[i] := int2bit(0, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Now we can set current bit and update SSN */</span><br><span style="color: hsl(120, 100%, 40%);">+       desc.starting_seq_nr := bsn + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+      desc.receive_block_bitmap[lengthof(desc.receive_block_bitmap) - 1] := int2bit(1, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Finally update the final_ack bit as requested: */</span><br><span style="color: hsl(120, 100%, 40%);">+  desc.final_ack := final_ack;</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 function can be used to send DATA.cnf in response to the IUT originated DATA.req.</span><br><span style="color: hsl(120, 100%, 40%);">+ * NOTE: it's the responsibility of caller to make sure that pcu_msg contains u.data_req. */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_pcuif_tx_data_cnf(in PCUIF_Message pcu_msg)</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_Message pcu_msg_cnf := {</span><br><span style="color: hsl(120, 100%, 40%);">+            msg_type := PCU_IF_MSG_DATA_CNF,</span><br><span style="color: hsl(120, 100%, 40%);">+              bts_nr := pcu_msg.bts_nr,</span><br><span style="color: hsl(120, 100%, 40%);">+             spare := pcu_msg.spare,</span><br><span style="color: hsl(120, 100%, 40%);">+               u := { data_cnf := pcu_msg.u.data_req }</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%);">+  /* PCU wants DATA.cnf containing basically everything that was in DATA.req,</span><br><span style="color: hsl(120, 100%, 40%);">+    * but PCU_IF_SAPI_PCH is a special case - paging group shall be excluded. */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (pcu_msg.u.data_req.sapi == PCU_IF_SAPI_PCH) {</span><br><span style="color: hsl(120, 100%, 40%);">+             pcu_msg_cnf.u.data_cnf.data := substr(pcu_msg.u.data_req.data, 3,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   pcu_msg.u.data_req.len - 3);</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%);">+   BTS.send(pcu_msg_cnf);</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_pcuif_rx_imm_ass(out GsmRrMessage rr_imm_ass,</span><br><span style="color: hsl(120, 100%, 40%);">+                             template PCUIF_Sapi sapi := PCU_IF_SAPI_AGCH,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 template GsmRrMessage t_imm_ass := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 uint8_t bts_nr := 0)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on RAW_PCU_Test_CT return boolean {</span><br><span style="color: hsl(120, 100%, 40%);">+    var PCUIF_Message pcu_msg;</span><br><span style="color: hsl(120, 100%, 40%);">+    var octetstring data;</span><br><span style="color: hsl(120, 100%, 40%);">+ timer T;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    T.start(2.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BTS.receive(tr_PCUIF_DATA_REQ(bts_nr := bts_nr, trx_nr := 0, ts_nr := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    sapi := sapi, data := ?)) -> value pcu_msg {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* On PCH the payload is prefixed with paging group (3 octets): skip it.</span><br><span style="color: hsl(120, 100%, 40%);">+               * TODO: add an additional template parameter, so we can match it. */</span><br><span style="color: hsl(120, 100%, 40%);">+         if (pcu_msg.u.data_req.sapi == PCU_IF_SAPI_PCH) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     data := substr(pcu_msg.u.data_req.data, 3, pcu_msg.u.data_req.len - 3);</span><br><span style="color: hsl(120, 100%, 40%);">+               } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      data := pcu_msg.u.data_req.data;</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_imm_ass := dec_GsmRrMessage(data);</span><br><span style="color: hsl(120, 100%, 40%);">+         if (not match(rr_imm_ass, t_imm_ass)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       /* Not for us? Wait for more. */</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           log("Rx Immediate Assignment: ", rr_imm_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+               setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+             return true;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] BTS.receive { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+    [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Timeout waiting for Immediate Assignment");</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%);">+   return 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%);">+/* FIXME: properly encode RA (see TS 24.060, table 11.2.5.2) */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_establish_tbf(out GsmRrMessage rr_imm_ass, uint8_t bts_nr := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                uint16_t ra := oct2int('3A'O), uint8_t is_11bit := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 PCUIF_BurstType burst_type := BURST_TYPE_0,</span><br><span style="color: hsl(120, 100%, 40%);">+                           TimingAdvance ta := 0)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on RAW_PCU_Test_CT return boolean {</span><br><span style="color: hsl(120, 100%, 40%);">+     var uint32_t fn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* FIXME: ask the BTS component to give us the current TDMA fn */</span><br><span style="color: hsl(120, 100%, 40%);">+     fn := 1337 + ta;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Send RACH.ind */</span><br><span style="color: hsl(120, 100%, 40%);">+   log("Sending RACH.ind on fn=", fn, " with RA=", ra, ", TA=", ta);</span><br><span style="color: hsl(120, 100%, 40%);">+       BTS.send(ts_PCUIF_RACH_IND(bts_nr := bts_nr, trx_nr := 0, ts_nr := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                            ra := ra, is_11bit := is_11bit,</span><br><span style="color: hsl(120, 100%, 40%);">+                               burst_type := burst_type,</span><br><span style="color: hsl(120, 100%, 40%);">+                             fn := fn, arfcn := 871,</span><br><span style="color: hsl(120, 100%, 40%);">+                               qta := ta * 4));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* 3GPP TS 44.018, table 9.1.8.1, note 2b: Request Reference shall be set to 127</span><br><span style="color: hsl(120, 100%, 40%);">+       * when Immediate Assignment is triggered by EGPRS Packet Channel Request. Here</span><br><span style="color: hsl(120, 100%, 40%);">+        * we assume that 11 bit RA always contains EGPRS Packet Channel Request. */</span><br><span style="color: hsl(120, 100%, 40%);">+  if (is_11bit != 0) { ra := 127; }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Expect Immediate (TBF) Assignment on TS0/AGCH */</span><br><span style="color: hsl(120, 100%, 40%);">+   return f_pcuif_rx_imm_ass(rr_imm_ass, PCU_IF_SAPI_AGCH,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 tr_IMM_TBF_ASS(?, ra, fn),</span><br><span style="color: hsl(120, 100%, 40%);">+                            bts_nr := bts_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_imm_ass_verify_ul_tbf_ass(GsmRrMessage rr_imm_ass, out PacketUlAssign ul_tbf_ass)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on RAW_PCU_Test_CT return boolean {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Make sure we received an UL TBF Assignment */</span><br><span style="color: hsl(120, 100%, 40%);">+      if (match(rr_imm_ass, tr_IMM_TBF_ASS(dl := false, rest := tr_IaRestOctets_ULAss(?)))) {</span><br><span style="color: hsl(120, 100%, 40%);">+               ul_tbf_ass := rr_imm_ass.payload.imm_ass.rest_octets.hh.pa.uldl.ass.ul;</span><br><span style="color: hsl(120, 100%, 40%);">+               log("Rx Uplink TBF assignment: ", ul_tbf_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(fail, "Failed to match UL TBF Assignment");</span><br><span style="color: hsl(120, 100%, 40%);">+              return 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%);">+   /* Make sure we have got a TBF with Dynamic Block Allocation */</span><br><span style="color: hsl(120, 100%, 40%);">+       if (ul_tbf_ass.dynamic == omit) {</span><br><span style="color: hsl(120, 100%, 40%);">+             setverdict(fail, "Single Block Allocation is not handled by ", testcasename());</span><br><span style="color: hsl(120, 100%, 40%);">+             return 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%);">+   return 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%);">+private function f_imm_ass_verify_dl_tbf_ass(GsmRrMessage rr_imm_ass, out PacketDlAssign dl_tbf_ass)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on RAW_PCU_Test_CT return boolean {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Make sure we received a DL TBF Assignment */</span><br><span style="color: hsl(120, 100%, 40%);">+       if (match(rr_imm_ass, tr_IMM_TBF_ASS(dl := true, rest := tr_IaRestOctets_DLAss(?)))) {</span><br><span style="color: hsl(120, 100%, 40%);">+                dl_tbf_ass := rr_imm_ass.payload.imm_ass.rest_octets.hh.pa.uldl.ass.dl;</span><br><span style="color: hsl(120, 100%, 40%);">+               log("Rx Downlink TBF assignment: ", dl_tbf_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+            setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(fail, "Failed to match DL TBF Assignment");</span><br><span style="color: hsl(120, 100%, 40%);">+              return 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%);">+   return 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%);">+/* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_pcuif_tx_data_ind(octetstring data, int16_t lqual_cb := 0, uint32_t fn := 0)</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 template RAW_PCU_EventParam ev_param := {tdma_fn := ? };</span><br><span style="color: hsl(120, 100%, 40%);">+  BTS.send(ts_PCUIF_DATA_IND(bts_nr := 0, trx_nr := 0, ts_nr := 7, block_nr := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  sapi := PCU_IF_SAPI_PDTCH, data := data,</span><br><span style="color: hsl(120, 100%, 40%);">+                              fn := fn, arfcn := 871, lqual_cb := lqual_cb));</span><br><span style="color: hsl(120, 100%, 40%);">+    if (fn != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                ev_param := {tdma_fn := fn };</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     BTS.receive(tr_RAW_PCU_EV(TDMA_EV_PDTCH_BLOCK_SENT, ev_param));</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%);">+/* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_pcuif_rx_data_req(out PCUIF_Message pcu_msg)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     BTS.send(ts_PCUIF_RTS_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 sapi := PCU_IF_SAPI_PDTCH, fn := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                           arfcn := 871, block_nr := 0));</span><br><span style="color: hsl(120, 100%, 40%);">+      BTS.receive(tr_PCUIF_DATA_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 sapi := PCU_IF_SAPI_PDTCH)) -> value pcu_msg;</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%);">+/* Expect an Immediate Assignment (paging) from PCU on PCUIF on specified sapi.  */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_pcuif_rx_pch_imm_tbf_ass(out GsmRrMessage rr_imm_ass)</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_Message pcu_msg;</span><br><span style="color: hsl(120, 100%, 40%);">+    var octetstring macblock;</span><br><span style="color: hsl(120, 100%, 40%);">+     BTS.receive(tr_PCUIF_DATA_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 sapi := PCU_IF_SAPI_PCH)) -> value pcu_msg;</span><br><span style="color: hsl(120, 100%, 40%);">+  /* First 3 bytes contain paging group: */</span><br><span style="color: hsl(120, 100%, 40%);">+     macblock := substr(pcu_msg.u.data_req.data, 3, pcu_msg.u.data_req.len - 3);</span><br><span style="color: hsl(120, 100%, 40%);">+   rr_imm_ass := dec_GsmRrMessage(macblock);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (not match(rr_imm_ass, tr_IMM_TBF_ASS())) {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Failed to match Immediate Assignment: ", rr_imm_ass);</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%);">+     f_pcuif_tx_data_cnf(pcu_msg);</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%);">+/* Expect a Paging Request Type 1 from PCU on PCUIF on specified sapi.  */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_pcuif_rx_pch_pag_req1(template MobileIdentityV mi1 := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    template integer pag_group := ?)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on RAW_PCU_Test_CT return GsmRrMessage {</span><br><span style="color: hsl(120, 100%, 40%);">+      var GsmRrMessage rr_pag_req1;</span><br><span style="color: hsl(120, 100%, 40%);">+ var PCUIF_Message pcu_msg;</span><br><span style="color: hsl(120, 100%, 40%);">+    var octetstring imsi_suff_octstr;</span><br><span style="color: hsl(120, 100%, 40%);">+     var integer pag_group_rx;</span><br><span style="color: hsl(120, 100%, 40%);">+     var octetstring macblock;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   BTS.receive(tr_PCUIF_DATA_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 sapi := PCU_IF_SAPI_PCH)) -> value pcu_msg;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* First 3 bytes contain IMSI suffix to calculate paging group: */</span><br><span style="color: hsl(120, 100%, 40%);">+    imsi_suff_octstr := substr(pcu_msg.u.data_req.data, 0, 3);</span><br><span style="color: hsl(120, 100%, 40%);">+    pag_group_rx := str2int(oct2char(imsi_suff_octstr[0])) * 100 +</span><br><span style="color: hsl(120, 100%, 40%);">+                        str2int(oct2char(imsi_suff_octstr[1])) * 10 +</span><br><span style="color: hsl(120, 100%, 40%);">+                 str2int(oct2char(imsi_suff_octstr[2]));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Make sure we've got RR Paging Request Type 1 for a given MI */</span><br><span style="color: hsl(120, 100%, 40%);">+ macblock := substr(pcu_msg.u.data_req.data, 3, pcu_msg.u.data_req.len - 3);</span><br><span style="color: hsl(120, 100%, 40%);">+   rr_pag_req1 := dec_GsmRrMessage(macblock);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (not match(rr_pag_req1, tr_PAG_REQ1(tr_MI_LV(mi1)))) {</span><br><span style="color: hsl(120, 100%, 40%);">+             setverdict(fail, "Failed to match Paging Request Type 1: ", rr_pag_req1);</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%);">+   /* Make sure that received paging froup matches the expected one */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (not match(pag_group_rx, pag_group)) {</span><br><span style="color: hsl(120, 100%, 40%);">+             setverdict(fail, "Paging group", pag_group_rx, " does not match expected ", pag_group);</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%);">+   f_pcuif_tx_data_cnf(pcu_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return rr_pag_req1;</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_tx_rlcmac_ul_block(template (value) RlcmacUlBlock ul_data, int16_t lqual_cb := 0, uint32_t fn := 0)</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 octetstring data;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Encode the payload of DATA.ind */</span><br><span style="color: hsl(120, 100%, 40%);">+  data := enc_RlcmacUlBlock(valueof(ul_data));</span><br><span style="color: hsl(120, 100%, 40%);">+  data := f_pad_oct(data, 23, '00'O); /* CS-1 */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */</span><br><span style="color: hsl(120, 100%, 40%);">+      f_pcuif_tx_data_ind(data, lqual_cb, fn);</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_tx_rlcmac_ul_n_blocks(PacketUlAssign ul_tbf_ass, integer num_blocks := 1)</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 template (value) RlcmacUlBlock ul_data := t_RLCMAC_UL_DATA(</span><br><span style="color: hsl(120, 100%, 40%);">+               tfi := ul_tbf_ass.dynamic.tfi_assignment,</span><br><span style="color: hsl(120, 100%, 40%);">+             cv := num_blocks - 1, /* num UL blocks to be sent (to be overridden in loop) */</span><br><span style="color: hsl(120, 100%, 40%);">+               bsn := 0, /* TODO: what should be here? */</span><br><span style="color: hsl(120, 100%, 40%);">+            blocks := { /* To be generated in loop */ });</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* HACK: patch missing TLLI; otherwise OsmoPCU rejects DATA.req */</span><br><span style="color: hsl(120, 100%, 40%);">+    ul_data.data.tlli := '00000001'O;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   for (var integer i := 0; i < num_blocks; i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+             /* Prepare a new UL block (CV, random payload) */</span><br><span style="color: hsl(120, 100%, 40%);">+             ul_data.data.mac_hdr.countdown := (num_blocks - i - 1);</span><br><span style="color: hsl(120, 100%, 40%);">+               ul_data.data.blocks := { valueof(t_RLCMAC_LLCBLOCK(f_rnd_octstring(10))) };</span><br><span style="color: hsl(120, 100%, 40%);">+           f_tx_rlcmac_ul_block(ul_data);</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_rx_rlcmac_dl_block(out RlcmacDlBlock dl_block, out uint32_t dl_fn, template (present) CodingScheme exp_cs_mcs := ?)</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_Message pcu_msg;</span><br><span style="color: hsl(120, 100%, 40%);">+    f_pcuif_rx_data_req(pcu_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ dl_block := dec_RlcmacDlBlock(pcu_msg.u.data_req.data);</span><br><span style="color: hsl(120, 100%, 40%);">+       dl_fn := pcu_msg.u.data_req.fn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     var integer len := lengthof(pcu_msg.u.data_req.data);</span><br><span style="color: hsl(120, 100%, 40%);">+ var CodingScheme cs_mcs := f_rlcmac_block_len2cs_mcs(len)</span><br><span style="color: hsl(120, 100%, 40%);">+     if (not match(f_rlcmac_block_len2cs_mcs(len), exp_cs_mcs)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          setverdict(fail, "Failed to match Coding Scheme exp ", exp_cs_mcs, " vs ", cs_mcs, " (", len, ")");</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_rx_rlcmac_dl_block_exp_ack_nack(out RlcmacDlBlock dl_block, out uint32_t poll_fn)</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 uint32_t dl_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_rx_rlcmac_dl_block(dl_block, dl_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK(ul_tfi := ?, tlli := ?))) {</span><br><span style="color: hsl(120, 100%, 40%);">+             setverdict(fail, "Failed to match Packet Uplink ACK / NACK");</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%);">+   poll_fn := dl_fn + f_rrbp_fn_delay(dl_block.ctrl.mac_hdr.rrbp);</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_rx_rlcmac_dl_block_exp_dummy(out RlcmacDlBlock dl_block)</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 uint32_t dl_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_rx_rlcmac_dl_block(dl_block, dl_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (not match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {</span><br><span style="color: hsl(120, 100%, 40%);">+            setverdict(fail, "Failed to match Packet DUMMY DL");</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_rx_rlcmac_dl_block_exp_pkt_ass(out RlcmacDlBlock dl_block, out uint32_t poll_fn)</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 uint32_t dl_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_rx_rlcmac_dl_block(dl_block, dl_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (not match(dl_block, tr_RLCMAC_DL_PACKET_ASS())) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Failed to match Packet Downlink Assignment");</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%);">+   poll_fn := dl_fn + f_rrbp_fn_delay(dl_block.ctrl.mac_hdr.rrbp);</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_rx_rlcmac_dl_block_exp_pkt_ul_ass(out RlcmacDlBlock dl_block, out uint32_t poll_fn)</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 uint32_t dl_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        f_rx_rlcmac_dl_block(dl_block, dl_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (not match(dl_block, tr_RLCMAC_UL_PACKET_ASS())) {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Failed to match Packet Uplink Assignment");</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%);">+        poll_fn := dl_fn + f_rrbp_fn_delay(dl_block.ctrl.mac_hdr.rrbp);</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_rx_rlcmac_dl_block_exp_pkt_pag_req(out RlcmacDlBlock dl_block)</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 uint32_t dl_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_rx_rlcmac_dl_block(dl_block, dl_fn);</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, "Failed to match Packet Paging Request: ", dl_block, " vs ", tr_RLCMAC_PACKET_PAG_REQ());</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_rlcmac_dl_block_verify_data_gprs(RlcmacDlBlock dl_block, uint32_t dl_fn, out uint32_t ack_fn, octetstring data, template (present) uint7_t exp_bsn := ?, template (present) CodingScheme exp_cs := ?)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   log("verifying dl data block (gprs): ", dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        ack_fn := dl_fn + f_rrbp_fn_delay(dl_block.data.mac_hdr.mac_hdr.rrbp);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      if (not match(dl_block.data.mac_hdr.hdr_ext.bsn, exp_bsn)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          setverdict(fail, "DL block BSN doesn't match: ",</span><br><span style="color: hsl(120, 100%, 40%);">+                           dl_block.data.blocks[0].hdr.length_ind, " vs exp ", exp_bsn);</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 (lengthof(dl_block.data.blocks) < 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+          setverdict(fail, "DL block has no LLC payload: ", dl_block);</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%);">+   if (ispresent(dl_block.data.blocks[0].hdr) and dl_block.data.blocks[0].hdr.length_ind != lengthof(data)) {</span><br><span style="color: hsl(120, 100%, 40%);">+            setverdict(fail, "DL block has LLC header with wrong expected size: ",</span><br><span style="color: hsl(120, 100%, 40%);">+                         dl_block.data.blocks[0].hdr.length_ind, " vs ", lengthof(data));</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%);">+   if (dl_block.data.blocks[0].payload != data) {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Failed to match content of LLC payload in DL Block: ", dl_block, " vs ", data);</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%);">+   /* Check next data blocks contain dummy frames */</span><br><span style="color: hsl(120, 100%, 40%);">+     if (lengthof(dl_block.data.blocks) > 1 and substr(dl_block.data.blocks[1].payload, 0, 3) != '43C001'O) {</span><br><span style="color: hsl(120, 100%, 40%);">+           setverdict(fail, "Second data payload is not a dummy frame: ", dl_block.data.blocks[1].payload);</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%);">+   /* TODO: check exp_cs */</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_rlcmac_dl_block_verify_data_egprs(RlcmacDlBlock dl_block, uint32_t dl_fn, out uint32_t ack_fn, octetstring data, template (present) uint14_t exp_bsn := ?, template (present) CodingScheme exp_cs := ?)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  log("verifying dl data block (egprs): ", dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       ack_fn := dl_fn + f_rrbp_fn_delay(dl_block.data_egprs.mac_hdr.rrbp);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (not match(dl_block.data_egprs.mac_hdr.bsn1, exp_bsn)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           setverdict(fail, "DL block BSN doesn't match: ",</span><br><span style="color: hsl(120, 100%, 40%);">+                           dl_block.data_egprs.blocks[0].hdr.length_ind, " vs exp ", exp_bsn);</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 (lengthof(dl_block.data_egprs.blocks) < 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+            setverdict(fail, "DL block has no LLC payload: ", dl_block);</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%);">+   if (ispresent(dl_block.data_egprs.blocks[0].hdr) and dl_block.data_egprs.blocks[0].hdr.length_ind != lengthof(data)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "DL block has LLC header with wrong expected size: ",</span><br><span style="color: hsl(120, 100%, 40%);">+                         dl_block.data_egprs.blocks[0].hdr.length_ind, " vs ", lengthof(data));</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%);">+   if (dl_block.data_egprs.blocks[0].payload != data) {</span><br><span style="color: hsl(120, 100%, 40%);">+          setverdict(fail, "Failed to match content of LLC payload in DL Block: ", dl_block, " vs ", data);</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%);">+   /* Check next data blocks contain dummy frames */</span><br><span style="color: hsl(120, 100%, 40%);">+     if (lengthof(dl_block.data_egprs.blocks) > 1 and substr(dl_block.data_egprs.blocks[1].payload, 0, 3) != '43C001'O) {</span><br><span style="color: hsl(120, 100%, 40%);">+               setverdict(fail, "Second data payload is not a dummy frame: ", dl_block.data.blocks[1].payload);</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%);">+   /* TODO: Check exp_cs. In the case of EGPRS, first check mac_hdr.header_type and then decode CPS = exp_cs based on mac_hdr.header_type.</span><br><span style="color: hsl(120, 100%, 40%);">+               See wireshark's egprs_Header_type1_coding_puncturing_scheme_to_mcs. */</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_rx_rlcmac_dl_block_exp_data(out RlcmacDlBlock dl_block, out uint32_t ack_fn, octetstring data, template (present) uint7_t exp_bsn := ?, template (present) CodingScheme exp_cs := ?)</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_Message pcu_msg;</span><br><span style="color: hsl(120, 100%, 40%);">+    var uint32_t dl_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+   var boolean is_egprs := false;</span><br><span style="color: hsl(120, 100%, 40%);">+        var template RlcmacDlBlock dl_template := tr_RLCMAC_DATA_RRBP;</span><br><span style="color: hsl(120, 100%, 40%);">+        dl_template.data.blocks := ?;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_rx_rlcmac_dl_block(dl_block, dl_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (not match(dl_block, dl_template)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               dl_template := tr_RLCMAC_DATA_EGPRS;</span><br><span style="color: hsl(120, 100%, 40%);">+          dl_template.data_egprs.blocks := ?;</span><br><span style="color: hsl(120, 100%, 40%);">+           if (not match(dl_block, dl_template)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       setverdict(fail, "Failed to match Packet data: ", dl_block, " vs ", dl_template);</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%);">+             is_egprs := 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%);">+   if (is_egprs) {</span><br><span style="color: hsl(120, 100%, 40%);">+               f_rlcmac_dl_block_verify_data_egprs(dl_block, dl_fn, ack_fn, data, exp_bsn, exp_cs);</span><br><span style="color: hsl(120, 100%, 40%);">+  } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              f_rlcmac_dl_block_verify_data_gprs(dl_block, dl_fn, ack_fn, data, exp_bsn, exp_cs);</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%);">+testcase TC_pcuif_suspend() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var octetstring ra_id := enc_RoutingAreaIdentification(mp_gb_cfg.cell_id.ra_id);</span><br><span style="color: hsl(120, 100%, 40%);">+      var GprsTlli tlli := 'FFFFFFFF'O;</span><br><span style="color: hsl(120, 100%, 40%);">+     timer T;</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%);">+     /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init_raw(testcasename());</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        BTS.send(ts_PCUIF_SUSP_REQ(0, tlli, ra_id, 0));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     T.start(2.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BSSGP_SIG[0].receive(tr_BSSGP_SUSPEND(tlli, mp_gb_cfg.cell_id.ra_id)) {</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%);">+     [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Timeout waiting for BSSGP SUSPEND");</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%);">+/* Test of correct Timing Advance at the time of TBF establishment</span><br><span style="color: hsl(120, 100%, 40%);">+ * (derived from timing offset of the Access Burst). */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_ta_rach_imm_ass() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  var GsmRrMessage rr_msg;</span><br><span style="color: hsl(120, 100%, 40%);">+      var boolean ok;</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());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* We cannot send too many TBF requests in a short time because</span><br><span style="color: hsl(120, 100%, 40%);">+        * at some point the PCU will fail to allocate a new TBF. */</span><br><span style="color: hsl(120, 100%, 40%);">+  for (var TimingAdvance ta := 0; ta < 64; ta := ta + 16) {</span><br><span style="color: hsl(120, 100%, 40%);">+          /* Establish an Uplink TBF (send RACH.ind with current TA) */</span><br><span style="color: hsl(120, 100%, 40%);">+         ok := f_establish_tbf(rr_msg, bts_nr := 0, ta := ta);</span><br><span style="color: hsl(120, 100%, 40%);">+         if (not ok) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 setverdict(fail, "Failed to establish an Uplink TBF");</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%);">+           /* Make sure Timing Advance IE matches out expectations */</span><br><span style="color: hsl(120, 100%, 40%);">+            if (match(rr_msg, tr_IMM_TBF_ASS(dl := false, ta := ta))) {</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%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Verify Timing Advance value(s) indicated during the packet Downlink assignment</span><br><span style="color: hsl(120, 100%, 40%);">+ * procedure as per 3GPP TS 44.018, section 3.5.3. There seems to be a bug in the</span><br><span style="color: hsl(120, 100%, 40%);">+ * IUT that causes it to send an unreasonable Timing Advance value > 0 despite</span><br><span style="color: hsl(120, 100%, 40%);">+ * no active TBF exists at the moment of establishment (idle mode). */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_ta_idle_dl_tbf_ass() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   var OCT4 tlli := f_rnd_octstring(4);</span><br><span style="color: hsl(120, 100%, 40%);">+  var GsmRrMessage rr_imm_ass;</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%);">+     /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init_raw(testcasename());</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_bssgp_client_llgmm_assign('FFFFFFFF'O, tlli);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* SGSN sends some DL data, PCU will initiate Packet Downlink</span><br><span style="color: hsl(120, 100%, 40%);">+  * Assignment on CCCH (PCH). We don't care about the payload. */</span><br><span style="color: hsl(120, 100%, 40%);">+  BSSGP[0].send(ts_BSSGP_DL_UD(tlli, f_rnd_octstring(10)));</span><br><span style="color: hsl(120, 100%, 40%);">+     f_pcuif_rx_pch_imm_tbf_ass(rr_imm_ass); // TODO: match by TLLI!</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Make sure that Timing Advance is 0 (the actual value is not known yet).</span><br><span style="color: hsl(120, 100%, 40%);">+     * As per 3GPP S 44.018, section 3.5.3.1.2, the network *shall* initiate</span><br><span style="color: hsl(120, 100%, 40%);">+       * the procedures defined in 3GPP TS 44.060 or use the polling mechanism. */</span><br><span style="color: hsl(120, 100%, 40%);">+  if (not match(rr_imm_ass, tr_IMM_TBF_ASS(ta := 0))) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Timing Advance value doesn't match");</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Verify that the PCU generates valid PTCCH/D messages</span><br><span style="color: hsl(120, 100%, 40%);">+ * while neither Uplink nor Downlink TBF is established. */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_ta_ptcch_idle() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   var PTCCHDownlinkMsg ptcch_msg;</span><br><span style="color: hsl(120, 100%, 40%);">+       var PCUIF_Message pcu_msg;</span><br><span style="color: hsl(120, 100%, 40%);">+    timer T;</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());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Sent an RTS.req for PTCCH/D */</span><br><span style="color: hsl(120, 100%, 40%);">+     BTS.send(ts_PCUIF_RTS_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 sapi := PCU_IF_SAPI_PTCCH, fn := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                           arfcn := 871, block_nr := 0));</span><br><span style="color: hsl(120, 100%, 40%);">+      T.start(5.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BTS.receive(tr_PCUIF_DATA_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,</span><br><span style="color: hsl(120, 100%, 40%);">+                                         sapi := PCU_IF_SAPI_PTCCH)) -> value pcu_msg {</span><br><span style="color: hsl(120, 100%, 40%);">+            log("Rx DATA.req message: ", pcu_msg);</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%);">+     [] BTS.receive(PCUIF_Message:?) { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+   [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Timeout waiting for a PTCCH/D block");</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   ptcch_msg := dec_PTCCHDownlinkMsg(pcu_msg.u.data_req.data);</span><br><span style="color: hsl(120, 100%, 40%);">+   log("Decoded PTCCH/D message: ", ptcch_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Make sure the message is encoded correctly</span><br><span style="color: hsl(120, 100%, 40%);">+  * TODO: do we expect all TA values to be equal '1111111'B? */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (not match(ptcch_msg, tr_PTCCHDownlinkMsg)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(fail, "Malformed PTCCH/D message");</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test of correct Timing Advance during an active Uplink TBF.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Unlike the circuit-switched domain, Uplink transmissions on PDCH time-slots</span><br><span style="color: hsl(120, 100%, 40%);">+ * are not continuous and there can be long time gaps between them. This happens</span><br><span style="color: hsl(120, 100%, 40%);">+ * due to a bursty nature of packet data. The actual Timing Advance of a MS may</span><br><span style="color: hsl(120, 100%, 40%);">+ * significantly change between such rare Uplink transmissions, so GPRS introduces</span><br><span style="color: hsl(120, 100%, 40%);">+ * additional mechanisms to control Timing Advance, and thus reduce interference</span><br><span style="color: hsl(120, 100%, 40%);">+ * between neighboring TDMA time-slots.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * At the moment of Uplink TBF establishment, initial Timing Advance is measured</span><br><span style="color: hsl(120, 100%, 40%);">+ * from ToA (Timing of Arrival) of an Access Burst. This is covered by another</span><br><span style="color: hsl(120, 100%, 40%);">+ * test case - TC_ta_rach_imm_ass. In response to that Access Burst the network</span><br><span style="color: hsl(120, 100%, 40%);">+ * sends Immediate Assignment on AGCH, which _may_ contain Timing Advance Index</span><br><span style="color: hsl(120, 100%, 40%);">+ * among with the initial Timing Advance value. And here PTCCH comes to play.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * PTCCH is a unidirectional channel on which the network can instruct a sub-set</span><br><span style="color: hsl(120, 100%, 40%);">+ * of 16 MS (whether TBFs are active or not) to adjust their Timing Advance</span><br><span style="color: hsl(120, 100%, 40%);">+ * continuously. To ensure continuous measurements of the signal propagation</span><br><span style="color: hsl(120, 100%, 40%);">+ * delay, the MSs shall transmit Access Bursts on Uplink (PTCCH/U) on sub-slots</span><br><span style="color: hsl(120, 100%, 40%);">+ * defined by an assigned Timing Advance Index (see 3GPP TS 45.002).</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * The purpose of this test case is to verify the assignment of Timing Advance</span><br><span style="color: hsl(120, 100%, 40%);">+ * Index, and the process of Timing Advance notification on PTCCH/D. The MTC</span><br><span style="color: hsl(120, 100%, 40%);">+ * first establishes several Uplink TBFs, but does not transmit any Uplink</span><br><span style="color: hsl(120, 100%, 40%);">+ * blocks on them. During 4 TDMA multi-frame periods the MTC is sending RACH</span><br><span style="color: hsl(120, 100%, 40%);">+ * indications to the PCU, checking the correctness of two received PTCCH/D</span><br><span style="color: hsl(120, 100%, 40%);">+ * messages (period of PTCCH/D is two multi-frames).</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%);">+/* List of ToA values for Access Bursts to be sent on PTCCH/U,</span><br><span style="color: hsl(120, 100%, 40%);">+ * each ToA (Timing of Arrival) value is in units of 1/4 of</span><br><span style="color: hsl(120, 100%, 40%);">+ * a symbol (i.e. 1 symbol is 4 QTA units). */</span><br><span style="color: hsl(120, 100%, 40%);">+type record length(16) of int16_t PTCCH_TAI_ToA_MAP;</span><br><span style="color: hsl(120, 100%, 40%);">+const PTCCH_TAI_ToA_MAP ptcch_toa_map_def := {</span><br><span style="color: hsl(120, 100%, 40%);">+  0, 0, 0, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+   0, 0, 0, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+   0, 0, 0, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+   0, 0, 0, 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 altstep as_ta_ptcch(uint8_t bts_nr := 0, uint8_t trx_nr := 0, uint8_t ts_nr := 7,</span><br><span style="color: hsl(120, 100%, 40%);">+                       in PTCCH_TAI_ToA_MAP toa_map := ptcch_toa_map_def)</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 RAW_PCU_Event event;</span><br><span style="color: hsl(120, 100%, 40%);">+      var integer ss;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Send Access Bursts on PTCCH/U for every TA Index */</span><br><span style="color: hsl(120, 100%, 40%);">+        [] BTS.receive(tr_RAW_PCU_EV(TDMA_EV_PTCCH_UL_BURST)) -> value event {</span><br><span style="color: hsl(120, 100%, 40%);">+             ss := f_tdma_ptcch_fn2ss(event.data.tdma_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+         if (ss < 0) { mtc.stop; } /* Shall not happen */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         log("Sending an Access Burst on PTCCH/U",</span><br><span style="color: hsl(120, 100%, 40%);">+               ", sub-slot=", ss, " (TAI)",</span><br><span style="color: hsl(120, 100%, 40%);">+              ", fn=", event.data.tdma_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                ", ToA=", toa_map[ss], " (QTA)");</span><br><span style="color: hsl(120, 100%, 40%);">+             /* TODO: do we care about RA and burst format? */</span><br><span style="color: hsl(120, 100%, 40%);">+             BTS.send(ts_PCUIF_RACH_IND(bts_nr, trx_nr, ts_nr,</span><br><span style="color: hsl(120, 100%, 40%);">+                                        ra := oct2int('3A'O),</span><br><span style="color: hsl(120, 100%, 40%);">+                                         is_11bit := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                        burst_type := BURST_TYPE_0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                           fn := event.data.tdma_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     arfcn := 871,</span><br><span style="color: hsl(120, 100%, 40%);">+                                         qta := toa_map[ss],</span><br><span style="color: hsl(120, 100%, 40%);">+                                           sapi := PCU_IF_SAPI_PTCCH));</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%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_ta_ptcch_ul_multi_tbf(in PTCCH_TAI_ToA_MAP ptcch_toa_map,</span><br><span style="color: hsl(120, 100%, 40%);">+                                           template PTCCHDownlinkMsg t_ta_msg)</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 PTCCHDownlinkMsg ta_msg;</span><br><span style="color: hsl(120, 100%, 40%);">+  var PCUIF_Message pcu_msg;</span><br><span style="color: hsl(120, 100%, 40%);">+    timer T;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* First, send an RTS.req for the upcoming PTCCH/D block */</span><br><span style="color: hsl(120, 100%, 40%);">+   BTS.send(ts_PCUIF_RTS_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 sapi := PCU_IF_SAPI_PTCCH, fn := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                           arfcn := 871, block_nr := 0));</span><br><span style="color: hsl(120, 100%, 40%);">+      T.start(2.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Keep sending of Access Bursts during two multi-frames (period of PTCCH/D)</span><br><span style="color: hsl(120, 100%, 40%);">+   * with increasing ToA (Timing of Arrival) values: 0, 7, 14, 28, 35... */</span><br><span style="color: hsl(120, 100%, 40%);">+     [] as_ta_ptcch(bts_nr := 0, trx_nr := 0, ts_nr := 7, toa_map := ptcch_toa_map);</span><br><span style="color: hsl(120, 100%, 40%);">+       /* In the end of 2nd multi-frame we should receive a PTCCH/D block */</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BTS.receive(tr_PCUIF_DATA_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,</span><br><span style="color: hsl(120, 100%, 40%);">+                                         sapi := PCU_IF_SAPI_PTCCH)) -> value pcu_msg {</span><br><span style="color: hsl(120, 100%, 40%);">+            ta_msg := dec_PTCCHDownlinkMsg(pcu_msg.u.data_req.data);</span><br><span style="color: hsl(120, 100%, 40%);">+              log("Rx PTCCH/D message: ", ta_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Make sure Timing Advance values match our expectations */</span><br><span style="color: hsl(120, 100%, 40%);">+          if (match(ta_msg, t_ta_msg)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+             } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      setverdict(fail, "PTCCH/D message does not match: ", t_ta_msg);</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%);">+     [] BTS.receive { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+    [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Timeout waiting for a PTCCH/D block");</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%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_ta_ptcch_ul_multi_tbf() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var template PacketUlAssign t_ul_tbf_ass;</span><br><span style="color: hsl(120, 100%, 40%);">+     var PacketUlAssign ul_tbf_ass[7];</span><br><span style="color: hsl(120, 100%, 40%);">+     var GsmRrMessage rr_msg[7];</span><br><span style="color: hsl(120, 100%, 40%);">+   var boolean ok;</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());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Enable forwarding of PTCCH/U TDMA events to us */</span><br><span style="color: hsl(120, 100%, 40%);">+  BTS.send(ts_RAW_PCU_CMD(TDMA_CMD_ENABLE_PTCCH_UL_FWD));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Establish 7 Uplink TBFs (USF flag is 3 bits long, '111'B is reserved) */</span><br><span style="color: hsl(120, 100%, 40%);">+   for (var integer i := 0; i < 7; i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+              ok := f_establish_tbf(rr_msg[i], ta := 0);</span><br><span style="color: hsl(120, 100%, 40%);">+            if (not ok) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 setverdict(fail, "Failed to establish an Uplink TBF #", i);</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%);">+           /* Make sure we received an UL TBF Assignment */</span><br><span style="color: hsl(120, 100%, 40%);">+              if (match(rr_msg[i], tr_IMM_TBF_ASS(dl := false, rest := tr_IaRestOctets_ULAss(?)))) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        ul_tbf_ass[i] := rr_msg[i].payload.imm_ass.rest_octets.hh.pa.uldl.ass.ul;</span><br><span style="color: hsl(120, 100%, 40%);">+                     log("Rx Uplink TBF assignment for #", i, ": ", ul_tbf_ass[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+            } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      setverdict(fail, "Failed to match UL TBF Assignment for #", i);</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%);">+           /* We expect incremental TFI/USF assignment (dynamic allocation) */</span><br><span style="color: hsl(120, 100%, 40%);">+           t_ul_tbf_ass := tr_PacketUlDynAssign(tfi := i, usf := i);</span><br><span style="color: hsl(120, 100%, 40%);">+             if (not match(ul_tbf_ass[i], t_ul_tbf_ass)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 setverdict(fail, "Failed to match Packet Uplink Assignment for #", i);</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%);">+           /* We also expect Timing Advance Index to be a part of the assignment */</span><br><span style="color: hsl(120, 100%, 40%);">+              if (ul_tbf_ass[i].dynamic.ta_index != i) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    setverdict(fail, "Failed to match Timing Advance Index for #", i);</span><br><span style="color: hsl(120, 100%, 40%);">+                  /* Keep going, the current OsmoPCU does not assign TA Index */</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%);">+   /* Prepare a list of ToA values for Access Bursts to be sent on PTCCH/U */</span><br><span style="color: hsl(120, 100%, 40%);">+    var PTCCH_TAI_ToA_MAP toa_map := ptcch_toa_map_def;</span><br><span style="color: hsl(120, 100%, 40%);">+   for (var integer i := 0; i < 7; i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* ToA in units of 1/4 of a symbol */</span><br><span style="color: hsl(120, 100%, 40%);">+         toa_map[i] := (i + 1) * 7 * 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%);">+   /* Now we have all 7 TBFs established in one-phase access mode,</span><br><span style="color: hsl(120, 100%, 40%);">+        * however we will not be sending any data on them. Instead, we</span><br><span style="color: hsl(120, 100%, 40%);">+        * will be sending RACH.ind on PTCCH/U during 4 multi-frame</span><br><span style="color: hsl(120, 100%, 40%);">+    * periods (TAI 0..8), and then will check two PTCCH/D blocks.</span><br><span style="color: hsl(120, 100%, 40%);">+         *</span><br><span style="color: hsl(120, 100%, 40%);">+     * Why not 4 TBFs at once? Because Uplink is delayed by 3 TDMA</span><br><span style="color: hsl(120, 100%, 40%);">+         * time-slots, so at the moment of scheduling a PTCCH/D block</span><br><span style="color: hsl(120, 100%, 40%);">+  * the PCU has odd number of PTCCH/U Access Bursts received. */</span><br><span style="color: hsl(120, 100%, 40%);">+       f_TC_ta_ptcch_ul_multi_tbf(toa_map, tr_PTCCHDownlinkMsg(</span><br><span style="color: hsl(120, 100%, 40%);">+              tai0_ta :=  7, tai1_ta := 14, tai2_ta := 21,</span><br><span style="color: hsl(120, 100%, 40%);">+          /* Other values are not known (yet) */</span><br><span style="color: hsl(120, 100%, 40%);">+                tai3_ta := ?));</span><br><span style="color: hsl(120, 100%, 40%);">+       f_TC_ta_ptcch_ul_multi_tbf(toa_map, tr_PTCCHDownlinkMsg(</span><br><span style="color: hsl(120, 100%, 40%);">+              tai0_ta :=  7, tai1_ta := 14, tai2_ta := 21,</span><br><span style="color: hsl(120, 100%, 40%);">+          tai3_ta := 28, tai4_ta := 35, tai5_ta := 42,</span><br><span style="color: hsl(120, 100%, 40%);">+          /* Other values are out of our interest */</span><br><span style="color: hsl(120, 100%, 40%);">+            tai6_ta := ?));</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%);">+/* Default link quality adaptation (Coding Scheme) ranges (inclusive).</span><br><span style="color: hsl(120, 100%, 40%);">+ * OsmoPCU (VTY): cs link-quality-ranges cs1 6 cs2 5 8 cs3 7 13 cs4 12</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * NOTE: the ranges are intentionally overlapping because OsmoPCU</span><br><span style="color: hsl(120, 100%, 40%);">+ * does not change CS/MCS on the range borders (5-6, 7-8, 12-13). */</span><br><span style="color: hsl(120, 100%, 40%);">+private template integer CS1_lqual_dB_range := (-infinity .. 6);</span><br><span style="color: hsl(120, 100%, 40%);">+private template integer CS2_lqual_dB_range := (5 .. 8);</span><br><span style="color: hsl(120, 100%, 40%);">+private template integer CS3_lqual_dB_range := (7 .. 13);</span><br><span style="color: hsl(120, 100%, 40%);">+private template integer CS4_lqual_dB_range := (12 .. infinity);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_cs_lqual_ul_tbf() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var GsmRrMessage rr_imm_ass;</span><br><span style="color: hsl(120, 100%, 40%);">+  var PacketUlAssign ul_tbf_ass;</span><br><span style="color: hsl(120, 100%, 40%);">+        var RlcmacDlBlock dl_block;</span><br><span style="color: hsl(120, 100%, 40%);">+   var PCUIF_Message pcu_msg;</span><br><span style="color: hsl(120, 100%, 40%);">+    var octetstring data;</span><br><span style="color: hsl(120, 100%, 40%);">+ var boolean ok;</span><br><span style="color: hsl(120, 100%, 40%);">+       var uint32_t unused_fn;</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());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_pcuvty_set_allowed_cs_mcs();</span><br><span style="color: hsl(120, 100%, 40%);">+        f_pcuvty_set_link_quality_ranges();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Establish an Uplink TBF */</span><br><span style="color: hsl(120, 100%, 40%);">+ ok := f_establish_tbf(rr_imm_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (not ok) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Failed to establish TBF");</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%);">+   ok := f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (not ok) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Immediate Assignment not an Uplink TBF");</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%);">+   var template (value) RlcmacUlBlock ul_data := t_RLCMAC_UL_DATA(</span><br><span style="color: hsl(120, 100%, 40%);">+               tfi := ul_tbf_ass.dynamic.tfi_assignment,</span><br><span style="color: hsl(120, 100%, 40%);">+             cv := 15, /* 16 UL blocks to be sent (to be overridden in loop) */</span><br><span style="color: hsl(120, 100%, 40%);">+            bsn := 0, /* TODO: what should be here? */</span><br><span style="color: hsl(120, 100%, 40%);">+            blocks := { /* To be generated in loop */ });</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* HACK: patch missing TLLI; otherwise OsmoPCU rejects DATA.req */</span><br><span style="color: hsl(120, 100%, 40%);">+    ul_data.data.tlli := '00000001'O;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* The actual / old link quality values. We need to keep track of the old</span><br><span style="color: hsl(120, 100%, 40%);">+      * (basically previous) link quality value, because OsmoPCU actually</span><br><span style="color: hsl(120, 100%, 40%);">+   * changes the coding scheme if not only the actual, but also the old</span><br><span style="color: hsl(120, 100%, 40%);">+  * value leaves the current link quality range (window). */</span><br><span style="color: hsl(120, 100%, 40%);">+   var integer lqual := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+       var integer lqual_old;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* 16 UL blocks (0 .. 15 dB, step = 1 dB) */</span><br><span style="color: hsl(120, 100%, 40%);">+  for (var integer i := 0; i < 16; i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+             /* Prepare a new UL block (CV, random payload) */</span><br><span style="color: hsl(120, 100%, 40%);">+             ul_data.data.mac_hdr.countdown := (15 - i);</span><br><span style="color: hsl(120, 100%, 40%);">+           ul_data.data.blocks := { valueof(t_RLCMAC_LLCBLOCK(f_rnd_octstring(10))) };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         /* Update the old / actual link quality */</span><br><span style="color: hsl(120, 100%, 40%);">+            lqual_old := lqual;</span><br><span style="color: hsl(120, 100%, 40%);">+           lqual := i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */</span><br><span style="color: hsl(120, 100%, 40%);">+              log("Sending DATA.ind with link quality (dB): ", lqual);</span><br><span style="color: hsl(120, 100%, 40%);">+            f_tx_rlcmac_ul_block(ul_data, lqual * 10);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          /* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */</span><br><span style="color: hsl(120, 100%, 40%);">+               f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             log("Rx Packet Uplink ACK / NACK with Channel Coding Command: ",</span><br><span style="color: hsl(120, 100%, 40%);">+                dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                /* Match the received Channel Coding Command. Since we are increasing</span><br><span style="color: hsl(120, 100%, 40%);">+          * the link quality value on each iteration and not decreasing, there</span><br><span style="color: hsl(120, 100%, 40%);">+          * is no need to check the both old and current link quality values. */</span><br><span style="color: hsl(120, 100%, 40%);">+               var template ChCodingCommand ch_coding;</span><br><span style="color: hsl(120, 100%, 40%);">+               select (lqual_old) {</span><br><span style="color: hsl(120, 100%, 40%);">+          case (CS1_lqual_dB_range) { ch_coding := CH_CODING_CS1; }</span><br><span style="color: hsl(120, 100%, 40%);">+             case (CS2_lqual_dB_range) { ch_coding := CH_CODING_CS2; }</span><br><span style="color: hsl(120, 100%, 40%);">+             case (CS3_lqual_dB_range) { ch_coding := CH_CODING_CS3; }</span><br><span style="color: hsl(120, 100%, 40%);">+             case (CS4_lqual_dB_range) { ch_coding := CH_CODING_CS4; }</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 (not match(dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd, ch_coding)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   setverdict(fail, "Channel Coding does not match our expectations: ", ch_coding);</span><br><span style="color: hsl(120, 100%, 40%);">+            } else {</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%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test the max UL CS set by VTY works fine */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_cs_initial_ul() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var GsmRrMessage rr_imm_ass;</span><br><span style="color: hsl(120, 100%, 40%);">+  var PacketUlAssign ul_tbf_ass;</span><br><span style="color: hsl(120, 100%, 40%);">+        var RlcmacDlBlock dl_block;</span><br><span style="color: hsl(120, 100%, 40%);">+   var boolean ok;</span><br><span style="color: hsl(120, 100%, 40%);">+       var integer lqual_cb;</span><br><span style="color: hsl(120, 100%, 40%);">+ var ChCodingCommand last_ch_coding;</span><br><span style="color: hsl(120, 100%, 40%);">+   var uint32_t unused_fn;</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());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Set initial UL CS to 3 */</span><br><span style="color: hsl(120, 100%, 40%);">+  g_cs_initial_ul := 3;</span><br><span style="color: hsl(120, 100%, 40%);">+ f_pcuvty_set_allowed_cs_mcs();</span><br><span style="color: hsl(120, 100%, 40%);">+        f_pcuvty_set_link_quality_ranges();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Take lqual (dB->cB) so that we stay in that CS */</span><br><span style="color: hsl(120, 100%, 40%);">+       lqual_cb := g_cs_lqual_ranges[2].low * 10;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Establish an Uplink TBF */</span><br><span style="color: hsl(120, 100%, 40%);">+ ok := f_establish_tbf(rr_imm_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (not ok) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Failed to establish TBF");</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%);">+   ok := f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (not ok) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Immediate Assignment not an Uplink TBF");</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%);">+   var template (value) RlcmacUlBlock ul_data := t_RLCMAC_UL_DATA(</span><br><span style="color: hsl(120, 100%, 40%);">+               tfi := ul_tbf_ass.dynamic.tfi_assignment,</span><br><span style="color: hsl(120, 100%, 40%);">+             cv := 3, /* 8 UL blocks to be sent (to be overridden in loop) */</span><br><span style="color: hsl(120, 100%, 40%);">+              bsn := 0, /* TODO: what should be here? */</span><br><span style="color: hsl(120, 100%, 40%);">+            blocks := { /* To be generated in loop */ });</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* HACK: patch missing TLLI; otherwise OsmoPCU rejects DATA.req */</span><br><span style="color: hsl(120, 100%, 40%);">+    ul_data.data.tlli := '00000001'O;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* 3 UL blocks, check we are in same initial CS: */</span><br><span style="color: hsl(120, 100%, 40%);">+   for (var integer i := 0; i < 3; i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Prepare a new UL block (CV, random payload) */</span><br><span style="color: hsl(120, 100%, 40%);">+             ul_data.data.mac_hdr.countdown := (7 - i);</span><br><span style="color: hsl(120, 100%, 40%);">+            ul_data.data.blocks := { valueof(t_RLCMAC_LLCBLOCK(f_rnd_octstring(10))) };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */</span><br><span style="color: hsl(120, 100%, 40%);">+              f_tx_rlcmac_ul_block(ul_data, lqual_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            /* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */</span><br><span style="color: hsl(120, 100%, 40%);">+               f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+               last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;</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 (last_ch_coding != CH_CODING_CS3) {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);</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%);">+   setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Remaining UL blocks are used to make sure regardless of initial</span><br><span style="color: hsl(120, 100%, 40%);">+    /* lqual, we can go lower at any time */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* 5 UL blocks, check we are in same initial CS: */</span><br><span style="color: hsl(120, 100%, 40%);">+   for (var integer i := 3; i < 8; i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Prepare a new UL block (CV, random payload) */</span><br><span style="color: hsl(120, 100%, 40%);">+             ul_data.data.mac_hdr.countdown := (7 - i);</span><br><span style="color: hsl(120, 100%, 40%);">+            ul_data.data.blocks := { valueof(t_RLCMAC_LLCBLOCK(f_rnd_octstring(10))) };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */</span><br><span style="color: hsl(120, 100%, 40%);">+              f_tx_rlcmac_ul_block(ul_data, 0); /* 0 dB, make sure we downgrade CS */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             /* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */</span><br><span style="color: hsl(120, 100%, 40%);">+               f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;</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 (last_ch_coding != CH_CODING_CS1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Channel Coding does not match our expectations (CS-1): ", last_ch_coding);</span><br><span style="color: hsl(120, 100%, 40%);">+        } else {</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test the max UL CS set by VTY works fine */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_cs_max_ul() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     var GsmRrMessage rr_imm_ass;</span><br><span style="color: hsl(120, 100%, 40%);">+  var PacketUlAssign ul_tbf_ass;</span><br><span style="color: hsl(120, 100%, 40%);">+        var RlcmacDlBlock dl_block;</span><br><span style="color: hsl(120, 100%, 40%);">+   var boolean ok;</span><br><span style="color: hsl(120, 100%, 40%);">+       var ChCodingCommand last_ch_coding;</span><br><span style="color: hsl(120, 100%, 40%);">+   var uint32_t unused_fn;</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());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Set maximum allowed UL CS to 3 */</span><br><span style="color: hsl(120, 100%, 40%);">+  g_cs_max_ul := 3;</span><br><span style="color: hsl(120, 100%, 40%);">+     f_pcuvty_set_allowed_cs_mcs();</span><br><span style="color: hsl(120, 100%, 40%);">+        f_pcuvty_set_link_quality_ranges();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Establish an Uplink TBF */</span><br><span style="color: hsl(120, 100%, 40%);">+ ok := f_establish_tbf(rr_imm_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (not ok) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Failed to establish TBF");</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%);">+   ok := f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (not ok) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Immediate Assignment not an Uplink TBF");</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%);">+   var template (value) RlcmacUlBlock ul_data := t_RLCMAC_UL_DATA(</span><br><span style="color: hsl(120, 100%, 40%);">+               tfi := ul_tbf_ass.dynamic.tfi_assignment,</span><br><span style="color: hsl(120, 100%, 40%);">+             cv := 15, /* 16 UL blocks to be sent (to be overridden in loop) */</span><br><span style="color: hsl(120, 100%, 40%);">+            bsn := 0, /* TODO: what should be here? */</span><br><span style="color: hsl(120, 100%, 40%);">+            blocks := { /* To be generated in loop */ });</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* HACK: patch missing TLLI; otherwise OsmoPCU rejects DATA.req */</span><br><span style="color: hsl(120, 100%, 40%);">+    ul_data.data.tlli := '00000001'O;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* 16 UL blocks */</span><br><span style="color: hsl(120, 100%, 40%);">+    for (var integer i := 0; i < 16; i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+             /* Prepare a new UL block (CV, random payload) */</span><br><span style="color: hsl(120, 100%, 40%);">+             ul_data.data.mac_hdr.countdown := (15 - i);</span><br><span style="color: hsl(120, 100%, 40%);">+           ul_data.data.blocks := { valueof(t_RLCMAC_LLCBLOCK(f_rnd_octstring(10))) };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */</span><br><span style="color: hsl(120, 100%, 40%);">+              f_tx_rlcmac_ul_block(ul_data, 40*10); /* 40 dB */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           /* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */</span><br><span style="color: hsl(120, 100%, 40%);">+               f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;</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 (last_ch_coding != CH_CODING_CS3) {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);</span><br><span style="color: hsl(120, 100%, 40%);">+        } else {</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Verify PCU drops TBF after some time of inactivity. */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_t3169() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      var PCUIF_info_ind info_ind;</span><br><span style="color: hsl(120, 100%, 40%);">+  var GsmRrMessage rr_imm_ass;</span><br><span style="color: hsl(120, 100%, 40%);">+  var PacketUlAssign ul_tbf_ass;</span><br><span style="color: hsl(120, 100%, 40%);">+        var RlcmacDlBlock dl_block;</span><br><span style="color: hsl(120, 100%, 40%);">+   var PCUIF_Message pcu_msg;</span><br><span style="color: hsl(120, 100%, 40%);">+    var octetstring data;</span><br><span style="color: hsl(120, 100%, 40%);">+ var boolean ok;</span><br><span style="color: hsl(120, 100%, 40%);">+       var uint32_t unused_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+       var OCT4 tlli := '00000001'O;</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%);">+     info_ind := valueof(ts_PCUIF_INFO_default);</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Set timer to 1 sec (default 5) to speedup test: */</span><br><span style="color: hsl(120, 100%, 40%);">+ info_ind.t3169 := 1;</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_bssgp_client_llgmm_assign('FFFFFFFF'O, tlli);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Establish an Uplink TBF */</span><br><span style="color: hsl(120, 100%, 40%);">+ ok := f_establish_tbf(rr_imm_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (not ok) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Failed to establish TBF");</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%);">+   ok := f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (not ok) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Immediate Assignment not an Uplink TBF");</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%);">+   /* Send one UL block and make sure it is ACKED fine */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_tx_rlcmac_ul_n_blocks(ul_tbf_ass, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+       /* UL block should be received in SGSN */</span><br><span style="color: hsl(120, 100%, 40%);">+     BSSGP[0].receive(tr_BSSGP_UL_UD(tlli, mp_gb_cfg.cell_id));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Wait until T3169 fires (plus 1 extra sec to make sure) */</span><br><span style="color: hsl(120, 100%, 40%);">+  f_sleep(int2float(info_ind.t3169) + 1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Send an UL block once again, the TBF should be gone by now so no ACK */</span><br><span style="color: hsl(120, 100%, 40%);">+    f_tx_rlcmac_ul_n_blocks(ul_tbf_ass, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_rx_rlcmac_dl_block_exp_dummy(dl_block);</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%);">+/* Verify that a Downlink TBF can be assigned using PACCH shortly after the</span><br><span style="color: hsl(120, 100%, 40%);">+ * release of prev DL TBF due to MS staying in PDCH for a while (T3192, in PCU</span><br><span style="color: hsl(120, 100%, 40%);">+ * T3193) after DL TBF release */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_t3193() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var GsmRrMessage rr_imm_ass;</span><br><span style="color: hsl(120, 100%, 40%);">+  var PacketDlAssign dl_tbf_ass;</span><br><span style="color: hsl(120, 100%, 40%);">+        var RlcmacDlBlock dl_block;</span><br><span style="color: hsl(120, 100%, 40%);">+   var octetstring data := f_rnd_octstring(10);</span><br><span style="color: hsl(120, 100%, 40%);">+  var boolean ok;</span><br><span style="color: hsl(120, 100%, 40%);">+       var uint32_t sched_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+        var OCT4 tlli := '00000001'O;</span><br><span style="color: hsl(120, 100%, 40%);">+ var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);</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%);">+     /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init_raw(testcasename());</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_bssgp_client_llgmm_assign('FFFFFFFF'O, tlli);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* SGSN sends some DL data, PCU will page on CCCH (PCH) */</span><br><span style="color: hsl(120, 100%, 40%);">+    BSSGP[0].send(ts_BSSGP_DL_UD(tlli, data));</span><br><span style="color: hsl(120, 100%, 40%);">+    f_pcuif_rx_pch_imm_tbf_ass(rr_imm_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+       ok := f_imm_ass_verify_dl_tbf_ass(rr_imm_ass, dl_tbf_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (not ok) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Immediate Assignment not a Downlink TBF");</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%);">+     /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */</span><br><span style="color: hsl(120, 100%, 40%);">+  f_sleep(X2002);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_rx_rlcmac_dl_block_exp_data(dl_block, sched_fn, data, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* ACK the DL block */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_acknackdesc_ack_block(ack_nack_desc, dl_block, '1'B);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(f_rlcmac_dl_block_get_tfi(dl_block), ack_nack_desc), 0, sched_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* we are done with the DL-TBF here so far, let's clean up our local state: */</span><br><span style="color: hsl(120, 100%, 40%);">+    ack_nack_desc := valueof(t_AckNackDescription_init)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Now that final DL block is ACKED and TBF is released, T3193 in PCU</span><br><span style="color: hsl(120, 100%, 40%);">+    (T3192 in MS) was started and until it fires the MS will be abailable</span><br><span style="color: hsl(120, 100%, 40%);">+         on PDCH in case new data arrives from SGSN. Let's verify it: */</span><br><span style="color: hsl(120, 100%, 40%);">+        BSSGP[0].send(ts_BSSGP_DL_UD(tlli, data));</span><br><span style="color: hsl(120, 100%, 40%);">+    f_rx_rlcmac_dl_block_exp_pkt_ass(dl_block, sched_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_tx_rlcmac_ul_block(ts_RLCMAC_CTRL_ACK(tlli), 0, sched_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_rx_rlcmac_dl_block_exp_data(dl_block, sched_fn, data, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+   f_acknackdesc_ack_block(ack_nack_desc, dl_block, '1'B);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(f_rlcmac_dl_block_get_tfi(dl_block), ack_nack_desc), 0, sched_fn);</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%);">+/* Test scenario where MS wants to send some data on PDCH against SGSN and it is</span><br><span style="color: hsl(120, 100%, 40%);">+ * answered, so TBFs for uplink and later for downlink are created.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_mo_ping_pong(template (omit) MSRadioAccessCapabilityV ms_racap := omit, template (present) CodingScheme exp_cs_mcs := ?) runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      var GsmRrMessage rr_imm_ass;</span><br><span style="color: hsl(120, 100%, 40%);">+  var PacketUlAssign ul_tbf_ass;</span><br><span style="color: hsl(120, 100%, 40%);">+        var PacketDlAssign dl_tbf_ass;</span><br><span style="color: hsl(120, 100%, 40%);">+        var RlcmacDlBlock dl_block;</span><br><span style="color: hsl(120, 100%, 40%);">+   var PCUIF_Message pcu_msg;</span><br><span style="color: hsl(120, 100%, 40%);">+    var octetstring data := f_rnd_octstring(10);</span><br><span style="color: hsl(120, 100%, 40%);">+  var boolean ok;</span><br><span style="color: hsl(120, 100%, 40%);">+       var uint32_t sched_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+        var OCT4 tlli := '00000001'O;</span><br><span style="color: hsl(120, 100%, 40%);">+ var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);</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%);">+     /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init_raw(testcasename());</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_bssgp_client_llgmm_assign('FFFFFFFF'O, tlli);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Establish an Uplink TBF */</span><br><span style="color: hsl(120, 100%, 40%);">+ ok := f_establish_tbf(rr_imm_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (not ok) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Failed to establish TBF");</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%);">+     ok := f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (not ok) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Immediate Assignment not an Uplink TBF");</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%);">+   if (not istemplatekind(ms_racap, "omit")) {</span><br><span style="color: hsl(120, 100%, 40%);">+         /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS</span><br><span style="color: hsl(120, 100%, 40%);">+            * (see 3GPP TS 04.60 "7.1.3.1 Initiation of the Packet resource request procedure")</span><br><span style="color: hsl(120, 100%, 40%);">+                 */</span><br><span style="color: hsl(120, 100%, 40%);">+           f_tx_rlcmac_ul_block(ts_RLC_UL_CTRL_ACK(valueof(ts_RlcMacUlCtrl_PKT_RES_REQ(tlli, ms_racap))), 0);</span><br><span style="color: hsl(120, 100%, 40%);">+            f_rx_rlcmac_dl_block_exp_pkt_ul_ass(dl_block, sched_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+              if (dl_block.ctrl.payload.u.ul_assignment.identity.tlli.tlli != tlli) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       setverdict(fail, "Wrong TLLI ", dl_block.ctrl.payload.u.ul_assignment.identity.tlli, " received vs exp ", tlli);</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Send one UL block and make sure it is ACKED fine */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_tx_rlcmac_ul_n_blocks(ul_tbf_ass, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+        /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_tx_rlcmac_ul_block(ts_RLCMAC_CTRL_ACK(tlli), 0, sched_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* UL block should be received in SGSN */</span><br><span style="color: hsl(120, 100%, 40%);">+     BSSGP[0].receive(tr_BSSGP_UL_UD(tlli, mp_gb_cfg.cell_id));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */</span><br><span style="color: hsl(120, 100%, 40%);">+        BSSGP[0].send(ts_BSSGP_DL_UD(tlli, data));</span><br><span style="color: hsl(120, 100%, 40%);">+    f_pcuif_rx_pch_imm_tbf_ass(rr_imm_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     ok := f_imm_ass_verify_dl_tbf_ass(rr_imm_ass, dl_tbf_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (not ok) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Immediate Assignment not a Downlink TBF");</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%);">+   /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */</span><br><span style="color: hsl(120, 100%, 40%);">+  f_sleep(X2002);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_rx_rlcmac_dl_block_exp_data(dl_block, sched_fn, data, 0, exp_cs_mcs);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* ACK the DL block */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_acknackdesc_ack_block(ack_nack_desc, dl_block, '1'B);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(f_rlcmac_dl_block_get_tfi(dl_block), ack_nack_desc), 0, sched_fn);</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%);">+/* Test scenario where MS wants to send some data on PDCH against SGSN and it is</span><br><span style="color: hsl(120, 100%, 40%);">+ * answered, so TBFs for uplink and later for downlink are created.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_mo_ping_pong() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  var CodingScheme exp_cs_mcs := CS_1;</span><br><span style="color: hsl(120, 100%, 40%);">+  f_TC_mo_ping_pong(omit, exp_cs_mcs);</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%);">+testcase TC_mo_ping_pong_with_ul_racap() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var MultislotCap_GPRS mscap_gprs := {</span><br><span style="color: hsl(120, 100%, 40%);">+         gprsmultislotclass := '00011'B,</span><br><span style="color: hsl(120, 100%, 40%);">+               gprsextendeddynalloccap := '0'B</span><br><span style="color: hsl(120, 100%, 40%);">+       };</span><br><span style="color: hsl(120, 100%, 40%);">+    var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };</span><br><span style="color: hsl(120, 100%, 40%);">+     var CodingScheme exp_cs_mcs := CS_2;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        f_TC_mo_ping_pong(ms_racap, exp_cs_mcs);</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%);">+/* Test scenario where SGSN wants to send some data against MS and it is</span><br><span style="color: hsl(120, 100%, 40%);">+ * answered by the MS on PDCH, so TBFs for downlink and later for uplink are created.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_mt_ping_pong(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit, template (present) CodingScheme exp_cs_mcs := ?) runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   var GsmRrMessage rr_imm_ass;</span><br><span style="color: hsl(120, 100%, 40%);">+  var PacketUlAssign ul_tbf_ass;</span><br><span style="color: hsl(120, 100%, 40%);">+        var PacketDlAssign dl_tbf_ass;</span><br><span style="color: hsl(120, 100%, 40%);">+        var RlcmacDlBlock dl_block;</span><br><span style="color: hsl(120, 100%, 40%);">+   var PCUIF_Message pcu_msg;</span><br><span style="color: hsl(120, 100%, 40%);">+    var octetstring data := f_rnd_octstring(10);</span><br><span style="color: hsl(120, 100%, 40%);">+  var boolean ok;</span><br><span style="color: hsl(120, 100%, 40%);">+       var uint32_t sched_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+        var OCT4 tlli := '00000001'O;</span><br><span style="color: hsl(120, 100%, 40%);">+ var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);</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%);">+     /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init_raw(testcasename());</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_bssgp_client_llgmm_assign('FFFFFFFF'O, tlli);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* SGSN sends some DL data, PCU will page on CCCH (PCH) */</span><br><span style="color: hsl(120, 100%, 40%);">+    BSSGP[0].send(ts_BSSGP_DL_UD(tlli, data, ms_racap));</span><br><span style="color: hsl(120, 100%, 40%);">+  f_pcuif_rx_pch_imm_tbf_ass(rr_imm_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     ok := f_imm_ass_verify_dl_tbf_ass(rr_imm_ass, dl_tbf_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (not ok) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Immediate Assignment not a Downlink TBF");</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%);">+   /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */</span><br><span style="color: hsl(120, 100%, 40%);">+  f_sleep(X2002);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_rx_rlcmac_dl_block_exp_data(dl_block, sched_fn, data, 0, exp_cs_mcs);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* ACK the DL block */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_acknackdesc_ack_block(ack_nack_desc, dl_block, '1'B);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(f_rlcmac_dl_block_get_tfi(dl_block), ack_nack_desc), 0, sched_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Now MS wants to answer the DL data, Establish an Uplink TBF */</span><br><span style="color: hsl(120, 100%, 40%);">+     ok := f_establish_tbf(rr_imm_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (not ok) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Failed to establish TBF");</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%);">+     ok := f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (not ok) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Immediate Assignment not an Uplink TBF");</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%);">+   /* Send one UL block and make sure it is ACKED fine */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_tx_rlcmac_ul_n_blocks(ul_tbf_ass, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+        /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_tx_rlcmac_ul_block(ts_RLCMAC_CTRL_ACK(tlli), 0, sched_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* UL block should be received in SGSN */</span><br><span style="color: hsl(120, 100%, 40%);">+     BSSGP[0].receive(tr_BSSGP_UL_UD(tlli, mp_gb_cfg.cell_id));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_mt_ping_pong() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var CodingScheme exp_cs_mcs := CS_1;</span><br><span style="color: hsl(120, 100%, 40%);">+  f_TC_mt_ping_pong(omit, exp_cs_mcs);</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%);">+/* TC_mt_ping_pong, but DL-UNITDATA contains RA Access capability with (M)CS</span><br><span style="color: hsl(120, 100%, 40%);">+/* information about the MS */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_mt_ping_pong_with_dl_racap() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   var MultislotCap_GPRS_BSSGP mscap_gprs := {</span><br><span style="color: hsl(120, 100%, 40%);">+           gprsmultislotclass := '00011'B,</span><br><span style="color: hsl(120, 100%, 40%);">+               gprsextendeddynalloccap := '0'B</span><br><span style="color: hsl(120, 100%, 40%);">+       } ;</span><br><span style="color: hsl(120, 100%, 40%);">+   var MSRadioAccessCapabilityV_BSSGP ms_racap := { valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, mscap_gprs, omit)) };</span><br><span style="color: hsl(120, 100%, 40%);">+ var CodingScheme exp_cs_mcs := CS_2;</span><br><span style="color: hsl(120, 100%, 40%);">+  f_TC_mt_ping_pong(ms_racap, exp_cs_mcs);</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%);">+/* Verify that if PCU doesn't get an ACK for first DL block after IMM ASS, it</span><br><span style="color: hsl(120, 100%, 40%);">+ * will retry by retransmitting both the IMM ASS + DL block after poll (ack)</span><br><span style="color: hsl(120, 100%, 40%);">+ * timeout occurs (specified by sent RRBP on DL block). */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_imm_ass_dl_block_retrans() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  var GsmRrMessage rr_imm_ass;</span><br><span style="color: hsl(120, 100%, 40%);">+  var PacketDlAssign dl_tbf_ass;</span><br><span style="color: hsl(120, 100%, 40%);">+        var RlcmacDlBlock dl_block;</span><br><span style="color: hsl(120, 100%, 40%);">+   var octetstring data := f_rnd_octstring(10);</span><br><span style="color: hsl(120, 100%, 40%);">+  var boolean ok;</span><br><span style="color: hsl(120, 100%, 40%);">+       var uint32_t sched_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+        var OCT4 tlli := '00000001'O;</span><br><span style="color: hsl(120, 100%, 40%);">+ var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);</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%);">+     /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init_raw(testcasename());</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_bssgp_client_llgmm_assign('FFFFFFFF'O, tlli);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* SGSN sends some DL data, PCU will page on CCCH (PCH) */</span><br><span style="color: hsl(120, 100%, 40%);">+    BSSGP[0].send(ts_BSSGP_DL_UD(tlli, data));</span><br><span style="color: hsl(120, 100%, 40%);">+    f_pcuif_rx_pch_imm_tbf_ass(rr_imm_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+       ok := f_imm_ass_verify_dl_tbf_ass(rr_imm_ass, dl_tbf_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (not ok) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Immediate Assignment not a Downlink TBF");</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%);">+   /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */</span><br><span style="color: hsl(120, 100%, 40%);">+  f_sleep(X2002);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_rx_rlcmac_dl_block_exp_data(dl_block, sched_fn, data, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Now we don't ack the dl block (emulate MS failed receiveing IMM ASS</span><br><span style="color: hsl(120, 100%, 40%);">+     * or GPRS DL, or DL ACK was lost for some reason). As a result, PCU</span><br><span style="color: hsl(120, 100%, 40%);">+   * should retrigger IMM ASS + GPRS DL procedure after poll timeout. */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_pcuif_rx_pch_imm_tbf_ass(rr_imm_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+       ok := f_imm_ass_verify_dl_tbf_ass(rr_imm_ass, dl_tbf_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (not ok) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Immediate Assignment not a Downlink TBF");</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%);">+     /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */</span><br><span style="color: hsl(120, 100%, 40%);">+  f_sleep(X2002);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_rx_rlcmac_dl_block_exp_data(dl_block, sched_fn, data, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* ACK the DL block */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_acknackdesc_ack_block(ack_nack_desc, dl_block, '1'B);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(f_rlcmac_dl_block_get_tfi(dl_block), ack_nack_desc), 0, sched_fn);</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_pkt_paging_match_imsi(in PacketPagingReq req, hexstring imsi) {</span><br><span style="color: hsl(120, 100%, 40%);">+        var MobileIdentityLV_Paging mi_lv := req.repeated_pageinfo.cs.mobile_identity;</span><br><span style="color: hsl(120, 100%, 40%);">+        var MobileIdentityV mi := dec_MobileIdentityV(mi_lv.mobile_id);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (mi_lv.len != 8) { /* 8 octets: type of ID (3 bits) + even/odd flag (1 bit) + 15 BCD-encoded digits (60 bits) */</span><br><span style="color: hsl(120, 100%, 40%);">+           setverdict(fail, "Mobile Identity length mismatch: ",</span><br><span style="color: hsl(120, 100%, 40%);">+                          "expected: 8, got: ", mi_lv.len);</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%);">+   /* Make sure MI contains IMSI before referencing it */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (mi.typeOfIdentity != '001'B) {</span><br><span style="color: hsl(120, 100%, 40%);">+            setverdict(fail, "Mobile Identity must be of type IMSI ('001'B), ",</span><br><span style="color: hsl(120, 100%, 40%);">+                    "got: ", mi.typeOfIdentity);</span><br><span style="color: hsl(120, 100%, 40%);">+             mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+     } else if (mi.oddEvenInd_identity.imsi.digits != imsi) {</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(fail, "Mobile Identity contains unexpected IMSI, ",</span><br><span style="color: hsl(120, 100%, 40%);">+                         "expected: ", imsi, " got: ", mi.oddEvenInd_identity.imsi.digits);</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_pkt_paging_match_tmsi(in PacketPagingReq req, template GsmTmsi tmsi) {</span><br><span style="color: hsl(120, 100%, 40%);">+     if (not match(req.repeated_pageinfo.cs.tmsi, tmsi)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Mobile Identity (TMSI/P-TMSI) mismatch: ",</span><br><span style="color: hsl(120, 100%, 40%);">+                           "expected: ", tmsi, "got: ", req.repeated_pageinfo.cs.tmsi);</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test CS paging over the BTS<->PCU socket.</span><br><span style="color: hsl(120, 100%, 40%);">+ * When a (class B or C, not A) MS has an active TBF (or is on the PDCH), the MS can not react on CS paging over CCCH.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Paging should be send on the PACCH.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * 1. Send a Paging Request over PCU socket.</span><br><span style="color: hsl(120, 100%, 40%);">+ * 2. Send a Ready-To-Send message over PCU socket</span><br><span style="color: hsl(120, 100%, 40%);">+ * 3. Expect a Paging Frame</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_paging_cs_from_bts() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        var GsmRrMessage rr_imm_ass;</span><br><span style="color: hsl(120, 100%, 40%);">+  var PacketUlAssign ul_tbf_ass;</span><br><span style="color: hsl(120, 100%, 40%);">+        var RlcmacDlBlock dl_block;</span><br><span style="color: hsl(120, 100%, 40%);">+   var boolean ok;</span><br><span style="color: hsl(120, 100%, 40%);">+       var OCT4 tlli := '00000001'O;</span><br><span style="color: hsl(120, 100%, 40%);">+ var MobileIdentityLV mi;</span><br><span style="color: hsl(120, 100%, 40%);">+      var octetstring mi_enc_lv;</span><br><span style="color: hsl(120, 100%, 40%);">+    var hexstring imsi := f_gen_imsi(42);</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%);">+     /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init_raw(testcasename());</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_bssgp_client_llgmm_assign('FFFFFFFF'O, tlli);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Establish an Uplink TBF */</span><br><span style="color: hsl(120, 100%, 40%);">+ ok := f_establish_tbf(rr_imm_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (not ok) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Failed to establish TBF");</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%);">+   ok := f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (not ok) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Immediate Assignment not an Uplink TBF");</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* build mobile Identity */</span><br><span style="color: hsl(120, 100%, 40%);">+   mi := valueof(ts_MI_IMSI_LV(imsi));</span><br><span style="color: hsl(120, 100%, 40%);">+   mi_enc_lv := enc_MobileIdentityLV(mi);</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Send paging request */</span><br><span style="color: hsl(120, 100%, 40%);">+     BTS.send(ts_PCUIF_PAG_REQ(bts_nr := 0, id_lv := mi_enc_lv, chan_needed := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                          sapi :=PCU_IF_SAPI_PDTCH));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Receive it on BTS side towards MS */</span><br><span style="color: hsl(120, 100%, 40%);">+       f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Make sure that Packet Paging Request contains the same IMSI */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_pkt_paging_match_imsi(dl_block.ctrl.payload.u.paging, imsi);</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%);">+/* Test CS paging over Gb (SGSN->PCU->BTS[PDCH]).</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_paging_cs_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)</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 GsmRrMessage rr_imm_ass;</span><br><span style="color: hsl(120, 100%, 40%);">+  var PacketUlAssign ul_tbf_ass;</span><br><span style="color: hsl(120, 100%, 40%);">+        var RlcmacDlBlock dl_block;</span><br><span style="color: hsl(120, 100%, 40%);">+   var boolean ok;</span><br><span style="color: hsl(120, 100%, 40%);">+       var OCT4 tlli := '00000001'O;</span><br><span style="color: hsl(120, 100%, 40%);">+ var hexstring imsi := f_gen_imsi(42);</span><br><span style="color: hsl(120, 100%, 40%);">+ var GsmTmsi tmsi;</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%);">+     /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init_raw(testcasename());</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_bssgp_client_llgmm_assign('FFFFFFFF'O, tlli);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Establish an Uplink TBF */</span><br><span style="color: hsl(120, 100%, 40%);">+ ok := f_establish_tbf(rr_imm_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (not ok) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Failed to establish TBF");</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%);">+   ok := f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (not ok) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Immediate Assignment not an Uplink TBF");</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%);">+   /* Send paging request with or without TMSI */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (use_ptmsi) {</span><br><span style="color: hsl(120, 100%, 40%);">+              tmsi := oct2int(f_rnd_octstring(4)); /* Random P-TMSI */</span><br><span style="color: hsl(120, 100%, 40%);">+              BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, 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, 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%);">+   /* Receive it on BTS side towards MS */</span><br><span style="color: hsl(120, 100%, 40%);">+       f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Make sure that Packet Paging Request contains the same P-TMSI/IMSI */</span><br><span style="color: hsl(120, 100%, 40%);">+      if (use_ptmsi) {</span><br><span style="color: hsl(120, 100%, 40%);">+              f_pkt_paging_match_tmsi(dl_block.ctrl.payload.u.paging, tmsi);</span><br><span style="color: hsl(120, 100%, 40%);">+        } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              f_pkt_paging_match_imsi(dl_block.ctrl.payload.u.paging, 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%);">+   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%);">+testcase TC_paging_cs_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        f_tc_paging_cs_from_sgsn(0, 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_from_sgsn_sign() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     f_tc_paging_cs_from_sgsn(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%);">+testcase TC_paging_cs_from_sgsn_ptp() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    f_tc_paging_cs_from_sgsn(mp_gb_cfg.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%);">+/* Test PS paging over Gb (SGSN->PCU->BTS[CCCH]).</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_paging_ps_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)</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 OCT4 tlli := '00000001'O;</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer imsi_suff_tx := 423;</span><br><span style="color: hsl(120, 100%, 40%);">+      var hexstring imsi := f_gen_imsi(imsi_suff_tx);</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%);">+     /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init_raw(testcasename());</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_bssgp_client_llgmm_assign('FFFFFFFF'O, tlli);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Send BSSGP PAGING-PS (with or without TMSI), wait for RR Paging Request Type 1.</span><br><span style="color: hsl(120, 100%, 40%);">+     * Make sure that both paging group (IMSI suffix) and Mobile Identity match. */</span><br><span style="color: hsl(120, 100%, 40%);">+       if (use_ptmsi) {</span><br><span style="color: hsl(120, 100%, 40%);">+              var OCT4 tmsi := f_rnd_octstring(4); /* Random P-TMSI */</span><br><span style="color: hsl(120, 100%, 40%);">+              BSSGP[0].send(ts_BSSGP_PS_PAGING_PTMSI(bvci, imsi, oct2int(tmsi)));</span><br><span style="color: hsl(120, 100%, 40%);">+           f_pcuif_rx_pch_pag_req1(t_MI_TMSI(tmsi), imsi_suff_tx);</span><br><span style="color: hsl(120, 100%, 40%);">+       } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              BSSGP[0].send(ts_BSSGP_PS_PAGING_IMSI(bvci, imsi));</span><br><span style="color: hsl(120, 100%, 40%);">+           f_pcuif_rx_pch_pag_req1(tr_MI_IMSI(imsi), imsi_suff_tx);</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%);">+testcase TC_paging_ps_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        f_tc_paging_ps_from_sgsn(0, 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_ps_from_sgsn_sign() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     f_tc_paging_ps_from_sgsn(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%);">+testcase TC_paging_ps_from_sgsn_ptp() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    f_tc_paging_ps_from_sgsn(mp_gb_cfg.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%);">+private function f_TC_egprs_pkt_chan_req(in EGPRSPktChRequest req,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     template GsmRrMessage t_imm_ass := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                         PCUIF_BurstType bt := BURST_TYPE_1)</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 GsmRrMessage rr_msg;</span><br><span style="color: hsl(120, 100%, 40%);">+      var uint16_t ra11;</span><br><span style="color: hsl(120, 100%, 40%);">+    var boolean ok;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     ra11 := enc_EGPRSPktChRequest2uint(req);</span><br><span style="color: hsl(120, 100%, 40%);">+      log("Sending EGPRS Packet Channel Request (", ra11, "): ", req);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        ok := f_establish_tbf(rr_msg, ra := ra11, is_11bit := 1, burst_type := bt);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (not ok) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Failed to establush an Uplink TBF");</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%);">+   if (not match(rr_msg, t_imm_ass)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           setverdict(fail, "Immediate Assignment does not match");</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%);">+   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%);">+testcase TC_egprs_pkt_chan_req_signalling() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var template GsmRrMessage imm_ass;</span><br><span style="color: hsl(120, 100%, 40%);">+    var template IaRestOctets rest;</span><br><span style="color: hsl(120, 100%, 40%);">+       var template EgprsUlAss ul_ass;</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());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var EGPRSPktChRequest req := {</span><br><span style="color: hsl(120, 100%, 40%);">+                /* NOTE: other fields are set in the loop */</span><br><span style="color: hsl(120, 100%, 40%);">+          signalling := { tag := '110011'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%);">+  for (var integer i := 0; i < 6; i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+              var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);</span><br><span style="color: hsl(120, 100%, 40%);">+         req.signalling.random_bits := ext_ra;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               /* For signalling, do we expect Multiblock UL TBF Assignment? */</span><br><span style="color: hsl(120, 100%, 40%);">+              ul_ass  := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);</span><br><span style="color: hsl(120, 100%, 40%);">+         rest    := tr_IaRestOctets_EGPRSULAss(ul_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+                imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               f_TC_egprs_pkt_chan_req(req, imm_ass);</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%);">+testcase TC_egprs_pkt_chan_req_one_phase() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  var template GsmRrMessage imm_ass;</span><br><span style="color: hsl(120, 100%, 40%);">+    var template IaRestOctets rest;</span><br><span style="color: hsl(120, 100%, 40%);">+       var template EgprsUlAss ul_ass;</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());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var EGPRSPktChRequest req := {</span><br><span style="color: hsl(120, 100%, 40%);">+                /* NOTE: other fields are set in the loop */</span><br><span style="color: hsl(120, 100%, 40%);">+          one_phase := { tag := '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%);">+  for (var integer i := 0; i < 6; i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+              var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);</span><br><span style="color: hsl(120, 100%, 40%);">+         var BIT5 mslot_class := int2bit(f_rnd_int(32), 5);</span><br><span style="color: hsl(120, 100%, 40%);">+            var BIT2 priority := substr(ext_ra, 0, 2);</span><br><span style="color: hsl(120, 100%, 40%);">+            var BIT3 rand := substr(ext_ra, 2, 3);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              req.one_phase.multislot_class := mslot_class;</span><br><span style="color: hsl(120, 100%, 40%);">+         req.one_phase.priority := priority;</span><br><span style="color: hsl(120, 100%, 40%);">+           req.one_phase.random_bits := rand;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          /* For one phase access, do we expect Dynamic UL TBF Assignment? */</span><br><span style="color: hsl(120, 100%, 40%);">+           ul_ass  := tr_EgprsUlAssDynamic(ext_ra := ext_ra);</span><br><span style="color: hsl(120, 100%, 40%);">+            rest    := tr_IaRestOctets_EGPRSULAss(ul_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+                imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               f_TC_egprs_pkt_chan_req(req, imm_ass);</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%);">+testcase TC_egprs_pkt_chan_req_two_phase() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  var template GsmRrMessage imm_ass;</span><br><span style="color: hsl(120, 100%, 40%);">+    var template IaRestOctets rest;</span><br><span style="color: hsl(120, 100%, 40%);">+       var template EgprsUlAss ul_ass;</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());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var EGPRSPktChRequest req := {</span><br><span style="color: hsl(120, 100%, 40%);">+                /* NOTE: other fields are set in the loop */</span><br><span style="color: hsl(120, 100%, 40%);">+          two_phase := { tag := '110000'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%);">+  for (var integer i := 0; i < 6; i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+              var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);</span><br><span style="color: hsl(120, 100%, 40%);">+         var BIT2 priority := substr(ext_ra, 0, 2);</span><br><span style="color: hsl(120, 100%, 40%);">+            var BIT3 rand := substr(ext_ra, 2, 3);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              req.two_phase.priority := priority;</span><br><span style="color: hsl(120, 100%, 40%);">+           req.two_phase.random_bits := rand;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          /* For two phase access, do we expect Multiblock UL TBF Assignment? */</span><br><span style="color: hsl(120, 100%, 40%);">+                ul_ass  := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);</span><br><span style="color: hsl(120, 100%, 40%);">+         rest    := tr_IaRestOctets_EGPRSULAss(ul_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+                imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               f_TC_egprs_pkt_chan_req(req, imm_ass);</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%);">+control {</span><br><span style="color: hsl(120, 100%, 40%);">+     execute( TC_pcuif_suspend() );</span><br><span style="color: hsl(120, 100%, 40%);">+        execute( TC_ta_ptcch_idle() );</span><br><span style="color: hsl(120, 100%, 40%);">+        execute( TC_ta_rach_imm_ass() );</span><br><span style="color: hsl(120, 100%, 40%);">+      execute( TC_ta_idle_dl_tbf_ass() );</span><br><span style="color: hsl(120, 100%, 40%);">+   execute( TC_ta_ptcch_ul_multi_tbf() );</span><br><span style="color: hsl(120, 100%, 40%);">+        execute( TC_cs_lqual_ul_tbf() );</span><br><span style="color: hsl(120, 100%, 40%);">+      execute( TC_cs_initial_ul() );</span><br><span style="color: hsl(120, 100%, 40%);">+        execute( TC_cs_max_ul() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_t3169() );</span><br><span style="color: hsl(120, 100%, 40%);">+        execute( TC_t3193() );</span><br><span style="color: hsl(120, 100%, 40%);">+        execute( TC_mo_ping_pong() );</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_mo_ping_pong_with_ul_racap() );</span><br><span style="color: hsl(120, 100%, 40%);">+   execute( TC_mt_ping_pong() );</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_mt_ping_pong_with_dl_racap() );</span><br><span style="color: hsl(120, 100%, 40%);">+   execute( TC_imm_ass_dl_block_retrans() );</span><br><span style="color: hsl(120, 100%, 40%);">+     execute( TC_paging_cs_from_bts() );</span><br><span style="color: hsl(120, 100%, 40%);">+   execute( TC_paging_cs_from_sgsn_sign_ptmsi() );</span><br><span style="color: hsl(120, 100%, 40%);">+       execute( TC_paging_cs_from_sgsn_sign() );</span><br><span style="color: hsl(120, 100%, 40%);">+     execute( TC_paging_cs_from_sgsn_ptp() );</span><br><span style="color: hsl(120, 100%, 40%);">+      execute( TC_paging_ps_from_sgsn_sign_ptmsi() );</span><br><span style="color: hsl(120, 100%, 40%);">+       execute( TC_paging_ps_from_sgsn_sign() );</span><br><span style="color: hsl(120, 100%, 40%);">+     execute( TC_paging_ps_from_sgsn_ptp() );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* EGPRS specific test cases */</span><br><span style="color: hsl(120, 100%, 40%);">+       execute( TC_egprs_pkt_chan_req_signalling() );</span><br><span style="color: hsl(120, 100%, 40%);">+        execute( TC_egprs_pkt_chan_req_one_phase() );</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_egprs_pkt_chan_req_two_phase() );</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> }</span><br><span>diff --git a/pcu/PCU_Tests_RAW_NS.ttcn b/pcu/PCU_Tests_NS.ttcn</span><br><span>similarity index 99%</span><br><span>rename from pcu/PCU_Tests_RAW_NS.ttcn</span><br><span>rename to pcu/PCU_Tests_NS.ttcn</span><br><span>index 81b60c3..9ea5149 100644</span><br><span>--- a/pcu/PCU_Tests_RAW_NS.ttcn</span><br><span>+++ b/pcu/PCU_Tests_NS.ttcn</span><br><span>@@ -1,4 +1,4 @@</span><br><span style="color: hsl(0, 100%, 40%);">-module PCU_Tests_RAW_NS {</span><br><span style="color: hsl(120, 100%, 40%);">+module PCU_Tests_NS {</span><br><span> </span><br><span> /* Osmocom PCU test suite for IP Sub-Network-Service (SNS) in TTCN-3</span><br><span>  * (C) 2018-2019 Harald Welte <laforge@gnumonks.org></span><br><span>@@ -12,7 +12,7 @@</span><br><span> </span><br><span> import from General_Types all;</span><br><span> import from Osmocom_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from PCU_Tests_RAW all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from PCU_Tests all;</span><br><span> import from SGSN_Components all;</span><br><span> import from Osmocom_Gb_Types all;</span><br><span> import from NS_CodecPort all;</span><br><span>diff --git a/pcu/PCU_Tests_RAW.ttcn b/pcu/PCU_Tests_RAW.ttcn</span><br><span>deleted file mode 100644</span><br><span>index 1348a8e..0000000</span><br><span>--- a/pcu/PCU_Tests_RAW.ttcn</span><br><span>+++ /dev/null</span><br><span>@@ -1,1906 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-module PCU_Tests_RAW {</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* "RAW" PCU tests: Talk directly to the PCU socket of OsmoPCU on the one hand side (emulating</span><br><span style="color: hsl(0, 100%, 40%);">-   the BTS/BSC side PCU socket server) and the Gb interface on the other hand side.  No NS/BSSGP</span><br><span style="color: hsl(0, 100%, 40%);">-   Emulation is used; rather, we simply use the NS_CodecPort to implement both standard and non-</span><br><span style="color: hsl(0, 100%, 40%);">-   standard procedures on the NS and BSSGP level.  The goal of these tests is to test exactly</span><br><span style="color: hsl(0, 100%, 40%);">-   those NS and BSSGP implementations on the BSS (PCU) side. */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* (C) 2018-2019 Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2019 Vadim Yanitskiy <axilirator@gmail.com></span><br><span style="color: hsl(0, 100%, 40%);">- * All rights reserved.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * Released under the terms of GNU General Public License, Version 2 or</span><br><span style="color: hsl(0, 100%, 40%);">- * (at your option) any later version.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * SPDX-License-Identifier: GPL-2.0-or-later</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-friend module PCU_Tests_RAW_NS;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-import from General_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from Osmocom_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from GSM_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from GSM_RR_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-import from Osmocom_VTY_Functions all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from TELNETasp_PortType all;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-import from MobileL3_GMM_SM_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from RLCMAC_CSN1_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from RLCMAC_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-import from MobileL3_CommonIE_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from L3_Templates all;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-import from NS_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from BSSGP_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from Osmocom_Gb_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-import from BSSGP_Emulation all; /* BssgpConfig */</span><br><span style="color: hsl(0, 100%, 40%);">-import from NS_Emulation all; /* NSConfiguration */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-import from UD_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from PCUIF_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from PCUIF_CodecPort all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from PCUIF_RAW_Components all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from IPL4asp_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from Native_Functions all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from SGSN_Components all;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-modulepar {</span><br><span style="color: hsl(0, 100%, 40%);">-   charstring mp_pcu_sock_path := PCU_SOCK_DEFAULT;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        float X2002 := 0.2; /* Timer -2002, IMM ASSIGN confirm delay */</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* FIXME: make sure to use parameters from mp_gb_cfg.cell_id in the PCU INFO IND */</span><br><span style="color: hsl(0, 100%, 40%);">-private template (value) PCUIF_info_ind ts_PCUIF_INFO_default := {</span><br><span style="color: hsl(0, 100%, 40%);">-   version := PCU_IF_VERSION,</span><br><span style="color: hsl(0, 100%, 40%);">-      flags := c_PCUIF_Flags_default,</span><br><span style="color: hsl(0, 100%, 40%);">- trx := valueof(ts_PCUIF_InfoTrxs_def),</span><br><span style="color: hsl(0, 100%, 40%);">-  bsic := 7,</span><br><span style="color: hsl(0, 100%, 40%);">-      mcc := 262,</span><br><span style="color: hsl(0, 100%, 40%);">-     mnc := 42,</span><br><span style="color: hsl(0, 100%, 40%);">-      mnc_3_digits := 0,</span><br><span style="color: hsl(0, 100%, 40%);">-      lac := 13135,</span><br><span style="color: hsl(0, 100%, 40%);">-   rac := 0,</span><br><span style="color: hsl(0, 100%, 40%);">-       nsei := mp_nsconfig.nsei,</span><br><span style="color: hsl(0, 100%, 40%);">-       nse_timer := { 3, 3, 3, 3, 30, 3, 10 },</span><br><span style="color: hsl(0, 100%, 40%);">- cell_timer := { 3, 3, 3, 3, 3, 10, 3, 10, 3, 10, 3 },</span><br><span style="color: hsl(0, 100%, 40%);">-   cell_id := 20960,</span><br><span style="color: hsl(0, 100%, 40%);">-       repeat_time := 5 * 50,</span><br><span style="color: hsl(0, 100%, 40%);">-  repeat_count := 3,</span><br><span style="color: hsl(0, 100%, 40%);">-      bvci := mp_gb_cfg.bvci,</span><br><span style="color: hsl(0, 100%, 40%);">- t3142 := 20,</span><br><span style="color: hsl(0, 100%, 40%);">-    t3169 := 5,</span><br><span style="color: hsl(0, 100%, 40%);">-     t3191 := 5,</span><br><span style="color: hsl(0, 100%, 40%);">-     t3193_10ms := 160,</span><br><span style="color: hsl(0, 100%, 40%);">-      t3195 := 5,</span><br><span style="color: hsl(0, 100%, 40%);">-     t3101 := 10,</span><br><span style="color: hsl(0, 100%, 40%);">-    t3103 := 4,</span><br><span style="color: hsl(0, 100%, 40%);">-     t3105 := 8,</span><br><span style="color: hsl(0, 100%, 40%);">-     cv_countdown := 15,</span><br><span style="color: hsl(0, 100%, 40%);">-     dl_tbf_ext := 250 * 10, /* ms */</span><br><span style="color: hsl(0, 100%, 40%);">-        ul_tbf_ext := 250 * 10, /* ms */</span><br><span style="color: hsl(0, 100%, 40%);">-        initial_cs := 2,</span><br><span style="color: hsl(0, 100%, 40%);">-        initial_mcs := 6,</span><br><span style="color: hsl(0, 100%, 40%);">-       nsvci := { mp_nsconfig.nsvci, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">-      local_pprt := { mp_nsconfig.remote_udp_port, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">-       remote_port := { mp_nsconfig.local_udp_port, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">-       remote_ip := { f_inet_haddr(mp_nsconfig.local_ip) , '00000000'O }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-type record lqual_range {</span><br><span style="color: hsl(0, 100%, 40%);">-     /* component reference to the IPA_Client component used for RSL */</span><br><span style="color: hsl(0, 100%, 40%);">-      uint8_t low,</span><br><span style="color: hsl(0, 100%, 40%);">-    uint8_t high</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-type component RAW_PCU_Test_CT extends bssgp_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-  /* Connection to the BTS component (one for now) */</span><br><span style="color: hsl(0, 100%, 40%);">-     port RAW_PCU_MSG_PT BTS;</span><br><span style="color: hsl(0, 100%, 40%);">-        /* Connection to the PCUIF component */</span><br><span style="color: hsl(0, 100%, 40%);">- port RAW_PCU_MSG_PT PCUIF;</span><br><span style="color: hsl(0, 100%, 40%);">-      /* VTY connection to the PCU */</span><br><span style="color: hsl(0, 100%, 40%);">- port TELNETasp_PT PCUVTY;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Uplink CS/MCS thresholds, default from pcu_main.c: */</span><br><span style="color: hsl(0, 100%, 40%);">-        var lqual_range g_cs_lqual_ranges[4] := {{low := 0, high := 6},</span><br><span style="color: hsl(0, 100%, 40%);">-                                          {low := 5, high := 8},</span><br><span style="color: hsl(0, 100%, 40%);">-                                          {low := 7, high := 13},</span><br><span style="color: hsl(0, 100%, 40%);">-                                                 {low := 12,high := 35}};</span><br><span style="color: hsl(0, 100%, 40%);">-       var lqual_range g_mcs_lqual_ranges[9] := {{low := 0, high := 6},</span><br><span style="color: hsl(0, 100%, 40%);">-                                                 {low := 5, high := 8},</span><br><span style="color: hsl(0, 100%, 40%);">-                                          {low := 7, high := 13},</span><br><span style="color: hsl(0, 100%, 40%);">-                                                 {low := 12,high := 15},</span><br><span style="color: hsl(0, 100%, 40%);">-                                                 {low := 14, high := 17},</span><br><span style="color: hsl(0, 100%, 40%);">-                                                {low := 16, high := 18},</span><br><span style="color: hsl(0, 100%, 40%);">-                                                {low := 17,high := 20},</span><br><span style="color: hsl(0, 100%, 40%);">-                                                 {low := 19, high := 24},</span><br><span style="color: hsl(0, 100%, 40%);">-                                                {low := 23,high := 35}};</span><br><span style="color: hsl(0, 100%, 40%);">-       var uint8_t g_cs_initial_dl := 1;</span><br><span style="color: hsl(0, 100%, 40%);">-       var uint8_t g_cs_initial_ul := 1;</span><br><span style="color: hsl(0, 100%, 40%);">-       var uint8_t g_mcs_initial_dl := 1;</span><br><span style="color: hsl(0, 100%, 40%);">-      var uint8_t g_mcs_initial_ul := 1;</span><br><span style="color: hsl(0, 100%, 40%);">-      var uint8_t g_cs_max_dl := 4;</span><br><span style="color: hsl(0, 100%, 40%);">-   var uint8_t g_cs_max_ul := 4;</span><br><span style="color: hsl(0, 100%, 40%);">-   var uint8_t g_mcs_max_dl := 9;</span><br><span style="color: hsl(0, 100%, 40%);">-  var uint8_t g_mcs_max_ul := 9;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  var boolean g_egprs_only := false;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* Guard timeout */</span><br><span style="color: hsl(0, 100%, 40%);">-     timer g_T_guard := 60.0;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-private altstep as_Tguard_RAW() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-     [] g_T_guard.timeout {</span><br><span style="color: hsl(0, 100%, 40%);">-          setverdict(fail, "Timeout of T_guard");</span><br><span style="color: hsl(0, 100%, 40%);">-               mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_pcuvty_set_allowed_cs_mcs() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-      f_vty_config2(PCUVTY, {"pcu"}, "cs " & int2str(g_cs_initial_dl) & " " & int2str(g_cs_initial_ul));</span><br><span style="color: hsl(0, 100%, 40%);">-    f_vty_config2(PCUVTY, {"pcu"}, "cs max " & int2str(g_cs_max_dl) & " " & int2str(g_cs_max_ul));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        f_vty_config2(PCUVTY, {"pcu"}, "mcs " & int2str(g_mcs_initial_dl) & " " & int2str(g_mcs_initial_ul));</span><br><span style="color: hsl(0, 100%, 40%);">- f_vty_config2(PCUVTY, {"pcu"}, "mcs max " & int2str(g_mcs_max_dl) & " " & int2str(g_mcs_max_ul));</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_pcuvty_set_link_quality_ranges() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-       var charstring cmd;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     cmd := "cs link-quality-ranges" &</span><br><span style="color: hsl(0, 100%, 40%);">-        " cs1 " & int2str(g_cs_lqual_ranges[0].high) &</span><br><span style="color: hsl(0, 100%, 40%);">-        " cs2 " & int2str(g_cs_lqual_ranges[1].low) & " " & int2str(g_cs_lqual_ranges[1].high) &</span><br><span style="color: hsl(0, 100%, 40%);">-            " cs3 " & int2str(g_cs_lqual_ranges[2].low) & " " & int2str(g_cs_lqual_ranges[2].high) &</span><br><span style="color: hsl(0, 100%, 40%);">-            " cs4 " & int2str(g_cs_lqual_ranges[3].low);</span><br><span style="color: hsl(0, 100%, 40%);">-       f_vty_config2(PCUVTY, {"pcu"}, cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  cmd := "mcs link-quality-ranges" &</span><br><span style="color: hsl(0, 100%, 40%);">-               " mcs1 " & int2str(g_mcs_lqual_ranges[0].high) &</span><br><span style="color: hsl(0, 100%, 40%);">-              " mcs2 " & int2str(g_mcs_lqual_ranges[1].low) & " " & int2str(g_mcs_lqual_ranges[1].high) &</span><br><span style="color: hsl(0, 100%, 40%);">-         " mcs3 " & int2str(g_mcs_lqual_ranges[2].low) & " " & int2str(g_mcs_lqual_ranges[2].high) &</span><br><span style="color: hsl(0, 100%, 40%);">-         " mcs4 " & int2str(g_mcs_lqual_ranges[3].low) & " " & int2str(g_mcs_lqual_ranges[3].high) &</span><br><span style="color: hsl(0, 100%, 40%);">-         " mcs5 " & int2str(g_mcs_lqual_ranges[4].low) & " " & int2str(g_mcs_lqual_ranges[4].high) &</span><br><span style="color: hsl(0, 100%, 40%);">-         " mcs6 " & int2str(g_mcs_lqual_ranges[5].low) & " " & int2str(g_mcs_lqual_ranges[5].high) &</span><br><span style="color: hsl(0, 100%, 40%);">-         " mcs7 " & int2str(g_mcs_lqual_ranges[6].low) & " " & int2str(g_mcs_lqual_ranges[6].high) &</span><br><span style="color: hsl(0, 100%, 40%);">-         " mcs8 " & int2str(g_mcs_lqual_ranges[7].low) & " " & int2str(g_mcs_lqual_ranges[7].high) &</span><br><span style="color: hsl(0, 100%, 40%);">-         " mcs9 " & int2str(g_mcs_lqual_ranges[8].low);</span><br><span style="color: hsl(0, 100%, 40%);">-     f_vty_config2(PCUVTY, {"pcu"}, cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_init_vty(charstring id) runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-     map(self:PCUVTY, system:PCUVTY);</span><br><span style="color: hsl(0, 100%, 40%);">-        f_vty_set_prompts(PCUVTY);</span><br><span style="color: hsl(0, 100%, 40%);">-      f_vty_transceive(PCUVTY, "enable");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   if (g_egprs_only) {</span><br><span style="color: hsl(0, 100%, 40%);">-             f_vty_config2(PCUVTY, {"pcu"}, "egprs only");</span><br><span style="color: hsl(0, 100%, 40%);">-       } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                f_vty_config2(PCUVTY, {"pcu"}, "no egprs");</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_init_raw(charstring id, template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-        var RAW_PCUIF_CT vc_PCUIF;</span><br><span style="color: hsl(0, 100%, 40%);">-      var RAW_PCU_BTS_CT vc_BTS;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* Start the guard timer */</span><br><span style="color: hsl(0, 100%, 40%);">-     g_T_guard.start;</span><br><span style="color: hsl(0, 100%, 40%);">-        activate(as_Tguard_RAW());</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* Init PCU interface component */</span><br><span style="color: hsl(0, 100%, 40%);">-      vc_PCUIF := RAW_PCUIF_CT.create("PCUIF-" & id);</span><br><span style="color: hsl(0, 100%, 40%);">-   connect(vc_PCUIF:MTC, self:PCUIF);</span><br><span style="color: hsl(0, 100%, 40%);">-      map(vc_PCUIF:PCU, system:PCU);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  /* Create one BTS component (we may want more some day) */</span><br><span style="color: hsl(0, 100%, 40%);">-      vc_BTS := RAW_PCU_BTS_CT.create("BTS-" & id);</span><br><span style="color: hsl(0, 100%, 40%);">-     connect(vc_BTS:PCUIF, vc_PCUIF:BTS);</span><br><span style="color: hsl(0, 100%, 40%);">-    connect(vc_BTS:TC, self:BTS);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   f_init_vty(id);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- vc_PCUIF.start(f_PCUIF_CT_handler(mp_pcu_sock_path));</span><br><span style="color: hsl(0, 100%, 40%);">-   vc_BTS.start(f_BTS_CT_handler(0, valueof(info_ind)));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* Wait until the BTS is ready (SI13 negotiated) */</span><br><span style="color: hsl(0, 100%, 40%);">-     BTS.receive(tr_RAW_PCU_EV(BTS_EV_SI13_NEGO));</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-template AckNackDescription t_AckNackDescription_init := {</span><br><span style="color: hsl(0, 100%, 40%);">-        final_ack := '0'B,</span><br><span style="color: hsl(0, 100%, 40%);">-      starting_seq_nr := 0,</span><br><span style="color: hsl(0, 100%, 40%);">-   receive_block_bitmap := '0000000000000000000000000000000000000000000000000000000000000000'B</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_rlcmac_dl_block_get_tfi(RlcmacDlBlock dl_block) return uint5_t {</span><br><span style="color: hsl(0, 100%, 40%);">- if (ischosen(dl_block.data)) {</span><br><span style="color: hsl(0, 100%, 40%);">-          return dl_block.data.mac_hdr.hdr_ext.tfi;</span><br><span style="color: hsl(0, 100%, 40%);">-       } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                return dl_block.data_egprs.mac_hdr.tfi;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* TS 44.060 sec 12.3 Ack/Nack Description */</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_acknackdesc_ack_block(inout AckNackDescription desc, RlcmacDlBlock dl_block, BIT1 final_ack := '0'B)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- var uint7_t bsn;</span><br><span style="color: hsl(0, 100%, 40%);">-        var integer i;</span><br><span style="color: hsl(0, 100%, 40%);">-  var integer inc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (ischosen(dl_block.data)) {</span><br><span style="color: hsl(0, 100%, 40%);">-          bsn := dl_block.data.mac_hdr.hdr_ext.bsn;</span><br><span style="color: hsl(0, 100%, 40%);">-       } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                bsn := dl_block.data_egprs.mac_hdr.bsn1;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       inc := bsn - desc.starting_seq_nr + 1;</span><br><span style="color: hsl(0, 100%, 40%);">-  /* Filling hole? */</span><br><span style="color: hsl(0, 100%, 40%);">-     if (bsn < desc.starting_seq_nr) {</span><br><span style="color: hsl(0, 100%, 40%);">-            desc.receive_block_bitmap[lengthof(desc.receive_block_bitmap) - (desc.starting_seq_nr - bsn)] := int2bit(1, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-         return;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* SSN is increased, and so RBB values need to be moved */</span><br><span style="color: hsl(0, 100%, 40%);">-      for (i := 0; i < lengthof(desc.receive_block_bitmap) - inc; i := i+1) {</span><br><span style="color: hsl(0, 100%, 40%);">-              desc.receive_block_bitmap[i] := desc.receive_block_bitmap[i + inc];</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-       for (i := lengthof(desc.receive_block_bitmap) - inc; i < lengthof(desc.receive_block_bitmap) - 1; i := i+1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                desc.receive_block_bitmap[i] := int2bit(0, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Now we can set current bit and update SSN */</span><br><span style="color: hsl(0, 100%, 40%);">- desc.starting_seq_nr := bsn + 1;</span><br><span style="color: hsl(0, 100%, 40%);">-        desc.receive_block_bitmap[lengthof(desc.receive_block_bitmap) - 1] := int2bit(1, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /* Finally update the final_ack bit as requested: */</span><br><span style="color: hsl(0, 100%, 40%);">-    desc.final_ack := final_ack;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* This function can be used to send DATA.cnf in response to the IUT originated DATA.req.</span><br><span style="color: hsl(0, 100%, 40%);">- * NOTE: it's the responsibility of caller to make sure that pcu_msg contains u.data_req. */</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_pcuif_tx_data_cnf(in PCUIF_Message pcu_msg)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-   var PCUIF_Message pcu_msg_cnf := {</span><br><span style="color: hsl(0, 100%, 40%);">-              msg_type := PCU_IF_MSG_DATA_CNF,</span><br><span style="color: hsl(0, 100%, 40%);">-                bts_nr := pcu_msg.bts_nr,</span><br><span style="color: hsl(0, 100%, 40%);">-               spare := pcu_msg.spare,</span><br><span style="color: hsl(0, 100%, 40%);">-         u := { data_cnf := pcu_msg.u.data_req }</span><br><span style="color: hsl(0, 100%, 40%);">- };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* PCU wants DATA.cnf containing basically everything that was in DATA.req,</span><br><span style="color: hsl(0, 100%, 40%);">-      * but PCU_IF_SAPI_PCH is a special case - paging group shall be excluded. */</span><br><span style="color: hsl(0, 100%, 40%);">-   if (pcu_msg.u.data_req.sapi == PCU_IF_SAPI_PCH) {</span><br><span style="color: hsl(0, 100%, 40%);">-               pcu_msg_cnf.u.data_cnf.data := substr(pcu_msg.u.data_req.data, 3,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                     pcu_msg.u.data_req.len - 3);</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       BTS.send(pcu_msg_cnf);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_pcuif_rx_imm_ass(out GsmRrMessage rr_imm_ass,</span><br><span style="color: hsl(0, 100%, 40%);">-                             template PCUIF_Sapi sapi := PCU_IF_SAPI_AGCH,</span><br><span style="color: hsl(0, 100%, 40%);">-                                   template GsmRrMessage t_imm_ass := ?,</span><br><span style="color: hsl(0, 100%, 40%);">-                                   uint8_t bts_nr := 0)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on RAW_PCU_Test_CT return boolean {</span><br><span style="color: hsl(0, 100%, 40%);">-        var PCUIF_Message pcu_msg;</span><br><span style="color: hsl(0, 100%, 40%);">-      var octetstring data;</span><br><span style="color: hsl(0, 100%, 40%);">-   timer T;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        T.start(2.0);</span><br><span style="color: hsl(0, 100%, 40%);">-   alt {</span><br><span style="color: hsl(0, 100%, 40%);">-   [] BTS.receive(tr_PCUIF_DATA_REQ(bts_nr := bts_nr, trx_nr := 0, ts_nr := 0,</span><br><span style="color: hsl(0, 100%, 40%);">-                                      sapi := sapi, data := ?)) -> value pcu_msg {</span><br><span style="color: hsl(0, 100%, 40%);">-                /* On PCH the payload is prefixed with paging group (3 octets): skip it.</span><br><span style="color: hsl(0, 100%, 40%);">-                 * TODO: add an additional template parameter, so we can match it. */</span><br><span style="color: hsl(0, 100%, 40%);">-           if (pcu_msg.u.data_req.sapi == PCU_IF_SAPI_PCH) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       data := substr(pcu_msg.u.data_req.data, 3, pcu_msg.u.data_req.len - 3);</span><br><span style="color: hsl(0, 100%, 40%);">-         } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        data := pcu_msg.u.data_req.data;</span><br><span style="color: hsl(0, 100%, 40%);">-                }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               rr_imm_ass := dec_GsmRrMessage(data);</span><br><span style="color: hsl(0, 100%, 40%);">-           if (not match(rr_imm_ass, t_imm_ass)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 /* Not for us? Wait for more. */</span><br><span style="color: hsl(0, 100%, 40%);">-                        repeat;</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               log("Rx Immediate Assignment: ", rr_imm_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-         setverdict(pass);</span><br><span style="color: hsl(0, 100%, 40%);">-               return true;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-       [] BTS.receive { repeat; }</span><br><span style="color: hsl(0, 100%, 40%);">-      [] T.timeout {</span><br><span style="color: hsl(0, 100%, 40%);">-          setverdict(fail, "Timeout waiting for Immediate Assignment");</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return false;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* FIXME: properly encode RA (see TS 24.060, table 11.2.5.2) */</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_establish_tbf(out GsmRrMessage rr_imm_ass, uint8_t bts_nr := 0,</span><br><span style="color: hsl(0, 100%, 40%);">-                          uint16_t ra := oct2int('3A'O), uint8_t is_11bit := 0,</span><br><span style="color: hsl(0, 100%, 40%);">-                           PCUIF_BurstType burst_type := BURST_TYPE_0,</span><br><span style="color: hsl(0, 100%, 40%);">-                             TimingAdvance ta := 0)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on RAW_PCU_Test_CT return boolean {</span><br><span style="color: hsl(0, 100%, 40%);">- var uint32_t fn;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* FIXME: ask the BTS component to give us the current TDMA fn */</span><br><span style="color: hsl(0, 100%, 40%);">-       fn := 1337 + ta;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* Send RACH.ind */</span><br><span style="color: hsl(0, 100%, 40%);">-     log("Sending RACH.ind on fn=", fn, " with RA=", ra, ", TA=", ta);</span><br><span style="color: hsl(0, 100%, 40%);">- BTS.send(ts_PCUIF_RACH_IND(bts_nr := bts_nr, trx_nr := 0, ts_nr := 0,</span><br><span style="color: hsl(0, 100%, 40%);">-                              ra := ra, is_11bit := is_11bit,</span><br><span style="color: hsl(0, 100%, 40%);">-                                 burst_type := burst_type,</span><br><span style="color: hsl(0, 100%, 40%);">-                               fn := fn, arfcn := 871,</span><br><span style="color: hsl(0, 100%, 40%);">-                                 qta := ta * 4));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* 3GPP TS 44.018, table 9.1.8.1, note 2b: Request Reference shall be set to 127</span><br><span style="color: hsl(0, 100%, 40%);">-         * when Immediate Assignment is triggered by EGPRS Packet Channel Request. Here</span><br><span style="color: hsl(0, 100%, 40%);">-  * we assume that 11 bit RA always contains EGPRS Packet Channel Request. */</span><br><span style="color: hsl(0, 100%, 40%);">-    if (is_11bit != 0) { ra := 127; }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Expect Immediate (TBF) Assignment on TS0/AGCH */</span><br><span style="color: hsl(0, 100%, 40%);">-     return f_pcuif_rx_imm_ass(rr_imm_ass, PCU_IF_SAPI_AGCH,</span><br><span style="color: hsl(0, 100%, 40%);">-                           tr_IMM_TBF_ASS(?, ra, fn),</span><br><span style="color: hsl(0, 100%, 40%);">-                              bts_nr := bts_nr);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_imm_ass_verify_ul_tbf_ass(GsmRrMessage rr_imm_ass, out PacketUlAssign ul_tbf_ass)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on RAW_PCU_Test_CT return boolean {</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Make sure we received an UL TBF Assignment */</span><br><span style="color: hsl(0, 100%, 40%);">-        if (match(rr_imm_ass, tr_IMM_TBF_ASS(dl := false, rest := tr_IaRestOctets_ULAss(?)))) {</span><br><span style="color: hsl(0, 100%, 40%);">-         ul_tbf_ass := rr_imm_ass.payload.imm_ass.rest_octets.hh.pa.uldl.ass.ul;</span><br><span style="color: hsl(0, 100%, 40%);">-         log("Rx Uplink TBF assignment: ", ul_tbf_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-                setverdict(pass);</span><br><span style="color: hsl(0, 100%, 40%);">-       } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                setverdict(fail, "Failed to match UL TBF Assignment");</span><br><span style="color: hsl(0, 100%, 40%);">-                return false;</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Make sure we have got a TBF with Dynamic Block Allocation */</span><br><span style="color: hsl(0, 100%, 40%);">- if (ul_tbf_ass.dynamic == omit) {</span><br><span style="color: hsl(0, 100%, 40%);">-               setverdict(fail, "Single Block Allocation is not handled by ", testcasename());</span><br><span style="color: hsl(0, 100%, 40%);">-               return false;</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return true;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_imm_ass_verify_dl_tbf_ass(GsmRrMessage rr_imm_ass, out PacketDlAssign dl_tbf_ass)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on RAW_PCU_Test_CT return boolean {</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Make sure we received a DL TBF Assignment */</span><br><span style="color: hsl(0, 100%, 40%);">- if (match(rr_imm_ass, tr_IMM_TBF_ASS(dl := true, rest := tr_IaRestOctets_DLAss(?)))) {</span><br><span style="color: hsl(0, 100%, 40%);">-          dl_tbf_ass := rr_imm_ass.payload.imm_ass.rest_octets.hh.pa.uldl.ass.dl;</span><br><span style="color: hsl(0, 100%, 40%);">-         log("Rx Downlink TBF assignment: ", dl_tbf_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-              setverdict(pass);</span><br><span style="color: hsl(0, 100%, 40%);">-       } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                setverdict(fail, "Failed to match DL TBF Assignment");</span><br><span style="color: hsl(0, 100%, 40%);">-                return false;</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return true;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_pcuif_tx_data_ind(octetstring data, int16_t lqual_cb := 0, uint32_t fn := 0)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-   var template RAW_PCU_EventParam ev_param := {tdma_fn := ? };</span><br><span style="color: hsl(0, 100%, 40%);">-    BTS.send(ts_PCUIF_DATA_IND(bts_nr := 0, trx_nr := 0, ts_nr := 7, block_nr := 0,</span><br><span style="color: hsl(0, 100%, 40%);">-                            sapi := PCU_IF_SAPI_PDTCH, data := data,</span><br><span style="color: hsl(0, 100%, 40%);">-                                fn := fn, arfcn := 871, lqual_cb := lqual_cb));</span><br><span style="color: hsl(0, 100%, 40%);">-      if (fn != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-          ev_param := {tdma_fn := fn };</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(0, 100%, 40%);">-       BTS.receive(tr_RAW_PCU_EV(TDMA_EV_PDTCH_BLOCK_SENT, ev_param));</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_pcuif_rx_data_req(out PCUIF_Message pcu_msg)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">- BTS.send(ts_PCUIF_RTS_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,</span><br><span style="color: hsl(0, 100%, 40%);">-                           sapi := PCU_IF_SAPI_PDTCH, fn := 0,</span><br><span style="color: hsl(0, 100%, 40%);">-                             arfcn := 871, block_nr := 0));</span><br><span style="color: hsl(0, 100%, 40%);">-        BTS.receive(tr_PCUIF_DATA_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,</span><br><span style="color: hsl(0, 100%, 40%);">-                                   sapi := PCU_IF_SAPI_PDTCH)) -> value pcu_msg;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Expect an Immediate Assignment (paging) from PCU on PCUIF on specified sapi.  */</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_pcuif_rx_pch_imm_tbf_ass(out GsmRrMessage rr_imm_ass)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-     var PCUIF_Message pcu_msg;</span><br><span style="color: hsl(0, 100%, 40%);">-      var octetstring macblock;</span><br><span style="color: hsl(0, 100%, 40%);">-       BTS.receive(tr_PCUIF_DATA_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 0,</span><br><span style="color: hsl(0, 100%, 40%);">-                                   sapi := PCU_IF_SAPI_PCH)) -> value pcu_msg;</span><br><span style="color: hsl(0, 100%, 40%);">-    /* First 3 bytes contain paging group: */</span><br><span style="color: hsl(0, 100%, 40%);">-       macblock := substr(pcu_msg.u.data_req.data, 3, pcu_msg.u.data_req.len - 3);</span><br><span style="color: hsl(0, 100%, 40%);">-     rr_imm_ass := dec_GsmRrMessage(macblock);</span><br><span style="color: hsl(0, 100%, 40%);">-       if (not match(rr_imm_ass, tr_IMM_TBF_ASS())) {</span><br><span style="color: hsl(0, 100%, 40%);">-          setverdict(fail, "Failed to match Immediate Assignment: ", rr_imm_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-               mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       f_pcuif_tx_data_cnf(pcu_msg);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Expect a Paging Request Type 1 from PCU on PCUIF on specified sapi.  */</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_pcuif_rx_pch_pag_req1(template MobileIdentityV mi1 := ?,</span><br><span style="color: hsl(0, 100%, 40%);">-                                      template integer pag_group := ?)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on RAW_PCU_Test_CT return GsmRrMessage {</span><br><span style="color: hsl(0, 100%, 40%);">-  var GsmRrMessage rr_pag_req1;</span><br><span style="color: hsl(0, 100%, 40%);">-   var PCUIF_Message pcu_msg;</span><br><span style="color: hsl(0, 100%, 40%);">-      var octetstring imsi_suff_octstr;</span><br><span style="color: hsl(0, 100%, 40%);">-       var integer pag_group_rx;</span><br><span style="color: hsl(0, 100%, 40%);">-       var octetstring macblock;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       BTS.receive(tr_PCUIF_DATA_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 0,</span><br><span style="color: hsl(0, 100%, 40%);">-                                   sapi := PCU_IF_SAPI_PCH)) -> value pcu_msg;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /* First 3 bytes contain IMSI suffix to calculate paging group: */</span><br><span style="color: hsl(0, 100%, 40%);">-      imsi_suff_octstr := substr(pcu_msg.u.data_req.data, 0, 3);</span><br><span style="color: hsl(0, 100%, 40%);">-      pag_group_rx := str2int(oct2char(imsi_suff_octstr[0])) * 100 +</span><br><span style="color: hsl(0, 100%, 40%);">-                  str2int(oct2char(imsi_suff_octstr[1])) * 10 +</span><br><span style="color: hsl(0, 100%, 40%);">-                   str2int(oct2char(imsi_suff_octstr[2]));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Make sure we've got RR Paging Request Type 1 for a given MI */</span><br><span style="color: hsl(0, 100%, 40%);">-   macblock := substr(pcu_msg.u.data_req.data, 3, pcu_msg.u.data_req.len - 3);</span><br><span style="color: hsl(0, 100%, 40%);">-     rr_pag_req1 := dec_GsmRrMessage(macblock);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (not match(rr_pag_req1, tr_PAG_REQ1(tr_MI_LV(mi1)))) {</span><br><span style="color: hsl(0, 100%, 40%);">-               setverdict(fail, "Failed to match Paging Request Type 1: ", rr_pag_req1);</span><br><span style="color: hsl(0, 100%, 40%);">-             mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Make sure that received paging froup matches the expected one */</span><br><span style="color: hsl(0, 100%, 40%);">-     if (not match(pag_group_rx, pag_group)) {</span><br><span style="color: hsl(0, 100%, 40%);">-               setverdict(fail, "Paging group", pag_group_rx, " does not match expected ", pag_group);</span><br><span style="color: hsl(0, 100%, 40%);">-             mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       f_pcuif_tx_data_cnf(pcu_msg);</span><br><span style="color: hsl(0, 100%, 40%);">-   return rr_pag_req1;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_tx_rlcmac_ul_block(template (value) RlcmacUlBlock ul_data, int16_t lqual_cb := 0, uint32_t fn := 0)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-     var octetstring data;</span><br><span style="color: hsl(0, 100%, 40%);">-   /* Encode the payload of DATA.ind */</span><br><span style="color: hsl(0, 100%, 40%);">-    data := enc_RlcmacUlBlock(valueof(ul_data));</span><br><span style="color: hsl(0, 100%, 40%);">-    data := f_pad_oct(data, 23, '00'O); /* CS-1 */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */</span><br><span style="color: hsl(0, 100%, 40%);">-        f_pcuif_tx_data_ind(data, lqual_cb, fn);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_tx_rlcmac_ul_n_blocks(PacketUlAssign ul_tbf_ass, integer num_blocks := 1)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-  var template (value) RlcmacUlBlock ul_data := t_RLCMAC_UL_DATA(</span><br><span style="color: hsl(0, 100%, 40%);">-         tfi := ul_tbf_ass.dynamic.tfi_assignment,</span><br><span style="color: hsl(0, 100%, 40%);">-               cv := num_blocks - 1, /* num UL blocks to be sent (to be overridden in loop) */</span><br><span style="color: hsl(0, 100%, 40%);">-         bsn := 0, /* TODO: what should be here? */</span><br><span style="color: hsl(0, 100%, 40%);">-              blocks := { /* To be generated in loop */ });</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* HACK: patch missing TLLI; otherwise OsmoPCU rejects DATA.req */</span><br><span style="color: hsl(0, 100%, 40%);">-      ul_data.data.tlli := '00000001'O;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       for (var integer i := 0; i < num_blocks; i := i + 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-               /* Prepare a new UL block (CV, random payload) */</span><br><span style="color: hsl(0, 100%, 40%);">-               ul_data.data.mac_hdr.countdown := (num_blocks - i - 1);</span><br><span style="color: hsl(0, 100%, 40%);">-         ul_data.data.blocks := { valueof(t_RLCMAC_LLCBLOCK(f_rnd_octstring(10))) };</span><br><span style="color: hsl(0, 100%, 40%);">-             f_tx_rlcmac_ul_block(ul_data);</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_rx_rlcmac_dl_block(out RlcmacDlBlock dl_block, out uint32_t dl_fn, template (present) CodingScheme exp_cs_mcs := ?)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-       var PCUIF_Message pcu_msg;</span><br><span style="color: hsl(0, 100%, 40%);">-      f_pcuif_rx_data_req(pcu_msg);</span><br><span style="color: hsl(0, 100%, 40%);">-   dl_block := dec_RlcmacDlBlock(pcu_msg.u.data_req.data);</span><br><span style="color: hsl(0, 100%, 40%);">- dl_fn := pcu_msg.u.data_req.fn;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- var integer len := lengthof(pcu_msg.u.data_req.data);</span><br><span style="color: hsl(0, 100%, 40%);">-   var CodingScheme cs_mcs := f_rlcmac_block_len2cs_mcs(len)</span><br><span style="color: hsl(0, 100%, 40%);">-       if (not match(f_rlcmac_block_len2cs_mcs(len), exp_cs_mcs)) {</span><br><span style="color: hsl(0, 100%, 40%);">-            setverdict(fail, "Failed to match Coding Scheme exp ", exp_cs_mcs, " vs ", cs_mcs, " (", len, ")");</span><br><span style="color: hsl(0, 100%, 40%);">-             mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_rx_rlcmac_dl_block_exp_ack_nack(out RlcmacDlBlock dl_block, out uint32_t poll_fn)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">- var uint32_t dl_fn;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     f_rx_rlcmac_dl_block(dl_block, dl_fn);</span><br><span style="color: hsl(0, 100%, 40%);">-  if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK(ul_tfi := ?, tlli := ?))) {</span><br><span style="color: hsl(0, 100%, 40%);">-               setverdict(fail, "Failed to match Packet Uplink ACK / NACK");</span><br><span style="color: hsl(0, 100%, 40%);">-         mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       poll_fn := dl_fn + f_rrbp_fn_delay(dl_block.ctrl.mac_hdr.rrbp);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_rx_rlcmac_dl_block_exp_dummy(out RlcmacDlBlock dl_block)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-    var uint32_t dl_fn;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     f_rx_rlcmac_dl_block(dl_block, dl_fn);</span><br><span style="color: hsl(0, 100%, 40%);">-  if (not match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {</span><br><span style="color: hsl(0, 100%, 40%);">-              setverdict(fail, "Failed to match Packet DUMMY DL");</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_rx_rlcmac_dl_block_exp_pkt_ass(out RlcmacDlBlock dl_block, out uint32_t poll_fn)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-  var uint32_t dl_fn;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     f_rx_rlcmac_dl_block(dl_block, dl_fn);</span><br><span style="color: hsl(0, 100%, 40%);">-  if (not match(dl_block, tr_RLCMAC_DL_PACKET_ASS())) {</span><br><span style="color: hsl(0, 100%, 40%);">-           setverdict(fail, "Failed to match Packet Downlink Assignment");</span><br><span style="color: hsl(0, 100%, 40%);">-               mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       poll_fn := dl_fn + f_rrbp_fn_delay(dl_block.ctrl.mac_hdr.rrbp);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_rx_rlcmac_dl_block_exp_pkt_ul_ass(out RlcmacDlBlock dl_block, out uint32_t poll_fn)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-        var uint32_t dl_fn;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        f_rx_rlcmac_dl_block(dl_block, dl_fn);</span><br><span style="color: hsl(0, 100%, 40%);">-        if (not match(dl_block, tr_RLCMAC_UL_PACKET_ASS())) {</span><br><span style="color: hsl(0, 100%, 40%);">-                setverdict(fail, "Failed to match Packet Uplink Assignment");</span><br><span style="color: hsl(0, 100%, 40%);">-                mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        poll_fn := dl_fn + f_rrbp_fn_delay(dl_block.ctrl.mac_hdr.rrbp);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_rx_rlcmac_dl_block_exp_pkt_pag_req(out RlcmacDlBlock dl_block)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-        var uint32_t dl_fn;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     f_rx_rlcmac_dl_block(dl_block, dl_fn);</span><br><span style="color: hsl(0, 100%, 40%);">-  if (not match(dl_block, tr_RLCMAC_PACKET_PAG_REQ())) {</span><br><span style="color: hsl(0, 100%, 40%);">-          setverdict(fail, "Failed to match Packet Paging Request: ", dl_block, " vs ", tr_RLCMAC_PACKET_PAG_REQ());</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_rlcmac_dl_block_verify_data_gprs(RlcmacDlBlock dl_block, uint32_t dl_fn, out uint32_t ack_fn, octetstring data, template (present) uint7_t exp_bsn := ?, template (present) CodingScheme exp_cs := ?)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     log("verifying dl data block (gprs): ", dl_block);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    ack_fn := dl_fn + f_rrbp_fn_delay(dl_block.data.mac_hdr.mac_hdr.rrbp);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  if (not match(dl_block.data.mac_hdr.hdr_ext.bsn, exp_bsn)) {</span><br><span style="color: hsl(0, 100%, 40%);">-            setverdict(fail, "DL block BSN doesn't match: ",</span><br><span style="color: hsl(0, 100%, 40%);">-                     dl_block.data.blocks[0].hdr.length_ind, " vs exp ", exp_bsn);</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (lengthof(dl_block.data.blocks) < 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-            setverdict(fail, "DL block has no LLC payload: ", dl_block);</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (ispresent(dl_block.data.blocks[0].hdr) and dl_block.data.blocks[0].hdr.length_ind != lengthof(data)) {</span><br><span style="color: hsl(0, 100%, 40%);">-              setverdict(fail, "DL block has LLC header with wrong expected size: ",</span><br><span style="color: hsl(0, 100%, 40%);">-                           dl_block.data.blocks[0].hdr.length_ind, " vs ", lengthof(data));</span><br><span style="color: hsl(0, 100%, 40%);">-           mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (dl_block.data.blocks[0].payload != data) {</span><br><span style="color: hsl(0, 100%, 40%);">-          setverdict(fail, "Failed to match content of LLC payload in DL Block: ", dl_block, " vs ", data);</span><br><span style="color: hsl(0, 100%, 40%);">-           mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Check next data blocks contain dummy frames */</span><br><span style="color: hsl(0, 100%, 40%);">-       if (lengthof(dl_block.data.blocks) > 1 and substr(dl_block.data.blocks[1].payload, 0, 3) != '43C001'O) {</span><br><span style="color: hsl(0, 100%, 40%);">-             setverdict(fail, "Second data payload is not a dummy frame: ", dl_block.data.blocks[1].payload);</span><br><span style="color: hsl(0, 100%, 40%);">-              mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* TODO: check exp_cs */</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_rlcmac_dl_block_verify_data_egprs(RlcmacDlBlock dl_block, uint32_t dl_fn, out uint32_t ack_fn, octetstring data, template (present) uint14_t exp_bsn := ?, template (present) CodingScheme exp_cs := ?)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    log("verifying dl data block (egprs): ", dl_block);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   ack_fn := dl_fn + f_rrbp_fn_delay(dl_block.data_egprs.mac_hdr.rrbp);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    if (not match(dl_block.data_egprs.mac_hdr.bsn1, exp_bsn)) {</span><br><span style="color: hsl(0, 100%, 40%);">-             setverdict(fail, "DL block BSN doesn't match: ",</span><br><span style="color: hsl(0, 100%, 40%);">-                     dl_block.data_egprs.blocks[0].hdr.length_ind, " vs exp ", exp_bsn);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (lengthof(dl_block.data_egprs.blocks) < 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-              setverdict(fail, "DL block has no LLC payload: ", dl_block);</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (ispresent(dl_block.data_egprs.blocks[0].hdr) and dl_block.data_egprs.blocks[0].hdr.length_ind != lengthof(data)) {</span><br><span style="color: hsl(0, 100%, 40%);">-          setverdict(fail, "DL block has LLC header with wrong expected size: ",</span><br><span style="color: hsl(0, 100%, 40%);">-                           dl_block.data_egprs.blocks[0].hdr.length_ind, " vs ", lengthof(data));</span><br><span style="color: hsl(0, 100%, 40%);">-             mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (dl_block.data_egprs.blocks[0].payload != data) {</span><br><span style="color: hsl(0, 100%, 40%);">-            setverdict(fail, "Failed to match content of LLC payload in DL Block: ", dl_block, " vs ", data);</span><br><span style="color: hsl(0, 100%, 40%);">-           mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Check next data blocks contain dummy frames */</span><br><span style="color: hsl(0, 100%, 40%);">-       if (lengthof(dl_block.data_egprs.blocks) > 1 and substr(dl_block.data_egprs.blocks[1].payload, 0, 3) != '43C001'O) {</span><br><span style="color: hsl(0, 100%, 40%);">-         setverdict(fail, "Second data payload is not a dummy frame: ", dl_block.data.blocks[1].payload);</span><br><span style="color: hsl(0, 100%, 40%);">-              mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* TODO: Check exp_cs. In the case of EGPRS, first check mac_hdr.header_type and then decode CPS = exp_cs based on mac_hdr.header_type.</span><br><span style="color: hsl(0, 100%, 40%);">-         See wireshark's egprs_Header_type1_coding_puncturing_scheme_to_mcs. */</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_rx_rlcmac_dl_block_exp_data(out RlcmacDlBlock dl_block, out uint32_t ack_fn, octetstring data, template (present) uint7_t exp_bsn := ?, template (present) CodingScheme exp_cs := ?)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-     var PCUIF_Message pcu_msg;</span><br><span style="color: hsl(0, 100%, 40%);">-      var uint32_t dl_fn;</span><br><span style="color: hsl(0, 100%, 40%);">-     var boolean is_egprs := false;</span><br><span style="color: hsl(0, 100%, 40%);">-  var template RlcmacDlBlock dl_template := tr_RLCMAC_DATA_RRBP;</span><br><span style="color: hsl(0, 100%, 40%);">-  dl_template.data.blocks := ?;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   f_rx_rlcmac_dl_block(dl_block, dl_fn);</span><br><span style="color: hsl(0, 100%, 40%);">-  if (not match(dl_block, dl_template)) {</span><br><span style="color: hsl(0, 100%, 40%);">-         dl_template := tr_RLCMAC_DATA_EGPRS;</span><br><span style="color: hsl(0, 100%, 40%);">-            dl_template.data_egprs.blocks := ?;</span><br><span style="color: hsl(0, 100%, 40%);">-             if (not match(dl_block, dl_template)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 setverdict(fail, "Failed to match Packet data: ", dl_block, " vs ", dl_template);</span><br><span style="color: hsl(0, 100%, 40%);">-                   mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-               is_egprs := true;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (is_egprs) {</span><br><span style="color: hsl(0, 100%, 40%);">-         f_rlcmac_dl_block_verify_data_egprs(dl_block, dl_fn, ack_fn, data, exp_bsn, exp_cs);</span><br><span style="color: hsl(0, 100%, 40%);">-    } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                f_rlcmac_dl_block_verify_data_gprs(dl_block, dl_fn, ack_fn, data, exp_bsn, exp_cs);</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-testcase TC_pcuif_suspend() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">- var octetstring ra_id := enc_RoutingAreaIdentification(mp_gb_cfg.cell_id.ra_id);</span><br><span style="color: hsl(0, 100%, 40%);">-        var GprsTlli tlli := 'FFFFFFFF'O;</span><br><span style="color: hsl(0, 100%, 40%);">-       timer T;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* Initialize NS/BSSGP side */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_init_bssgp();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_init_raw(testcasename());</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Establish BSSGP connection to the PCU */</span><br><span style="color: hsl(0, 100%, 40%);">-     f_bssgp_establish();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    BTS.send(ts_PCUIF_SUSP_REQ(0, tlli, ra_id, 0));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- T.start(2.0);</span><br><span style="color: hsl(0, 100%, 40%);">-   alt {</span><br><span style="color: hsl(0, 100%, 40%);">-   [] BSSGP_SIG[0].receive(tr_BSSGP_SUSPEND(tlli, mp_gb_cfg.cell_id.ra_id)) {</span><br><span style="color: hsl(0, 100%, 40%);">-              setverdict(pass);</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-       [] T.timeout {</span><br><span style="color: hsl(0, 100%, 40%);">-          setverdict(fail, "Timeout waiting for BSSGP SUSPEND");</span><br><span style="color: hsl(0, 100%, 40%);">-                }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Test of correct Timing Advance at the time of TBF establishment</span><br><span style="color: hsl(0, 100%, 40%);">- * (derived from timing offset of the Access Burst). */</span><br><span style="color: hsl(0, 100%, 40%);">-testcase TC_ta_rach_imm_ass() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-      var GsmRrMessage rr_msg;</span><br><span style="color: hsl(0, 100%, 40%);">-        var boolean ok;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_init_raw(testcasename());</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* We cannot send too many TBF requests in a short time because</span><br><span style="color: hsl(0, 100%, 40%);">-  * at some point the PCU will fail to allocate a new TBF. */</span><br><span style="color: hsl(0, 100%, 40%);">-    for (var TimingAdvance ta := 0; ta < 64; ta := ta + 16) {</span><br><span style="color: hsl(0, 100%, 40%);">-            /* Establish an Uplink TBF (send RACH.ind with current TA) */</span><br><span style="color: hsl(0, 100%, 40%);">-           ok := f_establish_tbf(rr_msg, bts_nr := 0, ta := ta);</span><br><span style="color: hsl(0, 100%, 40%);">-           if (not ok) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   setverdict(fail, "Failed to establish an Uplink TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-                        mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               /* Make sure Timing Advance IE matches out expectations */</span><br><span style="color: hsl(0, 100%, 40%);">-              if (match(rr_msg, tr_IMM_TBF_ASS(dl := false, ta := ta))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     setverdict(pass);</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Verify Timing Advance value(s) indicated during the packet Downlink assignment</span><br><span style="color: hsl(0, 100%, 40%);">- * procedure as per 3GPP TS 44.018, section 3.5.3. There seems to be a bug in the</span><br><span style="color: hsl(0, 100%, 40%);">- * IUT that causes it to send an unreasonable Timing Advance value > 0 despite</span><br><span style="color: hsl(0, 100%, 40%);">- * no active TBF exists at the moment of establishment (idle mode). */</span><br><span style="color: hsl(0, 100%, 40%);">-testcase TC_ta_idle_dl_tbf_ass() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-   var OCT4 tlli := f_rnd_octstring(4);</span><br><span style="color: hsl(0, 100%, 40%);">-    var GsmRrMessage rr_imm_ass;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /* Initialize NS/BSSGP side */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_init_bssgp();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_init_raw(testcasename());</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Establish BSSGP connection to the PCU */</span><br><span style="color: hsl(0, 100%, 40%);">-     f_bssgp_establish();</span><br><span style="color: hsl(0, 100%, 40%);">-    f_bssgp_client_llgmm_assign('FFFFFFFF'O, tlli);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* SGSN sends some DL data, PCU will initiate Packet Downlink</span><br><span style="color: hsl(0, 100%, 40%);">-    * Assignment on CCCH (PCH). We don't care about the payload. */</span><br><span style="color: hsl(0, 100%, 40%);">-    BSSGP[0].send(ts_BSSGP_DL_UD(tlli, f_rnd_octstring(10)));</span><br><span style="color: hsl(0, 100%, 40%);">-       f_pcuif_rx_pch_imm_tbf_ass(rr_imm_ass); // TODO: match by TLLI!</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Make sure that Timing Advance is 0 (the actual value is not known yet).</span><br><span style="color: hsl(0, 100%, 40%);">-       * As per 3GPP S 44.018, section 3.5.3.1.2, the network *shall* initiate</span><br><span style="color: hsl(0, 100%, 40%);">-         * the procedures defined in 3GPP TS 44.060 or use the polling mechanism. */</span><br><span style="color: hsl(0, 100%, 40%);">-    if (not match(rr_imm_ass, tr_IMM_TBF_ASS(ta := 0))) {</span><br><span style="color: hsl(0, 100%, 40%);">-           setverdict(fail, "Timing Advance value doesn't match");</span><br><span style="color: hsl(0, 100%, 40%);">-           mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Verify that the PCU generates valid PTCCH/D messages</span><br><span style="color: hsl(0, 100%, 40%);">- * while neither Uplink nor Downlink TBF is established. */</span><br><span style="color: hsl(0, 100%, 40%);">-testcase TC_ta_ptcch_idle() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-       var PTCCHDownlinkMsg ptcch_msg;</span><br><span style="color: hsl(0, 100%, 40%);">- var PCUIF_Message pcu_msg;</span><br><span style="color: hsl(0, 100%, 40%);">-      timer T;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_init_raw(testcasename());</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Sent an RTS.req for PTCCH/D */</span><br><span style="color: hsl(0, 100%, 40%);">-       BTS.send(ts_PCUIF_RTS_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,</span><br><span style="color: hsl(0, 100%, 40%);">-                           sapi := PCU_IF_SAPI_PTCCH, fn := 0,</span><br><span style="color: hsl(0, 100%, 40%);">-                             arfcn := 871, block_nr := 0));</span><br><span style="color: hsl(0, 100%, 40%);">-        T.start(5.0);</span><br><span style="color: hsl(0, 100%, 40%);">-   alt {</span><br><span style="color: hsl(0, 100%, 40%);">-   [] BTS.receive(tr_PCUIF_DATA_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,</span><br><span style="color: hsl(0, 100%, 40%);">-                                   sapi := PCU_IF_SAPI_PTCCH)) -> value pcu_msg {</span><br><span style="color: hsl(0, 100%, 40%);">-              log("Rx DATA.req message: ", pcu_msg);</span><br><span style="color: hsl(0, 100%, 40%);">-                setverdict(pass);</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-       [] BTS.receive(PCUIF_Message:?) { repeat; }</span><br><span style="color: hsl(0, 100%, 40%);">-     [] T.timeout {</span><br><span style="color: hsl(0, 100%, 40%);">-          setverdict(fail, "Timeout waiting for a PTCCH/D block");</span><br><span style="color: hsl(0, 100%, 40%);">-              mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       ptcch_msg := dec_PTCCHDownlinkMsg(pcu_msg.u.data_req.data);</span><br><span style="color: hsl(0, 100%, 40%);">-     log("Decoded PTCCH/D message: ", ptcch_msg);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  /* Make sure the message is encoded correctly</span><br><span style="color: hsl(0, 100%, 40%);">-    * TODO: do we expect all TA values to be equal '1111111'B? */</span><br><span style="color: hsl(0, 100%, 40%);">-  if (not match(ptcch_msg, tr_PTCCHDownlinkMsg)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                setverdict(fail, "Malformed PTCCH/D message");</span><br><span style="color: hsl(0, 100%, 40%);">-                mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Test of correct Timing Advance during an active Uplink TBF.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * Unlike the circuit-switched domain, Uplink transmissions on PDCH time-slots</span><br><span style="color: hsl(0, 100%, 40%);">- * are not continuous and there can be long time gaps between them. This happens</span><br><span style="color: hsl(0, 100%, 40%);">- * due to a bursty nature of packet data. The actual Timing Advance of a MS may</span><br><span style="color: hsl(0, 100%, 40%);">- * significantly change between such rare Uplink transmissions, so GPRS introduces</span><br><span style="color: hsl(0, 100%, 40%);">- * additional mechanisms to control Timing Advance, and thus reduce interference</span><br><span style="color: hsl(0, 100%, 40%);">- * between neighboring TDMA time-slots.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * At the moment of Uplink TBF establishment, initial Timing Advance is measured</span><br><span style="color: hsl(0, 100%, 40%);">- * from ToA (Timing of Arrival) of an Access Burst. This is covered by another</span><br><span style="color: hsl(0, 100%, 40%);">- * test case - TC_ta_rach_imm_ass. In response to that Access Burst the network</span><br><span style="color: hsl(0, 100%, 40%);">- * sends Immediate Assignment on AGCH, which _may_ contain Timing Advance Index</span><br><span style="color: hsl(0, 100%, 40%);">- * among with the initial Timing Advance value. And here PTCCH comes to play.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * PTCCH is a unidirectional channel on which the network can instruct a sub-set</span><br><span style="color: hsl(0, 100%, 40%);">- * of 16 MS (whether TBFs are active or not) to adjust their Timing Advance</span><br><span style="color: hsl(0, 100%, 40%);">- * continuously. To ensure continuous measurements of the signal propagation</span><br><span style="color: hsl(0, 100%, 40%);">- * delay, the MSs shall transmit Access Bursts on Uplink (PTCCH/U) on sub-slots</span><br><span style="color: hsl(0, 100%, 40%);">- * defined by an assigned Timing Advance Index (see 3GPP TS 45.002).</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * The purpose of this test case is to verify the assignment of Timing Advance</span><br><span style="color: hsl(0, 100%, 40%);">- * Index, and the process of Timing Advance notification on PTCCH/D. The MTC</span><br><span style="color: hsl(0, 100%, 40%);">- * first establishes several Uplink TBFs, but does not transmit any Uplink</span><br><span style="color: hsl(0, 100%, 40%);">- * blocks on them. During 4 TDMA multi-frame periods the MTC is sending RACH</span><br><span style="color: hsl(0, 100%, 40%);">- * indications to the PCU, checking the correctness of two received PTCCH/D</span><br><span style="color: hsl(0, 100%, 40%);">- * messages (period of PTCCH/D is two multi-frames).</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* List of ToA values for Access Bursts to be sent on PTCCH/U,</span><br><span style="color: hsl(0, 100%, 40%);">- * each ToA (Timing of Arrival) value is in units of 1/4 of</span><br><span style="color: hsl(0, 100%, 40%);">- * a symbol (i.e. 1 symbol is 4 QTA units). */</span><br><span style="color: hsl(0, 100%, 40%);">-type record length(16) of int16_t PTCCH_TAI_ToA_MAP;</span><br><span style="color: hsl(0, 100%, 40%);">-const PTCCH_TAI_ToA_MAP ptcch_toa_map_def := {</span><br><span style="color: hsl(0, 100%, 40%);">-    0, 0, 0, 0,</span><br><span style="color: hsl(0, 100%, 40%);">-     0, 0, 0, 0,</span><br><span style="color: hsl(0, 100%, 40%);">-     0, 0, 0, 0,</span><br><span style="color: hsl(0, 100%, 40%);">-     0, 0, 0, 0</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-private altstep as_ta_ptcch(uint8_t bts_nr := 0, uint8_t trx_nr := 0, uint8_t ts_nr := 7,</span><br><span style="color: hsl(0, 100%, 40%);">-                       in PTCCH_TAI_ToA_MAP toa_map := ptcch_toa_map_def)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">- var RAW_PCU_Event event;</span><br><span style="color: hsl(0, 100%, 40%);">-        var integer ss;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Send Access Bursts on PTCCH/U for every TA Index */</span><br><span style="color: hsl(0, 100%, 40%);">-  [] BTS.receive(tr_RAW_PCU_EV(TDMA_EV_PTCCH_UL_BURST)) -> value event {</span><br><span style="color: hsl(0, 100%, 40%);">-               ss := f_tdma_ptcch_fn2ss(event.data.tdma_fn);</span><br><span style="color: hsl(0, 100%, 40%);">-           if (ss < 0) { mtc.stop; } /* Shall not happen */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-             log("Sending an Access Burst on PTCCH/U",</span><br><span style="color: hsl(0, 100%, 40%);">-                 ", sub-slot=", ss, " (TAI)",</span><br><span style="color: hsl(0, 100%, 40%);">-                ", fn=", event.data.tdma_fn,</span><br><span style="color: hsl(0, 100%, 40%);">-                  ", ToA=", toa_map[ss], " (QTA)");</span><br><span style="color: hsl(0, 100%, 40%);">-               /* TODO: do we care about RA and burst format? */</span><br><span style="color: hsl(0, 100%, 40%);">-               BTS.send(ts_PCUIF_RACH_IND(bts_nr, trx_nr, ts_nr,</span><br><span style="color: hsl(0, 100%, 40%);">-                                          ra := oct2int('3A'O),</span><br><span style="color: hsl(0, 100%, 40%);">-                                           is_11bit := 0,</span><br><span style="color: hsl(0, 100%, 40%);">-                                          burst_type := BURST_TYPE_0,</span><br><span style="color: hsl(0, 100%, 40%);">-                                     fn := event.data.tdma_fn,</span><br><span style="color: hsl(0, 100%, 40%);">-                                       arfcn := 871,</span><br><span style="color: hsl(0, 100%, 40%);">-                                           qta := toa_map[ss],</span><br><span style="color: hsl(0, 100%, 40%);">-                                     sapi := PCU_IF_SAPI_PTCCH));</span><br><span style="color: hsl(0, 100%, 40%);">-         repeat;</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_TC_ta_ptcch_ul_multi_tbf(in PTCCH_TAI_ToA_MAP ptcch_toa_map,</span><br><span style="color: hsl(0, 100%, 40%);">-                                           template PTCCHDownlinkMsg t_ta_msg)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-        var PTCCHDownlinkMsg ta_msg;</span><br><span style="color: hsl(0, 100%, 40%);">-    var PCUIF_Message pcu_msg;</span><br><span style="color: hsl(0, 100%, 40%);">-      timer T;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* First, send an RTS.req for the upcoming PTCCH/D block */</span><br><span style="color: hsl(0, 100%, 40%);">-     BTS.send(ts_PCUIF_RTS_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,</span><br><span style="color: hsl(0, 100%, 40%);">-                           sapi := PCU_IF_SAPI_PTCCH, fn := 0,</span><br><span style="color: hsl(0, 100%, 40%);">-                             arfcn := 871, block_nr := 0));</span><br><span style="color: hsl(0, 100%, 40%);">-        T.start(2.0);</span><br><span style="color: hsl(0, 100%, 40%);">-   alt {</span><br><span style="color: hsl(0, 100%, 40%);">-   /* Keep sending of Access Bursts during two multi-frames (period of PTCCH/D)</span><br><span style="color: hsl(0, 100%, 40%);">-     * with increasing ToA (Timing of Arrival) values: 0, 7, 14, 28, 35... */</span><br><span style="color: hsl(0, 100%, 40%);">-       [] as_ta_ptcch(bts_nr := 0, trx_nr := 0, ts_nr := 7, toa_map := ptcch_toa_map);</span><br><span style="color: hsl(0, 100%, 40%);">- /* In the end of 2nd multi-frame we should receive a PTCCH/D block */</span><br><span style="color: hsl(0, 100%, 40%);">-   [] BTS.receive(tr_PCUIF_DATA_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,</span><br><span style="color: hsl(0, 100%, 40%);">-                                   sapi := PCU_IF_SAPI_PTCCH)) -> value pcu_msg {</span><br><span style="color: hsl(0, 100%, 40%);">-              ta_msg := dec_PTCCHDownlinkMsg(pcu_msg.u.data_req.data);</span><br><span style="color: hsl(0, 100%, 40%);">-                log("Rx PTCCH/D message: ", ta_msg);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          /* Make sure Timing Advance values match our expectations */</span><br><span style="color: hsl(0, 100%, 40%);">-            if (match(ta_msg, t_ta_msg)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  setverdict(pass);</span><br><span style="color: hsl(0, 100%, 40%);">-               } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        setverdict(fail, "PTCCH/D message does not match: ", t_ta_msg);</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-       [] BTS.receive { repeat; }</span><br><span style="color: hsl(0, 100%, 40%);">-      [] T.timeout {</span><br><span style="color: hsl(0, 100%, 40%);">-          setverdict(fail, "Timeout waiting for a PTCCH/D block");</span><br><span style="color: hsl(0, 100%, 40%);">-              mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-testcase TC_ta_ptcch_ul_multi_tbf() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">- var template PacketUlAssign t_ul_tbf_ass;</span><br><span style="color: hsl(0, 100%, 40%);">-       var PacketUlAssign ul_tbf_ass[7];</span><br><span style="color: hsl(0, 100%, 40%);">-       var GsmRrMessage rr_msg[7];</span><br><span style="color: hsl(0, 100%, 40%);">-     var boolean ok;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_init_raw(testcasename());</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Enable forwarding of PTCCH/U TDMA events to us */</span><br><span style="color: hsl(0, 100%, 40%);">-    BTS.send(ts_RAW_PCU_CMD(TDMA_CMD_ENABLE_PTCCH_UL_FWD));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Establish 7 Uplink TBFs (USF flag is 3 bits long, '111'B is reserved) */</span><br><span style="color: hsl(0, 100%, 40%);">-     for (var integer i := 0; i < 7; i := i + 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                ok := f_establish_tbf(rr_msg[i], ta := 0);</span><br><span style="color: hsl(0, 100%, 40%);">-              if (not ok) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   setverdict(fail, "Failed to establish an Uplink TBF #", i);</span><br><span style="color: hsl(0, 100%, 40%);">-                   mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               /* Make sure we received an UL TBF Assignment */</span><br><span style="color: hsl(0, 100%, 40%);">-                if (match(rr_msg[i], tr_IMM_TBF_ASS(dl := false, rest := tr_IaRestOctets_ULAss(?)))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  ul_tbf_ass[i] := rr_msg[i].payload.imm_ass.rest_octets.hh.pa.uldl.ass.ul;</span><br><span style="color: hsl(0, 100%, 40%);">-                       log("Rx Uplink TBF assignment for #", i, ": ", ul_tbf_ass[i]);</span><br><span style="color: hsl(0, 100%, 40%);">-              } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        setverdict(fail, "Failed to match UL TBF Assignment for #", i);</span><br><span style="color: hsl(0, 100%, 40%);">-                       mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               /* We expect incremental TFI/USF assignment (dynamic allocation) */</span><br><span style="color: hsl(0, 100%, 40%);">-             t_ul_tbf_ass := tr_PacketUlDynAssign(tfi := i, usf := i);</span><br><span style="color: hsl(0, 100%, 40%);">-               if (not match(ul_tbf_ass[i], t_ul_tbf_ass)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   setverdict(fail, "Failed to match Packet Uplink Assignment for #", i);</span><br><span style="color: hsl(0, 100%, 40%);">-                        mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               /* We also expect Timing Advance Index to be a part of the assignment */</span><br><span style="color: hsl(0, 100%, 40%);">-                if (ul_tbf_ass[i].dynamic.ta_index != i) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      setverdict(fail, "Failed to match Timing Advance Index for #", i);</span><br><span style="color: hsl(0, 100%, 40%);">-                    /* Keep going, the current OsmoPCU does not assign TA Index */</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Prepare a list of ToA values for Access Bursts to be sent on PTCCH/U */</span><br><span style="color: hsl(0, 100%, 40%);">-      var PTCCH_TAI_ToA_MAP toa_map := ptcch_toa_map_def;</span><br><span style="color: hsl(0, 100%, 40%);">-     for (var integer i := 0; i < 7; i := i + 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                /* ToA in units of 1/4 of a symbol */</span><br><span style="color: hsl(0, 100%, 40%);">-           toa_map[i] := (i + 1) * 7 * 4;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Now we have all 7 TBFs established in one-phase access mode,</span><br><span style="color: hsl(0, 100%, 40%);">-  * however we will not be sending any data on them. Instead, we</span><br><span style="color: hsl(0, 100%, 40%);">-  * will be sending RACH.ind on PTCCH/U during 4 multi-frame</span><br><span style="color: hsl(0, 100%, 40%);">-      * periods (TAI 0..8), and then will check two PTCCH/D blocks.</span><br><span style="color: hsl(0, 100%, 40%);">-   *</span><br><span style="color: hsl(0, 100%, 40%);">-       * Why not 4 TBFs at once? Because Uplink is delayed by 3 TDMA</span><br><span style="color: hsl(0, 100%, 40%);">-   * time-slots, so at the moment of scheduling a PTCCH/D block</span><br><span style="color: hsl(0, 100%, 40%);">-    * the PCU has odd number of PTCCH/U Access Bursts received. */</span><br><span style="color: hsl(0, 100%, 40%);">- f_TC_ta_ptcch_ul_multi_tbf(toa_map, tr_PTCCHDownlinkMsg(</span><br><span style="color: hsl(0, 100%, 40%);">-                tai0_ta :=  7, tai1_ta := 14, tai2_ta := 21,</span><br><span style="color: hsl(0, 100%, 40%);">-            /* Other values are not known (yet) */</span><br><span style="color: hsl(0, 100%, 40%);">-          tai3_ta := ?));</span><br><span style="color: hsl(0, 100%, 40%);">- f_TC_ta_ptcch_ul_multi_tbf(toa_map, tr_PTCCHDownlinkMsg(</span><br><span style="color: hsl(0, 100%, 40%);">-                tai0_ta :=  7, tai1_ta := 14, tai2_ta := 21,</span><br><span style="color: hsl(0, 100%, 40%);">-            tai3_ta := 28, tai4_ta := 35, tai5_ta := 42,</span><br><span style="color: hsl(0, 100%, 40%);">-            /* Other values are out of our interest */</span><br><span style="color: hsl(0, 100%, 40%);">-              tai6_ta := ?));</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Default link quality adaptation (Coding Scheme) ranges (inclusive).</span><br><span style="color: hsl(0, 100%, 40%);">- * OsmoPCU (VTY): cs link-quality-ranges cs1 6 cs2 5 8 cs3 7 13 cs4 12</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * NOTE: the ranges are intentionally overlapping because OsmoPCU</span><br><span style="color: hsl(0, 100%, 40%);">- * does not change CS/MCS on the range borders (5-6, 7-8, 12-13). */</span><br><span style="color: hsl(0, 100%, 40%);">-private template integer CS1_lqual_dB_range := (-infinity .. 6);</span><br><span style="color: hsl(0, 100%, 40%);">-private template integer CS2_lqual_dB_range := (5 .. 8);</span><br><span style="color: hsl(0, 100%, 40%);">-private template integer CS3_lqual_dB_range := (7 .. 13);</span><br><span style="color: hsl(0, 100%, 40%);">-private template integer CS4_lqual_dB_range := (12 .. infinity);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-testcase TC_cs_lqual_ul_tbf() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-     var GsmRrMessage rr_imm_ass;</span><br><span style="color: hsl(0, 100%, 40%);">-    var PacketUlAssign ul_tbf_ass;</span><br><span style="color: hsl(0, 100%, 40%);">-  var RlcmacDlBlock dl_block;</span><br><span style="color: hsl(0, 100%, 40%);">-     var PCUIF_Message pcu_msg;</span><br><span style="color: hsl(0, 100%, 40%);">-      var octetstring data;</span><br><span style="color: hsl(0, 100%, 40%);">-   var boolean ok;</span><br><span style="color: hsl(0, 100%, 40%);">- var uint32_t unused_fn;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_init_raw(testcasename());</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     f_pcuvty_set_allowed_cs_mcs();</span><br><span style="color: hsl(0, 100%, 40%);">-  f_pcuvty_set_link_quality_ranges();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Establish an Uplink TBF */</span><br><span style="color: hsl(0, 100%, 40%);">-   ok := f_establish_tbf(rr_imm_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (not ok) {</span><br><span style="color: hsl(0, 100%, 40%);">-           setverdict(fail, "Failed to establish TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       ok := f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (not ok) {</span><br><span style="color: hsl(0, 100%, 40%);">-           setverdict(fail, "Immediate Assignment not an Uplink TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-           mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       var template (value) RlcmacUlBlock ul_data := t_RLCMAC_UL_DATA(</span><br><span style="color: hsl(0, 100%, 40%);">-         tfi := ul_tbf_ass.dynamic.tfi_assignment,</span><br><span style="color: hsl(0, 100%, 40%);">-               cv := 15, /* 16 UL blocks to be sent (to be overridden in loop) */</span><br><span style="color: hsl(0, 100%, 40%);">-              bsn := 0, /* TODO: what should be here? */</span><br><span style="color: hsl(0, 100%, 40%);">-              blocks := { /* To be generated in loop */ });</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* HACK: patch missing TLLI; otherwise OsmoPCU rejects DATA.req */</span><br><span style="color: hsl(0, 100%, 40%);">-      ul_data.data.tlli := '00000001'O;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* The actual / old link quality values. We need to keep track of the old</span><br><span style="color: hsl(0, 100%, 40%);">-        * (basically previous) link quality value, because OsmoPCU actually</span><br><span style="color: hsl(0, 100%, 40%);">-     * changes the coding scheme if not only the actual, but also the old</span><br><span style="color: hsl(0, 100%, 40%);">-    * value leaves the current link quality range (window). */</span><br><span style="color: hsl(0, 100%, 40%);">-     var integer lqual := 0;</span><br><span style="color: hsl(0, 100%, 40%);">- var integer lqual_old;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  /* 16 UL blocks (0 .. 15 dB, step = 1 dB) */</span><br><span style="color: hsl(0, 100%, 40%);">-    for (var integer i := 0; i < 16; i := i + 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-               /* Prepare a new UL block (CV, random payload) */</span><br><span style="color: hsl(0, 100%, 40%);">-               ul_data.data.mac_hdr.countdown := (15 - i);</span><br><span style="color: hsl(0, 100%, 40%);">-             ul_data.data.blocks := { valueof(t_RLCMAC_LLCBLOCK(f_rnd_octstring(10))) };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-             /* Update the old / actual link quality */</span><br><span style="color: hsl(0, 100%, 40%);">-              lqual_old := lqual;</span><br><span style="color: hsl(0, 100%, 40%);">-             lqual := i;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-             /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */</span><br><span style="color: hsl(0, 100%, 40%);">-                log("Sending DATA.ind with link quality (dB): ", lqual);</span><br><span style="color: hsl(0, 100%, 40%);">-              f_tx_rlcmac_ul_block(ul_data, lqual * 10);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-              /* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */</span><br><span style="color: hsl(0, 100%, 40%);">-         f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-         log("Rx Packet Uplink ACK / NACK with Channel Coding Command: ",</span><br><span style="color: hsl(0, 100%, 40%);">-                  dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            /* Match the received Channel Coding Command. Since we are increasing</span><br><span style="color: hsl(0, 100%, 40%);">-            * the link quality value on each iteration and not decreasing, there</span><br><span style="color: hsl(0, 100%, 40%);">-            * is no need to check the both old and current link quality values. */</span><br><span style="color: hsl(0, 100%, 40%);">-         var template ChCodingCommand ch_coding;</span><br><span style="color: hsl(0, 100%, 40%);">-         select (lqual_old) {</span><br><span style="color: hsl(0, 100%, 40%);">-            case (CS1_lqual_dB_range) { ch_coding := CH_CODING_CS1; }</span><br><span style="color: hsl(0, 100%, 40%);">-               case (CS2_lqual_dB_range) { ch_coding := CH_CODING_CS2; }</span><br><span style="color: hsl(0, 100%, 40%);">-               case (CS3_lqual_dB_range) { ch_coding := CH_CODING_CS3; }</span><br><span style="color: hsl(0, 100%, 40%);">-               case (CS4_lqual_dB_range) { ch_coding := CH_CODING_CS4; }</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               if (not match(dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd, ch_coding)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     setverdict(fail, "Channel Coding does not match our expectations: ", ch_coding);</span><br><span style="color: hsl(0, 100%, 40%);">-              } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        setverdict(pass);</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Test the max UL CS set by VTY works fine */</span><br><span style="color: hsl(0, 100%, 40%);">-testcase TC_cs_initial_ul() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-   var GsmRrMessage rr_imm_ass;</span><br><span style="color: hsl(0, 100%, 40%);">-    var PacketUlAssign ul_tbf_ass;</span><br><span style="color: hsl(0, 100%, 40%);">-  var RlcmacDlBlock dl_block;</span><br><span style="color: hsl(0, 100%, 40%);">-     var boolean ok;</span><br><span style="color: hsl(0, 100%, 40%);">- var integer lqual_cb;</span><br><span style="color: hsl(0, 100%, 40%);">-   var ChCodingCommand last_ch_coding;</span><br><span style="color: hsl(0, 100%, 40%);">-     var uint32_t unused_fn;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_init_raw(testcasename());</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Set initial UL CS to 3 */</span><br><span style="color: hsl(0, 100%, 40%);">-    g_cs_initial_ul := 3;</span><br><span style="color: hsl(0, 100%, 40%);">-   f_pcuvty_set_allowed_cs_mcs();</span><br><span style="color: hsl(0, 100%, 40%);">-  f_pcuvty_set_link_quality_ranges();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Take lqual (dB->cB) so that we stay in that CS */</span><br><span style="color: hsl(0, 100%, 40%);">- lqual_cb := g_cs_lqual_ranges[2].low * 10;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* Establish an Uplink TBF */</span><br><span style="color: hsl(0, 100%, 40%);">-   ok := f_establish_tbf(rr_imm_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (not ok) {</span><br><span style="color: hsl(0, 100%, 40%);">-           setverdict(fail, "Failed to establish TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       ok := f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (not ok) {</span><br><span style="color: hsl(0, 100%, 40%);">-           setverdict(fail, "Immediate Assignment not an Uplink TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-           mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       var template (value) RlcmacUlBlock ul_data := t_RLCMAC_UL_DATA(</span><br><span style="color: hsl(0, 100%, 40%);">-         tfi := ul_tbf_ass.dynamic.tfi_assignment,</span><br><span style="color: hsl(0, 100%, 40%);">-               cv := 3, /* 8 UL blocks to be sent (to be overridden in loop) */</span><br><span style="color: hsl(0, 100%, 40%);">-                bsn := 0, /* TODO: what should be here? */</span><br><span style="color: hsl(0, 100%, 40%);">-              blocks := { /* To be generated in loop */ });</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* HACK: patch missing TLLI; otherwise OsmoPCU rejects DATA.req */</span><br><span style="color: hsl(0, 100%, 40%);">-      ul_data.data.tlli := '00000001'O;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* 3 UL blocks, check we are in same initial CS: */</span><br><span style="color: hsl(0, 100%, 40%);">-     for (var integer i := 0; i < 3; i := i + 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                /* Prepare a new UL block (CV, random payload) */</span><br><span style="color: hsl(0, 100%, 40%);">-               ul_data.data.mac_hdr.countdown := (7 - i);</span><br><span style="color: hsl(0, 100%, 40%);">-              ul_data.data.blocks := { valueof(t_RLCMAC_LLCBLOCK(f_rnd_octstring(10))) };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-             /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */</span><br><span style="color: hsl(0, 100%, 40%);">-                f_tx_rlcmac_ul_block(ul_data, lqual_cb);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                /* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */</span><br><span style="color: hsl(0, 100%, 40%);">-         f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);</span><br><span style="color: hsl(0, 100%, 40%);">-         last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (last_ch_coding != CH_CODING_CS3) {</span><br><span style="color: hsl(0, 100%, 40%);">-          setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       setverdict(pass);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Remaining UL blocks are used to make sure regardless of initial</span><br><span style="color: hsl(0, 100%, 40%);">-      /* lqual, we can go lower at any time */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* 5 UL blocks, check we are in same initial CS: */</span><br><span style="color: hsl(0, 100%, 40%);">-     for (var integer i := 3; i < 8; i := i + 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                /* Prepare a new UL block (CV, random payload) */</span><br><span style="color: hsl(0, 100%, 40%);">-               ul_data.data.mac_hdr.countdown := (7 - i);</span><br><span style="color: hsl(0, 100%, 40%);">-              ul_data.data.blocks := { valueof(t_RLCMAC_LLCBLOCK(f_rnd_octstring(10))) };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-             /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */</span><br><span style="color: hsl(0, 100%, 40%);">-                f_tx_rlcmac_ul_block(ul_data, 0); /* 0 dB, make sure we downgrade CS */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-         /* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */</span><br><span style="color: hsl(0, 100%, 40%);">-         f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-         last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (last_ch_coding != CH_CODING_CS1) {</span><br><span style="color: hsl(0, 100%, 40%);">-          setverdict(fail, "Channel Coding does not match our expectations (CS-1): ", last_ch_coding);</span><br><span style="color: hsl(0, 100%, 40%);">-  } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                setverdict(pass);</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Test the max UL CS set by VTY works fine */</span><br><span style="color: hsl(0, 100%, 40%);">-testcase TC_cs_max_ul() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-       var GsmRrMessage rr_imm_ass;</span><br><span style="color: hsl(0, 100%, 40%);">-    var PacketUlAssign ul_tbf_ass;</span><br><span style="color: hsl(0, 100%, 40%);">-  var RlcmacDlBlock dl_block;</span><br><span style="color: hsl(0, 100%, 40%);">-     var boolean ok;</span><br><span style="color: hsl(0, 100%, 40%);">- var ChCodingCommand last_ch_coding;</span><br><span style="color: hsl(0, 100%, 40%);">-     var uint32_t unused_fn;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_init_raw(testcasename());</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Set maximum allowed UL CS to 3 */</span><br><span style="color: hsl(0, 100%, 40%);">-    g_cs_max_ul := 3;</span><br><span style="color: hsl(0, 100%, 40%);">-       f_pcuvty_set_allowed_cs_mcs();</span><br><span style="color: hsl(0, 100%, 40%);">-  f_pcuvty_set_link_quality_ranges();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Establish an Uplink TBF */</span><br><span style="color: hsl(0, 100%, 40%);">-   ok := f_establish_tbf(rr_imm_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (not ok) {</span><br><span style="color: hsl(0, 100%, 40%);">-           setverdict(fail, "Failed to establish TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       ok := f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (not ok) {</span><br><span style="color: hsl(0, 100%, 40%);">-           setverdict(fail, "Immediate Assignment not an Uplink TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-           mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       var template (value) RlcmacUlBlock ul_data := t_RLCMAC_UL_DATA(</span><br><span style="color: hsl(0, 100%, 40%);">-         tfi := ul_tbf_ass.dynamic.tfi_assignment,</span><br><span style="color: hsl(0, 100%, 40%);">-               cv := 15, /* 16 UL blocks to be sent (to be overridden in loop) */</span><br><span style="color: hsl(0, 100%, 40%);">-              bsn := 0, /* TODO: what should be here? */</span><br><span style="color: hsl(0, 100%, 40%);">-              blocks := { /* To be generated in loop */ });</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* HACK: patch missing TLLI; otherwise OsmoPCU rejects DATA.req */</span><br><span style="color: hsl(0, 100%, 40%);">-      ul_data.data.tlli := '00000001'O;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* 16 UL blocks */</span><br><span style="color: hsl(0, 100%, 40%);">-      for (var integer i := 0; i < 16; i := i + 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-               /* Prepare a new UL block (CV, random payload) */</span><br><span style="color: hsl(0, 100%, 40%);">-               ul_data.data.mac_hdr.countdown := (15 - i);</span><br><span style="color: hsl(0, 100%, 40%);">-             ul_data.data.blocks := { valueof(t_RLCMAC_LLCBLOCK(f_rnd_octstring(10))) };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-             /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */</span><br><span style="color: hsl(0, 100%, 40%);">-                f_tx_rlcmac_ul_block(ul_data, 40*10); /* 40 dB */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               /* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */</span><br><span style="color: hsl(0, 100%, 40%);">-         f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-         last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (last_ch_coding != CH_CODING_CS3) {</span><br><span style="color: hsl(0, 100%, 40%);">-          setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);</span><br><span style="color: hsl(0, 100%, 40%);">-  } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                setverdict(pass);</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Verify PCU drops TBF after some time of inactivity. */</span><br><span style="color: hsl(0, 100%, 40%);">-testcase TC_t3169() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-        var PCUIF_info_ind info_ind;</span><br><span style="color: hsl(0, 100%, 40%);">-    var GsmRrMessage rr_imm_ass;</span><br><span style="color: hsl(0, 100%, 40%);">-    var PacketUlAssign ul_tbf_ass;</span><br><span style="color: hsl(0, 100%, 40%);">-  var RlcmacDlBlock dl_block;</span><br><span style="color: hsl(0, 100%, 40%);">-     var PCUIF_Message pcu_msg;</span><br><span style="color: hsl(0, 100%, 40%);">-      var octetstring data;</span><br><span style="color: hsl(0, 100%, 40%);">-   var boolean ok;</span><br><span style="color: hsl(0, 100%, 40%);">- var uint32_t unused_fn;</span><br><span style="color: hsl(0, 100%, 40%);">- var OCT4 tlli := '00000001'O;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* Initialize NS/BSSGP side */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_init_bssgp();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- info_ind := valueof(ts_PCUIF_INFO_default);</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Set timer to 1 sec (default 5) to speedup test: */</span><br><span style="color: hsl(0, 100%, 40%);">-   info_ind.t3169 := 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_init_raw(testcasename(), info_ind);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* Establish BSSGP connection to the PCU */</span><br><span style="color: hsl(0, 100%, 40%);">-     f_bssgp_establish();</span><br><span style="color: hsl(0, 100%, 40%);">-    f_bssgp_client_llgmm_assign('FFFFFFFF'O, tlli);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Establish an Uplink TBF */</span><br><span style="color: hsl(0, 100%, 40%);">-   ok := f_establish_tbf(rr_imm_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (not ok) {</span><br><span style="color: hsl(0, 100%, 40%);">-           setverdict(fail, "Failed to establish TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       ok := f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (not ok) {</span><br><span style="color: hsl(0, 100%, 40%);">-           setverdict(fail, "Immediate Assignment not an Uplink TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-           mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Send one UL block and make sure it is ACKED fine */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_tx_rlcmac_ul_n_blocks(ul_tbf_ass, 1);</span><br><span style="color: hsl(0, 100%, 40%);">- f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);</span><br><span style="color: hsl(0, 100%, 40%);">- /* UL block should be received in SGSN */</span><br><span style="color: hsl(0, 100%, 40%);">-       BSSGP[0].receive(tr_BSSGP_UL_UD(tlli, mp_gb_cfg.cell_id));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* Wait until T3169 fires (plus 1 extra sec to make sure) */</span><br><span style="color: hsl(0, 100%, 40%);">-    f_sleep(int2float(info_ind.t3169) + 1.0);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Send an UL block once again, the TBF should be gone by now so no ACK */</span><br><span style="color: hsl(0, 100%, 40%);">-      f_tx_rlcmac_ul_n_blocks(ul_tbf_ass, 1);</span><br><span style="color: hsl(0, 100%, 40%);">- f_rx_rlcmac_dl_block_exp_dummy(dl_block);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Verify that a Downlink TBF can be assigned using PACCH shortly after the</span><br><span style="color: hsl(0, 100%, 40%);">- * release of prev DL TBF due to MS staying in PDCH for a while (T3192, in PCU</span><br><span style="color: hsl(0, 100%, 40%);">- * T3193) after DL TBF release */</span><br><span style="color: hsl(0, 100%, 40%);">-testcase TC_t3193() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-       var GsmRrMessage rr_imm_ass;</span><br><span style="color: hsl(0, 100%, 40%);">-    var PacketDlAssign dl_tbf_ass;</span><br><span style="color: hsl(0, 100%, 40%);">-  var RlcmacDlBlock dl_block;</span><br><span style="color: hsl(0, 100%, 40%);">-     var octetstring data := f_rnd_octstring(10);</span><br><span style="color: hsl(0, 100%, 40%);">-    var boolean ok;</span><br><span style="color: hsl(0, 100%, 40%);">- var uint32_t sched_fn;</span><br><span style="color: hsl(0, 100%, 40%);">-  var OCT4 tlli := '00000001'O;</span><br><span style="color: hsl(0, 100%, 40%);">-   var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Initialize NS/BSSGP side */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_init_bssgp();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_init_raw(testcasename());</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Establish BSSGP connection to the PCU */</span><br><span style="color: hsl(0, 100%, 40%);">-     f_bssgp_establish();</span><br><span style="color: hsl(0, 100%, 40%);">-    f_bssgp_client_llgmm_assign('FFFFFFFF'O, tlli);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* SGSN sends some DL data, PCU will page on CCCH (PCH) */</span><br><span style="color: hsl(0, 100%, 40%);">-      BSSGP[0].send(ts_BSSGP_DL_UD(tlli, data));</span><br><span style="color: hsl(0, 100%, 40%);">-      f_pcuif_rx_pch_imm_tbf_ass(rr_imm_ass);</span><br><span style="color: hsl(0, 100%, 40%);">- ok := f_imm_ass_verify_dl_tbf_ass(rr_imm_ass, dl_tbf_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (not ok) {</span><br><span style="color: hsl(0, 100%, 40%);">-           setverdict(fail, "Immediate Assignment not a Downlink TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */</span><br><span style="color: hsl(0, 100%, 40%);">-    f_sleep(X2002);</span><br><span style="color: hsl(0, 100%, 40%);">- f_rx_rlcmac_dl_block_exp_data(dl_block, sched_fn, data, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* ACK the DL block */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_acknackdesc_ack_block(ack_nack_desc, dl_block, '1'B);</span><br><span style="color: hsl(0, 100%, 40%);">- f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(f_rlcmac_dl_block_get_tfi(dl_block), ack_nack_desc), 0, sched_fn);</span><br><span style="color: hsl(0, 100%, 40%);">-   /* we are done with the DL-TBF here so far, let's clean up our local state: */</span><br><span style="color: hsl(0, 100%, 40%);">-      ack_nack_desc := valueof(t_AckNackDescription_init)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Now that final DL block is ACKED and TBF is released, T3193 in PCU</span><br><span style="color: hsl(0, 100%, 40%);">-      (T3192 in MS) was started and until it fires the MS will be abailable</span><br><span style="color: hsl(0, 100%, 40%);">-           on PDCH in case new data arrives from SGSN. Let's verify it: */</span><br><span style="color: hsl(0, 100%, 40%);">-  BSSGP[0].send(ts_BSSGP_DL_UD(tlli, data));</span><br><span style="color: hsl(0, 100%, 40%);">-      f_rx_rlcmac_dl_block_exp_pkt_ass(dl_block, sched_fn);</span><br><span style="color: hsl(0, 100%, 40%);">-   f_tx_rlcmac_ul_block(ts_RLCMAC_CTRL_ACK(tlli), 0, sched_fn);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_rx_rlcmac_dl_block_exp_data(dl_block, sched_fn, data, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-     f_acknackdesc_ack_block(ack_nack_desc, dl_block, '1'B);</span><br><span style="color: hsl(0, 100%, 40%);">- f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(f_rlcmac_dl_block_get_tfi(dl_block), ack_nack_desc), 0, sched_fn);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Test scenario where MS wants to send some data on PDCH against SGSN and it is</span><br><span style="color: hsl(0, 100%, 40%);">- * answered, so TBFs for uplink and later for downlink are created.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_TC_mo_ping_pong(template (omit) MSRadioAccessCapabilityV ms_racap := omit, template (present) CodingScheme exp_cs_mcs := ?) runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-    var GsmRrMessage rr_imm_ass;</span><br><span style="color: hsl(0, 100%, 40%);">-    var PacketUlAssign ul_tbf_ass;</span><br><span style="color: hsl(0, 100%, 40%);">-  var PacketDlAssign dl_tbf_ass;</span><br><span style="color: hsl(0, 100%, 40%);">-  var RlcmacDlBlock dl_block;</span><br><span style="color: hsl(0, 100%, 40%);">-     var PCUIF_Message pcu_msg;</span><br><span style="color: hsl(0, 100%, 40%);">-      var octetstring data := f_rnd_octstring(10);</span><br><span style="color: hsl(0, 100%, 40%);">-    var boolean ok;</span><br><span style="color: hsl(0, 100%, 40%);">- var uint32_t sched_fn;</span><br><span style="color: hsl(0, 100%, 40%);">-  var OCT4 tlli := '00000001'O;</span><br><span style="color: hsl(0, 100%, 40%);">-   var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Initialize NS/BSSGP side */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_init_bssgp();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_init_raw(testcasename());</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Establish BSSGP connection to the PCU */</span><br><span style="color: hsl(0, 100%, 40%);">-     f_bssgp_establish();</span><br><span style="color: hsl(0, 100%, 40%);">-    f_bssgp_client_llgmm_assign('FFFFFFFF'O, tlli);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Establish an Uplink TBF */</span><br><span style="color: hsl(0, 100%, 40%);">-   ok := f_establish_tbf(rr_imm_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (not ok) {</span><br><span style="color: hsl(0, 100%, 40%);">-           setverdict(fail, "Failed to establish TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       ok := f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (not ok) {</span><br><span style="color: hsl(0, 100%, 40%);">-           setverdict(fail, "Immediate Assignment not an Uplink TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-           mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (not istemplatekind(ms_racap, "omit")) {</span><br><span style="color: hsl(0, 100%, 40%);">-           /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS</span><br><span style="color: hsl(0, 100%, 40%);">-              * (see 3GPP TS 04.60 "7.1.3.1 Initiation of the Packet resource request procedure")</span><br><span style="color: hsl(0, 100%, 40%);">-           */</span><br><span style="color: hsl(0, 100%, 40%);">-             f_tx_rlcmac_ul_block(ts_RLC_UL_CTRL_ACK(valueof(ts_RlcMacUlCtrl_PKT_RES_REQ(tlli, ms_racap))), 0);</span><br><span style="color: hsl(0, 100%, 40%);">-              f_rx_rlcmac_dl_block_exp_pkt_ul_ass(dl_block, sched_fn);</span><br><span style="color: hsl(0, 100%, 40%);">-                if (dl_block.ctrl.payload.u.ul_assignment.identity.tlli.tlli != tlli) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 setverdict(fail, "Wrong TLLI ", dl_block.ctrl.payload.u.ul_assignment.identity.tlli, " received vs exp ", tlli);</span><br><span style="color: hsl(0, 100%, 40%);">-                    mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Send one UL block and make sure it is ACKED fine */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_tx_rlcmac_ul_n_blocks(ul_tbf_ass, 1);</span><br><span style="color: hsl(0, 100%, 40%);">- f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);</span><br><span style="color: hsl(0, 100%, 40%);">-  /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_tx_rlcmac_ul_block(ts_RLCMAC_CTRL_ACK(tlli), 0, sched_fn);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /* UL block should be received in SGSN */</span><br><span style="color: hsl(0, 100%, 40%);">-       BSSGP[0].receive(tr_BSSGP_UL_UD(tlli, mp_gb_cfg.cell_id));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */</span><br><span style="color: hsl(0, 100%, 40%);">-  BSSGP[0].send(ts_BSSGP_DL_UD(tlli, data));</span><br><span style="color: hsl(0, 100%, 40%);">-      f_pcuif_rx_pch_imm_tbf_ass(rr_imm_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- ok := f_imm_ass_verify_dl_tbf_ass(rr_imm_ass, dl_tbf_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (not ok) {</span><br><span style="color: hsl(0, 100%, 40%);">-           setverdict(fail, "Immediate Assignment not a Downlink TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */</span><br><span style="color: hsl(0, 100%, 40%);">-    f_sleep(X2002);</span><br><span style="color: hsl(0, 100%, 40%);">- f_rx_rlcmac_dl_block_exp_data(dl_block, sched_fn, data, 0, exp_cs_mcs);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* ACK the DL block */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_acknackdesc_ack_block(ack_nack_desc, dl_block, '1'B);</span><br><span style="color: hsl(0, 100%, 40%);">- f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(f_rlcmac_dl_block_get_tfi(dl_block), ack_nack_desc), 0, sched_fn);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Test scenario where MS wants to send some data on PDCH against SGSN and it is</span><br><span style="color: hsl(0, 100%, 40%);">- * answered, so TBFs for uplink and later for downlink are created.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-testcase TC_mo_ping_pong() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-        var CodingScheme exp_cs_mcs := CS_1;</span><br><span style="color: hsl(0, 100%, 40%);">-    f_TC_mo_ping_pong(omit, exp_cs_mcs);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-testcase TC_mo_ping_pong_with_ul_racap() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">- var MultislotCap_GPRS mscap_gprs := {</span><br><span style="color: hsl(0, 100%, 40%);">-           gprsmultislotclass := '00011'B,</span><br><span style="color: hsl(0, 100%, 40%);">-         gprsextendeddynalloccap := '0'B</span><br><span style="color: hsl(0, 100%, 40%);">- };</span><br><span style="color: hsl(0, 100%, 40%);">-      var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };</span><br><span style="color: hsl(0, 100%, 40%);">-       var CodingScheme exp_cs_mcs := CS_2;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    f_TC_mo_ping_pong(ms_racap, exp_cs_mcs);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Test scenario where SGSN wants to send some data against MS and it is</span><br><span style="color: hsl(0, 100%, 40%);">- * answered by the MS on PDCH, so TBFs for downlink and later for uplink are created.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_TC_mt_ping_pong(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit, template (present) CodingScheme exp_cs_mcs := ?) runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">- var GsmRrMessage rr_imm_ass;</span><br><span style="color: hsl(0, 100%, 40%);">-    var PacketUlAssign ul_tbf_ass;</span><br><span style="color: hsl(0, 100%, 40%);">-  var PacketDlAssign dl_tbf_ass;</span><br><span style="color: hsl(0, 100%, 40%);">-  var RlcmacDlBlock dl_block;</span><br><span style="color: hsl(0, 100%, 40%);">-     var PCUIF_Message pcu_msg;</span><br><span style="color: hsl(0, 100%, 40%);">-      var octetstring data := f_rnd_octstring(10);</span><br><span style="color: hsl(0, 100%, 40%);">-    var boolean ok;</span><br><span style="color: hsl(0, 100%, 40%);">- var uint32_t sched_fn;</span><br><span style="color: hsl(0, 100%, 40%);">-  var OCT4 tlli := '00000001'O;</span><br><span style="color: hsl(0, 100%, 40%);">-   var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Initialize NS/BSSGP side */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_init_bssgp();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_init_raw(testcasename());</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Establish BSSGP connection to the PCU */</span><br><span style="color: hsl(0, 100%, 40%);">-     f_bssgp_establish();</span><br><span style="color: hsl(0, 100%, 40%);">-    f_bssgp_client_llgmm_assign('FFFFFFFF'O, tlli);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* SGSN sends some DL data, PCU will page on CCCH (PCH) */</span><br><span style="color: hsl(0, 100%, 40%);">-      BSSGP[0].send(ts_BSSGP_DL_UD(tlli, data, ms_racap));</span><br><span style="color: hsl(0, 100%, 40%);">-    f_pcuif_rx_pch_imm_tbf_ass(rr_imm_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- ok := f_imm_ass_verify_dl_tbf_ass(rr_imm_ass, dl_tbf_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (not ok) {</span><br><span style="color: hsl(0, 100%, 40%);">-           setverdict(fail, "Immediate Assignment not a Downlink TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */</span><br><span style="color: hsl(0, 100%, 40%);">-    f_sleep(X2002);</span><br><span style="color: hsl(0, 100%, 40%);">- f_rx_rlcmac_dl_block_exp_data(dl_block, sched_fn, data, 0, exp_cs_mcs);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* ACK the DL block */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_acknackdesc_ack_block(ack_nack_desc, dl_block, '1'B);</span><br><span style="color: hsl(0, 100%, 40%);">- f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(f_rlcmac_dl_block_get_tfi(dl_block), ack_nack_desc), 0, sched_fn);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* Now MS wants to answer the DL data, Establish an Uplink TBF */</span><br><span style="color: hsl(0, 100%, 40%);">-       ok := f_establish_tbf(rr_imm_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (not ok) {</span><br><span style="color: hsl(0, 100%, 40%);">-           setverdict(fail, "Failed to establish TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       ok := f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (not ok) {</span><br><span style="color: hsl(0, 100%, 40%);">-           setverdict(fail, "Immediate Assignment not an Uplink TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-           mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Send one UL block and make sure it is ACKED fine */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_tx_rlcmac_ul_n_blocks(ul_tbf_ass, 1);</span><br><span style="color: hsl(0, 100%, 40%);">- f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);</span><br><span style="color: hsl(0, 100%, 40%);">-  /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_tx_rlcmac_ul_block(ts_RLCMAC_CTRL_ACK(tlli), 0, sched_fn);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /* UL block should be received in SGSN */</span><br><span style="color: hsl(0, 100%, 40%);">-       BSSGP[0].receive(tr_BSSGP_UL_UD(tlli, mp_gb_cfg.cell_id));</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-testcase TC_mt_ping_pong() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">- var CodingScheme exp_cs_mcs := CS_1;</span><br><span style="color: hsl(0, 100%, 40%);">-    f_TC_mt_ping_pong(omit, exp_cs_mcs);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* TC_mt_ping_pong, but DL-UNITDATA contains RA Access capability with (M)CS</span><br><span style="color: hsl(0, 100%, 40%);">-/* information about the MS */</span><br><span style="color: hsl(0, 100%, 40%);">-testcase TC_mt_ping_pong_with_dl_racap() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-       var MultislotCap_GPRS_BSSGP mscap_gprs := {</span><br><span style="color: hsl(0, 100%, 40%);">-             gprsmultislotclass := '00011'B,</span><br><span style="color: hsl(0, 100%, 40%);">-         gprsextendeddynalloccap := '0'B</span><br><span style="color: hsl(0, 100%, 40%);">- } ;</span><br><span style="color: hsl(0, 100%, 40%);">-     var MSRadioAccessCapabilityV_BSSGP ms_racap := { valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, mscap_gprs, omit)) };</span><br><span style="color: hsl(0, 100%, 40%);">-   var CodingScheme exp_cs_mcs := CS_2;</span><br><span style="color: hsl(0, 100%, 40%);">-    f_TC_mt_ping_pong(ms_racap, exp_cs_mcs);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Verify that if PCU doesn't get an ACK for first DL block after IMM ASS, it</span><br><span style="color: hsl(0, 100%, 40%);">- * will retry by retransmitting both the IMM ASS + DL block after poll (ack)</span><br><span style="color: hsl(0, 100%, 40%);">- * timeout occurs (specified by sent RRBP on DL block). */</span><br><span style="color: hsl(0, 100%, 40%);">-testcase TC_imm_ass_dl_block_retrans() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-        var GsmRrMessage rr_imm_ass;</span><br><span style="color: hsl(0, 100%, 40%);">-    var PacketDlAssign dl_tbf_ass;</span><br><span style="color: hsl(0, 100%, 40%);">-  var RlcmacDlBlock dl_block;</span><br><span style="color: hsl(0, 100%, 40%);">-     var octetstring data := f_rnd_octstring(10);</span><br><span style="color: hsl(0, 100%, 40%);">-    var boolean ok;</span><br><span style="color: hsl(0, 100%, 40%);">- var uint32_t sched_fn;</span><br><span style="color: hsl(0, 100%, 40%);">-  var OCT4 tlli := '00000001'O;</span><br><span style="color: hsl(0, 100%, 40%);">-   var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Initialize NS/BSSGP side */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_init_bssgp();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_init_raw(testcasename());</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Establish BSSGP connection to the PCU */</span><br><span style="color: hsl(0, 100%, 40%);">-     f_bssgp_establish();</span><br><span style="color: hsl(0, 100%, 40%);">-    f_bssgp_client_llgmm_assign('FFFFFFFF'O, tlli);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* SGSN sends some DL data, PCU will page on CCCH (PCH) */</span><br><span style="color: hsl(0, 100%, 40%);">-      BSSGP[0].send(ts_BSSGP_DL_UD(tlli, data));</span><br><span style="color: hsl(0, 100%, 40%);">-      f_pcuif_rx_pch_imm_tbf_ass(rr_imm_ass);</span><br><span style="color: hsl(0, 100%, 40%);">- ok := f_imm_ass_verify_dl_tbf_ass(rr_imm_ass, dl_tbf_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (not ok) {</span><br><span style="color: hsl(0, 100%, 40%);">-           setverdict(fail, "Immediate Assignment not a Downlink TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */</span><br><span style="color: hsl(0, 100%, 40%);">-    f_sleep(X2002);</span><br><span style="color: hsl(0, 100%, 40%);">- f_rx_rlcmac_dl_block_exp_data(dl_block, sched_fn, data, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Now we don't ack the dl block (emulate MS failed receiveing IMM ASS</span><br><span style="color: hsl(0, 100%, 40%);">-       * or GPRS DL, or DL ACK was lost for some reason). As a result, PCU</span><br><span style="color: hsl(0, 100%, 40%);">-     * should retrigger IMM ASS + GPRS DL procedure after poll timeout. */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_pcuif_rx_pch_imm_tbf_ass(rr_imm_ass);</span><br><span style="color: hsl(0, 100%, 40%);">- ok := f_imm_ass_verify_dl_tbf_ass(rr_imm_ass, dl_tbf_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (not ok) {</span><br><span style="color: hsl(0, 100%, 40%);">-           setverdict(fail, "Immediate Assignment not a Downlink TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */</span><br><span style="color: hsl(0, 100%, 40%);">-    f_sleep(X2002);</span><br><span style="color: hsl(0, 100%, 40%);">- f_rx_rlcmac_dl_block_exp_data(dl_block, sched_fn, data, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* ACK the DL block */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_acknackdesc_ack_block(ack_nack_desc, dl_block, '1'B);</span><br><span style="color: hsl(0, 100%, 40%);">- f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(f_rlcmac_dl_block_get_tfi(dl_block), ack_nack_desc), 0, sched_fn);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_pkt_paging_match_imsi(in PacketPagingReq req, hexstring imsi) {</span><br><span style="color: hsl(0, 100%, 40%);">-        var MobileIdentityLV_Paging mi_lv := req.repeated_pageinfo.cs.mobile_identity;</span><br><span style="color: hsl(0, 100%, 40%);">-  var MobileIdentityV mi := dec_MobileIdentityV(mi_lv.mobile_id);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (mi_lv.len != 8) { /* 8 octets: type of ID (3 bits) + even/odd flag (1 bit) + 15 BCD-encoded digits (60 bits) */</span><br><span style="color: hsl(0, 100%, 40%);">-             setverdict(fail, "Mobile Identity length mismatch: ",</span><br><span style="color: hsl(0, 100%, 40%);">-                    "expected: 8, got: ", mi_lv.len);</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Make sure MI contains IMSI before referencing it */</span><br><span style="color: hsl(0, 100%, 40%);">-  if (mi.typeOfIdentity != '001'B) {</span><br><span style="color: hsl(0, 100%, 40%);">-              setverdict(fail, "Mobile Identity must be of type IMSI ('001'B), ",</span><br><span style="color: hsl(0, 100%, 40%);">-                      "got: ", mi.typeOfIdentity);</span><br><span style="color: hsl(0, 100%, 40%);">-               mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       } else if (mi.oddEvenInd_identity.imsi.digits != imsi) {</span><br><span style="color: hsl(0, 100%, 40%);">-                setverdict(fail, "Mobile Identity contains unexpected IMSI, ",</span><br><span style="color: hsl(0, 100%, 40%);">-                           "expected: ", imsi, " got: ", mi.oddEvenInd_identity.imsi.digits);</span><br><span style="color: hsl(0, 100%, 40%);">-               mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_pkt_paging_match_tmsi(in PacketPagingReq req, template GsmTmsi tmsi) {</span><br><span style="color: hsl(0, 100%, 40%);">-     if (not match(req.repeated_pageinfo.cs.tmsi, tmsi)) {</span><br><span style="color: hsl(0, 100%, 40%);">-           setverdict(fail, "Mobile Identity (TMSI/P-TMSI) mismatch: ",</span><br><span style="color: hsl(0, 100%, 40%);">-                     "expected: ", tmsi, "got: ", req.repeated_pageinfo.cs.tmsi);</span><br><span style="color: hsl(0, 100%, 40%);">-             mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Test CS paging over the BTS<->PCU socket.</span><br><span style="color: hsl(0, 100%, 40%);">- * When a (class B or C, not A) MS has an active TBF (or is on the PDCH), the MS can not react on CS paging over CCCH.</span><br><span style="color: hsl(0, 100%, 40%);">- * Paging should be send on the PACCH.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * 1. Send a Paging Request over PCU socket.</span><br><span style="color: hsl(0, 100%, 40%);">- * 2. Send a Ready-To-Send message over PCU socket</span><br><span style="color: hsl(0, 100%, 40%);">- * 3. Expect a Paging Frame</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-testcase TC_paging_cs_from_bts() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-        var GsmRrMessage rr_imm_ass;</span><br><span style="color: hsl(0, 100%, 40%);">-    var PacketUlAssign ul_tbf_ass;</span><br><span style="color: hsl(0, 100%, 40%);">-  var RlcmacDlBlock dl_block;</span><br><span style="color: hsl(0, 100%, 40%);">-     var boolean ok;</span><br><span style="color: hsl(0, 100%, 40%);">- var OCT4 tlli := '00000001'O;</span><br><span style="color: hsl(0, 100%, 40%);">-   var MobileIdentityLV mi;</span><br><span style="color: hsl(0, 100%, 40%);">-        var octetstring mi_enc_lv;</span><br><span style="color: hsl(0, 100%, 40%);">-      var hexstring imsi := f_gen_imsi(42);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* Initialize NS/BSSGP side */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_init_bssgp();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_init_raw(testcasename());</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Establish BSSGP connection to the PCU */</span><br><span style="color: hsl(0, 100%, 40%);">-     f_bssgp_establish();</span><br><span style="color: hsl(0, 100%, 40%);">-    f_bssgp_client_llgmm_assign('FFFFFFFF'O, tlli);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Establish an Uplink TBF */</span><br><span style="color: hsl(0, 100%, 40%);">-   ok := f_establish_tbf(rr_imm_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (not ok) {</span><br><span style="color: hsl(0, 100%, 40%);">-           setverdict(fail, "Failed to establish TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       ok := f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (not ok) {</span><br><span style="color: hsl(0, 100%, 40%);">-           setverdict(fail, "Immediate Assignment not an Uplink TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-           mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* build mobile Identity */</span><br><span style="color: hsl(0, 100%, 40%);">-     mi := valueof(ts_MI_IMSI_LV(imsi));</span><br><span style="color: hsl(0, 100%, 40%);">-     mi_enc_lv := enc_MobileIdentityLV(mi);</span><br><span style="color: hsl(0, 100%, 40%);">-  /* Send paging request */</span><br><span style="color: hsl(0, 100%, 40%);">-       BTS.send(ts_PCUIF_PAG_REQ(bts_nr := 0, id_lv := mi_enc_lv, chan_needed := 0,</span><br><span style="color: hsl(0, 100%, 40%);">-                            sapi :=PCU_IF_SAPI_PDTCH));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Receive it on BTS side towards MS */</span><br><span style="color: hsl(0, 100%, 40%);">- f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Make sure that Packet Paging Request contains the same IMSI */</span><br><span style="color: hsl(0, 100%, 40%);">-       f_pkt_paging_match_imsi(dl_block.ctrl.payload.u.paging, imsi);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  setverdict(pass);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Test CS paging over Gb (SGSN->PCU->BTS[PDCH]).</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_tc_paging_cs_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-  var GsmRrMessage rr_imm_ass;</span><br><span style="color: hsl(0, 100%, 40%);">-    var PacketUlAssign ul_tbf_ass;</span><br><span style="color: hsl(0, 100%, 40%);">-  var RlcmacDlBlock dl_block;</span><br><span style="color: hsl(0, 100%, 40%);">-     var boolean ok;</span><br><span style="color: hsl(0, 100%, 40%);">- var OCT4 tlli := '00000001'O;</span><br><span style="color: hsl(0, 100%, 40%);">-   var hexstring imsi := f_gen_imsi(42);</span><br><span style="color: hsl(0, 100%, 40%);">-   var GsmTmsi tmsi;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Initialize NS/BSSGP side */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_init_bssgp();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_init_raw(testcasename());</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Establish BSSGP connection to the PCU */</span><br><span style="color: hsl(0, 100%, 40%);">-     f_bssgp_establish();</span><br><span style="color: hsl(0, 100%, 40%);">-    f_bssgp_client_llgmm_assign('FFFFFFFF'O, tlli);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Establish an Uplink TBF */</span><br><span style="color: hsl(0, 100%, 40%);">-   ok := f_establish_tbf(rr_imm_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (not ok) {</span><br><span style="color: hsl(0, 100%, 40%);">-           setverdict(fail, "Failed to establish TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       ok := f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (not ok) {</span><br><span style="color: hsl(0, 100%, 40%);">-           setverdict(fail, "Immediate Assignment not an Uplink TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-           mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Send paging request with or without TMSI */</span><br><span style="color: hsl(0, 100%, 40%);">-  if (use_ptmsi) {</span><br><span style="color: hsl(0, 100%, 40%);">-                tmsi := oct2int(f_rnd_octstring(4)); /* Random P-TMSI */</span><br><span style="color: hsl(0, 100%, 40%);">-                BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, imsi, tmsi));</span><br><span style="color: hsl(0, 100%, 40%);">-      } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, imsi));</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Receive it on BTS side towards MS */</span><br><span style="color: hsl(0, 100%, 40%);">- f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Make sure that Packet Paging Request contains the same P-TMSI/IMSI */</span><br><span style="color: hsl(0, 100%, 40%);">-        if (use_ptmsi) {</span><br><span style="color: hsl(0, 100%, 40%);">-                f_pkt_paging_match_tmsi(dl_block.ctrl.payload.u.paging, tmsi);</span><br><span style="color: hsl(0, 100%, 40%);">-  } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                f_pkt_paging_match_imsi(dl_block.ctrl.payload.u.paging, imsi);</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       setverdict(pass);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-testcase TC_paging_cs_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-        f_tc_paging_cs_from_sgsn(0, true);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-testcase TC_paging_cs_from_sgsn_sign() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-     f_tc_paging_cs_from_sgsn(0);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-testcase TC_paging_cs_from_sgsn_ptp() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-    f_tc_paging_cs_from_sgsn(mp_gb_cfg.bvci);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Test PS paging over Gb (SGSN->PCU->BTS[CCCH]).</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_tc_paging_ps_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-  var OCT4 tlli := '00000001'O;</span><br><span style="color: hsl(0, 100%, 40%);">-   var integer imsi_suff_tx := 423;</span><br><span style="color: hsl(0, 100%, 40%);">-        var hexstring imsi := f_gen_imsi(imsi_suff_tx);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Initialize NS/BSSGP side */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_init_bssgp();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_init_raw(testcasename());</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Establish BSSGP connection to the PCU */</span><br><span style="color: hsl(0, 100%, 40%);">-     f_bssgp_establish();</span><br><span style="color: hsl(0, 100%, 40%);">-    f_bssgp_client_llgmm_assign('FFFFFFFF'O, tlli);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Send BSSGP PAGING-PS (with or without TMSI), wait for RR Paging Request Type 1.</span><br><span style="color: hsl(0, 100%, 40%);">-       * Make sure that both paging group (IMSI suffix) and Mobile Identity match. */</span><br><span style="color: hsl(0, 100%, 40%);">- if (use_ptmsi) {</span><br><span style="color: hsl(0, 100%, 40%);">-                var OCT4 tmsi := f_rnd_octstring(4); /* Random P-TMSI */</span><br><span style="color: hsl(0, 100%, 40%);">-                BSSGP[0].send(ts_BSSGP_PS_PAGING_PTMSI(bvci, imsi, oct2int(tmsi)));</span><br><span style="color: hsl(0, 100%, 40%);">-             f_pcuif_rx_pch_pag_req1(t_MI_TMSI(tmsi), imsi_suff_tx);</span><br><span style="color: hsl(0, 100%, 40%);">- } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                BSSGP[0].send(ts_BSSGP_PS_PAGING_IMSI(bvci, imsi));</span><br><span style="color: hsl(0, 100%, 40%);">-             f_pcuif_rx_pch_pag_req1(tr_MI_IMSI(imsi), imsi_suff_tx);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       setverdict(pass);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-testcase TC_paging_ps_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-        f_tc_paging_ps_from_sgsn(0, true);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-testcase TC_paging_ps_from_sgsn_sign() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-     f_tc_paging_ps_from_sgsn(0);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-testcase TC_paging_ps_from_sgsn_ptp() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-    f_tc_paging_ps_from_sgsn(mp_gb_cfg.bvci);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_TC_egprs_pkt_chan_req(in EGPRSPktChRequest req,</span><br><span style="color: hsl(0, 100%, 40%);">-                                     template GsmRrMessage t_imm_ass := ?,</span><br><span style="color: hsl(0, 100%, 40%);">-                                   PCUIF_BurstType bt := BURST_TYPE_1)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-   var GsmRrMessage rr_msg;</span><br><span style="color: hsl(0, 100%, 40%);">-        var uint16_t ra11;</span><br><span style="color: hsl(0, 100%, 40%);">-      var boolean ok;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- ra11 := enc_EGPRSPktChRequest2uint(req);</span><br><span style="color: hsl(0, 100%, 40%);">-        log("Sending EGPRS Packet Channel Request (", ra11, "): ", req);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    ok := f_establish_tbf(rr_msg, ra := ra11, is_11bit := 1, burst_type := bt);</span><br><span style="color: hsl(0, 100%, 40%);">-     if (not ok) {</span><br><span style="color: hsl(0, 100%, 40%);">-           setverdict(fail, "Failed to establush an Uplink TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-                mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (not match(rr_msg, t_imm_ass)) {</span><br><span style="color: hsl(0, 100%, 40%);">-             setverdict(fail, "Immediate Assignment does not match");</span><br><span style="color: hsl(0, 100%, 40%);">-              mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       setverdict(pass);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-testcase TC_egprs_pkt_chan_req_signalling() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">- var template GsmRrMessage imm_ass;</span><br><span style="color: hsl(0, 100%, 40%);">-      var template IaRestOctets rest;</span><br><span style="color: hsl(0, 100%, 40%);">- var template EgprsUlAss ul_ass;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_init_raw(testcasename());</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     var EGPRSPktChRequest req := {</span><br><span style="color: hsl(0, 100%, 40%);">-          /* NOTE: other fields are set in the loop */</span><br><span style="color: hsl(0, 100%, 40%);">-            signalling := { tag := '110011'B }</span><br><span style="color: hsl(0, 100%, 40%);">-      };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      for (var integer i := 0; i < 6; i := i + 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);</span><br><span style="color: hsl(0, 100%, 40%);">-           req.signalling.random_bits := ext_ra;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-           /* For signalling, do we expect Multiblock UL TBF Assignment? */</span><br><span style="color: hsl(0, 100%, 40%);">-                ul_ass  := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);</span><br><span style="color: hsl(0, 100%, 40%);">-           rest    := tr_IaRestOctets_EGPRSULAss(ul_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-          imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-           f_TC_egprs_pkt_chan_req(req, imm_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-testcase TC_egprs_pkt_chan_req_one_phase() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-  var template GsmRrMessage imm_ass;</span><br><span style="color: hsl(0, 100%, 40%);">-      var template IaRestOctets rest;</span><br><span style="color: hsl(0, 100%, 40%);">- var template EgprsUlAss ul_ass;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_init_raw(testcasename());</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     var EGPRSPktChRequest req := {</span><br><span style="color: hsl(0, 100%, 40%);">-          /* NOTE: other fields are set in the loop */</span><br><span style="color: hsl(0, 100%, 40%);">-            one_phase := { tag := '0'B }</span><br><span style="color: hsl(0, 100%, 40%);">-    };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      for (var integer i := 0; i < 6; i := i + 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);</span><br><span style="color: hsl(0, 100%, 40%);">-           var BIT5 mslot_class := int2bit(f_rnd_int(32), 5);</span><br><span style="color: hsl(0, 100%, 40%);">-              var BIT2 priority := substr(ext_ra, 0, 2);</span><br><span style="color: hsl(0, 100%, 40%);">-              var BIT3 rand := substr(ext_ra, 2, 3);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          req.one_phase.multislot_class := mslot_class;</span><br><span style="color: hsl(0, 100%, 40%);">-           req.one_phase.priority := priority;</span><br><span style="color: hsl(0, 100%, 40%);">-             req.one_phase.random_bits := rand;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-              /* For one phase access, do we expect Dynamic UL TBF Assignment? */</span><br><span style="color: hsl(0, 100%, 40%);">-             ul_ass  := tr_EgprsUlAssDynamic(ext_ra := ext_ra);</span><br><span style="color: hsl(0, 100%, 40%);">-              rest    := tr_IaRestOctets_EGPRSULAss(ul_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-          imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-           f_TC_egprs_pkt_chan_req(req, imm_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-testcase TC_egprs_pkt_chan_req_two_phase() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-  var template GsmRrMessage imm_ass;</span><br><span style="color: hsl(0, 100%, 40%);">-      var template IaRestOctets rest;</span><br><span style="color: hsl(0, 100%, 40%);">- var template EgprsUlAss ul_ass;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_init_raw(testcasename());</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     var EGPRSPktChRequest req := {</span><br><span style="color: hsl(0, 100%, 40%);">-          /* NOTE: other fields are set in the loop */</span><br><span style="color: hsl(0, 100%, 40%);">-            two_phase := { tag := '110000'B }</span><br><span style="color: hsl(0, 100%, 40%);">-       };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      for (var integer i := 0; i < 6; i := i + 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);</span><br><span style="color: hsl(0, 100%, 40%);">-           var BIT2 priority := substr(ext_ra, 0, 2);</span><br><span style="color: hsl(0, 100%, 40%);">-              var BIT3 rand := substr(ext_ra, 2, 3);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          req.two_phase.priority := priority;</span><br><span style="color: hsl(0, 100%, 40%);">-             req.two_phase.random_bits := rand;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-              /* For two phase access, do we expect Multiblock UL TBF Assignment? */</span><br><span style="color: hsl(0, 100%, 40%);">-          ul_ass  := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);</span><br><span style="color: hsl(0, 100%, 40%);">-           rest    := tr_IaRestOctets_EGPRSULAss(ul_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-          imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-           f_TC_egprs_pkt_chan_req(req, imm_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-control {</span><br><span style="color: hsl(0, 100%, 40%);">-     execute( TC_pcuif_suspend() );</span><br><span style="color: hsl(0, 100%, 40%);">-  execute( TC_ta_ptcch_idle() );</span><br><span style="color: hsl(0, 100%, 40%);">-  execute( TC_ta_rach_imm_ass() );</span><br><span style="color: hsl(0, 100%, 40%);">-        execute( TC_ta_idle_dl_tbf_ass() );</span><br><span style="color: hsl(0, 100%, 40%);">-     execute( TC_ta_ptcch_ul_multi_tbf() );</span><br><span style="color: hsl(0, 100%, 40%);">-  execute( TC_cs_lqual_ul_tbf() );</span><br><span style="color: hsl(0, 100%, 40%);">-        execute( TC_cs_initial_ul() );</span><br><span style="color: hsl(0, 100%, 40%);">-  execute( TC_cs_max_ul() );</span><br><span style="color: hsl(0, 100%, 40%);">-      execute( TC_t3169() );</span><br><span style="color: hsl(0, 100%, 40%);">-  execute( TC_t3193() );</span><br><span style="color: hsl(0, 100%, 40%);">-  execute( TC_mo_ping_pong() );</span><br><span style="color: hsl(0, 100%, 40%);">-   execute( TC_mo_ping_pong_with_ul_racap() );</span><br><span style="color: hsl(0, 100%, 40%);">-     execute( TC_mt_ping_pong() );</span><br><span style="color: hsl(0, 100%, 40%);">-   execute( TC_mt_ping_pong_with_dl_racap() );</span><br><span style="color: hsl(0, 100%, 40%);">-     execute( TC_imm_ass_dl_block_retrans() );</span><br><span style="color: hsl(0, 100%, 40%);">-       execute( TC_paging_cs_from_bts() );</span><br><span style="color: hsl(0, 100%, 40%);">-     execute( TC_paging_cs_from_sgsn_sign_ptmsi() );</span><br><span style="color: hsl(0, 100%, 40%);">- execute( TC_paging_cs_from_sgsn_sign() );</span><br><span style="color: hsl(0, 100%, 40%);">-       execute( TC_paging_cs_from_sgsn_ptp() );</span><br><span style="color: hsl(0, 100%, 40%);">-        execute( TC_paging_ps_from_sgsn_sign_ptmsi() );</span><br><span style="color: hsl(0, 100%, 40%);">- execute( TC_paging_ps_from_sgsn_sign() );</span><br><span style="color: hsl(0, 100%, 40%);">-       execute( TC_paging_ps_from_sgsn_ptp() );</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* EGPRS specific test cases */</span><br><span style="color: hsl(0, 100%, 40%);">- execute( TC_egprs_pkt_chan_req_signalling() );</span><br><span style="color: hsl(0, 100%, 40%);">-  execute( TC_egprs_pkt_chan_req_one_phase() );</span><br><span style="color: hsl(0, 100%, 40%);">-   execute( TC_egprs_pkt_chan_req_two_phase() );</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span>diff --git a/pcu/PCU_Tests_SNS.cfg b/pcu/PCU_Tests_SNS.cfg</span><br><span>index 0368f36..022f91c 100644</span><br><span>--- a/pcu/PCU_Tests_SNS.cfg</span><br><span>+++ b/pcu/PCU_Tests_SNS.cfg</span><br><span>@@ -21,4 +21,4 @@</span><br><span> [MAIN_CONTROLLER]</span><br><span> </span><br><span> [EXECUTE]</span><br><span style="color: hsl(0, 100%, 40%);">-PCU_Tests_RAW_SNS.control</span><br><span style="color: hsl(120, 100%, 40%);">+PCU_Tests_SNS.control</span><br><span>diff --git a/pcu/PCU_Tests_RAW_SNS.ttcn b/pcu/PCU_Tests_SNS.ttcn</span><br><span>similarity index 99%</span><br><span>rename from pcu/PCU_Tests_RAW_SNS.ttcn</span><br><span>rename to pcu/PCU_Tests_SNS.ttcn</span><br><span>index 1690ad4..fc98979 100644</span><br><span>--- a/pcu/PCU_Tests_RAW_SNS.ttcn</span><br><span>+++ b/pcu/PCU_Tests_SNS.ttcn</span><br><span>@@ -1,4 +1,4 @@</span><br><span style="color: hsl(0, 100%, 40%);">-module PCU_Tests_RAW_SNS {</span><br><span style="color: hsl(120, 100%, 40%);">+module PCU_Tests_SNS {</span><br><span> </span><br><span> /* Osmocom PCU test suite for IP Sub-Network-Service (SNS) in TTCN-3</span><br><span>  * (C) 2018-2019 Harald Welte <laforge@gnumonks.org></span><br><span>@@ -11,7 +11,7 @@</span><br><span>  */</span><br><span> </span><br><span> import from Osmocom_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from PCU_Tests_RAW_NS all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from PCU_Tests_NS all;</span><br><span> import from SGSN_Components all;</span><br><span> import from Osmocom_Gb_Types all;</span><br><span> import from NS_CodecPort all;</span><br><span>diff --git a/pcu/README.md b/pcu/README.md</span><br><span>index a711410..a2e439a 100644</span><br><span>--- a/pcu/README.md</span><br><span>+++ b/pcu/README.md</span><br><span>@@ -1,4 +1,4 @@</span><br><span style="color: hsl(0, 100%, 40%);">-# PCU_Tests_RAW.ttcn</span><br><span style="color: hsl(120, 100%, 40%);">+# PCU_Tests.ttcn</span><br><span> </span><br><span> * external interfaces</span><br><span>     * Gb (emulates SGSN side NS/BSSGP)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/17975">change 17975</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/+/17975"/><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: Iacaddb56e41012ba58ef6d1b9e79d2c012259bed </div>
<div style="display:none"> Gerrit-Change-Number: 17975 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <axilirator@gmail.com> </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>