<p>laforge <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-pcu/+/14760">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">tests: test encoding of egprs ul ack/nacks<br><br>Test the encoding with uncompressed and compressed acknowledgements.<br><br>Change-Id: I35d6b5e312faeb116ddda6b33c550840da1496fe<br>---<br>M tests/types/TypesTest.cpp<br>M tests/types/TypesTest.err<br>2 files changed, 304 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/tests/types/TypesTest.cpp b/tests/types/TypesTest.cpp</span><br><span>index 589f156..b2ddc94 100644</span><br><span>--- a/tests/types/TypesTest.cpp</span><br><span>+++ b/tests/types/TypesTest.cpp</span><br><span>@@ -2,6 +2,7 @@</span><br><span>  * TypesTest.cpp Test the primitive data types</span><br><span>  *</span><br><span>  * Copyright (C) 2013 by Holger Hans Peter Freyther</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright (C) 2019 by Sysmocom s.f.m.c. GmbH</span><br><span>  *</span><br><span>  * All Rights Reserved</span><br><span>  *</span><br><span>@@ -26,6 +27,7 @@</span><br><span> #include "encoding.h"</span><br><span> #include "decoding.h"</span><br><span> #include "gprs_rlcmac.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "egprs_rlc_compression.h"</span><br><span> </span><br><span> extern "C" {</span><br><span> #include <osmocom/core/application.h></span><br><span>@@ -431,6 +433,296 @@</span><br><span>   }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct crbb_test {</span><br><span style="color: hsl(120, 100%, 40%);">+        bool has_crbb;</span><br><span style="color: hsl(120, 100%, 40%);">+        bitvec *crbb;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t length;</span><br><span style="color: hsl(120, 100%, 40%);">+       bool color_code;</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%);">+static void extract_egprs_ul_ack_nack(</span><br><span style="color: hsl(120, 100%, 40%);">+                struct gprs_rlcmac_ul_tbf *tbf,</span><br><span style="color: hsl(120, 100%, 40%);">+               struct bitvec *dest,</span><br><span style="color: hsl(120, 100%, 40%);">+          uint16_t *ssn,</span><br><span style="color: hsl(120, 100%, 40%);">+                struct crbb_test *crbb_test,</span><br><span style="color: hsl(120, 100%, 40%);">+          struct bitvec **urbb,</span><br><span style="color: hsl(120, 100%, 40%);">+         bool is_final)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     uint8_t bytelength;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Start of Ack/Nack Description struct */</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t startbit_ack_nack = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      bool has_length = false;</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t length = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ bool bow = false;</span><br><span style="color: hsl(120, 100%, 40%);">+     uint8_t urbb_length = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      dest->cur_bit = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* ignore the first 8 bit */</span><br><span style="color: hsl(120, 100%, 40%);">+  bitvec_get_uint(dest, 8);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* uplink ack/nack message content */</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(bitvec_get_uint(dest, 6) == 0b001001);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* ignore page mode*/</span><br><span style="color: hsl(120, 100%, 40%);">+ bitvec_get_uint(dest, 2);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* fix 00 */</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_ASSERT(bitvec_get_uint(dest, 2) == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(bitvec_get_uint(dest, 5) == tbf->tfi());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* egprs ack/nack */</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_ASSERT(bitvec_get_uint(dest, 1) == 1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* fix 00 */</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_ASSERT(bitvec_get_uint(dest, 2) == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* ignore Channel Coding Command */</span><br><span style="color: hsl(120, 100%, 40%);">+   bitvec_get_uint(dest, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* we always allow resegmentation */</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_ASSERT(bitvec_get_uint(dest, 1) == 1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* ignore pre emptive transmission */</span><br><span style="color: hsl(120, 100%, 40%);">+ bitvec_get_uint(dest, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* ignore PRR retransmission request */</span><br><span style="color: hsl(120, 100%, 40%);">+       bitvec_get_uint(dest, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* ignore ARAC retransmission request */</span><br><span style="color: hsl(120, 100%, 40%);">+      bitvec_get_uint(dest, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (bitvec_get_uint(dest, 1)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               OSMO_ASSERT((uint32_t) bitvec_get_uint(dest, 32) == tbf->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%);">+   /* ignore TBF_EST */</span><br><span style="color: hsl(120, 100%, 40%);">+  bitvec_get_uint(dest, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Timing Advance */</span><br><span style="color: hsl(120, 100%, 40%);">+  if (bitvec_get_uint(dest, 1)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               /* Timing Advance Value */</span><br><span style="color: hsl(120, 100%, 40%);">+            if (bitvec_get_uint(dest, 1))</span><br><span style="color: hsl(120, 100%, 40%);">+                 bitvec_get_uint(dest, 6);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           /* Timing Advance Index*/</span><br><span style="color: hsl(120, 100%, 40%);">+             if (bitvec_get_uint(dest, 1))</span><br><span style="color: hsl(120, 100%, 40%);">+                 bitvec_get_uint(dest, 6);</span><br><span style="color: hsl(120, 100%, 40%);">+             /* Timing Advance Timeslot Number */</span><br><span style="color: hsl(120, 100%, 40%);">+          bitvec_get_uint(dest, 3);</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Packet Extended Timing Advance */</span><br><span style="color: hsl(120, 100%, 40%);">+  if (bitvec_get_uint(dest, 1))</span><br><span style="color: hsl(120, 100%, 40%);">+         bitvec_get_uint(dest, 2);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Power Control Parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (bitvec_get_uint(dest, 1)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               /* Alpha */</span><br><span style="color: hsl(120, 100%, 40%);">+           bitvec_get_uint(dest, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+             for (int i=0; i<8 ; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 /* Gamma */</span><br><span style="color: hsl(120, 100%, 40%);">+                   if (bitvec_get_uint(dest, 1))</span><br><span style="color: hsl(120, 100%, 40%);">+                         bitvec_get_uint(dest, 5);</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%);">+   /* Extension Bits */</span><br><span style="color: hsl(120, 100%, 40%);">+  if (bitvec_get_uint(dest, 1)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               int length = bitvec_get_uint(dest, 6);</span><br><span style="color: hsl(120, 100%, 40%);">+                bitvec_get_uint(dest, length);</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%);">+   /* Beging of the EGPRS Ack/Nack */</span><br><span style="color: hsl(120, 100%, 40%);">+    has_length = bitvec_get_uint(dest, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (has_length) {</span><br><span style="color: hsl(120, 100%, 40%);">+             length = bitvec_get_uint(dest, 8);</span><br><span style="color: hsl(120, 100%, 40%);">+    } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* remaining bits is the length */</span><br><span style="color: hsl(120, 100%, 40%);">+            length = dest->data_len * 8 - dest->cur_bit;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     startbit_ack_nack = dest->cur_bit;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_ASSERT(bitvec_get_uint(dest, 1) == is_final);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* bow Begin Of Window */</span><br><span style="color: hsl(120, 100%, 40%);">+     bow = bitvec_get_uint(dest, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+       /* TODO: check if bow is always present in our implementation */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* eow End Of Window */</span><br><span style="color: hsl(120, 100%, 40%);">+       /* TODO: eow checking */</span><br><span style="color: hsl(120, 100%, 40%);">+      bitvec_get_uint(dest, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   *ssn = bitvec_get_uint(dest, 11);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (bow) {</span><br><span style="color: hsl(120, 100%, 40%);">+            OSMO_ASSERT(*ssn == tbf->window()->v_q() + 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%);">+   crbb_test->has_crbb = bitvec_get_uint(dest, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (crbb_test->has_crbb) {</span><br><span style="color: hsl(120, 100%, 40%);">+         crbb_test->length = bitvec_get_uint(dest, 7);</span><br><span style="color: hsl(120, 100%, 40%);">+              crbb_test->color_code = bitvec_get_uint(dest, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+          if (crbb_test->length % 8)</span><br><span style="color: hsl(120, 100%, 40%);">+                 bytelength = crbb_test->length * 8 + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+            else</span><br><span style="color: hsl(120, 100%, 40%);">+                  bytelength = crbb_test->length * 8;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              crbb_test->crbb = bitvec_alloc(bytelength, tall_pcu_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+          for (int i=0; i<crbb_test->length; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+                 bitvec_set_bit(crbb_test->crbb, bitvec_get_bit_pos(dest, dest->cur_bit + i));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         dest->cur_bit += crbb_test->length;</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%);">+   OSMO_ASSERT(dest->cur_bit < dest->data_len * 8);</span><br><span style="color: hsl(120, 100%, 40%);">+     urbb_length = length - (dest->cur_bit - startbit_ack_nack);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      if (urbb_length > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+             if (urbb_length % 8)</span><br><span style="color: hsl(120, 100%, 40%);">+                  bytelength = urbb_length / 8 + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+             else</span><br><span style="color: hsl(120, 100%, 40%);">+                  bytelength = urbb_length / 8;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               *urbb = bitvec_alloc(bytelength, tall_pcu_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+               for (int i=urbb_length; i>0; i--) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        bitvec_set_bit(*urbb, bitvec_get_bit_pos(dest, dest->cur_bit + i - 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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void check_egprs_bitmap(struct gprs_rlcmac_ul_tbf *tbf, uint16_t ssn, struct crbb_test *crbb_test, bitvec *urbb, unsigned int *rbb_size)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    gprs_rlc_ul_window *win = tbf->window();</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t rbb_should[RLC_EGPRS_MAX_WS] = {0};</span><br><span style="color: hsl(120, 100%, 40%);">+   bitvec rbb_should_bv;</span><br><span style="color: hsl(120, 100%, 40%);">+ rbb_should_bv.data = rbb_should;</span><br><span style="color: hsl(120, 100%, 40%);">+      rbb_should_bv.data_len = RLC_EGPRS_MAX_WS;</span><br><span style="color: hsl(120, 100%, 40%);">+    rbb_should_bv.cur_bit = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* rbb starting at ssn without mod */</span><br><span style="color: hsl(120, 100%, 40%);">+ bitvec *rbb_ssn_bv = bitvec_alloc(RLC_EGPRS_MAX_WS, tall_pcu_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* even any ssn is allowed, pcu should only use v_q() at least for now */</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_ASSERT(ssn == (win->v_q() + 1));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (crbb_test->has_crbb) {</span><br><span style="color: hsl(120, 100%, 40%);">+         OSMO_ASSERT(0 == egprs_compress::decompress_crbb(</span><br><span style="color: hsl(120, 100%, 40%);">+                                 crbb_test->length,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 crbb_test->color_code,</span><br><span style="color: hsl(120, 100%, 40%);">+                             crbb_test->crbb->data,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  rbb_ssn_bv));</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 (urbb && urbb->cur_bit > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                for (unsigned int i=0; i<urbb->cur_bit; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  bitvec_set_bit(rbb_ssn_bv, bitvec_get_bit_pos(urbb, i));</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%);">+   /* check our rbb is equal the decompressed */</span><br><span style="color: hsl(120, 100%, 40%);">+ rbb_should_bv.cur_bit = win->update_egprs_rbb(rbb_should);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       bool failed = false;</span><br><span style="color: hsl(120, 100%, 40%);">+  for (unsigned int i=0; i < rbb_ssn_bv->cur_bit; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (bitvec_get_bit_pos(&rbb_should_bv, i) !=</span><br><span style="color: hsl(120, 100%, 40%);">+                          bitvec_get_bit_pos(rbb_ssn_bv, i))</span><br><span style="color: hsl(120, 100%, 40%);">+                        failed = true;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (failed) {</span><br><span style="color: hsl(120, 100%, 40%);">+         fprintf(stderr, "SSN %d\n", ssn);</span><br><span style="color: hsl(120, 100%, 40%);">+           for (int i=win->v_q(); i<win->ws(); i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   fprintf(stderr, "bsn %d is %s\n", i, win->is_received( i) ? "received" : "MISS");</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+             char to_dump[256] = { 0 };</span><br><span style="color: hsl(120, 100%, 40%);">+            bitvec_to_string_r(&rbb_should_bv, to_dump);</span><br><span style="color: hsl(120, 100%, 40%);">+              fprintf(stderr, "should: %s\n", to_dump);</span><br><span style="color: hsl(120, 100%, 40%);">+           memset(to_dump, 0x0, 256);</span><br><span style="color: hsl(120, 100%, 40%);">+            bitvec_to_string_r(rbb_ssn_bv, to_dump);</span><br><span style="color: hsl(120, 100%, 40%);">+              fprintf(stderr, "is    : %s\n", to_dump);</span><br><span style="color: hsl(120, 100%, 40%);">+           OSMO_ASSERT(false);</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (rbb_size)</span><br><span style="color: hsl(120, 100%, 40%);">+         *rbb_size = rbb_ssn_bv->cur_bit;</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%);">+static void free_egprs_ul_ack_nack(bitvec **rbb, struct crbb_test *crbb_test)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    if (*rbb) {</span><br><span style="color: hsl(120, 100%, 40%);">+           bitvec_free(*rbb);</span><br><span style="color: hsl(120, 100%, 40%);">+            *rbb = NULL;</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 (crbb_test->crbb) {</span><br><span style="color: hsl(120, 100%, 40%);">+             bitvec_free(crbb_test->crbb);</span><br><span style="color: hsl(120, 100%, 40%);">+              crbb_test->crbb = NULL;</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%);">+static void test_egprs_ul_ack_nack()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       bitvec *dest = bitvec_alloc(23, tall_pcu_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      fprintf(stderr, "############## test_egprs_ul_ack_nack\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       BTS the_bts;</span><br><span style="color: hsl(120, 100%, 40%);">+  the_bts.bts_data()->egprs_enabled = true;</span><br><span style="color: hsl(120, 100%, 40%);">+  the_bts.bts_data()->alloc_algorithm = alloc_algorithm_a;</span><br><span style="color: hsl(120, 100%, 40%);">+   the_bts.bts_data()->trx[0].pdch[4].enable();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gprs_rlcmac_ul_tbf *tbf = tbf_alloc_ul_tbf(the_bts.bts_data(), NULL, 0, 1, 1, true);</span><br><span style="color: hsl(120, 100%, 40%);">+   struct crbb_test crbb_test = {0};</span><br><span style="color: hsl(120, 100%, 40%);">+     bitvec *rbb = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+   unsigned int rbb_size;</span><br><span style="color: hsl(120, 100%, 40%);">+        uint16_t ssn = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     gprs_rlc_ul_window *win = tbf->window();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "************** Test with empty window\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ win->reset_state();</span><br><span style="color: hsl(120, 100%, 40%);">+        win->set_ws(256);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        Encoding::write_packet_uplink_ack(dest, tbf, false, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+       extract_egprs_ul_ack_nack(tbf, dest, &ssn, &crbb_test, &rbb, false);</span><br><span style="color: hsl(120, 100%, 40%);">+      check_egprs_bitmap(tbf, ssn, &crbb_test, rbb, &rbb_size);</span><br><span style="color: hsl(120, 100%, 40%);">+     free_egprs_ul_ack_nack(&rbb, &crbb_test);</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_ASSERT(rbb_size == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "************** Test with 1 lost packet\n");</span><br><span style="color: hsl(120, 100%, 40%);">+        win->reset_state();</span><br><span style="color: hsl(120, 100%, 40%);">+        win->set_ws(256);</span><br><span style="color: hsl(120, 100%, 40%);">+  win->receive_bsn(1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     Encoding::write_packet_uplink_ack(dest, tbf, false, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+       extract_egprs_ul_ack_nack(tbf, dest, &ssn, &crbb_test, &rbb, false);</span><br><span style="color: hsl(120, 100%, 40%);">+      check_egprs_bitmap(tbf, ssn, &crbb_test, rbb, &rbb_size);</span><br><span style="color: hsl(120, 100%, 40%);">+     free_egprs_ul_ack_nack(&rbb, &crbb_test);</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_ASSERT(rbb_size == 1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "************** Test with compressed window\n");</span><br><span style="color: hsl(120, 100%, 40%);">+    win->reset_state();</span><br><span style="color: hsl(120, 100%, 40%);">+        win->set_ws(128);</span><br><span style="color: hsl(120, 100%, 40%);">+  win->receive_bsn(127);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   Encoding::write_packet_uplink_ack(dest, tbf, false, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+       extract_egprs_ul_ack_nack(tbf, dest, &ssn, &crbb_test, &rbb, false);</span><br><span style="color: hsl(120, 100%, 40%);">+      check_egprs_bitmap(tbf, ssn, &crbb_test, rbb, &rbb_size);</span><br><span style="color: hsl(120, 100%, 40%);">+     free_egprs_ul_ack_nack(&rbb, &crbb_test);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   fprintf(stderr, "************** Provoke an uncompressed ACK without EOW\n");</span><br><span style="color: hsl(120, 100%, 40%);">+        win->reset_state();</span><br><span style="color: hsl(120, 100%, 40%);">+        win->set_ws(384);</span><br><span style="color: hsl(120, 100%, 40%);">+  for (uint16_t i=1; i<384/2; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+           win->receive_bsn(i*2);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   Encoding::write_packet_uplink_ack(dest, tbf, false, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+       extract_egprs_ul_ack_nack(tbf, dest, &ssn, &crbb_test, &rbb, false);</span><br><span style="color: hsl(120, 100%, 40%);">+      check_egprs_bitmap(tbf, ssn, &crbb_test, rbb, &rbb_size);</span><br><span style="color: hsl(120, 100%, 40%);">+     free_egprs_ul_ack_nack(&rbb, &crbb_test);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void check_imm_ass(struct gprs_rlcmac_tbf *tbf, bool dl, enum ph_burst_type bt, const uint8_t *exp, uint8_t len,</span><br><span>                      const char *kind)</span><br><span> {</span><br><span>@@ -619,6 +911,7 @@</span><br><span>       log_set_print_filename(osmo_stderr_target, 0);</span><br><span> </span><br><span>   printf("Making some basic type testing.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     test_llc();</span><br><span>  test_rlc();</span><br><span>  test_rlc_v_b();</span><br><span>@@ -631,6 +924,7 @@</span><br><span>        test_immediate_assign_ul1s();</span><br><span>        test_immediate_assign_rej();</span><br><span>         test_lsb();</span><br><span style="color: hsl(120, 100%, 40%);">+   test_egprs_ul_ack_nack();</span><br><span> </span><br><span>        return EXIT_SUCCESS;</span><br><span> }</span><br><span>diff --git a/tests/types/TypesTest.err b/tests/types/TypesTest.err</span><br><span>index 3abc61c..92dbe06 100644</span><br><span>--- a/tests/types/TypesTest.err</span><br><span>+++ b/tests/types/TypesTest.err</span><br><span>@@ -7,3 +7,13 @@</span><br><span> Allocating UL TBF: MS_CLASS=1/1</span><br><span> TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL) Setting Control TS 1</span><br><span> TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL) Allocated: trx = 0, ul_slots = 02, dl_slots = 00</span><br><span style="color: hsl(120, 100%, 40%);">+############## test_egprs_ul_ack_nack</span><br><span style="color: hsl(120, 100%, 40%);">+Allocating UL TBF: MS_CLASS=1/1</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL EGPRS) Enabled EGPRS, mode EGPRS</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL EGPRS) Setting Control TS 4</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL EGPRS) Allocated: trx = 0, ul_slots = 10, dl_slots = 00</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL EGPRS) setting EGPRS UL window size to 64, base(0) slots(1) ws_pdch(0)</span><br><span style="color: hsl(120, 100%, 40%);">+************** Test with empty window</span><br><span style="color: hsl(120, 100%, 40%);">+************** Test with 1 lost packet</span><br><span style="color: hsl(120, 100%, 40%);">+************** Test with compressed window</span><br><span style="color: hsl(120, 100%, 40%);">+************** Provoke an uncompressed ACK without EOW</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-pcu/+/14760">change 14760</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-pcu/+/14760"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-pcu </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I35d6b5e312faeb116ddda6b33c550840da1496fe </div>
<div style="display:none"> Gerrit-Change-Number: 14760 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: lynxis lazus <lynxis@fe80.eu> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>