<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>