<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/17992">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">RLCMAC_EncDec.cc: Fix egprs data block encode alignment<br><br>Selftests I'm using in the pcu testsuite to verify encoding are attached<br>too.<br><br>Change-Id: Id0e21248853eb5fac89e863822804cfbecf3c865<br>---<br>M library/RLCMAC_EncDec.cc<br>M library/RLCMAC_Templates.ttcn<br>M pcu/PCU_Tests.ttcn<br>M pcu/PCU_selftest.ttcn<br>4 files changed, 209 insertions(+), 14 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/92/17992/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 8f3ff2f..d25a7e0 100644</span><br><span>--- a/library/RLCMAC_EncDec.cc</span><br><span>+++ b/library/RLCMAC_EncDec.cc</span><br><span>@@ -2,6 +2,7 @@</span><br><span> #include <endian.h></span><br><span> </span><br><span> #include "RLCMAC_Types.hh"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "RLCMAC_Templates.hh"</span><br><span> #include "GSM_Types.hh"</span><br><span> /* Decoding of TS 44.060 GPRS RLC/MAC blocks, portions requiring manual functions</span><br><span>  * beyond what TITAN RAW coder can handle internally.</span><br><span>@@ -172,6 +173,22 @@</span><br><span> #endif</span><br><span> } __attribute__ ((packed));</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+static const char hex_chars[] = "0123456789abcdef";</span><br><span style="color: hsl(120, 100%, 40%);">+void printbuffer(const char* ptr, TTCN_Buffer& buf) {</span><br><span style="color: hsl(120, 100%, 40%);">+  int len = buf.get_len();</span><br><span style="color: hsl(120, 100%, 40%);">+      const unsigned char* cbuf = buf.get_data();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "printbuffer %s (len=%d): [", ptr, len);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  for (int i = 0; i < len; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+            fprintf(stderr, " %c%c", hex_chars[cbuf[i] >> 4], hex_chars[cbuf[i] & 0xf]);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   fprintf(stderr, " ]\n");</span><br><span 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> static CodingScheme::enum_type payload_len_2_coding_scheme(size_t payload_len) {</span><br><span>      switch (payload_len) {</span><br><span>       case 23:</span><br><span>@@ -294,7 +311,7 @@</span><br><span>       hdr_bytes = offset_bits / 8;</span><br><span>         extra_bits = offset_bits % 8;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       fprintf(stderr, "RLMAC: clone: hdr_bytes=%u extra_bits=%u (length_bytes=%u)\n", hdr_bytes, extra_bits, length_bytes);</span><br><span style="color: hsl(120, 100%, 40%);">+       //fprintf(stderr, "RLMAC: clone: hdr_bytes=%u extra_bits=%u (length_bytes=%u)\n", hdr_bytes, extra_bits, length_bytes);</span><br><span> </span><br><span>        if (extra_bits == 0) {</span><br><span>               /* It is aligned already */</span><br><span>@@ -324,9 +341,8 @@</span><br><span>    size_t length_bytes = (initial_spare_bits + length_bits + 7) / 8;</span><br><span>    size_t accepted_len = length_bytes;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- fprintf(stderr, "RLMAC: trying to allocate %u bytes (orig is %zu bytes long with read pos %zu)\n", length_bytes, orig_ttcn_buffer.get_len(), orig_ttcn_buffer.get_pos());</span><br><span style="color: hsl(120, 100%, 40%);">+   //fprintf(stderr, "RLMAC: trying to allocate %u bytes (orig is %zu bytes long with read pos %zu)\n", length_bytes, orig_ttcn_buffer.get_len(), orig_ttcn_buffer.get_pos());</span><br><span>        dst_ttcn_buffer.get_end(aligned_buf, accepted_len);</span><br><span style="color: hsl(0, 100%, 40%);">-     fprintf(stderr, "RLMAC: For dst ptr=%p with length=%zu\n", aligned_buf, accepted_len);</span><br><span>     if (accepted_len < length_bytes) {</span><br><span>                fprintf(stderr, "RLMAC: ERROR! asked for %zu bytes but got %zu\n", length_bytes, accepted_len);</span><br><span>    }</span><br><span>@@ -337,14 +353,90 @@</span><br><span>            orig_ttcn_buffer.get_data(),</span><br><span>                 aligned_buf);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       fprintf(stderr, "RLMAC: clone_aligned_buffer_lsbf success\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>     /* clear spare bits and move block header bits to the right */</span><br><span>       aligned_buf[0] = aligned_buf[0] >> initial_spare_bits;</span><br><span> </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%);">+/* bit-shift the entire 'src' of length 'length_bytes'</span><br><span style="color: hsl(120, 100%, 40%);">+ * and store the result to caller-allocated 'buffer'  by 'offset_bits'.  The shifting is</span><br><span style="color: hsl(120, 100%, 40%);">+ * done lsb-first. */</span><br><span style="color: hsl(120, 100%, 40%);">+static void clone_unaligned_buffer_lsbf(unsigned int offset_bits, unsigned int length_bytes,</span><br><span style="color: hsl(120, 100%, 40%);">+        const uint8_t *src, uint8_t *buffer)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       unsigned int hdr_bytes;</span><br><span style="color: hsl(120, 100%, 40%);">+       unsigned int extra_bits;</span><br><span style="color: hsl(120, 100%, 40%);">+      unsigned int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     uint8_t c, last_hdr_c, last_c;</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t *dst;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       hdr_bytes = offset_bits / 8;</span><br><span style="color: hsl(120, 100%, 40%);">+  extra_bits = offset_bits % 8;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       //fprintf(stderr, "RLMAC: clone: hdr_bytes=%u extra_bits=%u (length_bytes=%u)\n", hdr_bytes, extra_bits, length_bytes);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (extra_bits == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                /* It is aligned already */</span><br><span style="color: hsl(120, 100%, 40%);">+           memcpy(buffer, src + hdr_bytes, length_bytes);</span><br><span style="color: hsl(120, 100%, 40%);">+                return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Copy first header+data byte, it's not handled correctly by loop */</span><br><span style="color: hsl(120, 100%, 40%);">+     dst = buffer + hdr_bytes;</span><br><span style="color: hsl(120, 100%, 40%);">+     last_hdr_c = *dst;</span><br><span style="color: hsl(120, 100%, 40%);">+    last_c = *dst << (8 - extra_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    for (i = 0; i < length_bytes; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+               c = src[i];</span><br><span style="color: hsl(120, 100%, 40%);">+           *(dst++) = (last_c >> (8 - extra_bits)) | (c << extra_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+              last_c = c;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* overwrite the lower extra_bits */</span><br><span style="color: hsl(120, 100%, 40%);">+  *dst = (*dst & (0xff << extra_bits)) | (last_c >> (8 - extra_bits));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Copy back first header+data byte */</span><br><span style="color: hsl(120, 100%, 40%);">+        dst = buffer + hdr_bytes;</span><br><span style="color: hsl(120, 100%, 40%);">+     *(dst++) = last_hdr_c | (src[0] << (8 - extra_bits));</span><br><span style="color: hsl(120, 100%, 40%);">+   *dst |= (src[0] >> (extra_bits)) & (0xff >> (8 - extra_bits));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* put an (aligned) EGPRS data block with given bit-offset and</span><br><span style="color: hsl(120, 100%, 40%);">+ * bit-length into parent buffer */</span><br><span style="color: hsl(120, 100%, 40%);">+static void put_egprs_data_block(const TTCN_Buffer& aligned_data_block_buffer, unsigned int offset_bits,</span><br><span style="color: hsl(120, 100%, 40%);">+        unsigned int length_bits, TTCN_Buffer& dst_ttcn_buffer)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        const unsigned int initial_spare_bits = 6;</span><br><span style="color: hsl(120, 100%, 40%);">+    unsigned char *unaligned_buf = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  char tmpbuf[120];</span><br><span style="color: hsl(120, 100%, 40%);">+     int tmplen = dst_ttcn_buffer.get_len();</span><br><span style="color: hsl(120, 100%, 40%);">+       //size_t max_length_bytes = (initial_spare_bits + length_bits + 7) / 8;</span><br><span style="color: hsl(120, 100%, 40%);">+       size_t length_bytes = tmplen + aligned_data_block_buffer.get_len();</span><br><span style="color: hsl(120, 100%, 40%);">+   size_t accepted_len = length_bytes;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ //fprintf(stderr, "RLMAC: trying to allocate %u bytes\n", length_bytes);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* API .get_end() is the only one I could find to access writeable</span><br><span style="color: hsl(120, 100%, 40%);">+       memory in the buffer. It points to the end. Hence, we first copy</span><br><span style="color: hsl(120, 100%, 40%);">+      (readonly) data to tmpbuf and later clear() so that .get_end()</span><br><span style="color: hsl(120, 100%, 40%);">+        provides us with a pointer to the start of the buffer. */</span><br><span style="color: hsl(120, 100%, 40%);">+  memcpy(tmpbuf, dst_ttcn_buffer.get_data(), tmplen);</span><br><span style="color: hsl(120, 100%, 40%);">+   dst_ttcn_buffer.clear();</span><br><span style="color: hsl(120, 100%, 40%);">+      dst_ttcn_buffer.get_end(unaligned_buf, accepted_len);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (accepted_len < tmplen) {</span><br><span style="color: hsl(120, 100%, 40%);">+               fprintf(stderr, "RLMAC: ERROR! asked for %zu bytes but got %zu\n", length_bytes, accepted_len);</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     memcpy(unaligned_buf, tmpbuf, tmplen);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Copy the data out of the tvb to an aligned buffer */</span><br><span style="color: hsl(120, 100%, 40%);">+       clone_unaligned_buffer_lsbf(</span><br><span style="color: hsl(120, 100%, 40%);">+          offset_bits - initial_spare_bits, length_bytes,</span><br><span style="color: hsl(120, 100%, 40%);">+               aligned_data_block_buffer.get_data(),</span><br><span style="color: hsl(120, 100%, 40%);">+         unaligned_buf);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     dst_ttcn_buffer.increase_length(length_bytes);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> /////////////////////</span><br><span> // DECODE</span><br><span>@@ -1078,8 +1170,15 @@</span><br><span> {</span><br><span>    RlcmacUlEgprsDataBlock in = si;</span><br><span>      OCTETSTRING ret_val;</span><br><span style="color: hsl(0, 100%, 40%);">-    TTCN_Buffer ttcn_buffer;</span><br><span style="color: hsl(120, 100%, 40%);">+      TTCN_Buffer ttcn_buffer, aligned_buffer;</span><br><span>     int i;</span><br><span style="color: hsl(120, 100%, 40%);">+        unsigned int data_block_bits, data_block_offsets[2];</span><br><span style="color: hsl(120, 100%, 40%);">+  unsigned int num_calls;</span><br><span style="color: hsl(120, 100%, 40%);">+       CodingScheme mcs;</span><br><span style="color: hsl(120, 100%, 40%);">+     boolean tlli_ind, e;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        mcs = RLCMAC__Templates::f__rlcmac__cps__htype__to__mcs(in.mac__hdr().cps(), in.mac__hdr().header__type());</span><br><span style="color: hsl(120, 100%, 40%);">+   //fprintf(stderr, "RLCMAC: infered MCS %s (%d)\n", mcs.enum_to_str(static_cast<CodingScheme::enum_type>(mcs.as_int())), mcs.as_int());</span><br><span> </span><br><span>   if (!in.blocks().is_bound()) {</span><br><span>               /* we don't have nay blocks: Add length value (zero) */</span><br><span>@@ -1109,10 +1208,14 @@</span><br><span>                break; /* TODO: error */</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Put first TI + E byte */</span><br><span style="color: hsl(120, 100%, 40%);">+   aligned_buffer.put_c(tlli_ind << 1 | e << 0); /* M=0, E=1 LEN=0 */</span><br><span style="color: hsl(120, 100%, 40%);">+        //printbuffer("After encoding first byte", aligned_buffer);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>      if (in.e() == false) {</span><br><span>               /* Add LI octets, if any */</span><br><span>          if (!in.blocks().is_bound()) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  ttcn_buffer.put_c(0x01); /* M=0, E=1 LEN=0 */</span><br><span style="color: hsl(120, 100%, 40%);">+                 aligned_buffer.put_c(0x01); /* M=0, E=1 LEN=0 */</span><br><span>             } else {</span><br><span>                     for (i = 0; i < in.blocks().size_of(); i++) {</span><br><span> #if 0</span><br><span>@@ -1138,28 +1241,38 @@</span><br><span>                          }</span><br><span> #endif</span><br><span>                          if (in.blocks()[i].hdr() != OMIT_VALUE) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                       in.blocks()[i].hdr()().encode(EgprsLlcBlockHdr_descr_, ttcn_buffer,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   in.blocks()[i].hdr()().encode(EgprsLlcBlockHdr_descr_, aligned_buffer,</span><br><span>                                                                       TTCN_EncDec::CT_RAW);</span><br><span>                                }</span><br><span>                    }</span><br><span>            }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    if (in.tlli__ind()) {</span><br><span style="color: hsl(0, 100%, 40%);">-           ttcn_buffer.put_string(in.tlli());</span><br><span style="color: hsl(120, 100%, 40%);">+            aligned_buffer.put_string(in.tlli());</span><br><span>        }</span><br><span> </span><br><span>        if (in.mac__hdr().pfi__ind()) {</span><br><span style="color: hsl(0, 100%, 40%);">-         in.pfi().encode(RlcmacUlEgprsDataBlock_pfi_descr_, ttcn_buffer, TTCN_EncDec::CT_RAW);</span><br><span style="color: hsl(120, 100%, 40%);">+         in.pfi().encode(RlcmacUlEgprsDataBlock_pfi_descr_, aligned_buffer, TTCN_EncDec::CT_RAW);</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ //printbuffer("Before encoding EgprsLlc payload", aligned_buffer);</span><br><span>         if (in.blocks().is_bound()) {</span><br><span>                for (i = 0; i < in.blocks().size_of(); i++) {</span><br><span>                     if (!in.blocks()[i].is_bound())</span><br><span>                              continue;</span><br><span style="color: hsl(0, 100%, 40%);">-                       ttcn_buffer.put_string(in.blocks()[i].payload());</span><br><span style="color: hsl(120, 100%, 40%);">+                     aligned_buffer.put_string(in.blocks()[i].payload());</span><br><span>                 }</span><br><span>    }</span><br><span style="color: hsl(120, 100%, 40%);">+     //printbuffer("After encoding EgprsLlc payload", aligned_buffer);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ setup_rlc_mac_priv(mcs, in.mac__hdr().header__type(), true,</span><br><span style="color: hsl(120, 100%, 40%);">+                      &num_calls, &data_block_bits, data_block_offsets);</span><br><span style="color: hsl(120, 100%, 40%);">+ //printbuffer("before merging data block", ttcn_buffer);</span><br><span style="color: hsl(120, 100%, 40%);">+    put_egprs_data_block(aligned_buffer, data_block_offsets[0], data_block_bits, ttcn_buffer);</span><br><span style="color: hsl(120, 100%, 40%);">+    //printbuffer("after merging data block", ttcn_buffer);</span><br><span> </span><br><span>        ttcn_buffer.get_string(ret_val);</span><br><span>     return ret_val;</span><br><span>diff --git a/library/RLCMAC_Templates.ttcn b/library/RLCMAC_Templates.ttcn</span><br><span>index d2174d7..38147f3 100644</span><br><span>--- a/library/RLCMAC_Templates.ttcn</span><br><span>+++ b/library/RLCMAC_Templates.ttcn</span><br><span>@@ -326,6 +326,31 @@</span><br><span>              }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Template for uplink Data block */</span><br><span style="color: hsl(120, 100%, 40%);">+  template RlcmacUlBlock t_RLCMAC_UL_EGPRS_DATA(CodingScheme mcs,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     template uint5_t tfi, template uint4_t cv,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    template uint11_t bsn1, template EgprsLlcBlocks blocks := {}) := {</span><br><span style="color: hsl(120, 100%, 40%);">+              data_egprs := {</span><br><span style="color: hsl(120, 100%, 40%);">+                       mac_hdr := {</span><br><span style="color: hsl(120, 100%, 40%);">+                          header_type := f_rlcmac_mcs2headertype(mcs),</span><br><span style="color: hsl(120, 100%, 40%);">+                          tfi := tfi,</span><br><span style="color: hsl(120, 100%, 40%);">+                           countdown := cv,</span><br><span style="color: hsl(120, 100%, 40%);">+                              foi_si := '0'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                               r_ri := '0'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                         bsn1 := bsn1,</span><br><span style="color: hsl(120, 100%, 40%);">+                         cps := f_rlcmac_mcs_to_cps(mcs, 1, false),</span><br><span style="color: hsl(120, 100%, 40%);">+                            pfi_ind := false,</span><br><span style="color: hsl(120, 100%, 40%);">+                             rsb := '0'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                          spb := '00'B</span><br><span style="color: hsl(120, 100%, 40%);">+                  },</span><br><span style="color: hsl(120, 100%, 40%);">+                    tlli_ind := false,</span><br><span style="color: hsl(120, 100%, 40%);">+                    e := false,</span><br><span style="color: hsl(120, 100%, 40%);">+                   tlli := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                 pfi := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                  blocks := blocks</span><br><span 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>  template DlMacHeader t_RLCMAC_DlMacH(template MacPayloadType pt, template MacRrbp rrbp, template</span><br><span> uint3_t usf) := {</span><br><span>                payload_type := pt,</span><br><span>@@ -519,4 +544,11 @@</span><br><span>           payload := data</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Template for a LlcBlock (part of a LLC frame inside RlcMacEgprs?lDataBlock */</span><br><span style="color: hsl(120, 100%, 40%);">+      template EgprsLlcBlock t_RLCMAC_LLCBLOCK_EGPRS(octetstring data, boolean e := true) := {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* let encoder figure out the header */</span><br><span style="color: hsl(120, 100%, 40%);">+               hdr := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+          payload := data</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> } with { encode "RAW"; variant "FIELDORDER(msb)" }</span><br><span>diff --git a/pcu/PCU_Tests.ttcn b/pcu/PCU_Tests.ttcn</span><br><span>index 3562925..c69101b 100644</span><br><span>--- a/pcu/PCU_Tests.ttcn</span><br><span>+++ b/pcu/PCU_Tests.ttcn</span><br><span>@@ -187,7 +187,7 @@</span><br><span>     }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-private function f_init_raw(charstring id, template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default)</span><br><span style="color: hsl(120, 100%, 40%);">+function f_init_raw(charstring id, template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default)</span><br><span> runs on RAW_PCU_Test_CT {</span><br><span>  var RAW_PCUIF_CT vc_PCUIF;</span><br><span>   var RAW_PCU_BTS_CT vc_BTS;</span><br><span>@@ -394,7 +394,7 @@</span><br><span> }</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%);">-private function f_pcuif_tx_data_ind(octetstring data, int16_t lqual_cb := 0, uint32_t fn := 0)</span><br><span style="color: hsl(120, 100%, 40%);">+function f_pcuif_tx_data_ind(octetstring data, int16_t lqual_cb := 0, uint32_t fn := 0)</span><br><span> runs on RAW_PCU_Test_CT {</span><br><span>   var template RAW_PCU_EventParam ev_param := {tdma_fn := ? };</span><br><span>         BTS.send(ts_PCUIF_DATA_IND(bts_nr := 0, trx_nr := 0, ts_nr := 7, block_nr := 0,</span><br><span>diff --git a/pcu/PCU_selftest.ttcn b/pcu/PCU_selftest.ttcn</span><br><span>index 3cdb4f4..15cdd80 100644</span><br><span>--- a/pcu/PCU_selftest.ttcn</span><br><span>+++ b/pcu/PCU_selftest.ttcn</span><br><span>@@ -17,12 +17,15 @@</span><br><span> import from NS_Emulation all;</span><br><span> import from GPRS_Context all;</span><br><span> import from Osmocom_Gb_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from Osmocom_Types all;</span><br><span> import from LLC_Types all;</span><br><span> import from LLC_Templates all;</span><br><span> import from L3_Templates all;</span><br><span> import from GSM_RR_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from RLCMAC_Types all;</span><br><span> import from RLCMAC_CSN1_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RLCMAC_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RLCMAC_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from PCU_Tests all;</span><br><span> </span><br><span> type component dummy_CT extends BSSGP_Client_CT {</span><br><span>    var NS_CT ns_component;</span><br><span>@@ -249,6 +252,53 @@</span><br><span>       f_rlcmac_ul_decenc(c_ul_dl_ack_nack);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_selftest_rlcmac_egprs() runs on RAW_PCU_Test_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        var octetstring data;</span><br><span style="color: hsl(120, 100%, 40%);">+ var CodingSchemeArray schemes := {</span><br><span style="color: hsl(120, 100%, 40%);">+            //MCS_0,</span><br><span style="color: hsl(120, 100%, 40%);">+              MCS_1,</span><br><span style="color: hsl(120, 100%, 40%);">+                MCS_2,</span><br><span style="color: hsl(120, 100%, 40%);">+                MCS_3,</span><br><span style="color: hsl(120, 100%, 40%);">+                MCS_4,</span><br><span style="color: hsl(120, 100%, 40%);">+                MCS_5,</span><br><span style="color: hsl(120, 100%, 40%);">+                MCS_6,</span><br><span style="color: hsl(120, 100%, 40%);">+                MCS_7,</span><br><span style="color: hsl(120, 100%, 40%);">+                MCS_8,</span><br><span style="color: hsl(120, 100%, 40%);">+                MCS_9</span><br><span style="color: hsl(120, 100%, 40%);">+         };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init_raw(testcasename());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ log("Started Uplink test");</span><br><span style="color: hsl(120, 100%, 40%);">+ for (var integer i := 0; i < sizeof(schemes); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+          log("Testing Coding Schema ", schemes[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+          var template (value) RlcmacUlBlock ul_data := t_RLCMAC_UL_EGPRS_DATA(</span><br><span style="color: hsl(120, 100%, 40%);">+                 schemes[i],</span><br><span style="color: hsl(120, 100%, 40%);">+                   tfi := 4,</span><br><span style="color: hsl(120, 100%, 40%);">+                     cv := 1, /* num UL blocks to be sent (to be overridden in loop) */</span><br><span style="color: hsl(120, 100%, 40%);">+                    bsn1 := 2, /* TODO: what should be here? */</span><br><span style="color: hsl(120, 100%, 40%);">+                   blocks := { /* To be generated in loop */ });</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               ul_data.data_egprs.tlli := '00100101'O;</span><br><span style="color: hsl(120, 100%, 40%);">+               ul_data.data_egprs.blocks := { valueof(t_RLCMAC_LLCBLOCK_EGPRS('AABBCCDDEEFF00112233'O)) };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         /* Encode the payload of DATA.ind */</span><br><span style="color: hsl(120, 100%, 40%);">+          log("Encoding ", valueof(ul_data));</span><br><span style="color: hsl(120, 100%, 40%);">+         data := enc_RlcmacUlBlock(valueof(ul_data));</span><br><span style="color: hsl(120, 100%, 40%);">+          data := f_pad_oct(data, f_rlcmac_cs_mcs2block_len(schemes[i]), '00'O);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Send to PCU so that we get gsmtap traces to verify with wireshark */</span><br><span style="color: hsl(120, 100%, 40%);">+               f_pcuif_tx_data_ind(data, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            log("Decoding ", schemes[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+               ul_data := dec_RlcmacUlBlock(data);</span><br><span style="color: hsl(120, 100%, 40%);">+           log("Decoded: ", ul_data);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+     log("Done Uplink test");</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> ///////////////////</span><br><span> // RR selftest</span><br><span> ///////////////////</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/17992">change 17992</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/+/17992"/><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: Id0e21248853eb5fac89e863822804cfbecf3c865 </div>
<div style="display:none"> Gerrit-Change-Number: 17992 </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-MessageType: newchange </div>