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