<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/21093">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">pcu: Specify (M)CS to use when sending UL rlcmac data blocks<br><br>Apply padding and spare bits in the encoder according to CS/MCS format.<br><br>Change-Id: I918acac81f550077daeda3374b3de9b426ff3572<br>---<br>M library/RLCMAC_EncDec.cc<br>M library/RLCMAC_Templates.ttcn<br>M library/RLCMAC_Types.ttcn<br>M pcu/GPRS_Components.ttcn<br>M pcu/GPRS_TBF.ttcn<br>M pcu/PCU_Tests.ttcn<br>6 files changed, 171 insertions(+), 58 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/93/21093/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/library/RLCMAC_EncDec.cc b/library/RLCMAC_EncDec.cc</span><br><span>index 4dba35a..ea93de4 100644</span><br><span>--- a/library/RLCMAC_EncDec.cc</span><br><span>+++ b/library/RLCMAC_EncDec.cc</span><br><span>@@ -438,6 +438,28 @@</span><br><span>     dst_ttcn_buffer.increase_length(length_bytes);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Append padding bytes and spare bits at the end of ttcn_buffer, based on requested CS */</span><br><span style="color: hsl(120, 100%, 40%);">+static void encode_trailing_padding_spb(TTCN_Buffer& ttcn_buffer, CodingScheme cs)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t buf[256]; /* enough to fit any RLCMAC buffer*/</span><br><span style="color: hsl(120, 100%, 40%);">+        uint32_t blk_len = RLCMAC__Templates::f__rlcmac__cs__mcs2block__len(cs);</span><br><span style="color: hsl(120, 100%, 40%);">+      uint32_t blk_len_no_spb = RLCMAC__Templates::f__rlcmac__cs__mcs2block__len__no__spare__bits(cs);</span><br><span style="color: hsl(120, 100%, 40%);">+      uint32_t data_len = ttcn_buffer.get_len();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (data_len > blk_len_no_spb) {</span><br><span style="color: hsl(120, 100%, 40%);">+           fprintf(stderr, "Buffer too large for requested CS! %s (%s:%u)\n", __func__, __FILE__, __LINE__);</span><br><span style="color: hsl(120, 100%, 40%);">+           // TODO: throw exception?</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   for (int i = 0; i < blk_len_no_spb - data_len; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+                buf[i] = 0x2b; /* Padding bits if needed */</span><br><span style="color: hsl(120, 100%, 40%);">+   for (int i = blk_len_no_spb - data_len; i < blk_len - data_len; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+               buf[i] = 0x00;  /* Spare bits if needed */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  const OCTETSTRING& pad_octstr = OCTETSTRING(blk_len - data_len, buf);</span><br><span style="color: hsl(120, 100%, 40%);">+     ttcn_buffer.put_string(pad_octstr);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /////////////////////</span><br><span> // DECODE</span><br><span> /////////////////////</span><br><span>@@ -970,6 +992,8 @@</span><br><span>                }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ encode_trailing_padding_spb(ttcn_buffer, in.cs());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         ttcn_buffer.get_string(ret_val);</span><br><span>     return ret_val;</span><br><span> }</span><br><span>@@ -1040,6 +1064,8 @@</span><br><span>                 }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ encode_trailing_padding_spb(ttcn_buffer, in.mcs());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>        ttcn_buffer.get_string(ret_val);</span><br><span>     return ret_val;</span><br><span> }</span><br><span>@@ -1133,6 +1159,8 @@</span><br><span>                 }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ encode_trailing_padding_spb(ttcn_buffer, in.cs());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         ttcn_buffer.get_string(ret_val);</span><br><span>     return ret_val;</span><br><span> }</span><br><span>@@ -1320,6 +1348,8 @@</span><br><span>         put_egprs_data_block(aligned_buffer, data_block_offsets[0], data_block_bits, ttcn_buffer);</span><br><span>   //printbuffer("after merging data block", ttcn_buffer);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ encode_trailing_padding_spb(ttcn_buffer, in.mcs());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>        ttcn_buffer.get_string(ret_val);</span><br><span>     return ret_val;</span><br><span> }</span><br><span>diff --git a/library/RLCMAC_Templates.ttcn b/library/RLCMAC_Templates.ttcn</span><br><span>index 9722f43..f016c4d 100644</span><br><span>--- a/library/RLCMAC_Templates.ttcn</span><br><span>+++ b/library/RLCMAC_Templates.ttcn</span><br><span>@@ -38,6 +38,13 @@</span><br><span>           return (current_fn + f_rrbp_fn_delay(rrbp)) mod 2715648;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ function f_rlcmac_cs_mcs_is_mcs(CodingScheme cs_mcs) return boolean {</span><br><span style="color: hsl(120, 100%, 40%);">+         if (cs_mcs >= MCS_0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     return true;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+             return false;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  function f_rlcmac_mcs2headertype(CodingScheme mcs) return EgprsHeaderType {</span><br><span>          select (mcs) {</span><br><span>               case (MCS_0) { return RLCMAC_HDR_TYPE_3; }</span><br><span>@@ -97,7 +104,27 @@</span><br><span>             return CS_1;</span><br><span>         }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* Minimum CodingScheme required to fit RLCMAC block */</span><br><span style="color: hsl(120, 100%, 40%);">+       function f_rlcmac_cs_mcs2block_len_no_spare_bits(CodingScheme cs_mcs) return uint32_t {</span><br><span style="color: hsl(120, 100%, 40%);">+               select (cs_mcs) {</span><br><span style="color: hsl(120, 100%, 40%);">+             /* 3GPP TS 44.060 Table 10.2.1: RLC data block size, discounting padding in octet */</span><br><span style="color: hsl(120, 100%, 40%);">+          case (CS_1) { return 23; }</span><br><span style="color: hsl(120, 100%, 40%);">+            case (CS_2) { return 33; }</span><br><span style="color: hsl(120, 100%, 40%);">+            case (CS_3) { return 39; }</span><br><span style="color: hsl(120, 100%, 40%);">+            case (CS_4) { return 53; }</span><br><span style="color: hsl(120, 100%, 40%);">+            case (MCS_1) { return 27; }</span><br><span style="color: hsl(120, 100%, 40%);">+           case (MCS_2) { return 33; }</span><br><span style="color: hsl(120, 100%, 40%);">+           case (MCS_3) { return 42; }</span><br><span style="color: hsl(120, 100%, 40%);">+           case (MCS_4) { return 49; }</span><br><span style="color: hsl(120, 100%, 40%);">+           case (MCS_5) { return 61; }</span><br><span style="color: hsl(120, 100%, 40%);">+           case (MCS_6) { return 79; }</span><br><span style="color: hsl(120, 100%, 40%);">+           case (MCS_7) { return 119; }</span><br><span style="color: hsl(120, 100%, 40%);">+          case (MCS_8) { return 143; }</span><br><span style="color: hsl(120, 100%, 40%);">+          case (MCS_9) { return 155; }</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+             return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Minimum CodingScheme required to fit RLCMAC block. Spare bits not counted. */</span><br><span>     function f_rlcmac_block_len_required_cs_mcs(uint32_t len, boolean is_mcs) return CodingScheme {</span><br><span>              if (is_mcs) {</span><br><span>                        if (len <= 27) { return MCS_1; }</span><br><span>@@ -375,10 +402,11 @@</span><br><span>  }</span><br><span> </span><br><span>        /* Template for uplink Data block */</span><br><span style="color: hsl(0, 100%, 40%);">-    template RlcmacUlBlock t_RLCMAC_UL_DATA(template uint5_t tfi, template uint4_t cv, template uint7_t bsn,</span><br><span style="color: hsl(120, 100%, 40%);">+      template RlcmacUlBlock t_RLCMAC_UL_DATA(template CodingScheme cs, template uint5_t tfi,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               template uint4_t cv, template uint7_t bsn,</span><br><span>                                           template LlcBlocks blocks := {}, template boolean stall := false) := {</span><br><span>               data := {</span><br><span style="color: hsl(0, 100%, 40%);">-                       cs := CS_1, /* TODO: make this available to template */</span><br><span style="color: hsl(120, 100%, 40%);">+                       cs := cs,</span><br><span>                    mac_hdr := {</span><br><span>                                 payload_type := MAC_PT_RLC_DATA,</span><br><span>                             countdown := cv,</span><br><span>@@ -396,10 +424,12 @@</span><br><span>                     blocks := blocks</span><br><span>             }</span><br><span>    }</span><br><span style="color: hsl(0, 100%, 40%);">-       template RlcmacUlBlock t_RLCMAC_UL_DATA_TLLI(template uint5_t tfi, template uint4_t cv, template uint7_t bsn,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                template LlcBlocks blocks := {}, template boolean stall := false, template GprsTlli tlli) := {</span><br><span style="color: hsl(120, 100%, 40%);">+   template RlcmacUlBlock t_RLCMAC_UL_DATA_TLLI(template CodingScheme cs, template uint5_t tfi,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               template uint4_t cv, template uint7_t bsn,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    template LlcBlocks blocks := {}, template boolean stall := false,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     template GprsTlli tlli) := {</span><br><span>            data := {</span><br><span style="color: hsl(0, 100%, 40%);">-                       cs := CS_1, /* TODO: make this available to template */</span><br><span style="color: hsl(120, 100%, 40%);">+                       cs := cs,</span><br><span>                    mac_hdr := {</span><br><span>                                 payload_type := MAC_PT_RLC_DATA,</span><br><span>                             countdown := cv,</span><br><span>diff --git a/library/RLCMAC_Types.ttcn b/library/RLCMAC_Types.ttcn</span><br><span>index eb9d845..3110a66 100644</span><br><span>--- a/library/RLCMAC_Types.ttcn</span><br><span>+++ b/library/RLCMAC_Types.ttcn</span><br><span>@@ -115,6 +115,11 @@</span><br><span>             DlCtrlOptOctets         opt optional,</span><br><span>                RlcmacDlCtrlMsg         payload</span><br><span>      } with {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Automatic padding by RAW encoder seems to causing problems</span><br><span style="color: hsl(120, 100%, 40%);">+          * due to padding sequence 2b inserted shifted from octet</span><br><span style="color: hsl(120, 100%, 40%);">+              * boundary on some messags. See UL CTRL blocks in TC_t3193.</span><br><span style="color: hsl(120, 100%, 40%);">+           * See 3GPP TS 44.060 Figure 11.1 (below)</span><br><span style="color: hsl(120, 100%, 40%);">+              * variant "PADDING(184), PADDING_PATTERN('00101011'B)" */</span><br><span>                 variant (opt) "PRESENCE(mac_hdr.payload_type = MAC_PT_RLCMAC_OPT)"</span><br><span>         };</span><br><span> </span><br><span>@@ -133,7 +138,14 @@</span><br><span>        type record RlcmacUlCtrlBlock {</span><br><span>              UlMacCtrlHeader         mac_hdr,</span><br><span>             RlcmacUlCtrlMsg         payload</span><br><span style="color: hsl(0, 100%, 40%);">- } with { variant "" };</span><br><span style="color: hsl(120, 100%, 40%);">+      } with {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Automatic padding by RAW encoder seems to causing problems</span><br><span style="color: hsl(120, 100%, 40%);">+          * due to padding sequence 2b inserted shifted from octet</span><br><span style="color: hsl(120, 100%, 40%);">+              * boundary on some messags. See UL CTRL blocks in TC_t3193.</span><br><span style="color: hsl(120, 100%, 40%);">+           * See 3GPP TS 44.060 Figure 11.1 (below)</span><br><span style="color: hsl(120, 100%, 40%);">+              * variant "PADDING(184), PADDING_PATTERN('00101011'B)" */</span><br><span style="color: hsl(120, 100%, 40%);">+           variant ""</span><br><span style="color: hsl(120, 100%, 40%);">+         };</span><br><span> </span><br><span>       external function enc_RlcmacUlCtrlBlock(in RlcmacUlCtrlBlock si) return octetstring</span><br><span>          with { extension "prototype(convert) encode(RAW)" };</span><br><span>diff --git a/pcu/GPRS_Components.ttcn b/pcu/GPRS_Components.ttcn</span><br><span>index 1cbca4c..0f46490 100644</span><br><span>--- a/pcu/GPRS_Components.ttcn</span><br><span>+++ b/pcu/GPRS_Components.ttcn</span><br><span>@@ -432,6 +432,24 @@</span><br><span>   return n;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+function f_ultbf_payload_fill_length(UlTbf ul_tbf, boolean tlli := false, integer li_bytes := 0)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on MS_BTS_IFACE_CT return uint32_t {</span><br><span style="color: hsl(120, 100%, 40%);">+       var uint32_t blk_len := f_rlcmac_cs_mcs2block_len_no_spare_bits(ul_tbf.tx_cs_mcs);</span><br><span style="color: hsl(120, 100%, 40%);">+    var uint32_t payload_fill_len;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      if (f_rlcmac_cs_mcs_is_mcs(ul_tbf.tx_cs_mcs)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               payload_fill_len := blk_len - 5 - li_bytes;</span><br><span style="color: hsl(120, 100%, 40%);">+   } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* GPRS: blk_len = 3 Header bytes + payload length. No LI byte in this case. */</span><br><span style="color: hsl(120, 100%, 40%);">+               payload_fill_len := blk_len - 3 - li_bytes;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (tlli) {</span><br><span style="color: hsl(120, 100%, 40%);">+           payload_fill_len := payload_fill_len - 4;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     return payload_fill_len;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> function f_ms_use_ra(inout GprsMS ms, uint16_t ra, uint8_t ra_is_11bit := 0)</span><br><span> runs on MS_BTS_IFACE_CT {</span><br><span>   ms.ra_is_11bit := ra_is_11bit;</span><br><span>@@ -507,53 +525,57 @@</span><br><span> function f_ms_tx_ul_block(inout GprsMS ms, template (value) RlcmacUlBlock ul_data,</span><br><span>                           uint32_t fn := 0, template (omit) CodingScheme force_cs_mcs := omit,</span><br><span>                         template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on MS_BTS_IFACE_CT return integer {</span><br><span style="color: hsl(120, 100%, 40%);">+runs on MS_BTS_IFACE_CT {</span><br><span>      var octetstring data;</span><br><span style="color: hsl(0, 100%, 40%);">-   var integer padding_len;</span><br><span>     var CodingScheme cs_mcs;</span><br><span>     var uint32_t cs_mcs_len;</span><br><span> </span><br><span>         /* Encode the payload of DATA.ind */</span><br><span>         data := enc_RlcmacUlBlock(valueof(ul_data));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        if (ispresent(force_cs_mcs)) {</span><br><span style="color: hsl(0, 100%, 40%);">-          cs_mcs := valueof(force_cs_mcs);</span><br><span style="color: hsl(0, 100%, 40%);">-        } else if (ischosen(ul_data.ctrl)) {</span><br><span style="color: hsl(0, 100%, 40%);">-            cs_mcs := CS_1; /* CTRL is always CS1 */</span><br><span style="color: hsl(0, 100%, 40%);">-        } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                /* Add padding to encode payload to minimum required CS/MCS: */</span><br><span style="color: hsl(0, 100%, 40%);">-         cs_mcs := f_rlcmac_block_len_required_cs_mcs(lengthof(data), ischosen(ul_data.data_egprs));</span><br><span style="color: hsl(120, 100%, 40%);">+   if (ischosen(ul_data.ctrl)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         /* Ctrl blocks are right now encoded by RAW encoder, which was</span><br><span style="color: hsl(120, 100%, 40%);">+                 * found to have some issue with final padding, so we add it</span><br><span style="color: hsl(120, 100%, 40%);">+           * here manually. This is actually still incorrect because the</span><br><span style="color: hsl(120, 100%, 40%);">+                 * remaining bits of last octet with data are not filled with</span><br><span style="color: hsl(120, 100%, 40%);">+          * the padding sequence, but it's good enough since anyway PCU</span><br><span style="color: hsl(120, 100%, 40%);">+             * don't check these. */</span><br><span style="color: hsl(120, 100%, 40%);">+          data := f_pad_oct(data, f_rlcmac_cs_mcs2block_len(CS_1), '2b'O);</span><br><span>     }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       cs_mcs_len := f_rlcmac_cs_mcs2block_len(cs_mcs);</span><br><span style="color: hsl(0, 100%, 40%);">-        padding_len := cs_mcs_len - lengthof(data);</span><br><span style="color: hsl(0, 100%, 40%);">-     if (padding_len < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-               setverdict(fail, "Unable to encode UL block of size ", lengthof(data), " with ", cs_mcs);</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%);">-       data := f_pad_oct(data, cs_mcs_len, '00'O);</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>     f_ms_tx_data_ind(ms, data, fn, nr := nr);</span><br><span style="color: hsl(0, 100%, 40%);">-       return padding_len;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* FIXME: Only supports sending CS-1 so far */</span><br><span> function f_ms_tx_ul_data_block(inout GprsMS ms, octetstring payload,</span><br><span>                          uint4_t cv := 15, boolean with_tlli := false, uint32_t fn := 0,</span><br><span>                              template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on MS_BTS_IFACE_CT return integer {</span><br><span style="color: hsl(120, 100%, 40%);">+runs on MS_BTS_IFACE_CT {</span><br><span>         var template (value) RlcmacUlBlock ul_data;</span><br><span style="color: hsl(0, 100%, 40%);">-     ul_data := t_RLCMAC_UL_DATA(tfi := ms.ul_tbf.tfi,</span><br><span style="color: hsl(0, 100%, 40%);">-                                   cv := cv,</span><br><span style="color: hsl(0, 100%, 40%);">-                               bsn := ms.ul_tbf.bsn,</span><br><span style="color: hsl(0, 100%, 40%);">-                                   blocks := {t_RLCMAC_LLCBLOCK(payload)});</span><br><span style="color: hsl(0, 100%, 40%);">-    if (with_tlli) {</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 := ms.tlli;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (f_rlcmac_cs_mcs_is_mcs(ms.ul_tbf.tx_cs_mcs)) {</span><br><span style="color: hsl(120, 100%, 40%);">+            ul_data := t_RLCMAC_UL_EGPRS_DATA(mcs := ms.ul_tbf.tx_cs_mcs,</span><br><span style="color: hsl(120, 100%, 40%);">+                                           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%);">+                                             bsn1 := ms.ul_tbf.bsn,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                bsn2_offset := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             blocks := {t_RLCMAC_LLCBLOCK_EGPRS(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_egprs.tlli_ind := true;</span><br><span style="color: hsl(120, 100%, 40%);">+                  ul_data.data_egprs.tlli := ms.tlli;</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%);">+              ul_data := t_RLCMAC_UL_DATA(cs := ms.ul_tbf.tx_cs_mcs,</span><br><span style="color: hsl(120, 100%, 40%);">+                                            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>    }</span><br><span>    f_ultbf_inc_bsn(ms.ul_tbf);</span><br><span style="color: hsl(0, 100%, 40%);">-     return f_ms_tx_ul_block(ms, ul_data, fn, nr := nr);</span><br><span style="color: hsl(120, 100%, 40%);">+   f_ms_tx_ul_block(ms, ul_data, fn, nr := nr);</span><br><span> }</span><br><span> </span><br><span> /* Send random payload for last "num_blocks" blocks in Ul TBF (ending with CV=0). */</span><br><span>@@ -561,17 +583,17 @@</span><br><span>                                   template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum)</span><br><span> runs on MS_BTS_IFACE_CT return octetstring {</span><br><span>      var octetstring total_payload := ''O;</span><br><span style="color: hsl(120, 100%, 40%);">+ var uint32_t payload_fill_len := f_ultbf_payload_fill_length(ms.ul_tbf, with_tlli, 0);</span><br><span> </span><br><span>   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(120, 100%, 40%);">+               var octetstring payload := f_rnd_octstring(payload_fill_len);</span><br><span>                /* Prepare a new UL block (CV, random payload) */</span><br><span>            var integer cv := num_blocks - i - 1;</span><br><span>                if (cv > g_bs_cv_max) {</span><br><span>                   cv := 15;</span><br><span>            }</span><br><span style="color: hsl(0, 100%, 40%);">-               padding_len := f_ms_tx_ul_data_block(ms, payload, cv := cv, with_tlli := with_tlli, nr := nr);</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(120, 100%, 40%);">+                f_ms_tx_ul_data_block(ms, payload, cv := cv, with_tlli := with_tlli, nr := nr);</span><br><span style="color: hsl(120, 100%, 40%);">+               total_payload := total_payload & payload;</span><br><span>        }</span><br><span>    return total_payload;</span><br><span> }</span><br><span>diff --git a/pcu/GPRS_TBF.ttcn b/pcu/GPRS_TBF.ttcn</span><br><span>index fb42097..f946f29 100644</span><br><span>--- a/pcu/GPRS_TBF.ttcn</span><br><span>+++ b/pcu/GPRS_TBF.ttcn</span><br><span>@@ -326,10 +326,10 @@</span><br><span> </span><br><span>      /* include TLLI when needed */</span><br><span>       if (tlli_needed) {</span><br><span style="color: hsl(0, 100%, 40%);">-              blk := valueof(t_RLCMAC_UL_DATA_TLLI(us.tfi, cv, us.et.v_s,</span><br><span style="color: hsl(120, 100%, 40%);">+           blk := valueof(t_RLCMAC_UL_DATA_TLLI(CS_1, us.tfi, cv, us.et.v_s,</span><br><span>                                            llc_blocks, false, mmctx.tlli));</span><br><span>     } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                blk := valueof(t_RLCMAC_UL_DATA(us.tfi, cv, us.et.v_s, llc_blocks, false));</span><br><span style="color: hsl(120, 100%, 40%);">+           blk := valueof(t_RLCMAC_UL_DATA(CS_1, us.tfi, cv, us.et.v_s, llc_blocks, false));</span><br><span>    }</span><br><span> </span><br><span>        /* Increment Block Sequence Number */</span><br><span>diff --git a/pcu/PCU_Tests.ttcn b/pcu/PCU_Tests.ttcn</span><br><span>index 4df040e..5be63b2 100644</span><br><span>--- a/pcu/PCU_Tests.ttcn</span><br><span>+++ b/pcu/PCU_Tests.ttcn</span><br><span>@@ -97,7 +97,7 @@</span><br><span>       dl_tbf_ext := 250 * 10, /* ms */</span><br><span>     ul_tbf_ext := 250 * 10, /* ms */</span><br><span>     initial_cs := 2,</span><br><span style="color: hsl(0, 100%, 40%);">-        initial_mcs := 6,</span><br><span style="color: hsl(120, 100%, 40%);">+     initial_mcs := 1,</span><br><span>    nsvci := { mp_nsconfig.nsvci, 0 },</span><br><span>   local_port := { mp_nsconfig.provider.ip.remote_udp_port, 0 },</span><br><span>        remote_port := { mp_nsconfig.provider.ip.local_udp_port, 0 },</span><br><span>@@ -1085,7 +1085,7 @@</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(120, 100%, 40%);">+ total_payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true));</span><br><span>      /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */</span><br><span>  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>@@ -1114,6 +1114,8 @@</span><br><span>       var template (value) RlcmacUlBlock ul_data;</span><br><span>  var template (value) LlcBlockHdr blk_hdr;</span><br><span>    var template (value) LlcBlocks blocks;</span><br><span style="color: hsl(120, 100%, 40%);">+        var integer blk_len;</span><br><span style="color: hsl(120, 100%, 40%);">+  var CodingScheme tx_cs;</span><br><span>      var GprsMS ms;</span><br><span> </span><br><span>   /* Initialize NS/BSSGP side */</span><br><span>@@ -1139,7 +1141,8 @@</span><br><span>                                        more := false, e := true);</span><br><span>  blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };</span><br><span>   /* 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%);">-     ul_data := t_RLCMAC_UL_DATA_TLLI(tfi := ms.ul_tbf.tfi,</span><br><span style="color: hsl(120, 100%, 40%);">+        ul_data := t_RLCMAC_UL_DATA_TLLI(cs := ms.ul_tbf.tx_cs_mcs,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    tfi := ms.ul_tbf.tfi,</span><br><span>                                        cv := 15,</span><br><span>                                    bsn := ms.ul_tbf.bsn,</span><br><span>                                        blocks := blocks,</span><br><span>@@ -1166,12 +1169,15 @@</span><br><span>                         cv := max_size - i;</span><br><span>          }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+         blk_len := 3 + 1 + i; /* 3 Header bytes + LI byte + payload length */</span><br><span style="color: hsl(120, 100%, 40%);">+         tx_cs := f_rlcmac_block_len_required_cs_mcs(blk_len, false);</span><br><span>                 payload := f_rnd_octstring(i);</span><br><span>               blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),</span><br><span>                                             more := false, e := true);</span><br><span>          blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };</span><br><span>           /* 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%);">-             ul_data := t_RLCMAC_UL_DATA(tfi := ms.ul_tbf.tfi,</span><br><span style="color: hsl(120, 100%, 40%);">+             ul_data := t_RLCMAC_UL_DATA(cs := tx_cs,</span><br><span style="color: hsl(120, 100%, 40%);">+                                          tfi := ms.ul_tbf.tfi,</span><br><span>                                        cv := cv,</span><br><span>                                            bsn := ms.ul_tbf.bsn,</span><br><span>                                        blocks := blocks);</span><br><span>@@ -1218,7 +1224,8 @@</span><br><span>       blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),</span><br><span>                                     more := false, e := true);</span><br><span>  blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };</span><br><span style="color: hsl(0, 100%, 40%);">-      ul_data := t_RLCMAC_UL_DATA_TLLI(tfi := ms.ul_tbf.tfi,</span><br><span style="color: hsl(120, 100%, 40%);">+        ul_data := t_RLCMAC_UL_DATA_TLLI(cs := cs,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     tfi := ms.ul_tbf.tfi,</span><br><span>                                        cv := cv,</span><br><span>                                    bsn := ms.ul_tbf.bsn,</span><br><span>                                        blocks := blocks,</span><br><span>@@ -1368,7 +1375,7 @@</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_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);  /* 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);</span><br><span> </span><br><span>   /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */</span><br><span>       f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);</span><br><span>@@ -1524,6 +1531,7 @@</span><br><span>       var octetstring lost_payload;</span><br><span>        var uint5_t tfi;</span><br><span>     var GprsMS ms;</span><br><span style="color: hsl(120, 100%, 40%);">+        var uint32_t payload_fill_len;</span><br><span> </span><br><span>   /* Initialize NS/BSSGP side */</span><br><span>       f_init_bssgp();</span><br><span>@@ -1544,7 +1552,7 @@</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%);">-    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%);">+       payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true)); /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */</span><br><span>    f_ms_tx_ul_data_block(ms, payload, cv := 15, with_tlli := true);</span><br><span> </span><br><span>         f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);</span><br><span>@@ -1552,20 +1560,22 @@</span><br><span>     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 style="color: hsl(120, 100%, 40%);">+ payload_fill_len := f_ultbf_payload_fill_length(ms.ul_tbf);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>        /* Send 2 packets, skip 1 (inc bsn) and send another one */</span><br><span style="color: hsl(0, 100%, 40%);">-     payload := f_rnd_octstring(20); /* 20 bytes fills the CS-1 llc block */</span><br><span style="color: hsl(120, 100%, 40%);">+       payload := f_rnd_octstring(payload_fill_len);</span><br><span>        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%);">-       payload := f_rnd_octstring(20); /* 20 bytes fills the CS-1 llc block */</span><br><span style="color: hsl(120, 100%, 40%);">+       payload := f_rnd_octstring(payload_fill_len);</span><br><span>        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);</span><br><span style="color: hsl(120, 100%, 40%);">+  lost_payload := f_rnd_octstring(payload_fill_len);</span><br><span>   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 style="color: hsl(0, 100%, 40%);">-  payload := f_rnd_octstring(20); /* 20 bytes fills the CS-1 llc block */</span><br><span style="color: hsl(120, 100%, 40%);">+       payload := f_rnd_octstring(payload_fill_len)</span><br><span>         f_ms_tx_ul_data_block(ms, payload, cv := 15);</span><br><span>        total_payload := total_payload & payload;</span><br><span> </span><br><span>@@ -1575,7 +1585,11 @@</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 style="color: hsl(0, 100%, 40%);">- ul_data := t_RLCMAC_UL_DATA(tfi := tfi, cv := 15, bsn := 3, blocks := {t_RLCMAC_LLCBLOCK(lost_payload)});</span><br><span style="color: hsl(120, 100%, 40%);">+     ul_data := t_RLCMAC_UL_DATA(cs := ms.ul_tbf.tx_cs_mcs,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    tfi := tfi,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   cv := 15,</span><br><span style="color: hsl(120, 100%, 40%);">+                             bsn := 3,</span><br><span style="color: hsl(120, 100%, 40%);">+                             blocks := {t_RLCMAC_LLCBLOCK(lost_payload)});</span><br><span>    f_ms_tx_ul_block(ms, ul_data);</span><br><span> </span><br><span>   /* Now final ack is recieved */</span><br><span>@@ -1760,7 +1774,8 @@</span><br><span>       */</span><br><span> </span><br><span>      /*  UL RlcDataBlock(dataA) [BSN=0, CV=3] */</span><br><span style="color: hsl(0, 100%, 40%);">-     ul_data := t_RLCMAC_UL_DATA_TLLI(tfi := ms.ul_tbf.tfi,</span><br><span style="color: hsl(120, 100%, 40%);">+        ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,</span><br><span style="color: hsl(120, 100%, 40%);">+                              tfi := ms.ul_tbf.tfi,</span><br><span>                                cv := 3,</span><br><span>                                     bsn := ms.ul_tbf.bsn,</span><br><span>                                blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 0, 16)) },</span><br><span>@@ -1772,7 +1787,8 @@</span><br><span>   f_ms_tx_ul_block(ms, ul_data);</span><br><span> </span><br><span>   /* UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2] */</span><br><span style="color: hsl(0, 100%, 40%);">-       ul_data := t_RLCMAC_UL_DATA_TLLI(tfi := ms.ul_tbf.tfi,</span><br><span style="color: hsl(120, 100%, 40%);">+        ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,</span><br><span style="color: hsl(120, 100%, 40%);">+                              tfi := ms.ul_tbf.tfi,</span><br><span>                                cv := 2,</span><br><span>                                     bsn := ms.ul_tbf.bsn,</span><br><span>                                blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 16, 4),</span><br><span>@@ -1787,7 +1803,8 @@</span><br><span>      BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, dataA));</span><br><span> </span><br><span>      /* UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1] */</span><br><span style="color: hsl(0, 100%, 40%);">-    ul_data := t_RLCMAC_UL_DATA_TLLI(tfi := ms.ul_tbf.tfi,</span><br><span style="color: hsl(120, 100%, 40%);">+        ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,</span><br><span style="color: hsl(120, 100%, 40%);">+                              tfi := ms.ul_tbf.tfi,</span><br><span>                                cv := 1,</span><br><span>                                     bsn := ms.ul_tbf.bsn,</span><br><span>                                blocks := { t_RLCMAC_LLCBLOCK(substr(dataB, 11, 2),</span><br><span>@@ -1805,7 +1822,9 @@</span><br><span>      BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, dataC));</span><br><span> </span><br><span>      /* UL RlcDataBlock(dataD finishes) [BSN=3, CV=0] */</span><br><span style="color: hsl(0, 100%, 40%);">-     ul_data := t_RLCMAC_UL_DATA_TLLI(tfi := ms.ul_tbf.tfi,</span><br><span style="color: hsl(120, 100%, 40%);">+        ul_data := t_RLCMAC_UL_DATA_TLLI(</span><br><span style="color: hsl(120, 100%, 40%);">+                                 cs := CS_1,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   tfi := ms.ul_tbf.tfi,</span><br><span>                                cv := 0,</span><br><span>                                     bsn := ms.ul_tbf.bsn,</span><br><span>                                blocks := { t_RLCMAC_LLCBLOCK(substr(dataD, 9, 3),</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/21093">change 21093</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/+/21093"/><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: I918acac81f550077daeda3374b3de9b426ff3572 </div>
<div style="display:none"> Gerrit-Change-Number: 21093 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </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-MessageType: newchange </div>