<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-pcu/+/25093">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Get rid of lots of code only used by tests<br><br>There are 2 methods "rcvd_dl_ack()" in osmo-pcu code. One is used by<br>osmo-pcu itself, and the other is only used in tests.<br>Changing the tests to use the same method as osmo-pcu allows removing<br>the second one, and with it, a lot of code and complexity out of<br>osmo-pcu.<br><br>Change-Id: I14d9312cb61534dc97fca83141b9c0cd933c9206<br>---<br>M src/decoding.cpp<br>M src/decoding.h<br>M src/encoding.cpp<br>M src/encoding.h<br>M src/tbf_dl.cpp<br>M src/tbf_dl.h<br>M tests/tbf/TbfTest.cpp<br>M tests/tbf/TbfTest.err<br>M tests/types/TypesTest.cpp<br>9 files changed, 120 insertions(+), 122 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-pcu refs/changes/93/25093/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/decoding.cpp b/src/decoding.cpp</span><br><span>index e40496d..0caa8bf 100644</span><br><span>--- a/src/decoding.cpp</span><br><span>+++ b/src/decoding.cpp</span><br><span>@@ -326,18 +326,6 @@</span><br><span>  * The index of the array is the bit position in the rbb</span><br><span>  * (show_rbb[63] relates to BSN ssn-1)</span><br><span>  */</span><br><span style="color: hsl(0, 100%, 40%);">-void Decoding::extract_rbb(const uint8_t *rbb, char *show_rbb)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       for (int i = 0; i < 64; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-               uint8_t bit;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            bit = !!(rbb[i/8] & (1<<(7-i%8)));</span><br><span style="color: hsl(0, 100%, 40%);">-            show_rbb[i] = bit ? 'R' : 'I';</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       show_rbb[64] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> void Decoding::extract_rbb(const struct bitvec *rbb, char *show_rbb)</span><br><span> {</span><br><span>   unsigned int i;</span><br><span>diff --git a/src/decoding.h b/src/decoding.h</span><br><span>index 28af3c4..7270c3d 100644</span><br><span>--- a/src/decoding.h</span><br><span>+++ b/src/decoding.h</span><br><span>@@ -50,7 +50,6 @@</span><br><span>             enum CodingScheme cs, const uint8_t *data, RlcData *chunks,</span><br><span>          unsigned int chunks_size, uint32_t *tlli);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  static void extract_rbb(const uint8_t *rbb, char *extracted_rbb);</span><br><span>    static void extract_rbb(const struct bitvec *rbb, char *show_rbb);</span><br><span>   static int rlc_parse_ul_data_header_egprs_type_3(</span><br><span>            struct gprs_rlc_data_info *rlc,</span><br><span>diff --git a/src/encoding.cpp b/src/encoding.cpp</span><br><span>index d9f4f87..f945161 100644</span><br><span>--- a/src/encoding.cpp</span><br><span>+++ b/src/encoding.cpp</span><br><span>@@ -841,20 +841,12 @@</span><br><span>  * The index of the array show_rbb is the bit position inside the rbb</span><br><span>  * (show_rbb[63] relates to BSN ssn-1)</span><br><span>  */</span><br><span style="color: hsl(0, 100%, 40%);">-void Encoding::encode_rbb(const char *show_rbb, uint8_t *rbb)</span><br><span style="color: hsl(120, 100%, 40%);">+void Encoding::encode_rbb(const char *show_rbb, bitvec *bv)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   uint8_t rbb_byte = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>        // RECEIVE_BLOCK_BITMAP</span><br><span>      for (int i = 0; i < 64; i++) {</span><br><span>            /* Set bit at the appropriate position (see 3GPP TS 44.060 9.1.8.1) */</span><br><span style="color: hsl(0, 100%, 40%);">-          if (show_rbb[i] == 'R')</span><br><span style="color: hsl(0, 100%, 40%);">-                 rbb_byte |= 1<< (7-(i%8));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                if ((i%8) == 7) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       rbb[i/8] = rbb_byte;</span><br><span style="color: hsl(0, 100%, 40%);">-                    rbb_byte = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-           }</span><br><span style="color: hsl(120, 100%, 40%);">+             bitvec_set_bit(bv, show_rbb[i] == 'R' ? ONE : ZERO);</span><br><span>         }</span><br><span> }</span><br><span> </span><br><span>diff --git a/src/encoding.h b/src/encoding.h</span><br><span>index f942fd8..298a937 100644</span><br><span>--- a/src/encoding.h</span><br><span>+++ b/src/encoding.h</span><br><span>@@ -63,7 +63,7 @@</span><br><span>                  uint8_t t3142</span><br><span>                );</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  static void encode_rbb(const char *show_rbb, uint8_t *rbb);</span><br><span style="color: hsl(120, 100%, 40%);">+   static void encode_rbb(const char *show_rbb, bitvec *rbb);</span><br><span> </span><br><span>       static void write_packet_uplink_ack(</span><br><span>                         bitvec * dest, struct gprs_rlcmac_ul_tbf *tbf, bool is_final,</span><br><span>diff --git a/src/tbf_dl.cpp b/src/tbf_dl.cpp</span><br><span>index ea7f18e..40b52e5 100644</span><br><span>--- a/src/tbf_dl.cpp</span><br><span>+++ b/src/tbf_dl.cpp</span><br><span>@@ -1158,68 +1158,6 @@</span><br><span>  return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int gprs_rlcmac_dl_tbf::update_window(const uint8_t ssn, const uint8_t *rbb)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- int16_t dist; /* must be signed */</span><br><span style="color: hsl(0, 100%, 40%);">-      uint16_t lost = 0, received = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-        char show_rbb[65];</span><br><span style="color: hsl(0, 100%, 40%);">-      char show_v_b[RLC_MAX_SNS + 1];</span><br><span style="color: hsl(0, 100%, 40%);">- int error_rate;</span><br><span style="color: hsl(0, 100%, 40%);">- struct ana_result ana_res;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      Decoding::extract_rbb(rbb, show_rbb);</span><br><span style="color: hsl(0, 100%, 40%);">-   /* show received array in debug (bit 64..1) */</span><br><span style="color: hsl(0, 100%, 40%);">-  LOGPTBFDL(this, LOGL_DEBUG,</span><br><span style="color: hsl(0, 100%, 40%);">-               "ack:  (BSN=%d)\"%s\"(BSN=%d)  R=ACK I=NACK\n",</span><br><span style="color: hsl(0, 100%, 40%);">-             m_window.mod_sns(ssn - 64), show_rbb, m_window.mod_sns(ssn - 1));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* apply received array to receive state (SSN-64..SSN-1) */</span><br><span style="color: hsl(0, 100%, 40%);">-     /* calculate distance of ssn from V(S) */</span><br><span style="color: hsl(0, 100%, 40%);">-       dist = m_window.mod_sns(m_window.v_s() - ssn);</span><br><span style="color: hsl(0, 100%, 40%);">-  /* check if distance is less than distance V(A)..V(S) */</span><br><span style="color: hsl(0, 100%, 40%);">-        if (dist >= m_window.distance()) {</span><br><span style="color: hsl(0, 100%, 40%);">-           /* this might happpen, if the downlink assignment</span><br><span style="color: hsl(0, 100%, 40%);">-                * was not received by ms and the ack refers</span><br><span style="color: hsl(0, 100%, 40%);">-             * to previous TBF</span><br><span style="color: hsl(0, 100%, 40%);">-               * FIXME: we should implement polling for</span><br><span style="color: hsl(0, 100%, 40%);">-                * control ack!*/</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGPTBFDL(this, LOGL_NOTICE, "ack range is out of V(A)..V(S) range - Free TBF!\n");</span><br><span style="color: hsl(0, 100%, 40%);">-           return 1; /* indicate to free TBF */</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       error_rate = analyse_errors(show_rbb, ssn, &ana_res);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (the_pcu->vty.cs_adj_enabled && ms())</span><br><span style="color: hsl(0, 100%, 40%);">-             ms_update_error_rate(ms(), this, error_rate);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   m_window.update(bts, show_rbb, ssn,</span><br><span style="color: hsl(0, 100%, 40%);">-                     &lost, &received);</span><br><span style="color: hsl(0, 100%, 40%);">-      rate_ctr_add(rate_ctr_group_get_ctr(m_ctrs, TBF_CTR_RLC_NACKED), lost);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* report lost and received packets */</span><br><span style="color: hsl(0, 100%, 40%);">-  gprs_rlcmac_received_lost(this, received, lost);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* Used to measure the leak rate */</span><br><span style="color: hsl(0, 100%, 40%);">-     gprs_bssgp_update_bytes_received(ana_res.received_bytes,</span><br><span style="color: hsl(0, 100%, 40%);">-                ana_res.received_packets + ana_res.lost_packets);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* raise V(A), if possible */</span><br><span style="color: hsl(0, 100%, 40%);">-   m_window.raise(m_window.move_window());</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* show receive state array in debug (V(A)..V(S)-1) */</span><br><span style="color: hsl(0, 100%, 40%);">-  m_window.show_state(show_v_b);</span><br><span style="color: hsl(0, 100%, 40%);">-  LOGPTBFDL(this, LOGL_DEBUG,</span><br><span style="color: hsl(0, 100%, 40%);">-               "V(B): (V(A)=%d)\"%s\"(V(S)-1=%d)  A=Acked N=Nacked U=Unacked X=Resend-Unacked I=Invalid\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                m_window.v_a(), show_v_b, m_window.v_s_mod(-1));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (state_is(TBF_ST_FINISHED) && m_window.window_empty()) {</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGPTBFDL(this, LOGL_NOTICE,</span><br><span style="color: hsl(0, 100%, 40%);">-                      "Received acknowledge of all blocks, but without final ack inidcation (don't worry)\n");</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-       return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> int gprs_rlcmac_dl_tbf::rcvd_dl_final_ack()</span><br><span> {</span><br><span>       osmo_fsm_inst_dispatch(this->state_fsm.fi, TBF_EV_FINAL_ACK_RECVD, NULL);</span><br><span>@@ -1275,17 +1213,6 @@</span><br><span>        return rc;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int gprs_rlcmac_dl_tbf::rcvd_dl_ack(bool final_ack, uint8_t ssn, uint8_t *rbb)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      LOGPTBFDL(this, LOGL_DEBUG, "downlink acknowledge\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (!final_ack)</span><br><span style="color: hsl(0, 100%, 40%);">-         return update_window(ssn, rbb);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- LOGPTBFDL(this, LOGL_DEBUG, "Final ACK received.\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return rcvd_dl_final_ack();</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> bool gprs_rlcmac_dl_tbf::dl_window_stalled() const</span><br><span> {</span><br><span>      return m_window.window_stalled();</span><br><span>diff --git a/src/tbf_dl.h b/src/tbf_dl.h</span><br><span>index b8fecde..67c05ad 100644</span><br><span>--- a/src/tbf_dl.h</span><br><span>+++ b/src/tbf_dl.h</span><br><span>@@ -48,7 +48,6 @@</span><br><span>   int append_data(uint16_t pdu_delay_csec,</span><br><span>                     const uint8_t *data, uint16_t len);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- int rcvd_dl_ack(bool final, uint8_t ssn, uint8_t *rbb);</span><br><span>      int rcvd_dl_ack(bool final_ack, unsigned first_bsn, struct bitvec *rbb);</span><br><span>     struct msgb *create_dl_acked_block(uint32_t fn, uint8_t ts, enum mcs_kind req_mcs_kind = EGPRS);</span><br><span>     void trigger_ass(struct gprs_rlcmac_tbf *old_tbf);</span><br><span>@@ -107,7 +106,6 @@</span><br><span>     int create_new_bsn(const uint32_t fn, enum CodingScheme cs);</span><br><span>         struct msgb *create_dl_acked_block(const uint32_t fn, const uint8_t ts,</span><br><span>                                      int index, int index2 = -1);</span><br><span style="color: hsl(0, 100%, 40%);">-    int update_window(const uint8_t ssn, const uint8_t *rbb);</span><br><span>    int update_window(unsigned first_bsn, const struct bitvec *rbb);</span><br><span>     int rcvd_dl_final_ack();</span><br><span>     bool dl_window_stalled() const;</span><br><span>diff --git a/tests/tbf/TbfTest.cpp b/tests/tbf/TbfTest.cpp</span><br><span>index 9ba1753..c6ea701 100644</span><br><span>--- a/tests/tbf/TbfTest.cpp</span><br><span>+++ b/tests/tbf/TbfTest.cpp</span><br><span>@@ -259,6 +259,28 @@</span><br><span>      TEST_MODE_REVERSE_FREE</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Receive an ACK */</span><br><span style="color: hsl(120, 100%, 40%);">+#define RCV_ACK(fin, tbf, rbb) do { \</span><br><span style="color: hsl(120, 100%, 40%);">+         gprs_rlc_dl_window *w = static_cast<gprs_rlc_dl_window *>(tbf->window());      \</span><br><span style="color: hsl(120, 100%, 40%);">+             uint8_t bits_data[RLC_GPRS_WS/8]; \</span><br><span style="color: hsl(120, 100%, 40%);">+           bitvec bits; \</span><br><span style="color: hsl(120, 100%, 40%);">+                Ack_Nack_Description_t ack_nack; \</span><br><span style="color: hsl(120, 100%, 40%);">+            int bsn_begin, bsn_end; \</span><br><span style="color: hsl(120, 100%, 40%);">+             uint8_t ssn = w->v_s(); \</span><br><span style="color: hsl(120, 100%, 40%);">+          bits.data = bits_data; \</span><br><span style="color: hsl(120, 100%, 40%);">+              bits.data_len = sizeof(bits_data); \</span><br><span style="color: hsl(120, 100%, 40%);">+          bits.cur_bit = 0; \</span><br><span style="color: hsl(120, 100%, 40%);">+           ack_nack.FINAL_ACK_INDICATION = fin; \</span><br><span style="color: hsl(120, 100%, 40%);">+                ack_nack.STARTING_SEQUENCE_NUMBER = ssn; \</span><br><span style="color: hsl(120, 100%, 40%);">+            memcpy(ack_nack.RECEIVED_BLOCK_BITMAP, rbb, RLC_GPRS_WS/8); \</span><br><span style="color: hsl(120, 100%, 40%);">+         Decoding::decode_gprs_acknack_bits( \</span><br><span style="color: hsl(120, 100%, 40%);">+                 &ack_nack, &bits, \</span><br><span style="color: hsl(120, 100%, 40%);">+                   &bsn_begin, &bsn_end, w); \</span><br><span style="color: hsl(120, 100%, 40%);">+           tbf->rcvd_dl_ack(fin, bsn_begin, &bits); \</span><br><span style="color: hsl(120, 100%, 40%);">+             if (!fin) \</span><br><span style="color: hsl(120, 100%, 40%);">+                   OSMO_ASSERT(w->window_empty());      \</span><br><span style="color: hsl(120, 100%, 40%);">+     } while(0)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void test_tbf_final_ack(enum test_tbf_final_ack_mode test_mode)</span><br><span> {</span><br><span>  the_pcu = prepare_pcu();</span><br><span>@@ -305,7 +327,7 @@</span><br><span>       /* Queue a final ACK */</span><br><span>      memset(rbb, 0, sizeof(rbb));</span><br><span>         /* Receive a final ACK */</span><br><span style="color: hsl(0, 100%, 40%);">-       dl_tbf->rcvd_dl_ack(true, 1, rbb);</span><br><span style="color: hsl(120, 100%, 40%);">+ RCV_ACK(true, dl_tbf, rbb);</span><br><span> </span><br><span>      /* Clean up and ensure tbfs are in the correct state */</span><br><span>      OSMO_ASSERT(dl_tbf->state_is(TBF_ST_WAIT_RELEASE));</span><br><span>@@ -335,14 +357,6 @@</span><br><span>        fprintf(stderr, "=== end %s ===\n", __func__);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Receive an ACK */</span><br><span style="color: hsl(0, 100%, 40%);">-#define RCV_ACK(fin, tbf, rbb) do { \</span><br><span style="color: hsl(0, 100%, 40%);">-              gprs_rlc_dl_window *w = static_cast<gprs_rlc_dl_window *>(tbf->window());      \</span><br><span style="color: hsl(0, 100%, 40%);">-               tbf->rcvd_dl_ack(fin, w->v_s(), rbb);     \</span><br><span style="color: hsl(0, 100%, 40%);">-               if (!fin)                                               \</span><br><span style="color: hsl(0, 100%, 40%);">-                       OSMO_ASSERT(w->window_empty());      \</span><br><span style="color: hsl(0, 100%, 40%);">-       } while(0)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static void test_tbf_delayed_release()</span><br><span> {</span><br><span>    the_pcu = prepare_pcu();</span><br><span>diff --git a/tests/tbf/TbfTest.err b/tests/tbf/TbfTest.err</span><br><span>index ce1aa3c..98c9d49 100644</span><br><span>--- a/tests/tbf/TbfTest.err</span><br><span>+++ b/tests/tbf/TbfTest.err</span><br><span>@@ -109,6 +109,9 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) Copying data unit 0 (BSN 1)</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) msg block (BSN 1, CS-1): 07 00 03 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 </span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) downlink acknowledge</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) ack:  (BSN=0)"RR"(BSN=1)  R=ACK I=NACK</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) DL analysis, range=0:2, lost=0, recv=2, skipped=0, bsn=0, info='RR..............................................................'</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) V(B): (V(A)=2)""(V(S)-1=1)  A=Acked N=Nacked U=Unacked X=Resend-Unacked I=Invalid</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) Final ACK received.</span><br><span> TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD</span><br><span> TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE</span><br><span>@@ -221,6 +224,9 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) Copying data unit 0 (BSN 1)</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) msg block (BSN 1, CS-1): 07 00 03 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 </span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) downlink acknowledge</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) ack:  (BSN=0)"RR"(BSN=1)  R=ACK I=NACK</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) DL analysis, range=0:2, lost=0, recv=2, skipped=0, bsn=0, info='RR..............................................................'</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) V(B): (V(A)=2)""(V(S)-1=1)  A=Acked N=Nacked U=Unacked X=Resend-Unacked I=Invalid</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) Final ACK received.</span><br><span> TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD</span><br><span> TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE</span><br><span>@@ -494,12 +500,13 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) Scheduled Ack/Nack polling on FN=104, TS=4</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) msg block (BSN 20, CS-1): 0f 00 28 09 c6 c7 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b </span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) downlink acknowledge</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) ack:  (BSN=85)"RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR"(BSN=20)  R=ACK I=NACK</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) ack:  (BSN=0)"RRRRRRRRRRRRRRRRRRRRR"(BSN=20)  R=ACK I=NACK</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) DL analysis, range=0:21, lost=0, recv=21, skipped=0, bsn=0, info='RRRRRRRRRRRRRRRRRRRRR...........................................'</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) V(B): (V(A)=21)""(V(S)-1=20)  A=Acked N=Nacked U=Unacked X=Resend-Unacked I=Invalid</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) downlink acknowledge</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) ack:  (BSN=85)"RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR"(BSN=20)  R=ACK I=NACK</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) ack range is out of V(A)..V(S) range - Free TBF!</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) ack:  (BSN=21)""(BSN=20)  R=ACK I=NACK</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) DL analysis, range=21:21, lost=0, recv=0, skipped=0, bsn=0, info='................................................................'</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) V(B): (V(A)=21)""(V(S)-1=20)  A=Acked N=Nacked U=Unacked X=Resend-Unacked I=Invalid</span><br><span> PDCH(bts=0,trx=0,ts=4) FN=203 Scheduling data message at RTS for DL TFI=0 prio=4 mcs_mode_restrict=EGPRS</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) downlink (V(A)==21 .. V(S)==21) mcs_mode_restrict=EGPRS</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) Sending new dummy block at BSN 21, CS=CS-1</span><br><span>@@ -519,6 +526,9 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FINISHED) Scheduled Ack/Nack polling on FN=216, TS=4</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FINISHED) msg block (BSN 21, CS-1): 0f 01 2a 4d 43 c0 01 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b </span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FINISHED) downlink acknowledge</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FINISHED) ack:  (BSN=21)"R"(BSN=21)  R=ACK I=NACK</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FINISHED) DL analysis, range=21:22, lost=0, recv=1, skipped=0, bsn=21, info='R...............................................................'</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FINISHED) V(B): (V(A)=22)""(V(S)-1=21)  A=Acked N=Nacked U=Unacked X=Resend-Unacked I=Invalid</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FINISHED) Final ACK received.</span><br><span> TBF(DL-TFI_0){FINISHED}: Received Event FINAL_ACK_RECVD</span><br><span> TBF(DL-TFI_0){FINISHED}: state_chg to WAIT_RELEASE</span><br><span>@@ -4278,6 +4288,9 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) poll timeout for FN=104, TS=4 (curr FN 112)</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) N3105 2 => 3 (< MAX 8)</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) downlink acknowledge</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) ack:  (BSN=0)"RRRRRRRRRRRRRRRRRRRRRRRRR"(BSN=24)  R=ACK I=NACK</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) DL analysis, range=0:25, lost=0, recv=25, skipped=0, bsn=0, info='RRRRRRRRRRRRRRRRRRRRRRRRR.......................................'</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) V(B): (V(A)=25)""(V(S)-1=24)  A=Acked N=Nacked U=Unacked X=Resend-Unacked I=Invalid</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD</span><br><span> TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE</span><br><span>@@ -4534,6 +4547,9 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Timeout for polling PACKET DOWNLINK ACK: |Assignment was on PACCH|No downlink ACK received yet|</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) N3105 1 => 2 (< MAX 8)</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) downlink acknowledge</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) ack:  (BSN=0)"RRRRRRRRRRRRRRRRRRRR"(BSN=19)  R=ACK I=NACK</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) DL analysis, range=0:20, lost=0, recv=20, skipped=0, bsn=0, info='RRRRRRRRRRRRRRRRRRRR............................................'</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) V(B): (V(A)=20)""(V(S)-1=19)  A=Acked N=Nacked U=Unacked X=Resend-Unacked I=Invalid</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD</span><br><span> TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE</span><br><span>@@ -4750,6 +4766,9 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Timeout for polling PACKET DOWNLINK ACK: |Assignment was on PACCH|No downlink ACK received yet|</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) N3105 1 => 2 (< MAX 8)</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) downlink acknowledge</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) ack:  (BSN=0)"RRRRRRRRRRRRRRR"(BSN=14)  R=ACK I=NACK</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) DL analysis, range=0:15, lost=0, recv=15, skipped=0, bsn=0, info='RRRRRRRRRRRRRRR.................................................'</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) V(B): (V(A)=15)""(V(S)-1=14)  A=Acked N=Nacked U=Unacked X=Resend-Unacked I=Invalid</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD</span><br><span> TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE</span><br><span>@@ -4950,6 +4969,9 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Timeout for polling PACKET DOWNLINK ACK: |Assignment was on PACCH|No downlink ACK received yet|</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) N3105 1 => 2 (< MAX 8)</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) downlink acknowledge</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) ack:  (BSN=0)"RRRRRRRRRRRRR"(BSN=12)  R=ACK I=NACK</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) DL analysis, range=0:13, lost=0, recv=13, skipped=0, bsn=0, info='RRRRRRRRRRRRR...................................................'</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) V(B): (V(A)=13)""(V(S)-1=12)  A=Acked N=Nacked U=Unacked X=Resend-Unacked I=Invalid</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD</span><br><span> TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE</span><br><span>@@ -5134,6 +5156,9 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Timeout for polling PACKET DOWNLINK ACK: |Assignment was on PACCH|No downlink ACK received yet|</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) N3105 1 => 2 (< MAX 8)</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) downlink acknowledge</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) ack:  (BSN=0)"RRRRRRRRRRR"(BSN=10)  R=ACK I=NACK</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) DL analysis, range=0:11, lost=0, recv=11, skipped=0, bsn=0, info='RRRRRRRRRRR.....................................................'</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) V(B): (V(A)=11)""(V(S)-1=10)  A=Acked N=Nacked U=Unacked X=Resend-Unacked I=Invalid</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD</span><br><span> TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE</span><br><span>@@ -5294,6 +5319,9 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Timeout for polling PACKET DOWNLINK ACK: |Assignment was on PACCH|No downlink ACK received yet|</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) N3105 1 => 2 (< MAX 8)</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) downlink acknowledge</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) ack:  (BSN=0)"RRRRRRRR"(BSN=7)  R=ACK I=NACK</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) DL analysis, range=0:8, lost=0, recv=8, skipped=0, bsn=0, info='RRRRRRRR........................................................'</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) V(B): (V(A)=8)""(V(S)-1=7)  A=Acked N=Nacked U=Unacked X=Resend-Unacked I=Invalid</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD</span><br><span> TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE</span><br><span>@@ -5463,6 +5491,9 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Timeout for polling PACKET DOWNLINK ACK: |Assignment was on PACCH|No downlink ACK received yet|</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) N3105 1 => 2 (< MAX 8)</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) downlink acknowledge</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) ack:  (BSN=0)"RRRRRRRRRRR"(BSN=10)  R=ACK I=NACK</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) DL analysis, range=0:11, lost=0, recv=10, skipped=1, bsn=0, info='xRRRRRRRRRR.....................................................'</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) V(B): (V(A)=11)""(V(S)-1=10)  A=Acked N=Nacked U=Unacked X=Resend-Unacked I=Invalid</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD</span><br><span> TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE</span><br><span>@@ -5623,6 +5654,9 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Timeout for polling PACKET DOWNLINK ACK: |Assignment was on PACCH|No downlink ACK received yet|</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) N3105 1 => 2 (< MAX 8)</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) downlink acknowledge</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) ack:  (BSN=0)"RRRRRRRRR"(BSN=8)  R=ACK I=NACK</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) DL analysis, range=0:9, lost=0, recv=9, skipped=0, bsn=0, info='RRRRRRRRR.......................................................'</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) V(B): (V(A)=9)""(V(S)-1=8)  A=Acked N=Nacked U=Unacked X=Resend-Unacked I=Invalid</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD</span><br><span> TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE</span><br><span>@@ -5772,6 +5806,9 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Timeout for polling PACKET DOWNLINK ACK: |Assignment was on PACCH|No downlink ACK received yet|</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) N3105 1 => 2 (< MAX 8)</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) downlink acknowledge</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) ack:  (BSN=0)"RRRRRRRR"(BSN=7)  R=ACK I=NACK</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) DL analysis, range=0:8, lost=0, recv=8, skipped=0, bsn=0, info='RRRRRRRR........................................................'</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) V(B): (V(A)=8)""(V(S)-1=7)  A=Acked N=Nacked U=Unacked X=Resend-Unacked I=Invalid</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD</span><br><span> TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE</span><br><span>@@ -5844,6 +5881,9 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) msg block (BSN 0, MCS-6): 07 00 00 12 40 80 c0 00 41 81 c1 01 42 82 c2 02 43 83 c3 03 44 84 c4 04 45 85 c5 05 46 86 c6 06 47 87 c7 07 48 88 c8 08 49 89 c9 09 4a 8a ca 0a 4b 8b cb 0b 4c 8c cc 0c 4d 8d cd 0d 4e 8e ce 0e 4f 8f cf 0f 50 90 d0 10 51 91 d1 11 52 12 </span><br><span> Detected FN jump! 2654167 -> 58</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) downlink acknowledge</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) ack:  (BSN=0)"R"(BSN=0)  R=ACK I=NACK</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) DL analysis, range=0:1, lost=0, recv=1, skipped=0, bsn=0, info='R...............................................................'</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) V(B): (V(A)=1)""(V(S)-1=0)  A=Acked N=Nacked U=Unacked X=Resend-Unacked I=Invalid</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD</span><br><span> TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE</span><br><span>@@ -5913,6 +5953,9 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Copying data unit 0 (BSN 0)</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) msg block (BSN 0, MCS-1): 07 00 00 98 00 02 04 06 08 0a 0c 0e 10 12 14 16 18 1a 1c 1e 20 22 24 26 28 2a 00 </span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) downlink acknowledge</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) ack:  (BSN=0)"R"(BSN=0)  R=ACK I=NACK</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) DL analysis, range=0:1, lost=0, recv=1, skipped=0, bsn=0, info='R...............................................................'</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) V(B): (V(A)=1)""(V(S)-1=0)  A=Acked N=Nacked U=Unacked X=Resend-Unacked I=Invalid</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD</span><br><span> TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE</span><br><span>@@ -5982,6 +6025,9 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Copying data unit 0 (BSN 0)</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) msg block (BSN 0, MCS-2): 07 00 00 94 00 02 04 06 08 0a 0c 0e 10 12 14 16 18 1a 1c 1e 20 22 24 26 28 2a 2c 2e 30 32 34 36 00 </span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) downlink acknowledge</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) ack:  (BSN=0)"R"(BSN=0)  R=ACK I=NACK</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) DL analysis, range=0:1, lost=0, recv=1, skipped=0, bsn=0, info='R...............................................................'</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) V(B): (V(A)=1)""(V(S)-1=0)  A=Acked N=Nacked U=Unacked X=Resend-Unacked I=Invalid</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD</span><br><span> TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE</span><br><span>@@ -6074,6 +6120,9 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Timeout for polling PACKET DOWNLINK ACK: |Assignment was on PACCH|No downlink ACK received yet|</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) N3105 0 => 1 (< MAX 8)</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) downlink acknowledge</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) ack:  (BSN=0)"RR"(BSN=1)  R=ACK I=NACK</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) DL analysis, range=0:2, lost=0, recv=2, skipped=0, bsn=0, info='RR..............................................................'</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) V(B): (V(A)=2)""(V(S)-1=1)  A=Acked N=Nacked U=Unacked X=Resend-Unacked I=Invalid</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD</span><br><span> TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE</span><br><span>@@ -6165,6 +6214,9 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Timeout for polling PACKET DOWNLINK ACK: |Assignment was on PACCH|No downlink ACK received yet|</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) N3105 0 => 1 (< MAX 8)</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) downlink acknowledge</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) ack:  (BSN=0)"RR"(BSN=1)  R=ACK I=NACK</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) DL analysis, range=0:2, lost=0, recv=2, skipped=0, bsn=0, info='RR..............................................................'</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) V(B): (V(A)=2)""(V(S)-1=1)  A=Acked N=Nacked U=Unacked X=Resend-Unacked I=Invalid</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD</span><br><span> TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE</span><br><span>@@ -6256,6 +6308,9 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Timeout for polling PACKET DOWNLINK ACK: |Assignment was on PACCH|No downlink ACK received yet|</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) N3105 0 => 1 (< MAX 8)</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) downlink acknowledge</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) ack:  (BSN=0)"RR"(BSN=1)  R=ACK I=NACK</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) DL analysis, range=0:2, lost=0, recv=2, skipped=0, bsn=0, info='RR..............................................................'</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) V(B): (V(A)=2)""(V(S)-1=1)  A=Acked N=Nacked U=Unacked X=Resend-Unacked I=Invalid</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD</span><br><span> TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE</span><br><span>@@ -6347,6 +6402,9 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Timeout for polling PACKET DOWNLINK ACK: |Assignment was on PACCH|No downlink ACK received yet|</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) N3105 0 => 1 (< MAX 8)</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) downlink acknowledge</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) ack:  (BSN=0)"RR"(BSN=1)  R=ACK I=NACK</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) DL analysis, range=0:2, lost=0, recv=2, skipped=0, bsn=0, info='RR..............................................................'</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) V(B): (V(A)=2)""(V(S)-1=1)  A=Acked N=Nacked U=Unacked X=Resend-Unacked I=Invalid</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD</span><br><span> TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE</span><br><span>@@ -6425,6 +6483,9 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Copying data unit 0 (BSN 0)</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) msg block (BSN 0, MCS-3): 07 00 00 e6 4a 4c 4e 50 52 54 56 58 5a 5c 5e 60 62 64 66 68 6a 6c 6e 70 72 74 76 78 7a 7c 7e 80 82 84 86 88 8a 8c 8e 90 92 00 </span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) downlink acknowledge</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) ack:  (BSN=0)"R"(BSN=0)  R=ACK I=NACK</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) DL analysis, range=0:1, lost=0, recv=1, skipped=0, bsn=0, info='R...............................................................'</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) V(B): (V(A)=1)""(V(S)-1=0)  A=Acked N=Nacked U=Unacked X=Resend-Unacked I=Invalid</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD</span><br><span> TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE</span><br><span>@@ -6501,6 +6562,9 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Copying data unit 0 (BSN 0)</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) msg block (BSN 0, MCS-2): 07 00 00 f2 38 3a 3c 3e 40 42 44 46 48 4a 4c 4e 50 52 54 56 58 5a 5c 5e 60 62 64 66 68 6a 6c 6e 00 </span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) downlink acknowledge</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) ack:  (BSN=0)"R"(BSN=0)  R=ACK I=NACK</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) DL analysis, range=0:1, lost=0, recv=1, skipped=0, bsn=0, info='R...............................................................'</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) V(B): (V(A)=1)""(V(S)-1=0)  A=Acked N=Nacked U=Unacked X=Resend-Unacked I=Invalid</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD</span><br><span> TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE</span><br><span>@@ -6577,6 +6641,9 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Copying data unit 0 (BSN 0)</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) msg block (BSN 0, MCS-1): 07 00 00 f6 2c 2e 30 32 34 36 38 3a 3c 3e 40 42 44 46 48 4a 4c 4e 50 52 54 56 00 </span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) downlink acknowledge</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) ack:  (BSN=0)"R"(BSN=0)  R=ACK I=NACK</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) DL analysis, range=0:1, lost=0, recv=1, skipped=0, bsn=0, info='R...............................................................'</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) V(B): (V(A)=1)""(V(S)-1=0)  A=Acked N=Nacked U=Unacked X=Resend-Unacked I=Invalid</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD</span><br><span> TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE</span><br><span>@@ -6660,6 +6727,9 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Copying data unit 0 (BSN 0)</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) msg block (BSN 0, MCS-6): 07 00 00 10 40 80 c0 00 41 81 c1 01 42 82 c2 02 43 83 c3 03 44 84 c4 04 45 85 c5 05 46 86 c6 06 47 87 c7 07 48 88 c8 08 49 89 c9 09 4a 8a ca 0a 4b 8b cb 0b 4c 8c cc 0c 4d 8d cd 0d 4e 8e ce 0e 4f 8f cf 0f 50 90 d0 10 51 91 d1 11 52 12 </span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) downlink acknowledge</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) ack:  (BSN=0)"R"(BSN=0)  R=ACK I=NACK</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) DL analysis, range=0:1, lost=0, recv=1, skipped=0, bsn=0, info='R...............................................................'</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) V(B): (V(A)=1)""(V(S)-1=0)  A=Acked N=Nacked U=Unacked X=Resend-Unacked I=Invalid</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(DL-TFI_0){FLOW}: Received Event FINAL_ACK_RECVD</span><br><span> TBF(DL-TFI_0){FLOW}: state_chg to WAIT_RELEASE</span><br><span>diff --git a/tests/types/TypesTest.cpp b/tests/types/TypesTest.cpp</span><br><span>index 681ea4e..a975761 100644</span><br><span>--- a/tests/types/TypesTest.cpp</span><br><span>+++ b/tests/types/TypesTest.cpp</span><br><span>@@ -205,8 +205,12 @@</span><br><span>            int count;</span><br><span>           const char *rbb;</span><br><span>             char win_rbb[65];</span><br><span style="color: hsl(0, 100%, 40%);">-               uint8_t bin_rbb[8];</span><br><span style="color: hsl(120, 100%, 40%);">+           uint8_t bin_rbb[RLC_GPRS_WS/8];</span><br><span style="color: hsl(120, 100%, 40%);">+               bitvec bits;</span><br><span>                 win_rbb[64] = '\0';</span><br><span style="color: hsl(120, 100%, 40%);">+           bits.data = bin_rbb;</span><br><span style="color: hsl(120, 100%, 40%);">+          bits.data_len = sizeof(bin_rbb);</span><br><span style="color: hsl(120, 100%, 40%);">+              bits.cur_bit = 0;</span><br><span> </span><br><span>                ul_win.m_v_n.reset();</span><br><span> </span><br><span>@@ -220,9 +224,11 @@</span><br><span>             OSMO_ASSERT(ul_win.ssn() == 0);</span><br><span>              ul_win.update_rbb(win_rbb);</span><br><span>          OSMO_ASSERT_STR_EQ(win_rbb, rbb);</span><br><span style="color: hsl(0, 100%, 40%);">-               Encoding::encode_rbb(win_rbb, bin_rbb);</span><br><span style="color: hsl(120, 100%, 40%);">+               bits.cur_bit = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+             Encoding::encode_rbb(win_rbb, &bits);</span><br><span>            printf("rbb: %s\n", osmo_hexdump(bin_rbb, sizeof(bin_rbb)));</span><br><span style="color: hsl(0, 100%, 40%);">-          Decoding::extract_rbb(bin_rbb, win_rbb);</span><br><span style="color: hsl(120, 100%, 40%);">+              Decoding::extract_rbb(&bits, win_rbb);</span><br><span style="color: hsl(120, 100%, 40%);">+            //printf("win_rbb: %s\n", win_rbb);</span><br><span>                OSMO_ASSERT_STR_EQ(win_rbb, rbb);</span><br><span> </span><br><span>                /* simulate to have received 0, 1 and 5 */</span><br><span>@@ -238,9 +244,10 @@</span><br><span>            OSMO_ASSERT(ul_win.ssn() == 1);</span><br><span>              ul_win.update_rbb(win_rbb);</span><br><span>          OSMO_ASSERT_STR_EQ(win_rbb, rbb);</span><br><span style="color: hsl(0, 100%, 40%);">-               Encoding::encode_rbb(win_rbb, bin_rbb);</span><br><span style="color: hsl(120, 100%, 40%);">+               bits.cur_bit = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+             Encoding::encode_rbb(win_rbb, &bits);</span><br><span>            printf("rbb: %s\n", osmo_hexdump(bin_rbb, sizeof(bin_rbb)));</span><br><span style="color: hsl(0, 100%, 40%);">-          Decoding::extract_rbb(bin_rbb, win_rbb);</span><br><span style="color: hsl(120, 100%, 40%);">+              Decoding::extract_rbb(&bits, win_rbb);</span><br><span>           OSMO_ASSERT_STR_EQ(win_rbb, rbb);</span><br><span> </span><br><span>                OSMO_ASSERT(ul_win.is_in_window(1));</span><br><span>@@ -255,9 +262,10 @@</span><br><span>          OSMO_ASSERT(ul_win.ssn() == 2);</span><br><span>              ul_win.update_rbb(win_rbb);</span><br><span>          OSMO_ASSERT_STR_EQ(win_rbb, rbb);</span><br><span style="color: hsl(0, 100%, 40%);">-               Encoding::encode_rbb(win_rbb, bin_rbb);</span><br><span style="color: hsl(120, 100%, 40%);">+               bits.cur_bit = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+             Encoding::encode_rbb(win_rbb, &bits);</span><br><span>            printf("rbb: %s\n", osmo_hexdump(bin_rbb, sizeof(bin_rbb)));</span><br><span style="color: hsl(0, 100%, 40%);">-          Decoding::extract_rbb(bin_rbb, win_rbb);</span><br><span style="color: hsl(120, 100%, 40%);">+              Decoding::extract_rbb(&bits, win_rbb);</span><br><span>           OSMO_ASSERT_STR_EQ(win_rbb, rbb);</span><br><span> </span><br><span>                OSMO_ASSERT(ul_win.is_in_window(5));</span><br><span>@@ -272,9 +280,10 @@</span><br><span>          OSMO_ASSERT(ul_win.ssn() == 6);</span><br><span>              ul_win.update_rbb(win_rbb);</span><br><span>          OSMO_ASSERT_STR_EQ(win_rbb, rbb);</span><br><span style="color: hsl(0, 100%, 40%);">-               Encoding::encode_rbb(win_rbb, bin_rbb);</span><br><span style="color: hsl(120, 100%, 40%);">+               bits.cur_bit = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+             Encoding::encode_rbb(win_rbb, &bits);</span><br><span>            printf("rbb: %s\n", osmo_hexdump(bin_rbb, sizeof(bin_rbb)));</span><br><span style="color: hsl(0, 100%, 40%);">-          Decoding::extract_rbb(bin_rbb, win_rbb);</span><br><span style="color: hsl(120, 100%, 40%);">+              Decoding::extract_rbb(&bits, win_rbb);</span><br><span>           OSMO_ASSERT_STR_EQ(win_rbb, rbb);</span><br><span> </span><br><span>                OSMO_ASSERT(ul_win.is_in_window(65));</span><br><span>@@ -291,9 +300,10 @@</span><br><span>                 OSMO_ASSERT(ul_win.ssn() == 66);</span><br><span>             ul_win.update_rbb(win_rbb);</span><br><span>          OSMO_ASSERT_STR_EQ(win_rbb, rbb);</span><br><span style="color: hsl(0, 100%, 40%);">-               Encoding::encode_rbb(win_rbb, bin_rbb);</span><br><span style="color: hsl(120, 100%, 40%);">+               bits.cur_bit = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+             Encoding::encode_rbb(win_rbb, &bits);</span><br><span>            printf("rbb: %s\n", osmo_hexdump(bin_rbb, sizeof(bin_rbb)));</span><br><span style="color: hsl(0, 100%, 40%);">-          Decoding::extract_rbb(bin_rbb, win_rbb);</span><br><span style="color: hsl(120, 100%, 40%);">+              Decoding::extract_rbb(&bits, win_rbb);</span><br><span>           OSMO_ASSERT_STR_EQ(win_rbb, rbb);</span><br><span> </span><br><span>                OSMO_ASSERT(ul_win.is_in_window(2));</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-pcu/+/25093">change 25093</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/+/25093"/><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: I14d9312cb61534dc97fca83141b9c0cd933c9206 </div>
<div style="display:none"> Gerrit-Change-Number: 25093 </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>