<p>pespin <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-pcu/+/23309">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  pespin: Looks good to me, approved
  laforge: Looks good to me, but someone else must approve
  fixeria: Looks good to me, but someone else must approve

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Replace PollController with newly added PDCH UL Controller<br><br>TbfTest is updated to submit empty blocks to have somehow meaningful<br>output (at least as meaningful test results as before, not much). That's<br>because we must update bts->curr_fn to have polls expire.<br><br>Related: OS#5020<br>Change-Id: I683ca738ce5a133c49c36a1d94439a942d64a831<br>---<br>M src/Makefile.am<br>M src/bts.cpp<br>M src/bts.h<br>M src/pdch.cpp<br>M src/pdch_ul_controller.c<br>M src/pdch_ul_controller.h<br>D src/poll_controller.cpp<br>D src/poll_controller.h<br>M src/tbf.cpp<br>M src/tbf.h<br>M tests/tbf/TbfTest.cpp<br>M tests/tbf/TbfTest.err<br>12 files changed, 288 insertions(+), 246 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/Makefile.am b/src/Makefile.am</span><br><span>index ab9aeeb..e1225b0 100644</span><br><span>--- a/src/Makefile.am</span><br><span>+++ b/src/Makefile.am</span><br><span>@@ -63,7 +63,6 @@</span><br><span>  bts.cpp \</span><br><span>    pdch.cpp \</span><br><span>   pdch_ul_controller.c \</span><br><span style="color: hsl(0, 100%, 40%);">-  poll_controller.cpp \</span><br><span>        encoding.cpp \</span><br><span>       sba.c \</span><br><span>      decoding.cpp \</span><br><span>@@ -102,7 +101,6 @@</span><br><span>         bts.h \</span><br><span>      pdch.h \</span><br><span>     pdch_ul_controller.h \</span><br><span style="color: hsl(0, 100%, 40%);">-  poll_controller.h \</span><br><span>  encoding.h \</span><br><span>         sba.h \</span><br><span>      rlc.h \</span><br><span>diff --git a/src/bts.cpp b/src/bts.cpp</span><br><span>index a7d475c..9f78c8b 100644</span><br><span>--- a/src/bts.cpp</span><br><span>+++ b/src/bts.cpp</span><br><span>@@ -19,7 +19,6 @@</span><br><span>  */</span><br><span> </span><br><span> #include <bts.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <poll_controller.h></span><br><span> #include <tbf.h></span><br><span> #include <tbf_ul.h></span><br><span> #include <encoding.h></span><br><span>@@ -212,7 +211,6 @@</span><br><span>       * m_ms_store's destructor */</span><br><span>    bts->ms_store->cleanup();</span><br><span>      delete bts->ms_store;</span><br><span style="color: hsl(0, 100%, 40%);">-        delete bts->pollController;</span><br><span> </span><br><span>   if (bts->ratectrs) {</span><br><span>              rate_ctr_group_free(bts->ratectrs);</span><br><span>@@ -244,7 +242,6 @@</span><br><span>         bts->pcu = pcu;</span><br><span>   bts->nr = bts_nr;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        bts->pollController = new PollController(*bts);</span><br><span>   bts->ms_store = new GprsMsStorage(bts);</span><br><span> </span><br><span>       bts->cur_fn = 0;</span><br><span>@@ -295,16 +292,9 @@</span><br><span>   /* The UL frame numbers lag 3 behind the DL frames and the data</span><br><span>       * indication is only sent after all 4 frames of the block have been</span><br><span>          * received. Sometimes there is an idle frame between the end of one</span><br><span style="color: hsl(0, 100%, 40%);">-     * and start of another frame (every 3 blocks).  So the timeout should</span><br><span style="color: hsl(0, 100%, 40%);">-   * definitely be there if we're more than 8 frames past poll_fn. Let's</span><br><span style="color: hsl(0, 100%, 40%);">-   * stay on the safe side and say 13 or more. An additional delay can</span><br><span style="color: hsl(0, 100%, 40%);">-     * happen due to the block processing time in the DSP, so the delay of</span><br><span style="color: hsl(0, 100%, 40%);">-   * decoded blocks relative to the timing clock can be much larger.</span><br><span style="color: hsl(0, 100%, 40%);">-       * Values up to 50 frames have been observed under load. */</span><br><span style="color: hsl(0, 100%, 40%);">-     const static int max_delay = 60;</span><br><span style="color: hsl(120, 100%, 40%);">+       * and start of another frame (every 3 blocks). */</span><br><span> </span><br><span>       bts->cur_fn = fn;</span><br><span style="color: hsl(0, 100%, 40%);">-    bts->pollController->expireTimedout(bts->cur_fn, max_delay);</span><br><span> }</span><br><span> </span><br><span> static inline int delta_fn(int fn, int to)</span><br><span>@@ -341,8 +331,6 @@</span><br><span>   if (delay < fn_update_ok_min_delay || delay > fn_update_ok_max_delay ||</span><br><span>                bts_current_frame_number(bts) == 0)</span><br><span>          bts->cur_fn = fn;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    bts->pollController->expireTimedout(fn, max_delay);</span><br><span> }</span><br><span> </span><br><span> int bts_add_paging(struct gprs_rlcmac_bts *bts, uint8_t chan_needed, const struct osmo_mobile_identity *mi)</span><br><span>@@ -485,36 +473,6 @@</span><br><span>     return false;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct gprs_rlcmac_dl_tbf *bts_dl_tbf_by_poll_fn(struct gprs_rlcmac_bts *bts, uint32_t fn, uint8_t trx, uint8_t ts)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      struct llist_item *pos;</span><br><span style="color: hsl(0, 100%, 40%);">- struct gprs_rlcmac_tbf *tbf;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /* only one TBF can poll on specific TS/FN, because scheduler can only</span><br><span style="color: hsl(0, 100%, 40%);">-   * schedule one downlink control block (with polling) at a FN per TS */</span><br><span style="color: hsl(0, 100%, 40%);">- llist_for_each_entry(pos, &bts->dl_tbfs, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-         tbf = (struct gprs_rlcmac_tbf *)pos->entry;</span><br><span style="color: hsl(0, 100%, 40%);">-          if (tbf_check(tbf, fn, trx, ts))</span><br><span style="color: hsl(0, 100%, 40%);">-                        return as_dl_tbf(tbf);</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-       return NULL;</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%);">-struct gprs_rlcmac_ul_tbf *bts_ul_tbf_by_poll_fn(struct gprs_rlcmac_bts *bts, uint32_t fn, uint8_t trx, uint8_t ts)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       struct llist_item *pos;</span><br><span style="color: hsl(0, 100%, 40%);">- struct gprs_rlcmac_tbf *tbf;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /* only one TBF can poll on specific TS/FN, because scheduler can only</span><br><span style="color: hsl(0, 100%, 40%);">-   * schedule one downlink control block (with polling) at a FN per TS */</span><br><span style="color: hsl(0, 100%, 40%);">- llist_for_each_entry(pos, &bts->ul_tbfs, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-         tbf = (struct gprs_rlcmac_tbf *)pos->entry;</span><br><span style="color: hsl(0, 100%, 40%);">-          if (tbf_check(tbf, fn, trx, ts))</span><br><span style="color: hsl(0, 100%, 40%);">-                        return as_ul_tbf(tbf);</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-       return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* lookup downlink TBF Entity (by TFI) */</span><br><span> struct gprs_rlcmac_dl_tbf *bts_dl_tbf_by_tfi(struct gprs_rlcmac_bts *bts, uint8_t tfi, uint8_t trx, uint8_t ts)</span><br><span> {</span><br><span>@@ -1162,13 +1120,16 @@</span><br><span> void bts_update_tbf_ta(struct gprs_rlcmac_bts *bts, const char *p, uint32_t fn,</span><br><span>                     uint8_t trx_no, uint8_t ts, int8_t ta, bool is_rach)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        struct gprs_rlcmac_ul_tbf *tbf =</span><br><span style="color: hsl(0, 100%, 40%);">-                bts_ul_tbf_by_poll_fn(bts, fn, trx_no, ts);</span><br><span style="color: hsl(0, 100%, 40%);">-     if (!tbf)</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gprs_rlcmac_pdch *pdch = &bts->trx[trx_no].pdch[ts];</span><br><span style="color: hsl(120, 100%, 40%);">+    struct pdch_ulc_node *poll = pdch_ulc_get_node(pdch->ulc, fn);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gprs_rlcmac_ul_tbf *tbf;</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!poll || poll->type !=PDCH_ULC_NODE_TBF_POLL ||</span><br><span style="color: hsl(120, 100%, 40%);">+            poll->tbf_poll.poll_tbf->direction != GPRS_RLCMAC_UL_TBF)</span><br><span>          LOGP(DL1IF, LOGL_DEBUG, "[%s] update TA = %u ignored due to "</span><br><span>                   "unknown UL TBF on TRX = %d, TS = %d, FN = %d\n",</span><br><span>                  p, ta, trx_no, ts, fn);</span><br><span>         else {</span><br><span style="color: hsl(120, 100%, 40%);">+                tbf = as_ul_tbf(poll->tbf_poll.poll_tbf);</span><br><span>                 /* we need to distinguish TA information provided by L1</span><br><span>               * from PH-DATA-IND and PHY-RA-IND so that we can properly</span><br><span>            * update TA for given TBF</span><br><span>diff --git a/src/bts.h b/src/bts.h</span><br><span>index 8070abb..a459c2e 100644</span><br><span>--- a/src/bts.h</span><br><span>+++ b/src/bts.h</span><br><span>@@ -195,7 +195,6 @@</span><br><span>    bool single_block;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct PollController;</span><br><span> struct GprsMsStorage;</span><br><span> struct pcu_l1_meas;</span><br><span> </span><br><span>@@ -251,7 +250,6 @@</span><br><span>         int cur_blk_fn;</span><br><span>      uint8_t max_cs_dl, max_cs_ul;</span><br><span>        uint8_t max_mcs_dl, max_mcs_ul;</span><br><span style="color: hsl(0, 100%, 40%);">- struct PollController *pollController;</span><br><span>       struct rate_ctr_group *ratectrs;</span><br><span>     struct osmo_stat_item_group *statg;</span><br><span> </span><br><span>@@ -272,8 +270,6 @@</span><br><span> </span><br><span> uint32_t bts_rfn_to_fn(const struct gprs_rlcmac_bts *bts, int32_t rfn);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct gprs_rlcmac_dl_tbf *bts_dl_tbf_by_poll_fn(struct gprs_rlcmac_bts *bts, uint32_t fn, uint8_t trx, uint8_t ts);</span><br><span style="color: hsl(0, 100%, 40%);">-struct gprs_rlcmac_ul_tbf *bts_ul_tbf_by_poll_fn(struct gprs_rlcmac_bts *bts, uint32_t fn, uint8_t trx, uint8_t ts);</span><br><span> struct gprs_rlcmac_dl_tbf *bts_dl_tbf_by_tfi(struct gprs_rlcmac_bts *bts, uint8_t tfi, uint8_t trx, uint8_t ts);</span><br><span> struct gprs_rlcmac_ul_tbf *bts_ul_tbf_by_tfi(struct gprs_rlcmac_bts *bts, uint8_t tfi, uint8_t trx, uint8_t ts);</span><br><span> </span><br><span>diff --git a/src/pdch.cpp b/src/pdch.cpp</span><br><span>index 1e54117..727ffc6 100644</span><br><span>--- a/src/pdch.cpp</span><br><span>+++ b/src/pdch.cpp</span><br><span>@@ -306,12 +306,10 @@</span><br><span>    uint32_t tlli = packet->TLLI;</span><br><span>     GprsMs *ms = bts_ms_by_tlli(bts(), tlli, GSM_RESERVED_TMSI);</span><br><span>         gprs_rlcmac_ul_tbf *ul_tbf;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct pdch_ulc_node *poll;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- tbf = bts_ul_tbf_by_poll_fn(bts(), fn, trx_no(), ts_no);</span><br><span style="color: hsl(0, 100%, 40%);">-        if (!tbf)</span><br><span style="color: hsl(0, 100%, 40%);">-               tbf = bts_dl_tbf_by_poll_fn(bts(), fn, trx_no(), ts_no);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (!tbf) {</span><br><span style="color: hsl(120, 100%, 40%);">+   poll = pdch_ulc_get_node(ulc, fn);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!poll || poll->type !=PDCH_ULC_NODE_TBF_POLL || !poll->tbf_poll.poll_tbf) {</span><br><span>                LOGPDCH(this, DRLCMAC, LOGL_NOTICE, "PACKET CONTROL ACK with "</span><br><span>                     "unknown FN=%u TLLI=0x%08x (TRX %d TS %d)\n",</span><br><span>                      fn, tlli, trx_no(), ts_no);</span><br><span>@@ -326,6 +324,7 @@</span><br><span>                            ms_dl_tbf(ms) ? ms_dl_tbf(ms)->state_name() : "None");</span><br><span>          return;</span><br><span>      }</span><br><span style="color: hsl(120, 100%, 40%);">+     tbf = poll->tbf_poll.poll_tbf;</span><br><span> </span><br><span>        /* Reset N3101 counter: */</span><br><span>   tbf->n_reset(N3101);</span><br><span>@@ -334,6 +333,7 @@</span><br><span> </span><br><span>    LOGPTBF(tbf, LOGL_DEBUG, "RX: [PCU <- BTS] Packet Control Ack\n");</span><br><span>      TBF_POLL_SCHED_UNSET(tbf);</span><br><span style="color: hsl(120, 100%, 40%);">+    pdch_ulc_release_fn(ulc, fn);</span><br><span> </span><br><span>    /* check if this control ack belongs to packet uplink ack */</span><br><span>         ul_tbf = as_ul_tbf(tbf);</span><br><span>@@ -426,6 +426,7 @@</span><br><span> void gprs_rlcmac_pdch::rcv_control_dl_ack_nack(Packet_Downlink_Ack_Nack_t *ack_nack, uint32_t fn, struct pcu_l1_meas *meas)</span><br><span> {</span><br><span>   int8_t tfi = 0; /* must be signed */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct pdch_ulc_node *poll;</span><br><span>  struct gprs_rlcmac_dl_tbf *tbf;</span><br><span>      int rc;</span><br><span>      int num_blocks;</span><br><span>@@ -435,13 +436,14 @@</span><br><span>      char show_bits[RLC_GPRS_WS + 1];</span><br><span> </span><br><span>         tfi = ack_nack->DOWNLINK_TFI;</span><br><span style="color: hsl(0, 100%, 40%);">-        tbf = bts_dl_tbf_by_poll_fn(bts(), fn, trx_no(), ts_no);</span><br><span style="color: hsl(0, 100%, 40%);">-        if (!tbf) {</span><br><span style="color: hsl(120, 100%, 40%);">+   poll = pdch_ulc_get_node(ulc, fn);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!poll || poll->type != PDCH_ULC_NODE_TBF_POLL) {</span><br><span>              LOGPDCH(this, DRLCMAC, LOGL_NOTICE, "PACKET DOWNLINK ACK with "</span><br><span>                    "unknown FN=%u TFI=%d (TRX %d TS %d)\n",</span><br><span>                   fn, tfi, trx_no(), ts_no);</span><br><span>           return;</span><br><span>      }</span><br><span style="color: hsl(120, 100%, 40%);">+     tbf = as_dl_tbf(poll->tbf_poll.poll_tbf);</span><br><span>         if (tbf->tfi() != tfi) {</span><br><span>          LOGPTBFDL(tbf, LOGL_NOTICE,</span><br><span>                    "PACKET DOWNLINK ACK with wrong TFI=%d, ignoring!\n", tfi);</span><br><span>@@ -453,6 +455,7 @@</span><br><span> </span><br><span>    if (tbf->handle_ack_nack())</span><br><span>               LOGPTBF(tbf, LOGL_NOTICE, "Recovered downlink ack\n");</span><br><span style="color: hsl(120, 100%, 40%);">+      pdch_ulc_release_fn(ulc, fn);</span><br><span> </span><br><span>    LOGPTBF(tbf, LOGL_DEBUG, "RX: [PCU <- BTS] Packet Downlink Ack/Nack\n");</span><br><span> </span><br><span>@@ -493,6 +496,7 @@</span><br><span> {</span><br><span>         int8_t tfi = 0; /* must be signed */</span><br><span>         struct gprs_rlcmac_dl_tbf *tbf;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct pdch_ulc_node *poll;</span><br><span>  gprs_rlc_dl_window *window;</span><br><span>  int rc;</span><br><span>      int num_blocks;</span><br><span>@@ -502,13 +506,14 @@</span><br><span>      int bsn_begin, bsn_end;</span><br><span> </span><br><span>  tfi = ack_nack->DOWNLINK_TFI;</span><br><span style="color: hsl(0, 100%, 40%);">-        tbf = bts_dl_tbf_by_poll_fn(bts(), fn, trx_no(), ts_no);</span><br><span style="color: hsl(0, 100%, 40%);">-        if (!tbf) {</span><br><span style="color: hsl(120, 100%, 40%);">+   poll = pdch_ulc_get_node(ulc, fn);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!poll || poll->type !=PDCH_ULC_NODE_TBF_POLL) {</span><br><span>               LOGPDCH(this, DRLCMAC, LOGL_NOTICE, "EGPRS PACKET DOWNLINK ACK with "</span><br><span>                      "unknown FN=%u TFI=%d (TRX %d TS %d)\n",</span><br><span>                   fn, tfi, trx_no(), ts_no);</span><br><span>           return;</span><br><span>      }</span><br><span style="color: hsl(120, 100%, 40%);">+     tbf = as_dl_tbf(poll->tbf_poll.poll_tbf);</span><br><span>         if (tbf->tfi() != tfi) {</span><br><span>          LOGPDCH(this, DRLCMAC, LOGL_NOTICE, "EGPRS PACKET DOWNLINK ACK with "</span><br><span>                      "wrong TFI=%d, ignoring!\n", tfi);</span><br><span>@@ -520,6 +525,7 @@</span><br><span> </span><br><span>       if (tbf->handle_ack_nack())</span><br><span>               LOGPTBF(tbf, LOGL_NOTICE, "Recovered EGPRS downlink ack\n");</span><br><span style="color: hsl(120, 100%, 40%);">+        pdch_ulc_release_fn(ulc, fn);</span><br><span> </span><br><span>    LOGPTBF(tbf, LOGL_DEBUG,</span><br><span>             "RX: [PCU <- BTS] EGPRS Packet Downlink Ack/Nack\n");</span><br><span>@@ -694,6 +700,7 @@</span><br><span> void gprs_rlcmac_pdch::rcv_measurement_report(Packet_Measurement_Report_t *report, uint32_t fn)</span><br><span> {</span><br><span>     struct gprs_rlcmac_sba *sba;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct pdch_ulc_node *poll;</span><br><span>  GprsMs *ms;</span><br><span> </span><br><span>      ms = bts_ms_by_tlli(bts(), report->TLLI, GSM_RESERVED_TMSI);</span><br><span>@@ -703,9 +710,23 @@</span><br><span>               ms = bts_alloc_ms(bts(), 0, 0);</span><br><span>              ms_set_tlli(ms, report->TLLI);</span><br><span>    }</span><br><span style="color: hsl(0, 100%, 40%);">-       if ((sba = pdch_ulc_get_sba(this->ulc, fn))) {</span><br><span style="color: hsl(0, 100%, 40%);">-               ms_set_ta(ms, sba->ta);</span><br><span style="color: hsl(0, 100%, 40%);">-              sba_free(sba);</span><br><span style="color: hsl(120, 100%, 40%);">+        if ((poll = pdch_ulc_get_node(ulc, fn))) {</span><br><span style="color: hsl(120, 100%, 40%);">+            switch (poll->type) {</span><br><span style="color: hsl(120, 100%, 40%);">+              case PDCH_ULC_NODE_TBF_USF:</span><br><span style="color: hsl(120, 100%, 40%);">+                   break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case PDCH_ULC_NODE_TBF_POLL:</span><br><span style="color: hsl(120, 100%, 40%);">+                  LOGPDCH(this, DRLCMAC, LOGL_INFO, "FN=%" PRIu32 " Rx Meas Report "</span><br><span style="color: hsl(120, 100%, 40%);">+                                "on RRBP POLL, this probably means a DL/CTRL ACK/NACk will "</span><br><span style="color: hsl(120, 100%, 40%);">+                                "need to be polled again later\n", fn);</span><br><span style="color: hsl(120, 100%, 40%);">+                     TBF_POLL_SCHED_UNSET(poll->tbf_poll.poll_tbf);</span><br><span style="color: hsl(120, 100%, 40%);">+                     pdch_ulc_release_fn(ulc, fn);</span><br><span style="color: hsl(120, 100%, 40%);">+                 break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case PDCH_ULC_NODE_SBA:</span><br><span style="color: hsl(120, 100%, 40%);">+                       sba = poll->sba.sba;</span><br><span style="color: hsl(120, 100%, 40%);">+                       ms_set_ta(ms, sba->ta);</span><br><span style="color: hsl(120, 100%, 40%);">+                    sba_free(sba);</span><br><span style="color: hsl(120, 100%, 40%);">+                        break;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span>    }</span><br><span>    gprs_rlcmac_meas_rep(ms, report);</span><br><span> }</span><br><span>@@ -795,6 +816,7 @@</span><br><span>                         "FN=%u RX: [PCU <- BTS] unknown control block(%d) received\n",</span><br><span>                  fn, ul_control_block->u.MESSAGE_TYPE);</span><br><span>    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> free_ret:</span><br><span>     talloc_free(ul_control_block);</span><br><span>       bitvec_free(rlc_block);</span><br><span>@@ -809,13 +831,8 @@</span><br><span>       bts_set_current_frame_number(trx->bts, fn);</span><br><span> </span><br><span>   /* No successfully decoded UL block was received during this FN: */</span><br><span style="color: hsl(0, 100%, 40%);">-     if (len == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-         /* TODO: Here, in the future, it can be checked whether a UL block was expected for:</span><br><span style="color: hsl(0, 100%, 40%);">-             * - UL/DL TBFs: RRBP poll pending (bts->pollController->expireTimedout)</span><br><span style="color: hsl(0, 100%, 40%);">-           * - UL TBFs: USF poll pending (we don't store this info in ul_tbf yet) -> inc N3101 (OS#5033)</span><br><span style="color: hsl(0, 100%, 40%);">-            */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (len == 0)</span><br><span>                return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span> </span><br><span>        enum CodingScheme cs = mcs_get_by_size_ul(len);</span><br><span>      if (!cs) {</span><br><span>@@ -1007,6 +1024,8 @@</span><br><span>   m_assigned_tfi[tbf->direction] &= ~(1UL << tbf->tfi());</span><br><span>      m_tbfs[tbf->direction][tbf->tfi()] = NULL;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  pdch_ulc_release_tbf(ulc, tbf);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    LOGPDCH(this, DRLCMAC, LOGL_INFO, "Detaching %s, %d TBFs, "</span><br><span>                "USFs = %02x, TFIs = %08x.\n",</span><br><span>             tbf->name(), m_num_tbfs[tbf->direction],</span><br><span>diff --git a/src/pdch_ul_controller.c b/src/pdch_ul_controller.c</span><br><span>index ecd3691..38e6893 100644</span><br><span>--- a/src/pdch_ul_controller.c</span><br><span>+++ b/src/pdch_ul_controller.c</span><br><span>@@ -25,6 +25,7 @@</span><br><span> #include "bts.h"</span><br><span> #include "sba.h"</span><br><span> #include "pdch.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "pcu_utils.h"</span><br><span> </span><br><span> /* TS 44.060 Table 10.4.5.1 states maximum RRBP is N + 26. Give extra space for time diff between Tx and Rx? */</span><br><span> #define MAX_FN_RESERVED (27 + 50)</span><br><span>@@ -83,6 +84,22 @@</span><br><span>        return !pdch_ulc_get_node(ulc, fn);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int pdch_ulc_get_next_free_rrbp_fn(struct pdch_ulc *ulc, uint32_t fn, uint32_t *poll_fn, unsigned int *rrbp)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ /* TODO: support other RRBP offsets, see TS 44.060 able 10.4.5.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint32_t new_poll_fn = next_fn(fn, 13);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!pdch_ulc_fn_is_free(ulc, new_poll_fn)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGPDCH(ulc->pdch, DRLCMAC, LOGL_ERROR, "Polling is already scheduled "</span><br><span style="color: hsl(120, 100%, 40%);">+                  "for single block allocation at FN=%u\n", fn);</span><br><span style="color: hsl(120, 100%, 40%);">+              return -EBUSY;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   *poll_fn = new_poll_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+       *rrbp = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static struct pdch_ulc_node *_alloc_node(struct pdch_ulc *ulc, uint32_t fn)</span><br><span> {</span><br><span>   struct pdch_ulc_node *node;</span><br><span>@@ -126,7 +143,10 @@</span><br><span> </span><br><span> int pdch_ulc_reserve_tbf_poll(struct pdch_ulc *ulc, uint32_t fn, struct gprs_rlcmac_tbf *tbf)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    return 0; /* TODO: implement */</span><br><span style="color: hsl(120, 100%, 40%);">+       struct pdch_ulc_node *item = _alloc_node(ulc, fn);</span><br><span style="color: hsl(120, 100%, 40%);">+    item->type = PDCH_ULC_NODE_TBF_POLL;</span><br><span style="color: hsl(120, 100%, 40%);">+       item->tbf_poll.poll_tbf = tbf;</span><br><span style="color: hsl(120, 100%, 40%);">+     return pdch_ulc_add_node(ulc, item);</span><br><span> }</span><br><span> </span><br><span> int pdch_ulc_reserve_sba(struct pdch_ulc *ulc, struct gprs_rlcmac_sba *sba)</span><br><span>@@ -147,6 +167,40 @@</span><br><span>  return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void pdch_ulc_release_tbf(struct pdch_ulc *ulc, const struct gprs_rlcmac_tbf *tbf)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     bool tree_modified;</span><br><span style="color: hsl(120, 100%, 40%);">+   do {</span><br><span style="color: hsl(120, 100%, 40%);">+          struct rb_node *node;</span><br><span style="color: hsl(120, 100%, 40%);">+         struct pdch_ulc_node *item;</span><br><span style="color: hsl(120, 100%, 40%);">+           const struct gprs_rlcmac_tbf *item_tbf;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             tree_modified = false;</span><br><span style="color: hsl(120, 100%, 40%);">+                for (node = rb_first(&ulc->tree_root); node; node = rb_next(node)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   item = container_of(node, struct pdch_ulc_node, node);</span><br><span style="color: hsl(120, 100%, 40%);">+                        switch (item->type) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      case PDCH_ULC_NODE_SBA:</span><br><span style="color: hsl(120, 100%, 40%);">+                               continue;</span><br><span style="color: hsl(120, 100%, 40%);">+                     case PDCH_ULC_NODE_TBF_POLL:</span><br><span style="color: hsl(120, 100%, 40%);">+                          item_tbf = item->tbf_poll.poll_tbf;</span><br><span style="color: hsl(120, 100%, 40%);">+                                break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        case PDCH_ULC_NODE_TBF_USF:</span><br><span style="color: hsl(120, 100%, 40%);">+                           item_tbf = (struct gprs_rlcmac_tbf *)item->tbf_usf.ul_tbf;</span><br><span style="color: hsl(120, 100%, 40%);">+                         break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        }</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (item_tbf != tbf)</span><br><span style="color: hsl(120, 100%, 40%);">+                          continue;</span><br><span style="color: hsl(120, 100%, 40%);">+                     /* One entry found, remove it from tree and restart</span><br><span style="color: hsl(120, 100%, 40%);">+                    * search from start (to avoid traverse continue from</span><br><span style="color: hsl(120, 100%, 40%);">+                  * no-more existant node */</span><br><span style="color: hsl(120, 100%, 40%);">+                   tree_modified = true;</span><br><span style="color: hsl(120, 100%, 40%);">+                 rb_erase(&item->node, &ulc->tree_root);</span><br><span style="color: hsl(120, 100%, 40%);">+                 talloc_free(item);</span><br><span style="color: hsl(120, 100%, 40%);">+                    break;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+     } while (tree_modified);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> void pdch_ulc_expire_fn(struct pdch_ulc *ulc, uint32_t fn)</span><br><span> {</span><br><span>     struct gprs_rlcmac_sba *sba;</span><br><span>@@ -170,7 +224,10 @@</span><br><span>                  /* TODO: increase N3...*/</span><br><span>                    break;</span><br><span>               case PDCH_ULC_NODE_TBF_POLL:</span><br><span style="color: hsl(0, 100%, 40%);">-                    /* TODO: increase N3...*/</span><br><span style="color: hsl(120, 100%, 40%);">+                     LOGPDCH(ulc->pdch, DRLCMAC, LOGL_NOTICE,</span><br><span style="color: hsl(120, 100%, 40%);">+                           "Timeout for registered POLL (FN=%u): %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                                item->fn, tbf_name(item->tbf_poll.poll_tbf));</span><br><span style="color: hsl(120, 100%, 40%);">+                   tbf_poll_timeout(item->tbf_poll.poll_tbf);</span><br><span>                        break;</span><br><span>               case PDCH_ULC_NODE_SBA:</span><br><span>                      sba = item->sba.sba;</span><br><span>diff --git a/src/pdch_ul_controller.h b/src/pdch_ul_controller.h</span><br><span>index e86dbf5..53604a9 100644</span><br><span>--- a/src/pdch_ul_controller.h</span><br><span>+++ b/src/pdch_ul_controller.h</span><br><span>@@ -70,10 +70,14 @@</span><br><span> </span><br><span> bool pdch_ulc_fn_is_free(struct pdch_ulc *ulc, uint32_t fn);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int pdch_ulc_get_next_free_rrbp_fn(struct pdch_ulc *ulc, uint32_t fn, uint32_t *poll_fn, unsigned int *rrbp);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct pdch_ulc_node *pdch_ulc_get_node(struct pdch_ulc *ulc, uint32_t fn);</span><br><span> struct pdch_ulc_node *pdch_ulc_pop_node(struct pdch_ulc *ulc, uint32_t fn);</span><br><span> struct gprs_rlcmac_sba *pdch_ulc_get_sba(struct pdch_ulc *ulc, uint32_t fn);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void pdch_ulc_release_tbf(struct pdch_ulc *ulc, const struct gprs_rlcmac_tbf *tbf);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int pdch_ulc_release_fn(struct pdch_ulc *ulc, uint32_t fn);</span><br><span> </span><br><span> void pdch_ulc_expire_fn(struct pdch_ulc *ulc, uint32_t fn);</span><br><span>diff --git a/src/poll_controller.cpp b/src/poll_controller.cpp</span><br><span>deleted file mode 100644</span><br><span>index fe10171..0000000</span><br><span>--- a/src/poll_controller.cpp</span><br><span>+++ /dev/null</span><br><span>@@ -1,70 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/* poll_controller.h</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * Copyright (C) 2012 Andreas Eversberg <jolly@eversberg.eu></span><br><span style="color: hsl(0, 100%, 40%);">- * Copyright (C) 2013 by Holger Hans Peter Freyther</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * All Rights Reserved</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(0, 100%, 40%);">- * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(0, 100%, 40%);">- * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(0, 100%, 40%);">- * (at your option) any later version.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(0, 100%, 40%);">- * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(0, 100%, 40%);">- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(0, 100%, 40%);">- * GNU General Public License for more details.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(0, 100%, 40%);">- * along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <poll_controller.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <bts.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <tbf.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <tbf_ul.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <tbf_dl.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <cxx_linuxlist.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <sba.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-extern "C" {</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/linuxlist.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/gsm_utils.h></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%);">-PollController::PollController(struct gprs_rlcmac_bts& bts)</span><br><span style="color: hsl(0, 100%, 40%);">-     : m_bts(bts)</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%);">-static inline bool elapsed_fn_check(unsigned max_delay, int frame_number, uint32_t from)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t elapsed = (frame_number + GSM_MAX_FN - from) % GSM_MAX_FN;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     if (elapsed > max_delay && elapsed < 2715400)</span><br><span style="color: hsl(0, 100%, 40%);">-             return true;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    return false;</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%);">-void PollController::expireTimedout(int frame_number, unsigned max_delay)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        struct gprs_rlcmac_dl_tbf *dl_tbf;</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gprs_rlcmac_ul_tbf *ul_tbf;</span><br><span style="color: hsl(0, 100%, 40%);">-      struct llist_item *pos;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- llist_for_each_entry(pos, &m_bts.ul_tbfs, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-           ul_tbf = as_ul_tbf((struct gprs_rlcmac_tbf *)pos->entry);</span><br><span style="color: hsl(0, 100%, 40%);">-            if (ul_tbf->poll_scheduled()) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      if (elapsed_fn_check(max_delay, frame_number, ul_tbf->poll_fn))</span><br><span style="color: hsl(0, 100%, 40%);">-                              ul_tbf->poll_timeout();</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%);">-       llist_for_each_entry(pos, &m_bts.dl_tbfs, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-           dl_tbf = as_dl_tbf((struct gprs_rlcmac_tbf *)pos->entry);</span><br><span style="color: hsl(0, 100%, 40%);">-            if (dl_tbf->poll_scheduled()) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      if (elapsed_fn_check(max_delay, frame_number, dl_tbf->poll_fn))</span><br><span style="color: hsl(0, 100%, 40%);">-                              dl_tbf->poll_timeout();</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>diff --git a/src/poll_controller.h b/src/poll_controller.h</span><br><span>deleted file mode 100644</span><br><span>index 8e709a3..0000000</span><br><span>--- a/src/poll_controller.h</span><br><span>+++ /dev/null</span><br><span>@@ -1,45 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/* poll_controller.h</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * Copyright (C) 2013 by Holger Hans Peter Freyther</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * All Rights Reserved</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(0, 100%, 40%);">- * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(0, 100%, 40%);">- * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(0, 100%, 40%);">- * (at your option) any later version.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(0, 100%, 40%);">- * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(0, 100%, 40%);">- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(0, 100%, 40%);">- * GNU General Public License for more details.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(0, 100%, 40%);">- * along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#pragma once</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct gprs_rlcmac_bts;</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%);">- * I belong to a BTS and I am responsible for finding TBFs and</span><br><span style="color: hsl(0, 100%, 40%);">- * SBAs that should have been polled and execute the timeout</span><br><span style="color: hsl(0, 100%, 40%);">- * action on them.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-struct PollController {</span><br><span style="color: hsl(0, 100%, 40%);">-public:</span><br><span style="color: hsl(0, 100%, 40%);">-   PollController(struct gprs_rlcmac_bts& bts);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* check for poll timeout */</span><br><span style="color: hsl(0, 100%, 40%);">-    void expireTimedout(int frame_number, unsigned max_delay);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-private:</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gprs_rlcmac_bts& m_bts;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-private:</span><br><span style="color: hsl(0, 100%, 40%);">-      /* disable copying to avoid slicing */</span><br><span style="color: hsl(0, 100%, 40%);">-  PollController(const PollController&);</span><br><span style="color: hsl(0, 100%, 40%);">-      PollController& operator=(const PollController&);</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span>diff --git a/src/tbf.cpp b/src/tbf.cpp</span><br><span>index 87ca5bd..7237f58 100644</span><br><span>--- a/src/tbf.cpp</span><br><span>+++ b/src/tbf.cpp</span><br><span>@@ -550,8 +550,7 @@</span><br><span> int gprs_rlcmac_tbf::check_polling(uint32_t fn, uint8_t ts,</span><br><span>    uint32_t *poll_fn_, unsigned int *rrbp_) const</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     uint32_t new_poll_fn = next_fn(fn, 13);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+       int rc;</span><br><span>      if (!is_control_ts(ts)) {</span><br><span>            LOGPTBF(this, LOGL_DEBUG, "Polling cannot be "</span><br><span>                     "scheduled in this TS %d (first control TS %d)\n",</span><br><span>@@ -562,15 +561,13 @@</span><br><span>                 LOGPTBF(this, LOGL_DEBUG, "Polling is already scheduled\n");</span><br><span>               return -EBUSY;</span><br><span>       }</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!pdch_ulc_fn_is_free(trx->pdch[ts].ulc, new_poll_fn)) {</span><br><span style="color: hsl(0, 100%, 40%);">-          LOGPTBF(this, LOGL_DEBUG, "Polling is already scheduled "</span><br><span style="color: hsl(0, 100%, 40%);">-                     "for single block allocation at FN %d TS %d ...\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                   new_poll_fn, ts);</span><br><span style="color: hsl(0, 100%, 40%);">-               return -EBUSY;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   *poll_fn_ = new_poll_fn;</span><br><span style="color: hsl(0, 100%, 40%);">-        *rrbp_ = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   if ((rc = pdch_ulc_get_next_free_rrbp_fn(trx->pdch[ts].ulc, fn, poll_fn_, rrbp_)) < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGPTBF(this, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+                     "(bts=%u,trx=%u,ts=%u) FN=%u No suitable free RRBP offset found!\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                        trx->bts->nr, trx->trx_no, ts, fn);</span><br><span style="color: hsl(120, 100%, 40%);">+          return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span> </span><br><span>        return 0;</span><br><span> }</span><br><span>@@ -591,6 +588,11 @@</span><br><span>                          chan, new_poll_fn, ts);</span><br><span> </span><br><span>        /* schedule polling */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (pdch_ulc_reserve_tbf_poll(trx->pdch[ts].ulc, new_poll_fn, this) < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPTBFDL(this, LOGL_ERROR, "Failed scheduling poll on %s (FN=%d, TS=%d)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                          chan, poll_fn, ts);</span><br><span style="color: hsl(120, 100%, 40%);">+         return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span>    poll_state = GPRS_RLCMAC_POLL_SCHED;</span><br><span>         poll_fn = new_poll_fn;</span><br><span>       poll_ts = ts;</span><br><span>@@ -1230,3 +1232,8 @@</span><br><span> {</span><br><span>   return tbf->set_polling(new_poll_fn, ts, t);</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void tbf_poll_timeout(struct gprs_rlcmac_tbf *tbf)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ tbf->poll_timeout();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/tbf.h b/src/tbf.h</span><br><span>index 989ec08..779bc26 100644</span><br><span>--- a/src/tbf.h</span><br><span>+++ b/src/tbf.h</span><br><span>@@ -209,6 +209,7 @@</span><br><span> int tbf_assign_control_ts(struct gprs_rlcmac_tbf *tbf);</span><br><span> int tbf_check_polling(const struct gprs_rlcmac_tbf *tbf, uint32_t fn, uint8_t ts, uint32_t *poll_fn, unsigned int *rrbp);</span><br><span> void tbf_set_polling(struct gprs_rlcmac_tbf *tbf, uint32_t new_poll_fn, uint8_t ts, enum gprs_rlcmac_tbf_poll_type t);</span><br><span style="color: hsl(120, 100%, 40%);">+void tbf_poll_timeout(struct gprs_rlcmac_tbf *tbf);</span><br><span> #ifdef __cplusplus</span><br><span> }</span><br><span> #endif</span><br><span>diff --git a/tests/tbf/TbfTest.cpp b/tests/tbf/TbfTest.cpp</span><br><span>index f7524c9..ed54545 100644</span><br><span>--- a/tests/tbf/TbfTest.cpp</span><br><span>+++ b/tests/tbf/TbfTest.cpp</span><br><span>@@ -629,6 +629,14 @@</span><br><span>        return ul_tbf;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void send_ul_mac_block_buf(struct gprs_rlcmac_bts *bts, struct gprs_rlcmac_pdch *pdch,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  unsigned fn, uint8_t *buf, int num_bytes)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        bts_set_current_block_frame_number(bts, fn, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+       pdch->rcv_block(buf, num_bytes, fn, &meas);</span><br><span style="color: hsl(120, 100%, 40%);">+    pdch_ulc_expire_fn(pdch->ulc, fn);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void send_ul_mac_block(struct gprs_rlcmac_bts *bts, unsigned trx_no, unsigned ts_no,</span><br><span>    RlcMacUplink_t *ulreq, unsigned fn)</span><br><span> {</span><br><span>@@ -644,10 +652,8 @@</span><br><span>      OSMO_ASSERT(size_t(num_bytes) < sizeof(buf));</span><br><span>     bitvec_free(rlc_block);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     bts_set_current_block_frame_number(bts, fn, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>      pdch = &bts->trx[trx_no].pdch[ts_no];</span><br><span style="color: hsl(0, 100%, 40%);">-    pdch->rcv_block(&buf[0], num_bytes, fn, &meas);</span><br><span style="color: hsl(120, 100%, 40%);">+    send_ul_mac_block_buf(bts, pdch, fn, &buf[0], num_bytes);</span><br><span> }</span><br><span> </span><br><span> static void send_control_ack(gprs_rlcmac_tbf *tbf)</span><br><span>@@ -667,6 +673,13 @@</span><br><span>          &ulreq, tbf->poll_fn);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void send_empty_block(gprs_rlcmac_tbf *tbf, unsigned ts_no, unsigned fn)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gprs_rlcmac_pdch *pdch;</span><br><span style="color: hsl(120, 100%, 40%);">+        pdch = &tbf->bts->trx[tbf->trx->trx_no].pdch[ts_no];</span><br><span style="color: hsl(120, 100%, 40%);">+  send_ul_mac_block_buf(tbf->bts, pdch, fn, NULL, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static gprs_rlcmac_ul_tbf *puan_urbb_len_issue(struct gprs_rlcmac_bts *bts,</span><br><span>   uint8_t ts_no, uint32_t tlli, uint32_t *fn, uint16_t qta,</span><br><span>    uint8_t ms_class, uint8_t egprs_ms_class)</span><br><span>@@ -1887,6 +1900,7 @@</span><br><span>    const char *imsi = "0011223344";</span><br><span>   uint8_t ms_class = 1;</span><br><span>        gprs_rlcmac_ul_tbf *ul_tbf;</span><br><span style="color: hsl(120, 100%, 40%);">+   gprs_rlcmac_dl_tbf *dl_tbf;</span><br><span>  GprsMs *ms, *ms1, *ms2;</span><br><span> </span><br><span>  fprintf(stderr, "=== start %s ===\n", __func__);</span><br><span>@@ -1913,6 +1927,12 @@</span><br><span>  transmit_dl_data(bts, tlli1, &fn);</span><br><span>       OSMO_ASSERT(llc_queue_size(ms_llc_queue(ms1)) == 0);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+      dl_tbf = ms_dl_tbf(ms1);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(dl_tbf);</span><br><span style="color: hsl(120, 100%, 40%);">+  fn = dl_tbf->poll_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+      send_empty_block(dl_tbf, dl_tbf->poll_ts, fn);</span><br><span style="color: hsl(120, 100%, 40%);">+     fn = fn_add_blocks(fn, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         /* Now establish a new TBF for the RA UPDATE COMPLETE (new TLLI) */</span><br><span>  ul_tbf = establish_ul_tbf_two_phase(bts, ts_no, tlli2, &fn, qta,</span><br><span>                 ms_class, 0);</span><br><span>@@ -2679,9 +2699,11 @@</span><br><span>       OSMO_ASSERT(dl_tbf->state_is(GPRS_RLCMAC_FLOW));</span><br><span> </span><br><span>      /* Drain the queue */</span><br><span style="color: hsl(0, 100%, 40%);">-   while (dl_tbf->have_data())</span><br><span style="color: hsl(120, 100%, 40%);">+        while (dl_tbf->have_data()) {</span><br><span>             /* Request to send one RLC/MAC block */</span><br><span>              request_dl_rlc_block(dl_tbf, &fn);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     send_empty_block(dl_tbf, dl_tbf->poll_ts, fn);</span><br><span> </span><br><span>        /* Schedule a large LLC frame */</span><br><span>     dl_tbf->append_data(1000, test_data, sizeof(test_data));</span><br><span>@@ -2689,9 +2711,11 @@</span><br><span>         OSMO_ASSERT(dl_tbf->state_is(GPRS_RLCMAC_FLOW));</span><br><span> </span><br><span>      /* Drain the queue */</span><br><span style="color: hsl(0, 100%, 40%);">-   while (dl_tbf->have_data())</span><br><span style="color: hsl(120, 100%, 40%);">+        while (dl_tbf->have_data()) {</span><br><span>             /* Request to send one RLC/MAC block */</span><br><span>              request_dl_rlc_block(dl_tbf, &fn);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     send_empty_block(dl_tbf, dl_tbf->poll_ts, fn);</span><br><span> </span><br><span>        OSMO_ASSERT(dl_tbf->state_is(GPRS_RLCMAC_FLOW));</span><br><span> </span><br><span>@@ -3034,7 +3058,8 @@</span><br><span>              /* Send first RLC data block with demanded_mcs */</span><br><span>            MAKE_ACKED(msg, dl_tbf, fn, mcs, true);</span><br><span>      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Clean up pending items in UL controller: */</span><br><span style="color: hsl(120, 100%, 40%);">+        send_empty_block(dl_tbf, dl_tbf->poll_ts, fn+50);</span><br><span>         tbf_cleanup(dl_tbf);</span><br><span> }</span><br><span> </span><br><span>diff --git a/tests/tbf/TbfTest.err b/tests/tbf/TbfTest.err</span><br><span>index 2f370d4..c519a67 100644</span><br><span>--- a/tests/tbf/TbfTest.err</span><br><span>+++ b/tests/tbf/TbfTest.err</span><br><span>@@ -1706,26 +1706,31 @@</span><br><span> TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) starting timer T3191 [final block (DL-TBF)] with 5 sec. 0 microsec, cur_fn=2654288</span><br><span> TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) Scheduled Ack/Nack polling on FN=2654292, TS=7</span><br><span> TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) msg block (BSN 0, CS-4): 0f 01 00 29 52 41 55 5f 41 43 43 45 50 54 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 00 </span><br><span style="color: hsl(0, 100%, 40%);">-Received RTS for PDCH: TRX=0 TS=7 FN=2654283 block_nr=11 scheduling USF=0 for required uplink resource of UL TFI=0</span><br><span style="color: hsl(0, 100%, 40%);">-PDCH(bts=0,trx=0,ts=7) FN=2654283 Scheduling data message at RTS for DL TFI=0 prio=1 mcs_mode_restrict=EGPRS_GMSK-only</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=7) Timeout for registered POLL (FN=2654292): TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) poll timeout for FN=2654292, TS=7 (curr FN 2654292)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) N3101 0 => 1 (< MAX 10)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) Timeout for polling PACKET DOWNLINK ACK: |Assignment was on PACCH|No downlink ACK received yet|</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) N3105 0 => 1 (< MAX 8)</span><br><span style="color: hsl(120, 100%, 40%);">+Received RTS for PDCH: TRX=0 TS=7 FN=2654296 block_nr=2 scheduling USF=0 for required uplink resource of UL TFI=0</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=7) FN=2654296 Scheduling data message at RTS for DL TFI=0 prio=5 mcs_mode_restrict=EGPRS_GMSK-only</span><br><span> TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) downlink (V(A)==0 .. V(S)==1) mcs_mode_restrict=EGPRS_GMSK-only</span><br><span> TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) Restarting at BSN 0, because all blocks have been transmitted.</span><br><span> TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) Resending BSN 0</span><br><span> TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) need_padding 0 spb_status 0 spb 0 (BSN1 0 BSN2 -1)</span><br><span> TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) Copying 1 RLC blocks, 1 BSNs</span><br><span> TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) Copying data unit 0 (BSN 0)</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) msg block (BSN 0, CS-4): 07 01 00 29 52 41 55 5f 41 43 43 45 50 54 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 00 </span><br><span style="color: hsl(0, 100%, 40%);">-MS requests Uplink resource on CCCH/RACH: ra=0x73 (8 bit) Fn=2654232 qta=31</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) Scheduling Ack/Nack polling, because polling timed out.</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) Scheduled DL Acknowledgement polling on PACCH (FN=2654309, TS=7)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) restarting timer T3191 [final block (DL-TBF)] with 5 sec. 0 microsec, cur_fn=2654292</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) Scheduled Ack/Nack polling on FN=2654309, TS=7</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) msg block (BSN 0, CS-4): 0f 01 00 29 52 41 55 5f 41 43 43 45 50 54 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 00 </span><br><span style="color: hsl(120, 100%, 40%);">+MS requests Uplink resource on CCCH/RACH: ra=0x73 (8 bit) Fn=2654245 qta=31</span><br><span> MS requests single block allocation</span><br><span style="color: hsl(0, 100%, 40%);">-Allocated a single block at SBFn=2654335 TRX=0 TS=7</span><br><span style="color: hsl(120, 100%, 40%);">+Allocated a single block at SBFn=2654348 TRX=0 TS=7</span><br><span> Tx Immediate Assignment on AGCH: TRX=0 (ARFCN 0) TS=7 TA=7 TSC=0 TFI=-1 USF=7</span><br><span> Found first unallocated TRX=0 TFI=1</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) poll timeout for FN=2654292, TS=7 (curr FN 2654335)</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) N3101 0 => 1 (< MAX 10)</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) Timeout for polling PACKET DOWNLINK ACK: |Assignment was on PACCH|No downlink ACK received yet|</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) N3105 0 => 1 (< MAX 8)</span><br><span style="color: hsl(0, 100%, 40%);">-PDCH(bts=0,trx=0,ts=7) FN=2654335 +++++++++++++++++++++++++ RX : Uplink Control Block +++++++++++++++++++++++++</span><br><span style="color: hsl(0, 100%, 40%);">-PDCH(bts=0,trx=0,ts=7) FN=2654335 ------------------------- RX : Uplink Control Block -------------------------</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=7) FN=2654348 +++++++++++++++++++++++++ RX : Uplink Control Block +++++++++++++++++++++++++</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=7) FN=2654348 ------------------------- RX : Uplink Control Block -------------------------</span><br><span> Creating MS object, TLLI = 0xffffffff</span><br><span> Modifying MS object, UL TLLI: 0xffffffff -> 0xf5667788, not yet confirmed</span><br><span> PDCH(bts=0,trx=0,ts=7) MS requests UL TBF in packet resource request of single block, so we provide one:</span><br><span>@@ -1747,17 +1752,23 @@</span><br><span> TBF(TFI=1 TLLI=0xf5667788 DIR=UL STATE=NULL) Allocated: trx = 0, ul_slots = 80, dl_slots = 00</span><br><span> MS(TLLI=0xf5667788, IMSI=, TA=7, 1/0,) Attaching UL TBF: TBF(TFI=1 TLLI=0xf5667788 DIR=UL STATE=NULL)</span><br><span> TBF(TFI=1 TLLI=0xf5667788 DIR=UL STATE=NULL) changes state from NULL to ASSIGN</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=1 TLLI=0xf5667788 DIR=UL STATE=ASSIGN) starting timer T3169 [allocation (UL-TBF)] with 5 sec. 0 microsec, cur_fn=2654335</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=1 TLLI=0xf5667788 DIR=UL STATE=ASSIGN) starting timer T3169 [allocation (UL-TBF)] with 5 sec. 0 microsec, cur_fn=2654348</span><br><span> TBF(TFI=1 TLLI=0xf5667788 DIR=UL STATE=ASSIGN) change control TS 7 -> 7 until assignment is complete.</span><br><span> TBF(TFI=1 TLLI=0xf5667788 DIR=UL STATE=ASSIGN) changes UL ASS state from GPRS_RLCMAC_UL_ASS_NONE to GPRS_RLCMAC_UL_ASS_SEND_ASS</span><br><span style="color: hsl(0, 100%, 40%);">-Received RTS for PDCH: TRX=0 TS=7 FN=2654335 block_nr=11 scheduling USF=0 for required uplink resource of UL TFI=0</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=7) Expiring FN=2654348 but previous FN=2654309 is still reserved!</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=7) Timeout for registered POLL (FN=2654309): TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) poll timeout for FN=2654309, TS=7 (curr FN 2654348)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) N3101 1 => 2 (< MAX 10)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) Timeout for polling PACKET DOWNLINK ACK: |Assignment was on PACCH|No downlink ACK received yet|</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) N3105 1 => 2 (< MAX 8)</span><br><span style="color: hsl(120, 100%, 40%);">+Received RTS for PDCH: TRX=0 TS=7 FN=2654348 block_nr=2 scheduling USF=0 for required uplink resource of UL TFI=0</span><br><span> TBF(TFI=1 TLLI=0xf5667788 DIR=UL STATE=ASSIGN) start Packet Uplink Assignment (PACCH)</span><br><span> +++++++++++++++++++++++++ TX : Packet Uplink Assignment +++++++++++++++++++++++++</span><br><span> ------------------------- TX : Packet Uplink Assignment -------------------------</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=1 TLLI=0xf5667788 DIR=UL STATE=ASSIGN) Scheduled UL Assignment polling on PACCH (FN=2654348, TS=7)</span><br><span style="color: hsl(0, 100%, 40%);">-PDCH(bts=0,trx=0,ts=7) FN=2654335 Scheduling control message at RTS for TBF(TFI=1 TLLI=0xf5667788 DIR=UL STATE=ASSIGN)</span><br><span style="color: hsl(0, 100%, 40%);">-PDCH(bts=0,trx=0,ts=7) FN=2654348 +++++++++++++++++++++++++ RX : Uplink Control Block +++++++++++++++++++++++++</span><br><span style="color: hsl(0, 100%, 40%);">-PDCH(bts=0,trx=0,ts=7) FN=2654348 ------------------------- RX : Uplink Control Block -------------------------</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=1 TLLI=0xf5667788 DIR=UL STATE=ASSIGN) Scheduled UL Assignment polling on PACCH (FN=2654361, TS=7)</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=7) FN=2654348 Scheduling control message at RTS for TBF(TFI=1 TLLI=0xf5667788 DIR=UL STATE=ASSIGN)</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=7) FN=2654361 +++++++++++++++++++++++++ RX : Uplink Control Block +++++++++++++++++++++++++</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=7) FN=2654361 ------------------------- RX : Uplink Control Block -------------------------</span><br><span> TBF(TFI=1 TLLI=0xf5667788 DIR=UL STATE=ASSIGN) RX: [PCU <- BTS] Packet Control Ack</span><br><span> TBF(TFI=1 TLLI=0xf5667788 DIR=UL STATE=ASSIGN) changes poll state from GPRS_RLCMAC_POLL_SCHED to GPRS_RLCMAC_POLL_NONE</span><br><span> TBF(TFI=1 TLLI=0xf5667788 DIR=UL STATE=ASSIGN) [DOWNLINK] UPLINK ASSIGNED</span><br><span>@@ -1765,7 +1776,7 @@</span><br><span> TBF(TFI=1 TLLI=0xf5667788 DIR=UL STATE=ASSIGN) changes state from ASSIGN to FLOW</span><br><span> PDCH(bts=0,trx=0,ts=7) Got CS-1 RLC block: R=0, SI=0, TFI=1, CPS=0, RSB=0, rc=184</span><br><span> TBF(TFI=1 TLLI=0xf5667788 DIR=UL STATE=FLOW) UL DATA TFI=1 received (V(Q)=0 .. V(R)=0)</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=1 TLLI=0xf5667788 DIR=UL STATE=FLOW) restarting timer T3169 [acked (data)] with 5 sec. 0 microsec, cur_fn=2654340</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=1 TLLI=0xf5667788 DIR=UL STATE=FLOW) restarting timer T3169 [acked (data)] with 5 sec. 0 microsec, cur_fn=2654353</span><br><span> TBF(TFI=1 TLLI=0xf5667788 DIR=UL STATE=FLOW) Got CS-1 RLC data block: CV=15, BSN=0, SPB=0, PI=0, E=1, TI=0, bitoffs=24</span><br><span> TBF(TFI=1 TLLI=0xf5667788 DIR=UL STATE=FLOW) BSN 0 storing in window (0..63)</span><br><span> TBF(TFI=1 TLLI=0xf5667788 DIR=UL STATE=FLOW) data_length=20, data=00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 </span><br><span>@@ -3691,11 +3702,17 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Scheduling Ack/Nack polling, because it was requested explicitly (e.g. first final block sent).</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Polling is already scheduled</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) msg block (BSN 24, MCS-1): 07 00 06 16 18 fe 03 02 02 02 02 02 56 56 56 56 56 56 56 56 56 56 56 56 56 56 00 </span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=4) Expiring FN=112 but previous FN=13 is still reserved!</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=4) Timeout for registered POLL (FN=13): TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) poll timeout for FN=13, TS=4 (curr FN 112)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) N3101 0 => 1 (< MAX 10)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Timeout for polling PACKET CONTROL ACK for PACKET DOWNLINK ASSIGNMENT: |No downlink ACK received yet|</span><br><span style="color: hsl(120, 100%, 40%);">+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> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) changes state from FLOW to WAIT RELEASE</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) starting timer T3193 [release (DL-TBF)] with 0 sec. 100000 microsec, cur_fn=2654167</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes DL ASS state from GPRS_RLCMAC_DL_ASS_WAIT_ACK to GPRS_RLCMAC_DL_ASS_NONE</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) starting timer T3193 [release (DL-TBF)] with 0 sec. 100000 microsec, cur_fn=112</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes DL ASS state from GPRS_RLCMAC_DL_ASS_SEND_ASS to GPRS_RLCMAC_DL_ASS_NONE</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes state from WAIT RELEASE to RELEASING</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=RELEASING EGPRS) free</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=RELEASING EGPRS) stopping timer T3193 [freeing TBF]</span><br><span>@@ -3947,11 +3964,17 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Scheduling Ack/Nack polling, because it was requested explicitly (e.g. first final block sent).</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Polling is already scheduled</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) msg block (BSN 19, MCS-2): 07 c0 04 12 20 fe 03 02 02 02 02 02 02 02 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 56 00 </span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=4) Expiring FN=91 but previous FN=13 is still reserved!</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=4) Timeout for registered POLL (FN=13): TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) poll timeout for FN=13, TS=4 (curr FN 91)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) N3101 0 => 1 (< MAX 10)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Timeout for polling PACKET CONTROL ACK for PACKET DOWNLINK ASSIGNMENT: |No downlink ACK received yet|</span><br><span style="color: hsl(120, 100%, 40%);">+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> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) changes state from FLOW to WAIT RELEASE</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) starting timer T3193 [release (DL-TBF)] with 0 sec. 100000 microsec, cur_fn=2654167</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes DL ASS state from GPRS_RLCMAC_DL_ASS_WAIT_ACK to GPRS_RLCMAC_DL_ASS_NONE</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) starting timer T3193 [release (DL-TBF)] with 0 sec. 100000 microsec, cur_fn=91</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes DL ASS state from GPRS_RLCMAC_DL_ASS_SEND_ASS to GPRS_RLCMAC_DL_ASS_NONE</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes state from WAIT RELEASE to RELEASING</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=RELEASING EGPRS) free</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=RELEASING EGPRS) stopping timer T3193 [freeing TBF]</span><br><span>@@ -4153,11 +4176,17 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Scheduling Ack/Nack polling, because it was requested explicitly (e.g. first final block sent).</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Polling is already scheduled</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) msg block (BSN 14, MCS-3): 07 80 03 06 7c fe 03 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 56 56 56 56 00 </span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=4) Expiring FN=69 but previous FN=13 is still reserved!</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=4) Timeout for registered POLL (FN=13): TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) poll timeout for FN=13, TS=4 (curr FN 69)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) N3101 0 => 1 (< MAX 10)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Timeout for polling PACKET CONTROL ACK for PACKET DOWNLINK ASSIGNMENT: |No downlink ACK received yet|</span><br><span style="color: hsl(120, 100%, 40%);">+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> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) changes state from FLOW to WAIT RELEASE</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) starting timer T3193 [release (DL-TBF)] with 0 sec. 100000 microsec, cur_fn=2654167</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes DL ASS state from GPRS_RLCMAC_DL_ASS_WAIT_ACK to GPRS_RLCMAC_DL_ASS_NONE</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) starting timer T3193 [release (DL-TBF)] with 0 sec. 100000 microsec, cur_fn=69</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes DL ASS state from GPRS_RLCMAC_DL_ASS_SEND_ASS to GPRS_RLCMAC_DL_ASS_NONE</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes state from WAIT RELEASE to RELEASING</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=RELEASING EGPRS) free</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=RELEASING EGPRS) stopping timer T3193 [freeing TBF]</span><br><span>@@ -4339,11 +4368,17 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Scheduling Ack/Nack polling, because it was requested explicitly (e.g. first final block sent).</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Polling is already scheduled</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) msg block (BSN 12, MCS-4): 07 00 03 00 70 fe 03 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 56 56 56 56 56 56 56 56 56 56 56 56 56 56 00 </span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=4) Expiring FN=60 but previous FN=13 is still reserved!</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=4) Timeout for registered POLL (FN=13): TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) poll timeout for FN=13, TS=4 (curr FN 60)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) N3101 0 => 1 (< MAX 10)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Timeout for polling PACKET CONTROL ACK for PACKET DOWNLINK ASSIGNMENT: |No downlink ACK received yet|</span><br><span style="color: hsl(120, 100%, 40%);">+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> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) changes state from FLOW to WAIT RELEASE</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) starting timer T3193 [release (DL-TBF)] with 0 sec. 100000 microsec, cur_fn=2654167</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes DL ASS state from GPRS_RLCMAC_DL_ASS_WAIT_ACK to GPRS_RLCMAC_DL_ASS_NONE</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) starting timer T3193 [release (DL-TBF)] with 0 sec. 100000 microsec, cur_fn=60</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes DL ASS state from GPRS_RLCMAC_DL_ASS_SEND_ASS to GPRS_RLCMAC_DL_ASS_NONE</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes state from WAIT RELEASE to RELEASING</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=RELEASING EGPRS) free</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=RELEASING EGPRS) stopping timer T3193 [freeing TBF]</span><br><span>@@ -4505,11 +4540,17 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Scheduling Ack/Nack polling, because it was requested explicitly (e.g. first final block sent).</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Polling is already scheduled</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) msg block (BSN 10, MCS-5): 07 80 02 08 c4 7f 40 40 40 40 40 40 40 c0 ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca 0a </span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=4) Expiring FN=52 but previous FN=13 is still reserved!</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=4) Timeout for registered POLL (FN=13): TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) poll timeout for FN=13, TS=4 (curr FN 52)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) N3101 0 => 1 (< MAX 10)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Timeout for polling PACKET CONTROL ACK for PACKET DOWNLINK ASSIGNMENT: |No downlink ACK received yet|</span><br><span style="color: hsl(120, 100%, 40%);">+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> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) changes state from FLOW to WAIT RELEASE</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) starting timer T3193 [release (DL-TBF)] with 0 sec. 100000 microsec, cur_fn=2654167</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes DL ASS state from GPRS_RLCMAC_DL_ASS_WAIT_ACK to GPRS_RLCMAC_DL_ASS_NONE</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) starting timer T3193 [release (DL-TBF)] with 0 sec. 100000 microsec, cur_fn=52</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes DL ASS state from GPRS_RLCMAC_DL_ASS_SEND_ASS to GPRS_RLCMAC_DL_ASS_NONE</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes state from WAIT RELEASE to RELEASING</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=RELEASING EGPRS) free</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=RELEASING EGPRS) stopping timer T3193 [freeing TBF]</span><br><span>@@ -4641,11 +4682,17 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Scheduling Ack/Nack polling, because it was requested explicitly (e.g. first final block sent).</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Polling is already scheduled</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) msg block (BSN 7, MCS-6): 07 c0 01 00 e2 7f 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 c0 ca ca ca 0a </span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=4) Expiring FN=39 but previous FN=13 is still reserved!</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=4) Timeout for registered POLL (FN=13): TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) poll timeout for FN=13, TS=4 (curr FN 39)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) N3101 0 => 1 (< MAX 10)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Timeout for polling PACKET CONTROL ACK for PACKET DOWNLINK ASSIGNMENT: |No downlink ACK received yet|</span><br><span style="color: hsl(120, 100%, 40%);">+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> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) changes state from FLOW to WAIT RELEASE</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) starting timer T3193 [release (DL-TBF)] with 0 sec. 100000 microsec, cur_fn=2654167</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes DL ASS state from GPRS_RLCMAC_DL_ASS_WAIT_ACK to GPRS_RLCMAC_DL_ASS_NONE</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) starting timer T3193 [release (DL-TBF)] with 0 sec. 100000 microsec, cur_fn=39</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes DL ASS state from GPRS_RLCMAC_DL_ASS_SEND_ASS to GPRS_RLCMAC_DL_ASS_NONE</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes state from WAIT RELEASE to RELEASING</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=RELEASING EGPRS) free</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=RELEASING EGPRS) stopping timer T3193 [freeing TBF]</span><br><span>@@ -4784,11 +4831,17 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Scheduling Ack/Nack polling, because it was requested explicitly (e.g. first final block sent).</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Polling is already scheduled</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) msg block (BSN 10, MCS-5): 07 80 02 08 c4 7f 40 40 40 40 40 40 40 c0 ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca 0a </span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=4) Expiring FN=34 but previous FN=13 is still reserved!</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=4) Timeout for registered POLL (FN=13): TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) poll timeout for FN=13, TS=4 (curr FN 34)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) N3101 0 => 1 (< MAX 10)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Timeout for polling PACKET CONTROL ACK for PACKET DOWNLINK ASSIGNMENT: |No downlink ACK received yet|</span><br><span style="color: hsl(120, 100%, 40%);">+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> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) changes state from FLOW to WAIT RELEASE</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) starting timer T3193 [release (DL-TBF)] with 0 sec. 100000 microsec, cur_fn=2654167</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes DL ASS state from GPRS_RLCMAC_DL_ASS_WAIT_ACK to GPRS_RLCMAC_DL_ASS_NONE</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) starting timer T3193 [release (DL-TBF)] with 0 sec. 100000 microsec, cur_fn=34</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes DL ASS state from GPRS_RLCMAC_DL_ASS_SEND_ASS to GPRS_RLCMAC_DL_ASS_NONE</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes state from WAIT RELEASE to RELEASING</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=RELEASING EGPRS) free</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=RELEASING EGPRS) stopping timer T3193 [freeing TBF]</span><br><span>@@ -4916,11 +4969,17 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Scheduling Ack/Nack polling, because it was requested explicitly (e.g. first final block sent).</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Polling is already scheduled</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) msg block (BSN 8, MCS-8): 07 00 02 00 60 20 fd 07 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 ac ac ac ac ac ac ac ac ac ac ac ac ac ac ac ac ac ac ac ac ac ac ac ac ac ac ac ac ac ac 80 f4 1f 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 b0 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 02 </span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=4) Expiring FN=30 but previous FN=13 is still reserved!</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=4) Timeout for registered POLL (FN=13): TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) poll timeout for FN=13, TS=4 (curr FN 30)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) N3101 0 => 1 (< MAX 10)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Timeout for polling PACKET CONTROL ACK for PACKET DOWNLINK ASSIGNMENT: |No downlink ACK received yet|</span><br><span style="color: hsl(120, 100%, 40%);">+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> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) changes state from FLOW to WAIT RELEASE</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) starting timer T3193 [release (DL-TBF)] with 0 sec. 100000 microsec, cur_fn=2654167</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes DL ASS state from GPRS_RLCMAC_DL_ASS_WAIT_ACK to GPRS_RLCMAC_DL_ASS_NONE</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) starting timer T3193 [release (DL-TBF)] with 0 sec. 100000 microsec, cur_fn=30</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes DL ASS state from GPRS_RLCMAC_DL_ASS_SEND_ASS to GPRS_RLCMAC_DL_ASS_NONE</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes state from WAIT RELEASE to RELEASING</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=RELEASING EGPRS) free</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=RELEASING EGPRS) stopping timer T3193 [freeing TBF]</span><br><span>@@ -5035,11 +5094,17 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Scheduling Ack/Nack polling, because it was requested explicitly (e.g. first final block sent).</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Polling is already scheduled</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) msg block (BSN 6, MCS-9): 07 80 01 02 00 05 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 80 f8 1f 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 b0 b2 b2 b2 02 </span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=4) Expiring FN=26 but previous FN=13 is still reserved!</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=4) Timeout for registered POLL (FN=13): TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) poll timeout for FN=13, TS=4 (curr FN 26)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) N3101 0 => 1 (< MAX 10)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Timeout for polling PACKET CONTROL ACK for PACKET DOWNLINK ASSIGNMENT: |No downlink ACK received yet|</span><br><span style="color: hsl(120, 100%, 40%);">+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> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) changes state from FLOW to WAIT RELEASE</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) starting timer T3193 [release (DL-TBF)] with 0 sec. 100000 microsec, cur_fn=2654167</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes DL ASS state from GPRS_RLCMAC_DL_ASS_WAIT_ACK to GPRS_RLCMAC_DL_ASS_NONE</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) starting timer T3193 [release (DL-TBF)] with 0 sec. 100000 microsec, cur_fn=26</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes DL ASS state from GPRS_RLCMAC_DL_ASS_SEND_ASS to GPRS_RLCMAC_DL_ASS_NONE</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes state from WAIT RELEASE to RELEASING</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=RELEASING EGPRS) free</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=RELEASING EGPRS) stopping timer T3193 [freeing TBF]</span><br><span>@@ -5095,7 +5160,7 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) downlink acknowledge</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) changes state from FLOW to WAIT RELEASE</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) starting timer T3193 [release (DL-TBF)] with 0 sec. 100000 microsec, cur_fn=2654167</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) starting timer T3193 [release (DL-TBF)] with 0 sec. 100000 microsec, cur_fn=58</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes DL ASS state from GPRS_RLCMAC_DL_ASS_SEND_ASS to GPRS_RLCMAC_DL_ASS_NONE</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes state from WAIT RELEASE to RELEASING</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=RELEASING EGPRS) free</span><br><span>@@ -5150,7 +5215,7 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) downlink acknowledge</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) changes state from FLOW to WAIT RELEASE</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) starting timer T3193 [release (DL-TBF)] with 0 sec. 100000 microsec, cur_fn=2654167</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) starting timer T3193 [release (DL-TBF)] with 0 sec. 100000 microsec, cur_fn=58</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes DL ASS state from GPRS_RLCMAC_DL_ASS_SEND_ASS to GPRS_RLCMAC_DL_ASS_NONE</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes state from WAIT RELEASE to RELEASING</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=RELEASING EGPRS) free</span><br><span>@@ -5205,7 +5270,7 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) downlink acknowledge</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) changes state from FLOW to WAIT RELEASE</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) starting timer T3193 [release (DL-TBF)] with 0 sec. 100000 microsec, cur_fn=2654167</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) starting timer T3193 [release (DL-TBF)] with 0 sec. 100000 microsec, cur_fn=58</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes DL ASS state from GPRS_RLCMAC_DL_ASS_SEND_ASS to GPRS_RLCMAC_DL_ASS_NONE</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes state from WAIT RELEASE to RELEASING</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=RELEASING EGPRS) free</span><br><span>@@ -5273,10 +5338,16 @@</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) Copying data unit 1 (BSN 1)</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) msg block (BSN 0, MCS-7): 07 00 00 02 c0 01 04 08 0c 10 14 18 1c 20 24 28 2c 30 34 38 3c 40 44 48 4c 50 54 58 5c 60 64 68 6c 70 74 78 7c 80 84 88 8c 90 94 98 9c a0 a4 a8 ac b0 b4 b8 bc c0 c4 c8 cc d0 d4 d8 dc 80 f5 8f 93 a3 b3 c3 d3 e3 f3 03 14 24 34 44 54 64 74 84 94 a4 b4 c4 d4 e4 f4 04 15 25 35 45 55 65 75 85 95 a5 b5 c5 d5 e5 f5 05 16 26 36 b6 b2 b2 b2 b2 b2 b2 b2 b2 b2 02 </span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=4) Expiring FN=63 but previous FN=21 is still reserved!</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=4) Timeout for registered POLL (FN=21): TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) poll timeout for FN=21, TS=4 (curr FN 63)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) N3101 0 => 1 (< MAX 10)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Timeout for polling PACKET DOWNLINK ACK: |No downlink ACK received yet|</span><br><span style="color: hsl(120, 100%, 40%);">+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> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) changes state from FLOW to WAIT RELEASE</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) starting timer T3193 [release (DL-TBF)] with 0 sec. 100000 microsec, cur_fn=2654167</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) starting timer T3193 [release (DL-TBF)] with 0 sec. 100000 microsec, cur_fn=63</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes DL ASS state from GPRS_RLCMAC_DL_ASS_SEND_ASS to GPRS_RLCMAC_DL_ASS_NONE</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes state from WAIT RELEASE to RELEASING</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=RELEASING EGPRS) free</span><br><span>@@ -5344,10 +5415,16 @@</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) Copying data unit 1 (BSN 1)</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) msg block (BSN 0, MCS-9): 07 00 00 02 28 01 04 08 0c 10 14 18 1c 20 24 28 2c 30 34 38 3c 40 44 48 4c 50 54 58 5c 60 64 68 6c 70 74 78 7c 80 84 88 8c 90 94 98 9c a0 a4 a8 ac b0 b4 b8 bc c0 c4 c8 cc d0 d4 d8 dc e0 e4 e8 ec f0 f4 f8 fc 00 05 09 0d 11 15 19 1d 21 25 41 f3 af b4 c4 d4 e4 f4 04 15 25 35 45 55 65 75 85 95 a5 b5 c5 d5 e5 f5 05 16 26 36 b6 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 02 </span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=4) Expiring FN=63 but previous FN=21 is still reserved!</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=4) Timeout for registered POLL (FN=21): TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) poll timeout for FN=21, TS=4 (curr FN 63)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) N3101 0 => 1 (< MAX 10)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Timeout for polling PACKET DOWNLINK ACK: |No downlink ACK received yet|</span><br><span style="color: hsl(120, 100%, 40%);">+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> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) changes state from FLOW to WAIT RELEASE</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) starting timer T3193 [release (DL-TBF)] with 0 sec. 100000 microsec, cur_fn=2654167</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) starting timer T3193 [release (DL-TBF)] with 0 sec. 100000 microsec, cur_fn=63</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes DL ASS state from GPRS_RLCMAC_DL_ASS_SEND_ASS to GPRS_RLCMAC_DL_ASS_NONE</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes state from WAIT RELEASE to RELEASING</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=RELEASING EGPRS) free</span><br><span>@@ -5415,10 +5492,16 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Copying 1 RLC blocks, 1 BSNs</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Copying data unit 0 (BSN 1)</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) msg block (BSN 1, MCS-5): 07 40 00 08 d6 3f 4e 8e ce 0e 4f 8f cf 0f 50 90 d0 10 51 91 d1 11 52 92 d2 12 53 93 d3 13 54 94 d4 14 55 95 d5 15 56 96 d6 16 57 97 d7 17 58 98 d8 d8 ca ca ca ca ca ca ca ca ca 0a </span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=4) Expiring FN=63 but previous FN=17 is still reserved!</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=4) Timeout for registered POLL (FN=17): TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) poll timeout for FN=17, TS=4 (curr FN 63)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) N3101 0 => 1 (< MAX 10)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Timeout for polling PACKET DOWNLINK ACK: |No downlink ACK received yet|</span><br><span style="color: hsl(120, 100%, 40%);">+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> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) changes state from FLOW to WAIT RELEASE</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) starting timer T3193 [release (DL-TBF)] with 0 sec. 100000 microsec, cur_fn=2654167</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) starting timer T3193 [release (DL-TBF)] with 0 sec. 100000 microsec, cur_fn=63</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes DL ASS state from GPRS_RLCMAC_DL_ASS_SEND_ASS to GPRS_RLCMAC_DL_ASS_NONE</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes state from WAIT RELEASE to RELEASING</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=RELEASING EGPRS) free</span><br><span>@@ -5486,10 +5569,16 @@</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Copying 1 RLC blocks, 1 BSNs</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Copying data unit 0 (BSN 1)</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) msg block (BSN 1, MCS-6): 07 40 00 02 cd bf d2 12 53 93 d3 13 54 94 d4 14 55 95 d5 15 56 96 d6 16 57 97 d7 17 58 98 d8 d8 ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca ca 0a </span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=4) Expiring FN=63 but previous FN=17 is still reserved!</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=4) Timeout for registered POLL (FN=17): TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) poll timeout for FN=17, TS=4 (curr FN 63)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) N3101 0 => 1 (< MAX 10)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Timeout for polling PACKET DOWNLINK ACK: |No downlink ACK received yet|</span><br><span style="color: hsl(120, 100%, 40%);">+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> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) Final ACK received.</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) changes state from FLOW to WAIT RELEASE</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) starting timer T3193 [release (DL-TBF)] with 0 sec. 100000 microsec, cur_fn=2654167</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) starting timer T3193 [release (DL-TBF)] with 0 sec. 100000 microsec, cur_fn=63</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes DL ASS state from GPRS_RLCMAC_DL_ASS_SEND_ASS to GPRS_RLCMAC_DL_ASS_NONE</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=WAIT RELEASE EGPRS) changes state from WAIT RELEASE to RELEASING</span><br><span> TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=RELEASING EGPRS) free</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-pcu/+/23309">change 23309</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/+/23309"/><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: I683ca738ce5a133c49c36a1d94439a942d64a831 </div>
<div style="display:none"> Gerrit-Change-Number: 23309 </div>
<div style="display:none"> Gerrit-PatchSet: 6 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>