<p>fixeria <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/18370">View Change</a></p><div style="white-space:pre-wrap">Approvals:
Jenkins Builder: Verified
pespin: Looks good to me, approved
fixeria: Looks good to me, approved
</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">pcu: Refactor GPRS infrastructure to keep state and simplify tests<br><br>Before this patch, each test had to somehow keep state for all the<br>transactions needed. Now, most of the state is moved to generic GprsMS,<br>UlTbf and DlTbf structures, and APIs to maintain its state, as well as<br>function helpers to submit or receive messages from it. For now<br>specially the Tx side was improved, some of the Rx parts are left for<br>later and are still using the old APIs.<br><br>This will allow for more complex scenarios and more complex tests<br>running several MS.<br><br>All the tests were updated to use the new APIs, reworked when needed and<br>even totally rewritten in some cases since they were doing<br>inconsistent/wrong stuff from the point of view of what the scenarios<br>or code paths they were expected to test. There's no test regressions.<br><br>Change-Id: Ib3fee37580f0ea0530a659dec83656799bf57288<br>---<br>M pcu/GPRS_Components.ttcn<br>M pcu/PCU_Tests.ttcn<br>2 files changed, 631 insertions(+), 562 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/pcu/GPRS_Components.ttcn b/pcu/GPRS_Components.ttcn</span><br><span>index 7eff399..c0630a6 100644</span><br><span>--- a/pcu/GPRS_Components.ttcn</span><br><span>+++ b/pcu/GPRS_Components.ttcn</span><br><span>@@ -44,16 +44,83 @@</span><br><span> import from Native_Functions all;</span><br><span> import from SGSN_Components all;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+type union PacketDlAssignChan {</span><br><span style="color: hsl(120, 100%, 40%);">+ PacketDlAssign ccch,</span><br><span style="color: hsl(120, 100%, 40%);">+ PacketDlAssignment pacch</span><br><span 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 DlTbf {</span><br><span style="color: hsl(120, 100%, 40%);">+ GsmRrMessage rr_imm_ass,</span><br><span style="color: hsl(120, 100%, 40%);">+ PacketDlAssignChan ass,</span><br><span style="color: hsl(120, 100%, 40%);">+ uint5_t tfi,</span><br><span style="color: hsl(120, 100%, 40%);">+ AckNackDescription acknack_desc</span><br><span 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 union PacketUlAssignChan {</span><br><span style="color: hsl(120, 100%, 40%);">+ PacketUlAssign ccch,</span><br><span style="color: hsl(120, 100%, 40%);">+ EgprsUlAss ccch_egprs,</span><br><span style="color: hsl(120, 100%, 40%);">+ PacketUlAssignment pacch</span><br><span 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 UlTbf {</span><br><span style="color: hsl(120, 100%, 40%);">+ GsmRrMessage rr_imm_ass,</span><br><span style="color: hsl(120, 100%, 40%);">+ PacketUlAssignChan ass,</span><br><span style="color: hsl(120, 100%, 40%);">+ uint5_t tfi,</span><br><span style="color: hsl(120, 100%, 40%);">+ boolean is_egprs,</span><br><span style="color: hsl(120, 100%, 40%);">+ uint14_t bsn,</span><br><span style="color: hsl(120, 100%, 40%);">+ CodingScheme tx_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%);">+type record GprsMS {</span><br><span style="color: hsl(120, 100%, 40%);">+ hexstring imsi,</span><br><span style="color: hsl(120, 100%, 40%);">+ GprsTlli tlli,</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t ra,</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t ra_is_11bit,</span><br><span style="color: hsl(120, 100%, 40%);">+ PCUIF_BurstType burst_type,</span><br><span style="color: hsl(120, 100%, 40%);">+ TimingAdvance ta,</span><br><span style="color: hsl(120, 100%, 40%);">+ int16_t lqual_cb,</span><br><span style="color: hsl(120, 100%, 40%);">+ UlTbf ul_tbf optional, /* TODO: Only 1 UL tbf supported for now */</span><br><span style="color: hsl(120, 100%, 40%);">+ DlTbf dl_tbf optional /* TODO: Only 1 DL tbf supported for now */</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+type record of GprsMS GprsMSArray;</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%);">+template (value) GprsMS t_GprsMS_def := {</span><br><span style="color: hsl(120, 100%, 40%);">+ imsi := f_gen_imsi(42),</span><br><span style="color: hsl(120, 100%, 40%);">+ tlli := '00000001'O,</span><br><span style="color: hsl(120, 100%, 40%);">+ ra := bit2int(chan_req_def),</span><br><span style="color: hsl(120, 100%, 40%);">+ ra_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%);">+ ta := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ lqual_cb := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ ul_tbf := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ dl_tbf := omit</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> type component MS_BTS_IFACE_CT {</span><br><span> /* Virtual BTS component */</span><br><span> var RAW_PCU_BTS_CT vc_BTS;</span><br><span> /* Connection to the BTS component (one for now) */</span><br><span> port RAW_PCU_MSG_PT BTS;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Support only 1 ms for now */</span><br><span style="color: hsl(120, 100%, 40%);">+ var GprsMS g_ms[1];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Value at which Countdown Procedure starts. Announced by network (GPRS Cell Options as per TS 04.60 Chapter 12.24) */</span><br><span> var uint4_t g_bs_cv_max := 4;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+function f_init_gprs_ms(template (value) GprsMS ms_params := t_GprsMS_def) runs on MS_BTS_IFACE_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ g_ms[0] := valueof(ms_params);</span><br><span 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> function f_shutdown(charstring file, integer line,</span><br><span> boolean final := false)</span><br><span> runs on MS_BTS_IFACE_CT {</span><br><span>@@ -74,10 +141,275 @@</span><br><span> mtc.stop;</span><br><span> }</span><br><span> </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(120, 100%, 40%);">+function f_ultbf_new_from_rr_imm_ass(in GsmRrMessage rr_imm_ass)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on MS_BTS_IFACE_CT return UlTbf {</span><br><span style="color: hsl(120, 100%, 40%);">+ var UlTbf ul_tbf;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ ul_tbf.rr_imm_ass := rr_imm_ass;</span><br><span style="color: hsl(120, 100%, 40%);">+ ul_tbf.bsn := 0;</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.ccch := 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 GPRS assignment: ", ul_tbf.ass.ccch);</span><br><span style="color: hsl(120, 100%, 40%);">+ ul_tbf.is_egprs := false;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (match(ul_tbf.ass.ccch, tr_PacketUlDynAssign)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ ul_tbf.tfi := ul_tbf.ass.ccch.dynamic.tfi_assignment;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (match(ul_tbf.ass.ccch, tr_PacketUlSglAssign)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Nothing to do here yet */</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (match(rr_imm_ass, tr_IMM_TBF_ASS(dl := false, rest := tr_IaRestOctets_EGPRSULAss(?)))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ ul_tbf.ass.ccch_egprs := rr_imm_ass.payload.imm_ass.rest_octets.lh.egprs_ul;</span><br><span style="color: hsl(120, 100%, 40%);">+ log("Rx Uplink TBF EGPRS assignment: ", ul_tbf.ass.ccch_egprs);</span><br><span style="color: hsl(120, 100%, 40%);">+ ul_tbf.is_egprs := true;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (match(ul_tbf.ass.ccch_egprs, tr_EgprsUlAssDynamic)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ ul_tbf.tfi := ul_tbf.ass.ccch_egprs.dynamic.tfi_assignment;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (match(ul_tbf.ass.ccch_egprs, tr_EgprsUlAssMultiblock)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Nothing to do here yet */</span><br><span style="color: hsl(120, 100%, 40%);">+ }</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: ", rr_imm_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_shutdown(__BFILE__, __LINE__);</span><br><span 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%);">+ return ul_tbf;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+function f_ultbf_new_from_ass_pacch(RlcmacDlBlock dl_block)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on MS_BTS_IFACE_CT return UlTbf {</span><br><span style="color: hsl(120, 100%, 40%);">+ var UlTbf ul_tbf;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ ul_tbf.ass.pacch := dl_block.ctrl.payload.u.ul_assignment;</span><br><span style="color: hsl(120, 100%, 40%);">+ ul_tbf.bsn := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ ul_tbf.tx_cs_mcs := f_rlcmac_dl_block_get_assigned_ul_cs_mcs(dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+ ul_tbf.tfi := f_rlcmac_dl_block_get_tfi(dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* TODO: handle GlobalTfiOrTlli tfi_or_tlli from pkt_ul_ass */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* TODO: support single block allocation */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (match(dl_block, tr_RLCMAC_UL_PACKET_ASS_GPRS(?, tr_PktUlAssGprsDynamic(tr_DynamicAllocation(?))))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ ul_tbf.tfi := dl_block.ctrl.payload.u.ul_assignment.gprs.dyn_block_alloc.ul_tfi_assignment;</span><br><span style="color: hsl(120, 100%, 40%);">+ ul_tbf.is_egprs := false;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (match(dl_block, tr_RLCMAC_UL_PACKET_ASS_EGPRS(?, tr_PktUlAssEgprsDynamic(tr_DynamicAllocation(?))))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ ul_tbf.tfi := dl_block.ctrl.payload.u.ul_assignment.egprs.dyn_block_alloc.ul_tfi_assignment;</span><br><span style="color: hsl(120, 100%, 40%);">+ ul_tbf.is_egprs := true;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ return ul_tbf;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+function f_dltbf_new_from_rr_imm_ass(in GsmRrMessage rr_imm_ass, template PacketDlAssign dl_ass := tr_PacketDlAssign(?))</span><br><span style="color: hsl(120, 100%, 40%);">+runs on MS_BTS_IFACE_CT return DlTbf {</span><br><span style="color: hsl(120, 100%, 40%);">+ var DlTbf dl_tbf;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ dl_tbf.rr_imm_ass := rr_imm_ass;</span><br><span style="color: hsl(120, 100%, 40%);">+ dl_tbf.acknack_desc := valueof(t_AckNackDescription_init);</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(dl_ass)))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ dl_tbf.ass.ccch := 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%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(fail, "Failed to match DL TBF Assignment: ", rr_imm_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_shutdown(__BFILE__, __LINE__);</span><br><span 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: match TLLI */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (dl_tbf.ass.ccch.group1_present == '1'B) {</span><br><span style="color: hsl(120, 100%, 40%);">+ dl_tbf.tfi := dl_tbf.ass.ccch.group1.tfi_assignment;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(fail, "Immediate Assignment contains no DL TFI");</span><br><span style="color: hsl(120, 100%, 40%);">+ f_shutdown(__BFILE__, __LINE__);</span><br><span 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%);">+ return dl_tbf;</span><br><span 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: get stuff from f_rx_rlcmac_dl_block_exp_pkt_ass */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_dltbf_new_from_ass_pacch(RlcmacDlBlock dl_block)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on MS_BTS_IFACE_CT return DlTbf {</span><br><span style="color: hsl(120, 100%, 40%);">+ var DlTbf dl_tbf;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ dl_tbf.ass.pacch := dl_block.ctrl.payload.u.dl_assignment;</span><br><span style="color: hsl(120, 100%, 40%);">+ dl_tbf.tfi := f_rlcmac_dl_block_get_tfi(dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* TODO: handle GlobalTfiOrTlli tfi_or_tlli from pkt_dl_ass */</span><br><span style="color: hsl(120, 100%, 40%);">+ dl_tbf.acknack_desc := valueof(t_AckNackDescription_init);</span><br><span style="color: hsl(120, 100%, 40%);">+ return dl_tbf;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+function f_ms_use_ra(inout GprsMS ms, uint16_t ra, uint8_t ra_is_11bit := 0)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on MS_BTS_IFACE_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ ms.ra_is_11bit := ra_is_11bit;</span><br><span style="color: hsl(120, 100%, 40%);">+ ms.ra := ra;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ra_is_11bit == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ ms.burst_type := BURST_TYPE_0;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ ms.burst_type := BURST_TYPE_1;</span><br><span 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%);">+function f_ms_rx_imm_ass_ccch(inout GprsMS ms, template PCUIF_Sapi sapi := PCU_IF_SAPI_AGCH, template GsmRrMessage t_imm_ass := ?)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on MS_BTS_IFACE_CT return GsmRrMessage {</span><br><span style="color: hsl(120, 100%, 40%);">+ var PCUIF_Message pcu_msg;</span><br><span style="color: hsl(120, 100%, 40%);">+ var GsmRrMessage rr_imm_ass;</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 := 0, 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%);">+ f_pcuif_tx_data_cnf(pcu_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+ return rr_imm_ass;</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%);">+ f_shutdown(__BFILE__, __LINE__);</span><br><span 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 rr_imm_ass; /* make compiler happy */</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+function f_ms_rx_imm_ass_pacch(inout GprsMS ms, out uint32_t poll_fn, template RlcmacDlBlock t_imm_ass := ?)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on MS_BTS_IFACE_CT return RlcmacDlBlock {</span><br><span style="color: hsl(120, 100%, 40%);">+ var RlcmacDlBlock dl_block;</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, t_imm_ass)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(fail, "Failed to match Packet Assignment:", t_imm_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_shutdown(__BFILE__, __LINE__);</span><br><span 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 := f_rrbp_ack_fn(dl_fn, dl_block.ctrl.mac_hdr.rrbp);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (match(dl_block, tr_RLCMAC_UL_PACKET_ASS)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ ms.ul_tbf := f_ultbf_new_from_ass_pacch(dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ms.ul_tbf.ass.pacch.identity.tlli.tlli != ms.tlli) {</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(fail, "Wrong TLLI ", ms.ul_tbf.ass.pacch.identity.tlli, " received vs exp ", ms.tlli);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_shutdown(__BFILE__, __LINE__);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (match(dl_block, tr_RLCMAC_DL_PACKET_ASS)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ ms.dl_tbf := f_dltbf_new_from_ass_pacch(dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* TODO: match tlli from ms.dl_tbf.ass.pacch with ms.tlli), or error */</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(fail, "Should not happen:", dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_shutdown(__BFILE__, __LINE__);</span><br><span 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 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%);">+function f_ms_establish_ul_tbf(inout GprsMS ms, uint32_t fn := 1337)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on MS_BTS_IFACE_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 uint8_t exp_ra;</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=", ms.ra, ", TA=", ms.ta);</span><br><span style="color: hsl(120, 100%, 40%);">+ BTS.send(ts_PCUIF_RACH_IND(bts_nr := 0, trx_nr := 0, ts_nr := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ ra := ms.ra, is_11bit := ms.ra_is_11bit,</span><br><span style="color: hsl(120, 100%, 40%);">+ burst_type := ms.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 := ms.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 (ms.ra_is_11bit == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ exp_ra := ms.ra;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ exp_ra := 127;</span><br><span 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 Immediate (TBF) Assignment on TS0/AGCH */</span><br><span style="color: hsl(120, 100%, 40%);">+ rr_imm_ass := f_ms_rx_imm_ass_ccch(ms, PCU_IF_SAPI_AGCH,</span><br><span style="color: hsl(120, 100%, 40%);">+ tr_IMM_TBF_ASS(false, exp_ra, fn));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ ms.ul_tbf := f_ultbf_new_from_rr_imm_ass(rr_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%);">+function f_ms_exp_dl_tbf_ass_ccch(inout GprsMS ms, template PCUIF_Sapi sapi := PCU_IF_SAPI_AGCH, template GsmRrMessage t_imm_ass := tr_IMM_TBF_ASS(true, ?, ?))</span><br><span style="color: hsl(120, 100%, 40%);">+runs on MS_BTS_IFACE_CT {</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%);">+ rr_imm_ass := f_ms_rx_imm_ass_ccch(ms, sapi, t_imm_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+ ms.dl_tbf := f_dltbf_new_from_rr_imm_ass(rr_imm_ass, tr_PacketDlAssign(ms.tlli));</span><br><span 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%);">+function f_ms_tx_data_ind(inout GprsMS ms, octetstring data, uint32_t fn := 0)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on MS_BTS_IFACE_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_pcuif_tx_data_ind(data, ms.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%);">+function f_ms_tx_ul_block(inout GprsMS ms, template (value) RlcmacUlBlock ul_data, uint32_t fn := 0)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on MS_BTS_IFACE_CT return integer {</span><br><span style="color: hsl(120, 100%, 40%);">+ var octetstring data;</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer padding_len;</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%);">+ padding_len := 23 - lengthof(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_ms_tx_data_ind(ms, data, fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ return padding_len;</span><br><span 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: Only supports sending CS-1 so far */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_ms_tx_ul_data_block(inout GprsMS ms, octetstring payload, uint4_t cv := 15, boolean with_tlli := false, uint32_t fn := 0)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on MS_BTS_IFACE_CT return integer {</span><br><span style="color: hsl(120, 100%, 40%);">+ var template (value) RlcmacUlBlock ul_data;</span><br><span style="color: hsl(120, 100%, 40%);">+ ul_data := t_RLCMAC_UL_DATA(tfi := ms.ul_tbf.tfi,</span><br><span style="color: hsl(120, 100%, 40%);">+ cv := cv,</span><br><span style="color: hsl(120, 100%, 40%);">+ bsn := ms.ul_tbf.bsn,</span><br><span style="color: hsl(120, 100%, 40%);">+ blocks := {t_RLCMAC_LLCBLOCK(payload)});</span><br><span style="color: hsl(120, 100%, 40%);">+ if (with_tlli) {</span><br><span style="color: hsl(120, 100%, 40%);">+ ul_data.data.mac_hdr.tlli_ind := true;</span><br><span style="color: hsl(120, 100%, 40%);">+ ul_data.data.tlli := ms.tlli;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ ms.ul_tbf.bsn := ms.ul_tbf.bsn + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ ms.ul_tbf.bsn := ms.ul_tbf.bsn mod 128; /* FIXME: EGPRS SNS: 2048 */</span><br><span style="color: hsl(120, 100%, 40%);">+ return f_ms_tx_ul_block(ms, ul_data, 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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Send random payload for last "num_blocks" blocks in Ul TBF (ending with CV=0). */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_ms_tx_ul_data_block_multi(inout GprsMS ms, integer num_blocks := 1, boolean with_tlli := false)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on MS_BTS_IFACE_CT return octetstring {</span><br><span style="color: hsl(120, 100%, 40%);">+ var octetstring total_payload := ''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%);">+ var integer padding_len;</span><br><span style="color: hsl(120, 100%, 40%);">+ var octetstring payload := f_rnd_octstring(10);</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%);">+ var integer cv := num_blocks - i - 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (cv > g_bs_cv_max) {</span><br><span style="color: hsl(120, 100%, 40%);">+ cv := 15;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ padding_len := f_ms_tx_ul_data_block(ms, payload, cv := cv, with_tlli := with_tlli)</span><br><span style="color: hsl(120, 100%, 40%);">+ total_payload := total_payload & payload & f_pad_oct(''O, padding_len, '00'O);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ return total_payload;</span><br><span> }</span><br><span> </span><br><span> function f_rlcmac_dl_block_get_tfi(RlcmacDlBlock dl_block)</span><br><span>@@ -93,6 +425,9 @@</span><br><span> if (match(dl_block, tr_RLCMAC_UL_PACKET_ASS_EGPRS(?, tr_PktUlAssEgprsDynamic(tr_DynamicAllocation(?))))) {</span><br><span> return dl_block.ctrl.payload.u.ul_assignment.egprs.dyn_block_alloc.ul_tfi_assignment;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (match(dl_block, tr_RLCMAC_DL_PACKET_ASS(?))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return dl_block.ctrl.payload.u.dl_assignment.dl_tfi_assignment;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> setverdict(fail, "DlBlock doesn't contain a TFI:", dl_block);</span><br><span> f_shutdown(__BFILE__, __LINE__);</span><br><span>@@ -169,6 +504,10 @@</span><br><span> BTS.send(pcu_msg_cnf);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+////////////////////////</span><br><span style="color: hsl(120, 100%, 40%);">+// OLD APIs</span><br><span style="color: hsl(120, 100%, 40%);">+////////////////////////</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> function f_pcuif_rx_imm_ass(out GsmRrMessage rr_imm_ass,</span><br><span> template PCUIF_Sapi sapi := PCU_IF_SAPI_AGCH,</span><br><span> template GsmRrMessage t_imm_ass := ?)</span><br><span>@@ -248,34 +587,6 @@</span><br><span> tr_IMM_TBF_ASS(false, ra, fn));</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-function f_imm_ass_verify_ul_tbf_ass(in GsmRrMessage rr_imm_ass, out PacketUlAssign ul_tbf_ass, template PacketUlAssign ul_ass := tr_PacketUlDynAssign)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on MS_BTS_IFACE_CT {</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(ul_ass)))) {</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%);">- f_shutdown(__BFILE__, __LINE__);</span><br><span 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%);">-function f_imm_ass_verify_dl_tbf_ass(in GsmRrMessage rr_imm_ass, out PacketDlAssign dl_tbf_ass)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on MS_BTS_IFACE_CT {</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%);">- f_shutdown(__BFILE__, __LINE__);</span><br><span 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> /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */</span><br><span> function f_pcuif_tx_data_ind(octetstring data, int16_t lqual_cb := 0, uint32_t fn := 0)</span><br><span> runs on MS_BTS_IFACE_CT {</span><br><span>@@ -299,23 +610,6 @@</span><br><span> sapi := PCU_IF_SAPI_PDTCH)) -> value pcu_msg;</span><br><span> }</span><br><span> </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%);">-function f_pcuif_rx_pch_imm_tbf_ass(out GsmRrMessage rr_imm_ass)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on MS_BTS_IFACE_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%);">- f_shutdown(__BFILE__, __LINE__);</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> /* Expect a Paging Request Type 1 from PCU on PCUIF on specified sapi. */</span><br><span> function f_pcuif_rx_pch_pag_req1(template MobileIdentityV mi1 := ?,</span><br><span> template integer pag_group := ?)</span><br><span>@@ -353,56 +647,6 @@</span><br><span> return rr_pag_req1;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Send one rlcmac UL block adding necessary extra padding at the end.</span><br><span style="color: hsl(0, 100%, 40%);">- * returns length of extra padding added at the end, in octets.</span><br><span style="color: hsl(0, 100%, 40%);">- * FIXME: Only supports CS-1 so far.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-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 MS_BTS_IFACE_CT return integer {</span><br><span style="color: hsl(0, 100%, 40%);">- var octetstring data;</span><br><span style="color: hsl(0, 100%, 40%);">- var integer padding_len;</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%);">- padding_len := 23 - lengthof(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%);">- return padding_len;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-function f_tx_rlcmac_ul_n_blocks(uint5_t tfi, inout uint14_t bsn, integer num_blocks := 1, template (omit) GprsTlli tlli := omit)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on MS_BTS_IFACE_CT return octetstring {</span><br><span style="color: hsl(0, 100%, 40%);">- var octetstring total_payload := ''O;</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 := tfi,</span><br><span style="color: hsl(0, 100%, 40%);">- cv := 15, /* num UL blocks to be sent (to be overridden in loop) */</span><br><span style="color: hsl(0, 100%, 40%);">- bsn := 0, /* To be generated in loop */</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%);">- if (not istemplatekind(tlli, "omit")) {</span><br><span style="color: hsl(0, 100%, 40%);">- ul_data.data.mac_hdr.tlli_ind := true;</span><br><span style="color: hsl(0, 100%, 40%);">- ul_data.data.tlli := tlli;</span><br><span 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 < num_blocks; i := i + 1) {</span><br><span style="color: hsl(0, 100%, 40%);">- var integer padding_len;</span><br><span style="color: hsl(0, 100%, 40%);">- var octetstring payload := f_rnd_octstring(10);</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%);">- var integer cv := num_blocks - i - 1;</span><br><span style="color: hsl(0, 100%, 40%);">- if (cv > g_bs_cv_max) {</span><br><span style="color: hsl(0, 100%, 40%);">- cv := 15;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- ul_data.data.mac_hdr.countdown := cv;</span><br><span style="color: hsl(0, 100%, 40%);">- ul_data.data.mac_hdr.bsn := bsn + i;</span><br><span style="color: hsl(0, 100%, 40%);">- ul_data.data.blocks := { valueof(t_RLCMAC_LLCBLOCK(payload)) };</span><br><span style="color: hsl(0, 100%, 40%);">- padding_len := f_tx_rlcmac_ul_block(ul_data);</span><br><span style="color: hsl(0, 100%, 40%);">- total_payload := total_payload & payload & f_pad_oct(''O, padding_len, '00'O);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- bsn := valueof(ul_data.data.mac_hdr.bsn) + 1; /* update bsn to point to next one */</span><br><span style="color: hsl(0, 100%, 40%);">- return total_payload;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> function f_rx_rlcmac_dl_block(out RlcmacDlBlock dl_block, out uint32_t dl_fn, template (present) CodingScheme exp_cs_mcs := ?)</span><br><span> runs on MS_BTS_IFACE_CT {</span><br><span> var PCUIF_Message pcu_msg;</span><br><span>@@ -443,46 +687,6 @@</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-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 MS_BTS_IFACE_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%);">- f_shutdown(__BFILE__, __LINE__);</span><br><span 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 := f_rrbp_ack_fn(dl_fn, 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%);">-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 MS_BTS_IFACE_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%);">- f_shutdown(__BFILE__, __LINE__);</span><br><span 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 := f_rrbp_ack_fn(dl_fn, 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%);">-function f_rx_rlcmac_dl_block_exp_pkt_dl_ass(out RlcmacDlBlock dl_block, out uint32_t poll_fn)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on MS_BTS_IFACE_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%);">- f_shutdown(__BFILE__, __LINE__);</span><br><span 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 := f_rrbp_ack_fn(dl_fn, 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> function f_rx_rlcmac_dl_block_exp_pkt_pag_req(out RlcmacDlBlock dl_block)</span><br><span> runs on MS_BTS_IFACE_CT {</span><br><span> var uint32_t dl_fn;</span><br><span>diff --git a/pcu/PCU_Tests.ttcn b/pcu/PCU_Tests.ttcn</span><br><span>index 9e7c92b..ca37431 100644</span><br><span>--- a/pcu/PCU_Tests.ttcn</span><br><span>+++ b/pcu/PCU_Tests.ttcn</span><br><span>@@ -253,9 +253,11 @@</span><br><span> /* Test of correct Timing Advance at the time of TBF establishment</span><br><span> * (derived from timing offset of the Access Burst). */</span><br><span> 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(120, 100%, 40%);">+ var GprsMS ms;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Initialize GPRS MS side */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_gprs_ms();</span><br><span style="color: hsl(120, 100%, 40%);">+ ms := g_ms[0]; /* We only use first MS in this test */</span><br><span> /* Initialize the PCU interface abstraction */</span><br><span> f_init_raw(testcasename());</span><br><span> </span><br><span>@@ -263,16 +265,13 @@</span><br><span> * at some point the PCU will fail to allocate a new TBF. */</span><br><span> for (var TimingAdvance ta := 0; ta < 64; ta := ta + 16) {</span><br><span> /* 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, 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%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ ms.ta := ta;</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_establish_ul_tbf(ms, fn := 1337 + ta);</span><br><span> </span><br><span> /* Make sure Timing Advance IE matches out expectations */</span><br><span style="color: hsl(0, 100%, 40%);">- if (rr_msg.payload.imm_ass.timing_advance != ta) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ms.ul_tbf.rr_imm_ass.payload.imm_ass.timing_advance != ta) {</span><br><span> setverdict(fail, "Timing Advance mismatch: ",</span><br><span style="color: hsl(0, 100%, 40%);">- rr_msg.payload.imm_ass.timing_advance,</span><br><span style="color: hsl(120, 100%, 40%);">+ ms.ul_tbf.rr_imm_ass.payload.imm_ass.timing_advance,</span><br><span> " vs expected ", ta);</span><br><span> break;</span><br><span> }</span><br><span>@@ -286,30 +285,29 @@</span><br><span> * IUT that causes it to send an unreasonable Timing Advance value > 0 despite</span><br><span> * no active TBF exists at the moment of establishment (idle mode). */</span><br><span> 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(120, 100%, 40%);">+ var GprsMS ms;</span><br><span> </span><br><span> /* Initialize NS/BSSGP side */</span><br><span> f_init_bssgp();</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Initialize GPRS MS side */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_gprs_ms();</span><br><span style="color: hsl(120, 100%, 40%);">+ ms := g_ms[0]; /* We only use first MS in this test */</span><br><span> </span><br><span> /* Initialize the PCU interface abstraction */</span><br><span> f_init_raw(testcasename());</span><br><span> </span><br><span> /* Establish BSSGP connection to the PCU */</span><br><span> 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(120, 100%, 40%);">+ f_bssgp_client_llgmm_assign('FFFFFFFF'O, ms.tlli);</span><br><span> </span><br><span> /* SGSN sends some DL data, PCU will initiate Packet Downlink</span><br><span> * 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(120, 100%, 40%);">+ BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, f_rnd_octstring(10)));</span><br><span> </span><br><span> /* Make sure that Timing Advance is 0 (the actual value is not known yet).</span><br><span> * As per 3GPP S 44.018, section 3.5.3.1.2, the network *shall* initiate</span><br><span> * 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%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_rx_imm_ass_ccch(ms, PCU_IF_SAPI_PCH, tr_IMM_TBF_ASS(ta := 0));</span><br><span> </span><br><span> f_shutdown(__BFILE__, __LINE__, final := true);</span><br><span> }</span><br><span>@@ -460,9 +458,11 @@</span><br><span> </span><br><span> testcase TC_ta_ptcch_ul_multi_tbf() runs on RAW_PCU_Test_CT {</span><br><span> 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(120, 100%, 40%);">+ var GprsMS ms;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Initialize GPRS MS side */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_gprs_ms();</span><br><span style="color: hsl(120, 100%, 40%);">+ ms := g_ms[0]; /* We only use first MS in this test */</span><br><span> </span><br><span> /* Initialize the PCU interface abstraction */</span><br><span> f_init_raw(testcasename());</span><br><span>@@ -472,30 +472,18 @@</span><br><span> </span><br><span> /* Establish 7 Uplink TBFs (USF flag is 3 bits long, '111'B is reserved) */</span><br><span> 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%);">- break;</span><br><span 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%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Establish an Uplink TBF */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_establish_ul_tbf(ms);</span><br><span> </span><br><span> /* We expect incremental TFI/USF assignment (dynamic allocation) */</span><br><span> 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(120, 100%, 40%);">+ if (not match(ms.ul_tbf.ass.ccch, t_ul_tbf_ass)) {</span><br><span> setverdict(fail, "Failed to match Packet Uplink Assignment for #", i);</span><br><span> break;</span><br><span> }</span><br><span> </span><br><span> /* 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(120, 100%, 40%);">+ if (ms.ul_tbf.ass.ccch.dynamic.ta_index != i) {</span><br><span> setverdict(fail, "Failed to match Timing Advance Index for #", i);</span><br><span> /* Keep going, the current OsmoPCU does not assign TA Index */</span><br><span> }</span><br><span>@@ -540,13 +528,14 @@</span><br><span> private template integer CS4_lqual_dB_range := (12 .. infinity);</span><br><span> </span><br><span> 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> 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(120, 100%, 40%);">+ var GprsMS ms;</span><br><span style="color: hsl(120, 100%, 40%);">+ var uint32_t unused_fn, sched_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+ var uint4_t cv;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Initialize GPRS MS side */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_gprs_ms();</span><br><span style="color: hsl(120, 100%, 40%);">+ ms := g_ms[0]; /* We only use first MS in this test */</span><br><span> </span><br><span> /* Initialize the PCU interface abstraction */</span><br><span> f_init_raw(testcasename());</span><br><span>@@ -555,47 +544,51 @@</span><br><span> f_pcuvty_set_link_quality_ranges();</span><br><span> </span><br><span> /* 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%);">- f_shutdown(__BFILE__, __LINE__);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_establish_ul_tbf(ms);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Make sure we've got an Uplink TBF assignment */</span><br><span style="color: hsl(0, 100%, 40%);">- f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</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> </span><br><span> /* The actual / old link quality values. We need to keep track of the old</span><br><span> * (basically previous) link quality value, because OsmoPCU actually</span><br><span> * changes the coding scheme if not only the actual, but also the old</span><br><span> * value leaves the current link quality range (window). */</span><br><span style="color: hsl(0, 100%, 40%);">- var integer lqual := 0;</span><br><span> var integer lqual_old;</span><br><span style="color: hsl(120, 100%, 40%);">+ ms.lqual_cb := 0;</span><br><span> </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(120, 100%, 40%);">+ /* Send one UL block (with TLLI since we are in One-Phase Access</span><br><span style="color: hsl(120, 100%, 40%);">+ contention resoultion) and make sure it is ACKED fine. */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_tx_ul_data_block(ms, f_rnd_octstring(16), cv := 15, with_tlli := true)</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_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* 16 UL blocks (0 .. 15 dB, step = 1 cB) */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (var integer i := 150; i >= 0; i := i - 1) {</span><br><span> /* 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(120, 100%, 40%);">+ lqual_old := ms.lqual_cb;</span><br><span style="color: hsl(120, 100%, 40%);">+ ms.lqual_cb := 150 - i;</span><br><span> </span><br><span> /* 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(120, 100%, 40%);">+ log("Sending DATA.ind with link quality (dB): ", ms.lqual_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (i > g_bs_cv_max) {</span><br><span style="color: hsl(120, 100%, 40%);">+ cv := 15;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ cv := i;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </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(120, 100%, 40%);">+ f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := cv)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* we will receive UL ACK/NACK from time to time. In that case, check CdCofing increases */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_rx_rlcmac_dl_block(dl_block, unused_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {</span><br><span style="color: hsl(120, 100%, 40%);">+ continue;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and</span><br><span style="color: hsl(120, 100%, 40%);">+ not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_shutdown(__BFILE__, __LINE__);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span> log("Rx Packet Uplink ACK / NACK with Channel Coding Command: ",</span><br><span> dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd);</span><br><span>@@ -604,7 +597,7 @@</span><br><span> * the link quality value on each iteration and not decreasing, there</span><br><span> * is no need to check the both old and current link quality values. */</span><br><span> var template ChCodingCommand ch_coding;</span><br><span style="color: hsl(0, 100%, 40%);">- select (lqual_old) {</span><br><span style="color: hsl(120, 100%, 40%);">+ select (lqual_old / 10) {</span><br><span> case (CS1_lqual_dB_range) { ch_coding := CH_CODING_CS1; }</span><br><span> case (CS2_lqual_dB_range) { ch_coding := CH_CODING_CS2; }</span><br><span> case (CS3_lqual_dB_range) { ch_coding := CH_CODING_CS3; }</span><br><span>@@ -621,13 +614,14 @@</span><br><span> </span><br><span> /* Test the max UL CS set by VTY works fine */</span><br><span> 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> 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> 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(120, 100%, 40%);">+ var uint32_t unused_fn, sched_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+ var GprsMS ms;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Initialize GPRS MS side */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_gprs_ms();</span><br><span style="color: hsl(120, 100%, 40%);">+ ms := g_ms[0]; /* We only use first MS in this test */</span><br><span> </span><br><span> /* Initialize the PCU interface abstraction */</span><br><span> f_init_raw(testcasename());</span><br><span>@@ -638,62 +632,52 @@</span><br><span> f_pcuvty_set_link_quality_ranges();</span><br><span> </span><br><span> /* 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(120, 100%, 40%);">+ ms.lqual_cb := g_cs_lqual_ranges[2].low * 10;</span><br><span> </span><br><span> /* 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%);">- f_shutdown(__BFILE__, __LINE__);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_establish_ul_tbf(ms);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Make sure we've got an Uplink TBF assignment */</span><br><span style="color: hsl(0, 100%, 40%);">- f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Send one UL block (with TLLI since we are in One-Phase Access</span><br><span style="color: hsl(120, 100%, 40%);">+ contention resoultion) and make sure it is ACKED fine. */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_tx_ul_data_block(ms, f_rnd_octstring(16), cv := 15, with_tlli := true)</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_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);</span><br><span> </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(120, 100%, 40%);">+ /* Send UL blocks, until we receive UL ACK/NACK and check we are in same initial CS: */</span><br><span style="color: hsl(120, 100%, 40%);">+ while (true) {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 15);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_rx_rlcmac_dl_block(dl_block, unused_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {</span><br><span style="color: hsl(120, 100%, 40%);">+ continue;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </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(120, 100%, 40%);">+ if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and</span><br><span style="color: hsl(120, 100%, 40%);">+ not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_shutdown(__BFILE__, __LINE__);</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </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> last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> if (last_ch_coding != CH_CODING_CS3) {</span><br><span> setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_shutdown(__BFILE__, __LINE__);</span><br><span> }</span><br><span> </span><br><span> /* Remaining UL blocks are used to make sure regardless of initial</span><br><span> /* lqual, we can go lower at any time */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+ /* 0 dB, make sure we downgrade CS */</span><br><span style="color: hsl(120, 100%, 40%);">+ ms.lqual_cb := 0;</span><br><span> /* 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(120, 100%, 40%);">+ f_ms_tx_ul_data_block_multi(ms, 5);</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> </span><br><span> if (last_ch_coding != CH_CODING_CS1) {</span><br><span> setverdict(fail, "Channel Coding does not match our expectations (CS-1): ", last_ch_coding);</span><br><span>@@ -704,12 +688,14 @@</span><br><span> </span><br><span> /* Test the max UL CS set by VTY works fine */</span><br><span> 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> var RlcmacDlBlock dl_block;</span><br><span style="color: hsl(0, 100%, 40%);">- var boolean ok;</span><br><span> 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(120, 100%, 40%);">+ var uint32_t unused_fn, sched_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+ var GprsMS ms;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Initialize GPRS MS side */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_gprs_ms();</span><br><span style="color: hsl(120, 100%, 40%);">+ ms := g_ms[0]; /* We only use first MS in this test */</span><br><span> </span><br><span> /* Initialize the PCU interface abstraction */</span><br><span> f_init_raw(testcasename());</span><br><span>@@ -720,38 +706,22 @@</span><br><span> f_pcuvty_set_link_quality_ranges();</span><br><span> </span><br><span> /* 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%);">- f_shutdown(__BFILE__, __LINE__);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_establish_ul_tbf(ms);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Make sure we've got an Uplink TBF assignment */</span><br><span style="color: hsl(0, 100%, 40%);">- f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Send one UL block (with TLLI since we are in One-Phase Access</span><br><span style="color: hsl(120, 100%, 40%);">+ contention resoultion) and make sure it is ACKED fine. */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_tx_ul_data_block(ms, f_rnd_octstring(16), cv := 15, with_tlli := true)</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_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);</span><br><span> </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(120, 100%, 40%);">+ ms.lqual_cb := 40*10; /* 40 dB */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_tx_ul_data_block_multi(ms, 16);</span><br><span> </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(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> </span><br><span> if (last_ch_coding != CH_CODING_CS3) {</span><br><span> setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);</span><br><span>@@ -763,18 +733,15 @@</span><br><span> /* Verify PCU drops TBF after some time of inactivity. */</span><br><span> testcase TC_t3169() runs on RAW_PCU_Test_CT {</span><br><span> 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> 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> 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%);">- var uint14_t bsn := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ var GprsMS ms;</span><br><span> </span><br><span> /* Initialize NS/BSSGP side */</span><br><span> f_init_bssgp();</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Initialize GPRS MS side */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_gprs_ms();</span><br><span style="color: hsl(120, 100%, 40%);">+ ms := g_ms[0]; /* We only use first MS in this test */</span><br><span> </span><br><span> info_ind := valueof(ts_PCUIF_INFO_default);</span><br><span> /* Set timer to 1 sec (default 5) to speedup test: */</span><br><span>@@ -785,31 +752,22 @@</span><br><span> </span><br><span> /* Establish BSSGP connection to the PCU */</span><br><span> 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(120, 100%, 40%);">+ f_bssgp_client_llgmm_assign('FFFFFFFF'O, ms.tlli);</span><br><span> </span><br><span> /* 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%);">- f_shutdown(__BFILE__, __LINE__);</span><br><span 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've got an Uplink TBF assignment */</span><br><span style="color: hsl(0, 100%, 40%);">- f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_establish_ul_tbf(ms);</span><br><span> </span><br><span> /* Send one UL block (with TLLI since we are in One-Phase Access</span><br><span> contention resoultion) 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.dynamic.tfi_assignment, bsn, 1, tlli);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 1, with_tlli := true)</span><br><span> 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(120, 100%, 40%);">+ /* UL block should NOT be received in SGSN, since we didn't get CV=0 */</span><br><span> </span><br><span> /* Wait until T3169 fires (plus 1 extra sec to make sure) */</span><br><span> f_sleep(int2float(info_ind.t3169) + 1.0);</span><br><span> </span><br><span> /* 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%);">- bsn := 0;</span><br><span style="color: hsl(0, 100%, 40%);">- f_tx_rlcmac_ul_n_blocks(ul_tbf_ass.dynamic.tfi_assignment, bsn, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 0)</span><br><span> f_rx_rlcmac_dl_block_exp_dummy(dl_block);</span><br><span> </span><br><span> f_shutdown(__BFILE__, __LINE__, final := true);</span><br><span>@@ -819,181 +777,149 @@</span><br><span> * release of prev DL TBF due to MS staying in PDCH for a while (T3192, in PCU</span><br><span> * T3193) after DL TBF release */</span><br><span> 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> var RlcmacDlBlock dl_block;</span><br><span> var octetstring data := f_rnd_octstring(10);</span><br><span> var boolean ok;</span><br><span> var uint32_t sched_fn;</span><br><span> var uint32_t dl_fn;</span><br><span style="color: hsl(0, 100%, 40%);">- var OCT4 tlli := '00000001'O;</span><br><span style="color: hsl(120, 100%, 40%);">+ var GprsMS ms;</span><br><span> var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);</span><br><span> </span><br><span> /* Initialize NS/BSSGP side */</span><br><span> f_init_bssgp();</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Initialize GPRS MS side */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_gprs_ms();</span><br><span style="color: hsl(120, 100%, 40%);">+ ms := g_ms[0]; /* We only use first MS in this test */</span><br><span> </span><br><span> /* Initialize the PCU interface abstraction */</span><br><span> f_init_raw(testcasename());</span><br><span> </span><br><span> /* Establish BSSGP connection to the PCU */</span><br><span> 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(120, 100%, 40%);">+ f_bssgp_client_llgmm_assign('FFFFFFFF'O, ms.tlli);</span><br><span> </span><br><span> /* 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%);">- /* Make sure we've got a Downlink TBF assignment */</span><br><span style="color: hsl(0, 100%, 40%);">- f_imm_ass_verify_dl_tbf_ass(rr_imm_ass, dl_tbf_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);</span><br><span> </span><br><span> /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */</span><br><span> f_sleep(X2002);</span><br><span> f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);</span><br><span> </span><br><span> /* 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),</span><br><span style="color: hsl(0, 100%, 40%);">- 0, f_dl_block_ack_fn(dl_block, dl_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(120, 100%, 40%);">+ f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),</span><br><span style="color: hsl(120, 100%, 40%);">+ f_dl_block_ack_fn(dl_block, dl_fn));</span><br><span> </span><br><span> /* 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(120, 100%, 40%);">+ (T3192 in MS) was started and until it fires the MS will be available</span><br><span> 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(120, 100%, 40%);">+ BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_rx_imm_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);</span><br><span> </span><br><span> /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */</span><br><span> f_rx_rlcmac_dl_block_exp_data(dl_block, dl_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),</span><br><span style="color: hsl(0, 100%, 40%);">- 0, f_dl_block_ack_fn(dl_block, dl_fn));</span><br><span style="color: hsl(120, 100%, 40%);">+ f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),</span><br><span style="color: hsl(120, 100%, 40%);">+ f_dl_block_ack_fn(dl_block, dl_fn));</span><br><span> </span><br><span> f_shutdown(__BFILE__, __LINE__, final := true);</span><br><span> }</span><br><span> </span><br><span> /* Verify PCU handles correctly Countdown Procedure based on BS_CV_MAX */</span><br><span> testcase TC_countdown_procedure() 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> var RlcmacDlBlock dl_block;</span><br><span style="color: hsl(0, 100%, 40%);">- var boolean ok;</span><br><span> 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 uint14_t bsn := 1;</span><br><span style="color: hsl(0, 100%, 40%);">- var PDU_BSSGP bssgp_pdu;</span><br><span> var octetstring total_payload;</span><br><span style="color: hsl(0, 100%, 40%);">- var integer padding_len;</span><br><span style="color: hsl(120, 100%, 40%);">+ var GprsMS ms;</span><br><span> </span><br><span> /* Initialize NS/BSSGP side */</span><br><span> f_init_bssgp();</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Initialize GPRS MS side */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_gprs_ms();</span><br><span style="color: hsl(120, 100%, 40%);">+ ms := g_ms[0]; /* We only use first MS in this test */</span><br><span> </span><br><span> /* Initialize the PCU interface abstraction */</span><br><span> f_init_raw(testcasename());</span><br><span> </span><br><span> /* Establish BSSGP connection to the PCU */</span><br><span> 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(120, 100%, 40%);">+ f_bssgp_client_llgmm_assign('FFFFFFFF'O, ms.tlli);</span><br><span> </span><br><span> /* 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%);">- f_shutdown(__BFILE__, __LINE__);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- /* Make sure we've got an Uplink TBF assignment */</span><br><span style="color: hsl(0, 100%, 40%);">- f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_establish_ul_tbf(ms);</span><br><span> </span><br><span> /* Send one UL block (with TLLI since we are in One-Phase Access</span><br><span> contention resoultion) and make sure it is ACKED fine. */</span><br><span style="color: hsl(0, 100%, 40%);">- total_payload := f_rnd_octstring(16); /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */</span><br><span style="color: hsl(0, 100%, 40%);">- var template (value) RlcmacUlBlock ul_data := t_RLCMAC_UL_DATA_TLLI(</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, /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */</span><br><span style="color: hsl(0, 100%, 40%);">- bsn := 0,</span><br><span style="color: hsl(0, 100%, 40%);">- blocks := { valueof(t_RLCMAC_LLCBLOCK(total_payload)) },</span><br><span style="color: hsl(0, 100%, 40%);">- tlli := tlli);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- f_tx_rlcmac_ul_block(ul_data, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ total_payload := f_rnd_octstring(16); /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_tx_ul_data_block(ms, total_payload, cv := 15, with_tlli := true)</span><br><span> f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);</span><br><span> /* 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(120, 100%, 40%);">+ f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);</span><br><span> </span><br><span> /* Send enough blocks to test whole procedure: Until Nth block</span><br><span> (N=BS_CV_MAX), CV=15 is sent, and then the decreasing countdown value is sent.</span><br><span> */</span><br><span style="color: hsl(0, 100%, 40%);">- total_payload := total_payload & f_tx_rlcmac_ul_n_blocks(ul_tbf_ass.dynamic.tfi_assignment, bsn, 20);</span><br><span style="color: hsl(120, 100%, 40%);">+ total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, 20);</span><br><span> f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);</span><br><span> /* 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(120, 100%, 40%);">+ f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);</span><br><span> </span><br><span> /* receive one message on BSSGP with all aggregated data in payload: */</span><br><span style="color: hsl(0, 100%, 40%);">- BSSGP[0].receive(tr_BSSGP_UL_UD(tlli, mp_gb_cfg.cell_id, total_payload));</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.cell_id, total_payload));</span><br><span> }</span><br><span> </span><br><span> /* Test scenario where MS wants to send some data on PDCH against SGSN and it is</span><br><span> * answered, so TBFs for uplink and later for downlink are created.</span><br><span> */</span><br><span> private function f_TC_mo_ping_pong_1phase_access(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> var RlcmacDlBlock dl_block;</span><br><span style="color: hsl(0, 100%, 40%);">- var PCUIF_Message pcu_msg;</span><br><span> var octetstring data := f_rnd_octstring(10);</span><br><span style="color: hsl(0, 100%, 40%);">- var boolean ok;</span><br><span> var uint32_t sched_fn;</span><br><span> var uint32_t dl_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%);">- var uint14_t bsn := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ var GprsMS ms;</span><br><span> </span><br><span> /* Initialize NS/BSSGP side */</span><br><span> f_init_bssgp();</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Initialize GPRS MS side */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_gprs_ms();</span><br><span style="color: hsl(120, 100%, 40%);">+ ms := g_ms[0]; /* We only use first MS in this test */</span><br><span> </span><br><span> /* Initialize the PCU interface abstraction */</span><br><span> f_init_raw(testcasename());</span><br><span> </span><br><span> /* Establish BSSGP connection to the PCU */</span><br><span> 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(120, 100%, 40%);">+ f_bssgp_client_llgmm_assign('FFFFFFFF'O, ms.tlli);</span><br><span> </span><br><span> /* 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%);">- f_shutdown(__BFILE__, __LINE__);</span><br><span 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've got an Uplink TBF assignment */</span><br><span style="color: hsl(0, 100%, 40%);">- f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_establish_ul_tbf(ms);</span><br><span> </span><br><span> /* Send one UL block (with TLLI since we are in One-Phase Access</span><br><span> contention resoultion) 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.dynamic.tfi_assignment, bsn, 1, tlli);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);</span><br><span> f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);</span><br><span> /* 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(120, 100%, 40%);">+ f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);</span><br><span> </span><br><span> /* 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(120, 100%, 40%);">+ BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.cell_id));</span><br><span> </span><br><span> /* 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%);">- /* Make sure we've got a Downlink TBF assignment */</span><br><span style="color: hsl(0, 100%, 40%);">- f_imm_ass_verify_dl_tbf_ass(rr_imm_ass, dl_tbf_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);</span><br><span> </span><br><span> /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */</span><br><span> f_sleep(X2002);</span><br><span> f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);</span><br><span> </span><br><span> /* 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),</span><br><span style="color: hsl(0, 100%, 40%);">- 0, f_dl_block_ack_fn(dl_block, dl_fn));</span><br><span style="color: hsl(120, 100%, 40%);">+ f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),</span><br><span style="color: hsl(120, 100%, 40%);">+ f_dl_block_ack_fn(dl_block, dl_fn));</span><br><span> </span><br><span> f_shutdown(__BFILE__, __LINE__, final := true);</span><br><span> }</span><br><span>@@ -1013,20 +939,13 @@</span><br><span> template (present) CodingScheme exp_ul_cs_mcs := ?,</span><br><span> template (present) CodingScheme exp_dl_cs_mcs := ?)</span><br><span> 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> var RlcmacDlBlock dl_block;</span><br><span style="color: hsl(0, 100%, 40%);">- var PCUIF_Message pcu_msg;</span><br><span> var octetstring data := f_rnd_octstring(10);</span><br><span style="color: hsl(0, 100%, 40%);">- var boolean ok;</span><br><span> var uint32_t sched_fn;</span><br><span> var uint32_t dl_fn;</span><br><span> 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%);">- var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);</span><br><span style="color: hsl(0, 100%, 40%);">- var CodingScheme cs_mcs;</span><br><span style="color: hsl(0, 100%, 40%);">- var uint14_t bsn := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ var GprsMS ms;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* 0111 0xxx: Single block packet access; one block period on a PDCH is needed for two phase packet access or other RR signalling purpose. */</span><br><span> var uint16_t ra := oct2int('70'O);</span><br><span> if (g_force_two_phase_access) {</span><br><span>@@ -1038,55 +957,52 @@</span><br><span> </span><br><span> /* Initialize NS/BSSGP side */</span><br><span> f_init_bssgp();</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Initialize GPRS MS side */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_gprs_ms();</span><br><span style="color: hsl(120, 100%, 40%);">+ ms := g_ms[0]; /* We only use first MS in this test */</span><br><span> </span><br><span> /* Initialize the PCU interface abstraction */</span><br><span> f_init_raw(testcasename());</span><br><span> </span><br><span> /* Establish BSSGP connection to the PCU */</span><br><span> 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(120, 100%, 40%);">+ f_bssgp_client_llgmm_assign('FFFFFFFF'O, ms.tlli);</span><br><span> </span><br><span> /* Establish an Uplink TBF */</span><br><span style="color: hsl(0, 100%, 40%);">- ok := f_establish_tbf(rr_imm_ass, ra := ra);</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%);">- f_shutdown(__BFILE__, __LINE__);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_use_ra(ms, ra, ra_is_11bit := 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_establish_ul_tbf(ms);</span><br><span> </span><br><span> /* Make sure we've got an Uplink TBF assignment */</span><br><span style="color: hsl(0, 100%, 40%);">- f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass, tr_PacketUlSglAssign);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (not match(ms.ul_tbf.ass.ccch, tr_PacketUlSglAssign)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(fail, "Wrong Packet Uplink Assignment received: ", ms.ul_tbf.ass.ccch, " vs exp: ", tr_PacketUlSglAssign);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_shutdown(__BFILE__, __LINE__);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span> /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS</span><br><span> * (see 3GPP TS 04.60 "7.1.3.1 Initiation of the Packet resource request procedure")</span><br><span> */</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%);">- f_shutdown(__BFILE__, __LINE__);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- cs_mcs := f_rlcmac_dl_block_get_assigned_ul_cs_mcs(dl_block);</span><br><span style="color: hsl(0, 100%, 40%);">- if (not match(cs_mcs, exp_ul_cs_mcs)) {</span><br><span style="color: hsl(0, 100%, 40%);">- setverdict(fail, "Wrong CS_MCS ", cs_mcs, " received vs exp ", exp_ul_cs_mcs);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(valueof(ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap))), 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_rx_imm_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (not match(ms.ul_tbf.tx_cs_mcs, exp_ul_cs_mcs)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(fail, "Wrong CS_MCS ", ms.ul_tbf.tx_cs_mcs, " received vs exp ", exp_ul_cs_mcs);</span><br><span> f_shutdown(__BFILE__, __LINE__);</span><br><span> }</span><br><span> </span><br><span> /* Send one UL block (without TLLI since we are in Second-Phase Access)</span><br><span> and make sure it is ACKED fine */</span><br><span style="color: hsl(0, 100%, 40%);">- f_tx_rlcmac_ul_n_blocks(f_rlcmac_dl_block_get_tfi(dl_block), bsn, 1); /* TODO: send using cs_mcs */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true); /* TODO: send using cs_mcs */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- //f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);</span><br><span> /* 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(120, 100%, 40%);">+ f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);</span><br><span> </span><br><span> /* 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(120, 100%, 40%);">+ BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.cell_id));</span><br><span> </span><br><span> /* Now SGSN sends some DL data, PCU will page on PACCH */</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_dl_ass(dl_block, sched_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_rx_imm_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);</span><br><span> /* DL Ass 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(120, 100%, 40%);">+ f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);</span><br><span> </span><br><span> /* PCU acks the UL data after having received CV=0) */</span><br><span> f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);</span><br><span>@@ -1095,9 +1011,9 @@</span><br><span> f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_dl_cs_mcs);</span><br><span> </span><br><span> /* 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),</span><br><span style="color: hsl(0, 100%, 40%);">- 0, f_dl_block_ack_fn(dl_block, dl_fn));</span><br><span style="color: hsl(120, 100%, 40%);">+ f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.ul_tbf.tfi, ms.dl_tbf.acknack_desc),</span><br><span style="color: hsl(120, 100%, 40%);">+ f_dl_block_ack_fn(dl_block, dl_fn));</span><br><span> </span><br><span> f_shutdown(__BFILE__, __LINE__, final := true);</span><br><span> }</span><br><span>@@ -1152,64 +1068,50 @@</span><br><span> * answered by the MS on PDCH, so TBFs for downlink and later for uplink are created.</span><br><span> */</span><br><span> 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> var RlcmacDlBlock dl_block;</span><br><span style="color: hsl(0, 100%, 40%);">- var PCUIF_Message pcu_msg;</span><br><span> var octetstring data := f_rnd_octstring(10);</span><br><span style="color: hsl(0, 100%, 40%);">- var boolean ok;</span><br><span> var uint32_t sched_fn;</span><br><span> var uint32_t dl_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 uint14_t bsn := 0;</span><br><span style="color: hsl(0, 100%, 40%);">- var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);</span><br><span style="color: hsl(120, 100%, 40%);">+ var GprsMS ms;</span><br><span> </span><br><span> /* Initialize NS/BSSGP side */</span><br><span> f_init_bssgp();</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Initialize GPRS MS side */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_gprs_ms();</span><br><span style="color: hsl(120, 100%, 40%);">+ ms := g_ms[0]; /* We only use first MS in this test */</span><br><span> </span><br><span> /* Initialize the PCU interface abstraction */</span><br><span> f_init_raw(testcasename());</span><br><span> </span><br><span> /* Establish BSSGP connection to the PCU */</span><br><span> 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(120, 100%, 40%);">+ f_bssgp_client_llgmm_assign('FFFFFFFF'O, ms.tlli);</span><br><span> </span><br><span> /* 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%);">- /* Make sure we've got a Downlink TBF assignment */</span><br><span style="color: hsl(0, 100%, 40%);">- f_imm_ass_verify_dl_tbf_ass(rr_imm_ass, dl_tbf_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);</span><br><span> </span><br><span> /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */</span><br><span> f_sleep(X2002);</span><br><span> f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);</span><br><span> </span><br><span> /* 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),</span><br><span style="color: hsl(0, 100%, 40%);">- 0, f_dl_block_ack_fn(dl_block, dl_fn));</span><br><span style="color: hsl(120, 100%, 40%);">+ f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),</span><br><span style="color: hsl(120, 100%, 40%);">+ f_dl_block_ack_fn(dl_block, dl_fn));</span><br><span> </span><br><span> /* 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%);">- f_shutdown(__BFILE__, __LINE__);</span><br><span 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've got an Uplink TBF assignment */</span><br><span style="color: hsl(0, 100%, 40%);">- f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_establish_ul_tbf(ms);</span><br><span> </span><br><span> /* Send one UL block (with TLLI since we are in One-Phase Access</span><br><span> contention resoultion) 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.dynamic.tfi_assignment, bsn, 1, tlli);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);</span><br><span> f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);</span><br><span> /* 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(120, 100%, 40%);">+ f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);</span><br><span> </span><br><span> /* 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(120, 100%, 40%);">+ BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.cell_id));</span><br><span> </span><br><span> f_shutdown(__BFILE__, __LINE__, final := true);</span><br><span> }</span><br><span>@@ -1237,123 +1139,102 @@</span><br><span> * be transferred).</span><br><span> */</span><br><span> testcase TC_ul_intermediate_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 PacketUlAssign ul_tbf_ass;</span><br><span> var RlcmacDlBlock dl_block;</span><br><span> var template (value) RlcmacUlBlock ul_data;</span><br><span style="color: hsl(0, 100%, 40%);">- var boolean ok;</span><br><span> 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 uint14_t bsn := 5;</span><br><span style="color: hsl(0, 100%, 40%);">- var PDU_BSSGP bssgp_pdu;</span><br><span> var octetstring total_payload;</span><br><span> var octetstring payload;</span><br><span> var octetstring lost_payload;</span><br><span style="color: hsl(0, 100%, 40%);">- var integer padding_len;</span><br><span> var uint5_t tfi;</span><br><span style="color: hsl(120, 100%, 40%);">+ var GprsMS ms;</span><br><span> </span><br><span> /* Initialize NS/BSSGP side */</span><br><span> f_init_bssgp();</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Initialize GPRS MS side */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_gprs_ms();</span><br><span style="color: hsl(120, 100%, 40%);">+ ms := g_ms[0]; /* We only use first MS in this test */</span><br><span> </span><br><span> /* Initialize the PCU interface abstraction */</span><br><span> f_init_raw(testcasename());</span><br><span> </span><br><span> /* Establish BSSGP connection to the PCU */</span><br><span> 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(120, 100%, 40%);">+ f_bssgp_client_llgmm_assign('FFFFFFFF'O, ms.tlli);</span><br><span> </span><br><span> /* 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%);">- f_shutdown(__BFILE__, __LINE__);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- /* Make sure we've got an Uplink TBF assignment */</span><br><span style="color: hsl(0, 100%, 40%);">- f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</span><br><span style="color: hsl(0, 100%, 40%);">- tfi := ul_tbf_ass.dynamic.tfi_assignment;</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_establish_ul_tbf(ms);</span><br><span style="color: hsl(120, 100%, 40%);">+ tfi := ms.ul_tbf.tfi;</span><br><span> </span><br><span> /* Send one UL block (with TLLI since we are in One-Phase Access</span><br><span> contention resoultion) and make sure it is ACKED fine. */</span><br><span> payload := f_rnd_octstring(16); /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */</span><br><span style="color: hsl(0, 100%, 40%);">- ul_data := t_RLCMAC_UL_DATA_TLLI(</span><br><span style="color: hsl(0, 100%, 40%);">- tfi := tfi,</span><br><span style="color: hsl(0, 100%, 40%);">- cv := 15, /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */</span><br><span style="color: hsl(0, 100%, 40%);">- bsn := 0,</span><br><span style="color: hsl(0, 100%, 40%);">- blocks := { valueof(t_RLCMAC_LLCBLOCK(payload)) },</span><br><span style="color: hsl(0, 100%, 40%);">- tlli := tlli);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_tx_ul_data_block(ms, payload, cv := 15, with_tlli := true);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- f_tx_rlcmac_ul_block(ul_data, 0);</span><br><span> f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);</span><br><span> /* 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(120, 100%, 40%);">+ f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);</span><br><span> total_payload := payload;</span><br><span> </span><br><span> /* Send 2 packets, skip 1 (inc bsn) and send another one */</span><br><span> payload := f_rnd_octstring(20); /* 20 bytes fills the CS-1 llc block */</span><br><span style="color: hsl(0, 100%, 40%);">- ul_data := t_RLCMAC_UL_DATA(tfi := tfi, cv := 15, bsn := 1, blocks := {t_RLCMAC_LLCBLOCK(payload)});</span><br><span style="color: hsl(0, 100%, 40%);">- f_tx_rlcmac_ul_block(ul_data, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_tx_ul_data_block(ms, payload, cv := 15);</span><br><span> total_payload := total_payload & payload;</span><br><span> </span><br><span> payload := f_rnd_octstring(20); /* 20 bytes fills the CS-1 llc block */</span><br><span style="color: hsl(0, 100%, 40%);">- ul_data := t_RLCMAC_UL_DATA(tfi := tfi, cv := 15, bsn := 2, blocks := {t_RLCMAC_LLCBLOCK(payload)});</span><br><span style="color: hsl(0, 100%, 40%);">- f_tx_rlcmac_ul_block(ul_data, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_tx_ul_data_block(ms, payload, cv := 15);</span><br><span> total_payload := total_payload & payload;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- lost_payload := f_rnd_octstring(20); /* LOST PAYLOAD bsn=3, will be retransmitted, next bsn is increased +2 */</span><br><span style="color: hsl(120, 100%, 40%);">+ lost_payload := f_rnd_octstring(20);</span><br><span style="color: hsl(120, 100%, 40%);">+ ms.ul_tbf.bsn := ms.ul_tbf.bsn + 1; /* LOST PAYLOAD bsn=3, will be retransmitted, next bsn is increased +2 */</span><br><span> total_payload := total_payload & lost_payload;</span><br><span> </span><br><span> payload := f_rnd_octstring(20); /* 20 bytes fills the CS-1 llc block */</span><br><span style="color: hsl(0, 100%, 40%);">- ul_data := t_RLCMAC_UL_DATA(tfi := tfi, cv := 15, bsn := 4, blocks := {t_RLCMAC_LLCBLOCK(payload)});</span><br><span style="color: hsl(0, 100%, 40%);">- f_tx_rlcmac_ul_block(ul_data, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_tx_ul_data_block(ms, payload, cv := 15);</span><br><span> total_payload := total_payload & payload;</span><br><span> </span><br><span> /* Send enough blocks to finish the transmission (since we were sending BSN=15, send BS_CV_MAX packets) */</span><br><span style="color: hsl(0, 100%, 40%);">- total_payload := total_payload & f_tx_rlcmac_ul_n_blocks(ul_tbf_ass.dynamic.tfi_assignment, bsn, g_bs_cv_max);</span><br><span style="color: hsl(120, 100%, 40%);">+ total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, g_bs_cv_max);</span><br><span> </span><br><span> /* On CV=0, we'll receive a UL ACK asking about missing block */</span><br><span> f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);</span><br><span> /* TODO: check ack ack bitmap (URBB) */</span><br><span> ul_data := t_RLCMAC_UL_DATA(tfi := tfi, cv := 15, bsn := 3, blocks := {t_RLCMAC_LLCBLOCK(lost_payload)});</span><br><span style="color: hsl(0, 100%, 40%);">- f_tx_rlcmac_ul_block(ul_data, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_tx_ul_block(ms, ul_data);</span><br><span> </span><br><span> /* Now final ack is recieved */</span><br><span> f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);</span><br><span> /* 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(120, 100%, 40%);">+ f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);</span><br><span> </span><br><span> /* receive one message on BSSGP with all aggregated data in payload: */</span><br><span style="color: hsl(0, 100%, 40%);">- BSSGP[0].receive(tr_BSSGP_UL_UD(tlli, mp_gb_cfg.cell_id, total_payload));</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.cell_id, total_payload));</span><br><span> }</span><br><span> </span><br><span> /* Verify that if PCU doesn't get an ACK for first DL block after IMM ASS, it</span><br><span> * will retry by retransmitting both the IMM ASS + DL block after poll (ack)</span><br><span> * timeout occurs (specified by sent RRBP on DL block). */</span><br><span> 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> var RlcmacDlBlock dl_block;</span><br><span> var octetstring data := f_rnd_octstring(10);</span><br><span style="color: hsl(0, 100%, 40%);">- var boolean ok;</span><br><span> var uint32_t dl_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(120, 100%, 40%);">+ var GprsMS ms;</span><br><span> </span><br><span> /* Initialize NS/BSSGP side */</span><br><span> f_init_bssgp();</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Initialize GPRS MS side */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_gprs_ms();</span><br><span style="color: hsl(120, 100%, 40%);">+ ms := g_ms[0]; /* We only use first MS in this test */</span><br><span> </span><br><span> /* Initialize the PCU interface abstraction */</span><br><span> f_init_raw(testcasename());</span><br><span> </span><br><span> /* Establish BSSGP connection to the PCU */</span><br><span> 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(120, 100%, 40%);">+ f_bssgp_client_llgmm_assign('FFFFFFFF'O, ms.tlli);</span><br><span> </span><br><span> /* 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%);">- /* Make sure we've got a Downlink TBF assignment */</span><br><span style="color: hsl(0, 100%, 40%);">- f_imm_ass_verify_dl_tbf_ass(rr_imm_ass, dl_tbf_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);</span><br><span> </span><br><span> /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */</span><br><span> f_sleep(X2002);</span><br><span>@@ -1362,19 +1243,16 @@</span><br><span> /* Now we don't ack the dl block (emulate MS failed receiveing IMM ASS</span><br><span> * or GPRS DL, or DL ACK was lost for some reason). As a result, PCU</span><br><span> * 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%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Make sure we've got a Downlink TBF assignment */</span><br><span style="color: hsl(0, 100%, 40%);">- f_imm_ass_verify_dl_tbf_ass(rr_imm_ass, dl_tbf_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);</span><br><span> </span><br><span> /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */</span><br><span> f_sleep(X2002);</span><br><span> f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);</span><br><span> </span><br><span> /* 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),</span><br><span style="color: hsl(0, 100%, 40%);">- 0, f_dl_block_ack_fn(dl_block, dl_fn));</span><br><span style="color: hsl(120, 100%, 40%);">+ f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),</span><br><span style="color: hsl(120, 100%, 40%);">+ f_dl_block_ack_fn(dl_block, dl_fn));</span><br><span> </span><br><span> f_shutdown(__BFILE__, __LINE__, final := true);</span><br><span> }</span><br><span>@@ -1383,44 +1261,36 @@</span><br><span> testcase TC_dl_flow_more_blocks() runs on RAW_PCU_Test_CT {</span><br><span> var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);</span><br><span> var octetstring data := f_rnd_octstring(16);</span><br><span style="color: hsl(0, 100%, 40%);">- var OCT4 tlli := f_rnd_octstring(4);</span><br><span> var PacketDlAssign dl_tbf_ass;</span><br><span style="color: hsl(0, 100%, 40%);">- var GsmRrMessage rr_imm_ass;</span><br><span> var RlcmacDlBlock dl_block;</span><br><span> var uint32_t ack_fn;</span><br><span> var uint32_t fn;</span><br><span style="color: hsl(120, 100%, 40%);">+ var GprsMS ms;</span><br><span> timer T := 5.0;</span><br><span> </span><br><span> /* Initialize NS/BSSGP side */</span><br><span> f_init_bssgp();</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Initialize GPRS MS side */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_gprs_ms();</span><br><span style="color: hsl(120, 100%, 40%);">+ ms := g_ms[0]; /* We only use first MS in this test */</span><br><span> </span><br><span> /* Initialize the PCU interface abstraction */</span><br><span> f_init_raw(testcasename());</span><br><span> </span><br><span> /* Establish BSSGP connection to the PCU */</span><br><span> 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(120, 100%, 40%);">+ f_bssgp_client_llgmm_assign('FFFFFFFF'O, ms.tlli);</span><br><span> </span><br><span> /* 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%);">- /* Make sure we've got a Downlink TBF assignment with DL TFI */</span><br><span style="color: hsl(0, 100%, 40%);">- f_imm_ass_verify_dl_tbf_ass(rr_imm_ass, dl_tbf_ass);</span><br><span style="color: hsl(0, 100%, 40%);">- if (not ispresent(dl_tbf_ass.group1)) {</span><br><span style="color: hsl(0, 100%, 40%);">- setverdict(fail, "Immediate Assignment contains no DL TFI");</span><br><span style="color: hsl(0, 100%, 40%);">- f_shutdown(__BFILE__, __LINE__);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Get DL TFI from received Downlink TBF assignment */</span><br><span style="color: hsl(0, 100%, 40%);">- var uint5_t tfi := dl_tbf_ass.group1.tfi_assignment;</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);</span><br><span> </span><br><span> /* Wait timer X2002 and DL block is available after CCCH IMM ASS */</span><br><span> f_sleep(X2002);</span><br><span> </span><br><span> /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */</span><br><span> f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);</span><br><span style="color: hsl(0, 100%, 40%);">- f_acknackdesc_ack_block(ack_nack_desc, dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);</span><br><span> </span><br><span> /* TDMA frame number on which we are supposed to send the ACK */</span><br><span> ack_fn := f_dl_block_ack_fn(dl_block, fn);</span><br><span>@@ -1428,30 +1298,30 @@</span><br><span> /* SGSN sends more blocks during the indicated RRBP */</span><br><span> for (var integer bsn := 1; bsn < 63; bsn := bsn + 1) {</span><br><span> data := f_rnd_octstring(16); /* Random LLC data */</span><br><span style="color: hsl(0, 100%, 40%);">- BSSGP[0].send(ts_BSSGP_DL_UD(tlli, data));</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));</span><br><span> </span><br><span> f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, bsn);</span><br><span> </span><br><span> /* Make sure this block has the same TFI as was assigned</span><br><span> * FIXME: this is only valid for GPRS, not EGPRS. */</span><br><span style="color: hsl(0, 100%, 40%);">- if (dl_block.data.mac_hdr.hdr_ext.tfi != tfi) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (dl_block.data.mac_hdr.hdr_ext.tfi != ms.dl_tbf.tfi) {</span><br><span> setverdict(fail, "Rx DL data block with unexpected TFI: ",</span><br><span> dl_block.data.mac_hdr.hdr_ext.tfi);</span><br><span> f_shutdown(__BFILE__, __LINE__);</span><br><span> }</span><br><span> </span><br><span> /* Keep Ack/Nack description updated */</span><br><span style="color: hsl(0, 100%, 40%);">- f_acknackdesc_ack_block(ack_nack_desc, dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);</span><br><span> </span><br><span> /* Break if this is the end of RRBP */</span><br><span> if (fn == ack_fn) {</span><br><span style="color: hsl(0, 100%, 40%);">- ack_nack_desc.final_ack := '1'B;</span><br><span style="color: hsl(120, 100%, 40%);">+ ms.dl_tbf.acknack_desc.final_ack := '1'B;</span><br><span> break;</span><br><span> }</span><br><span> }</span><br><span> </span><br><span> /* This is the end of RRBP, send Packet Downlink Ack/Nack */</span><br><span style="color: hsl(0, 100%, 40%);">- f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(tfi, ack_nack_desc), fn := fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc), fn := fn);</span><br><span> </span><br><span> /* Make sure that the next block (after the Ack) is dummy */</span><br><span> f_rx_rlcmac_dl_block_exp_dummy(dl_block);</span><br><span>@@ -1491,34 +1361,27 @@</span><br><span> * 3. Expect a Paging Frame</span><br><span> */</span><br><span> 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> 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> var MobileIdentityLV mi;</span><br><span> var octetstring mi_enc_lv;</span><br><span> var hexstring imsi := f_gen_imsi(42);</span><br><span style="color: hsl(120, 100%, 40%);">+ var GprsMS ms;</span><br><span> </span><br><span> /* Initialize NS/BSSGP side */</span><br><span> f_init_bssgp();</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Initialize GPRS MS side */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_gprs_ms();</span><br><span style="color: hsl(120, 100%, 40%);">+ ms := g_ms[0]; /* We only use first MS in this test */</span><br><span> </span><br><span> /* Initialize the PCU interface abstraction */</span><br><span> f_init_raw(testcasename());</span><br><span> </span><br><span> /* Establish BSSGP connection to the PCU */</span><br><span> 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(120, 100%, 40%);">+ f_bssgp_client_llgmm_assign('FFFFFFFF'O, ms.tlli);</span><br><span> </span><br><span> /* 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%);">- f_shutdown(__BFILE__, __LINE__);</span><br><span 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've got an Uplink TBF assignment */</span><br><span style="color: hsl(0, 100%, 40%);">- f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_establish_ul_tbf(ms);</span><br><span> </span><br><span> /* build mobile Identity */</span><br><span> mi := valueof(ts_MI_IMSI_LV(imsi));</span><br><span>@@ -1540,33 +1403,26 @@</span><br><span> */</span><br><span> private function f_tc_paging_cs_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)</span><br><span> 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> 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> var hexstring imsi := f_gen_imsi(42);</span><br><span> var GsmTmsi tmsi;</span><br><span style="color: hsl(120, 100%, 40%);">+ var GprsMS ms;</span><br><span> </span><br><span> /* Initialize NS/BSSGP side */</span><br><span> f_init_bssgp();</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Initialize GPRS MS side */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_gprs_ms();</span><br><span style="color: hsl(120, 100%, 40%);">+ ms := g_ms[0]; /* We only use first MS in this test */</span><br><span> </span><br><span> /* Initialize the PCU interface abstraction */</span><br><span> f_init_raw(testcasename());</span><br><span> </span><br><span> /* Establish BSSGP connection to the PCU */</span><br><span> 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(120, 100%, 40%);">+ f_bssgp_client_llgmm_assign('FFFFFFFF'O, ms.tlli);</span><br><span> </span><br><span> /* 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%);">- f_shutdown(__BFILE__, __LINE__);</span><br><span 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've got an Uplink TBF assignment */</span><br><span style="color: hsl(0, 100%, 40%);">- f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_establish_ul_tbf(ms);</span><br><span> </span><br><span> /* Send paging request with or without TMSI */</span><br><span> if (use_ptmsi) {</span><br><span>@@ -1605,19 +1461,22 @@</span><br><span> */</span><br><span> private function f_tc_paging_ps_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)</span><br><span> runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">- var OCT4 tlli := '00000001'O;</span><br><span> var integer imsi_suff_tx := 423;</span><br><span> var hexstring imsi := f_gen_imsi(imsi_suff_tx);</span><br><span style="color: hsl(120, 100%, 40%);">+ var GprsMS ms;</span><br><span> </span><br><span> /* Initialize NS/BSSGP side */</span><br><span> f_init_bssgp();</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Initialize GPRS MS side */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_gprs_ms();</span><br><span style="color: hsl(120, 100%, 40%);">+ ms := g_ms[0]; /* We only use first MS in this test */</span><br><span> </span><br><span> /* Initialize the PCU interface abstraction */</span><br><span> f_init_raw(testcasename());</span><br><span> </span><br><span> /* Establish BSSGP connection to the PCU */</span><br><span> 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(120, 100%, 40%);">+ f_bssgp_client_llgmm_assign('FFFFFFFF'O, ms.tlli);</span><br><span> </span><br><span> /* Send BSSGP PAGING-PS (with or without TMSI), wait for RR Paging Request Type 1.</span><br><span> * Make sure that both paging group (IMSI suffix) and Mobile Identity match. */</span><br><span>@@ -1646,23 +1505,20 @@</span><br><span> }</span><br><span> </span><br><span> 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(120, 100%, 40%);">+ template GsmRrMessage t_imm_ass := ?)</span><br><span> runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">- var GsmRrMessage rr_msg;</span><br><span> var uint16_t ra11;</span><br><span style="color: hsl(0, 100%, 40%);">- var boolean ok;</span><br><span style="color: hsl(120, 100%, 40%);">+ var GprsMS ms;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ ms := g_ms[0]; /* We only use first MS in this test */</span><br><span> </span><br><span> ra11 := enc_EGPRSPktChRequest2uint(req);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_use_ra(ms, ra11, ra_is_11bit := 1);</span><br><span> log("Sending EGPRS Packet Channel Request (", ra11, "): ", req);</span><br><span> </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%);">- f_shutdown(__BFILE__, __LINE__);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_establish_ul_tbf(ms);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (not match(rr_msg, t_imm_ass)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (not match(ms.ul_tbf.rr_imm_ass, t_imm_ass)) {</span><br><span> setverdict(fail, "Immediate Assignment does not match");</span><br><span> f_shutdown(__BFILE__, __LINE__);</span><br><span> }</span><br><span>@@ -1675,6 +1531,9 @@</span><br><span> var template IaRestOctets rest;</span><br><span> var template EgprsUlAss ul_ass;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Initialize GPRS MS side */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_gprs_ms();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Initialize the PCU interface abstraction */</span><br><span> f_init_raw(testcasename());</span><br><span> </span><br><span>@@ -1703,6 +1562,9 @@</span><br><span> var template IaRestOctets rest;</span><br><span> var template EgprsUlAss ul_ass;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Initialize GPRS MS side */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_gprs_ms();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Initialize the PCU interface abstraction */</span><br><span> f_init_raw(testcasename());</span><br><span> </span><br><span>@@ -1737,6 +1599,9 @@</span><br><span> var template IaRestOctets rest;</span><br><span> var template EgprsUlAss ul_ass;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Initialize GPRS MS side */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_gprs_ms();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Initialize the PCU interface abstraction */</span><br><span> f_init_raw(testcasename());</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/18370">change 18370</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/+/18370"/><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: Ib3fee37580f0ea0530a659dec83656799bf57288 </div>
<div style="display:none"> Gerrit-Change-Number: 18370 </div>
<div style="display:none"> Gerrit-PatchSet: 8 </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>