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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">pdch_ulc: Store TBF poll reason<br><br>This allows easily checking the initial reason to trigger the poll when<br>either it is received or times out.<br><br>Later on this reason can be transformed into an FSM event and sent to<br>the related FSM.<br><br>Related: OS#5020<br>Change-Id: Ie8fefd1f47ad674ce597a8065b15284088956bde<br>---<br>M src/nacc_fsm.c<br>M src/pdch.cpp<br>M src/pdch_ul_controller.c<br>M src/pdch_ul_controller.h<br>M src/tbf.cpp<br>M src/tbf.h<br>M src/tbf_dl.cpp<br>M src/tbf_ul.cpp<br>M src/tbf_ul.h<br>M tests/ulc/PdchUlcTest.cpp<br>10 files changed, 48 insertions(+), 43 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/nacc_fsm.c b/src/nacc_fsm.c</span><br><span>index df7cd7d..6384fd5 100644</span><br><span>--- a/src/nacc_fsm.c</span><br><span>+++ b/src/nacc_fsm.c</span><br><span>@@ -206,7 +206,7 @@</span><br><span>    LOGP(DNACC, LOGL_DEBUG, "------------------------- TX : Packet Cell Change Continue -------------------------\n");</span><br><span>         rate_ctr_inc(&bts_rate_counters(ms->bts)->ctr[CTR_PKT_CELL_CHG_CONTINUE]);</span><br><span>         talloc_free(mac_control_block);</span><br><span style="color: hsl(0, 100%, 40%);">- tbf_set_polling(tbf, *new_poll_fn, data->ts, GPRS_RLCMAC_POLL_CELL_CHG_CONTINUE);</span><br><span style="color: hsl(120, 100%, 40%);">+  tbf_set_polling(tbf, *new_poll_fn, data->ts, PDCH_ULC_POLL_CELL_CHG_CONTINUE);</span><br><span>    return msg;</span><br><span> </span><br><span> free_ret:</span><br><span>diff --git a/src/pdch.cpp b/src/pdch.cpp</span><br><span>index 45c7c98..22bac0b 100644</span><br><span>--- a/src/pdch.cpp</span><br><span>+++ b/src/pdch.cpp</span><br><span>@@ -306,6 +306,7 @@</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%);">+   enum pdch_ulc_tbf_poll_reason reason;</span><br><span>        struct pdch_ulc_node *poll;</span><br><span> </span><br><span>      poll = pdch_ulc_get_node(ulc, fn);</span><br><span>@@ -325,6 +326,7 @@</span><br><span>             return;</span><br><span>      }</span><br><span>    tbf = poll->tbf_poll.poll_tbf;</span><br><span style="color: hsl(120, 100%, 40%);">+     reason = poll->tbf_poll.reason;</span><br><span> </span><br><span>       /* Reset N3101 counter: */</span><br><span>   tbf->n_reset(N3101);</span><br><span>@@ -337,7 +339,7 @@</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 style="color: hsl(0, 100%, 40%);">-        if (ul_tbf && ul_tbf->handle_ctrl_ack()) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ul_tbf && ul_tbf->handle_ctrl_ack(reason)) {</span><br><span>          LOGPTBF(tbf, LOGL_DEBUG, "[UPLINK] END\n");</span><br><span>                if (ul_tbf->ctrl_ack_to_toggle())</span><br><span>                         LOGPTBF(tbf, LOGL_NOTICE, "Recovered uplink ack for UL\n");</span><br><span>diff --git a/src/pdch_ul_controller.c b/src/pdch_ul_controller.c</span><br><span>index 6848d97..8fb5582 100644</span><br><span>--- a/src/pdch_ul_controller.c</span><br><span>+++ b/src/pdch_ul_controller.c</span><br><span>@@ -220,11 +220,12 @@</span><br><span>   return pdch_ulc_add_node(ulc, item);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int pdch_ulc_reserve_tbf_poll(struct pdch_ulc *ulc, uint32_t fn, struct gprs_rlcmac_tbf *tbf)</span><br><span style="color: hsl(120, 100%, 40%);">+int pdch_ulc_reserve_tbf_poll(struct pdch_ulc *ulc, uint32_t fn, struct gprs_rlcmac_tbf *tbf, enum pdch_ulc_tbf_poll_reason reason)</span><br><span> {</span><br><span>         struct pdch_ulc_node *item = _alloc_node(ulc, fn);</span><br><span>   item->type = PDCH_ULC_NODE_TBF_POLL;</span><br><span>      item->tbf_poll.poll_tbf = tbf;</span><br><span style="color: hsl(120, 100%, 40%);">+     item->tbf_poll.reason = reason;</span><br><span>   return pdch_ulc_add_node(ulc, item);</span><br><span> }</span><br><span> </span><br><span>@@ -317,7 +318,7 @@</span><br><span>                  LOGPDCH(ulc->pdch, DRLCMAC, LOGL_NOTICE,</span><br><span>                          "Timeout for registered POLL (FN=%u): %s\n",</span><br><span>                               item->fn, tbf_name(item->tbf_poll.poll_tbf));</span><br><span style="color: hsl(0, 100%, 40%);">-                     tbf_poll_timeout(item->tbf_poll.poll_tbf);</span><br><span style="color: hsl(120, 100%, 40%);">+                 tbf_poll_timeout(item->tbf_poll.poll_tbf, item->tbf_poll.reason);</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 d5fea4d..ff60d2f 100644</span><br><span>--- a/src/pdch_ul_controller.h</span><br><span>+++ b/src/pdch_ul_controller.h</span><br><span>@@ -52,6 +52,14 @@</span><br><span> };</span><br><span> extern const struct value_string pdch_ul_node_names[];</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+enum pdch_ulc_tbf_poll_reason {</span><br><span style="color: hsl(120, 100%, 40%);">+        PDCH_ULC_POLL_UL_ASS, /* Expect CTRL ACK for UL ASS we transmit */</span><br><span style="color: hsl(120, 100%, 40%);">+    PDCH_ULC_POLL_DL_ASS, /* Expect CTRL ACK for DL ASS we transmit */</span><br><span style="color: hsl(120, 100%, 40%);">+    PDCH_ULC_POLL_UL_ACK, /* Expect CTRL ACK for UL ACK/NACK we transmit */</span><br><span style="color: hsl(120, 100%, 40%);">+       PDCH_ULC_POLL_DL_ACK, /* Expect DL ACK/NACK requested by RRBP */</span><br><span style="color: hsl(120, 100%, 40%);">+      PDCH_ULC_POLL_CELL_CHG_CONTINUE, /* Expect CTRL ACK for Pkt cell Change Continue we transmit */</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct pdch_ulc_node {</span><br><span>      struct rb_node node;      /*! entry in pdch_ulc->tree_root */</span><br><span>     uint32_t fn;</span><br><span>@@ -62,6 +70,7 @@</span><br><span>             } tbf_usf;</span><br><span>           struct {</span><br><span>                     struct gprs_rlcmac_tbf *poll_tbf;</span><br><span style="color: hsl(120, 100%, 40%);">+                     enum pdch_ulc_tbf_poll_reason reason;</span><br><span>                } tbf_poll;</span><br><span>          struct {</span><br><span>                     struct gprs_rlcmac_sba *sba;</span><br><span>@@ -73,7 +82,7 @@</span><br><span> struct pdch_ulc *pdch_ulc_alloc(struct gprs_rlcmac_pdch *pdch, void *ctx);</span><br><span> </span><br><span> int pdch_ulc_reserve_tbf_usf(struct pdch_ulc *ulc, uint32_t fn, struct gprs_rlcmac_ul_tbf *ul_tbf);</span><br><span style="color: hsl(0, 100%, 40%);">-int pdch_ulc_reserve_tbf_poll(struct pdch_ulc *ulc, uint32_t fn, struct gprs_rlcmac_tbf *tbf);</span><br><span style="color: hsl(120, 100%, 40%);">+int pdch_ulc_reserve_tbf_poll(struct pdch_ulc *ulc, uint32_t fn, struct gprs_rlcmac_tbf *tbf, enum pdch_ulc_tbf_poll_reason reason);</span><br><span> int pdch_ulc_reserve_sba(struct pdch_ulc *ulc, struct gprs_rlcmac_sba *sba);</span><br><span> </span><br><span> bool pdch_ulc_fn_is_free(struct pdch_ulc *ulc, uint32_t fn);</span><br><span>diff --git a/src/tbf.cpp b/src/tbf.cpp</span><br><span>index a24f536..860b877 100644</span><br><span>--- a/src/tbf.cpp</span><br><span>+++ b/src/tbf.cpp</span><br><span>@@ -572,7 +572,7 @@</span><br><span>     return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void gprs_rlcmac_tbf::set_polling(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 gprs_rlcmac_tbf::set_polling(uint32_t new_poll_fn, uint8_t ts, enum pdch_ulc_tbf_poll_reason reason)</span><br><span> {</span><br><span>      const char *chan = "UNKNOWN";</span><br><span> </span><br><span>@@ -588,7 +588,7 @@</span><br><span>                      chan, new_poll_fn, ts);</span><br><span> </span><br><span>        /* schedule polling */</span><br><span style="color: hsl(0, 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%);">+      if (pdch_ulc_reserve_tbf_poll(trx->pdch[ts].ulc, new_poll_fn, this, reason) < 0) {</span><br><span>             LOGPTBFDL(this, LOGL_ERROR, "Failed scheduling poll on %s (FN=%d, TS=%d)\n",</span><br><span>                         chan, poll_fn, ts);</span><br><span>                return;</span><br><span>@@ -597,37 +597,37 @@</span><br><span>      poll_fn = new_poll_fn;</span><br><span>       poll_ts = ts;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       switch (t) {</span><br><span style="color: hsl(0, 100%, 40%);">-    case GPRS_RLCMAC_POLL_UL_ASS:</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (reason) {</span><br><span style="color: hsl(120, 100%, 40%);">+     case PDCH_ULC_POLL_UL_ASS:</span><br><span>           ul_ass_state = GPRS_RLCMAC_UL_ASS_WAIT_ACK;</span><br><span> </span><br><span>              LOGPTBFDL(this, LOGL_INFO, "Scheduled UL Assignment polling on %s (FN=%d, TS=%d)\n",</span><br><span>                         chan, poll_fn, poll_ts);</span><br><span>           break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GPRS_RLCMAC_POLL_DL_ASS:</span><br><span style="color: hsl(120, 100%, 40%);">+ case PDCH_ULC_POLL_DL_ASS:</span><br><span>           dl_ass_state = GPRS_RLCMAC_DL_ASS_WAIT_ACK;</span><br><span> </span><br><span>              LOGPTBFDL(this, LOGL_INFO, "Scheduled DL Assignment polling on %s (FN=%d, TS=%d)\n",</span><br><span>                         chan, poll_fn, poll_ts);</span><br><span>           break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GPRS_RLCMAC_POLL_UL_ACK:</span><br><span style="color: hsl(120, 100%, 40%);">+ case PDCH_ULC_POLL_UL_ACK:</span><br><span>           ul_ack_state = GPRS_RLCMAC_UL_ACK_WAIT_ACK;</span><br><span> </span><br><span>              LOGPTBFUL(this, LOGL_DEBUG, "Scheduled UL Acknowledgement polling on %s (FN=%d, TS=%d)\n",</span><br><span>                           chan, poll_fn, poll_ts);</span><br><span>           break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GPRS_RLCMAC_POLL_DL_ACK:</span><br><span style="color: hsl(120, 100%, 40%);">+ case PDCH_ULC_POLL_DL_ACK:</span><br><span>           LOGPTBFDL(this, LOGL_DEBUG, "Scheduled DL Acknowledgement polling on %s (FN=%d, TS=%d)\n",</span><br><span>                           chan, poll_fn, poll_ts);</span><br><span>           break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GPRS_RLCMAC_POLL_CELL_CHG_CONTINUE:</span><br><span style="color: hsl(120, 100%, 40%);">+      case PDCH_ULC_POLL_CELL_CHG_CONTINUE:</span><br><span>                LOGPTBFDL(this, LOGL_DEBUG, "Scheduled 'Packet Cell Change Continue' polling on %s (FN=%d, TS=%d)\n",</span><br><span>                        chan, poll_fn, poll_ts);</span><br><span>           break;</span><br><span>       }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void gprs_rlcmac_tbf::poll_timeout()</span><br><span style="color: hsl(120, 100%, 40%);">+void gprs_rlcmac_tbf::poll_timeout(enum pdch_ulc_tbf_poll_reason reason)</span><br><span> {</span><br><span>        uint16_t pgroup;</span><br><span>     gprs_rlcmac_ul_tbf *ul_tbf = as_ul_tbf(this);</span><br><span>@@ -637,7 +637,7 @@</span><br><span> </span><br><span>      poll_state = GPRS_RLCMAC_POLL_NONE;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (ul_tbf && ul_tbf->handle_ctrl_ack()) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ul_tbf && ul_tbf->handle_ctrl_ack(reason)) {</span><br><span>          if (!ul_tbf->ctrl_ack_to_toggle()) {</span><br><span>                      LOGPTBF(this, LOGL_NOTICE,</span><br><span>                           "Timeout for polling PACKET CONTROL ACK for PACKET UPLINK ACK: %s\n",</span><br><span>@@ -945,7 +945,7 @@</span><br><span>        bts_do_rate_ctr_inc(bts, CTR_PKT_DL_ASSIGNMENT);</span><br><span> </span><br><span>         if (poll_ass_dl) {</span><br><span style="color: hsl(0, 100%, 40%);">-              set_polling(new_poll_fn, ts, GPRS_RLCMAC_POLL_DL_ASS);</span><br><span style="color: hsl(120, 100%, 40%);">+                set_polling(new_poll_fn, ts, PDCH_ULC_POLL_DL_ASS);</span><br><span>  } else {</span><br><span>             dl_ass_state = GPRS_RLCMAC_DL_ASS_NONE;</span><br><span>              TBF_SET_STATE(new_dl_tbf, GPRS_RLCMAC_FLOW);</span><br><span>@@ -1048,7 +1048,7 @@</span><br><span>         LOGP(DTBF, LOGL_DEBUG, "------------------------- TX : Packet Uplink Assignment -------------------------\n");</span><br><span>     bts_do_rate_ctr_inc(bts, CTR_PKT_UL_ASSIGNMENT);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    set_polling(new_poll_fn, ts, GPRS_RLCMAC_POLL_UL_ASS);</span><br><span style="color: hsl(120, 100%, 40%);">+        set_polling(new_poll_fn, ts, PDCH_ULC_POLL_UL_ASS);</span><br><span> </span><br><span>      talloc_free(mac_control_block);</span><br><span>      return msg;</span><br><span>@@ -1222,12 +1222,12 @@</span><br><span>        return tbf->check_polling(fn, ts, poll_fn, rrbp);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-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_set_polling(struct gprs_rlcmac_tbf *tbf, uint32_t new_poll_fn, uint8_t ts, enum pdch_ulc_tbf_poll_reason t)</span><br><span> {</span><br><span>        return tbf->set_polling(new_poll_fn, ts, t);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void tbf_poll_timeout(struct gprs_rlcmac_tbf *tbf)</span><br><span style="color: hsl(120, 100%, 40%);">+void tbf_poll_timeout(struct gprs_rlcmac_tbf *tbf, enum pdch_ulc_tbf_poll_reason reason)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       tbf->poll_timeout();</span><br><span style="color: hsl(120, 100%, 40%);">+       tbf->poll_timeout(reason);</span><br><span> }</span><br><span>diff --git a/src/tbf.h b/src/tbf.h</span><br><span>index 779bc26..83c1b70 100644</span><br><span>--- a/src/tbf.h</span><br><span>+++ b/src/tbf.h</span><br><span>@@ -46,6 +46,7 @@</span><br><span> #include <osmocom/gsm/gsm48.h></span><br><span> </span><br><span> #include "coding_scheme.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include <pdch_ul_controller.h></span><br><span> #ifdef __cplusplus</span><br><span> }</span><br><span> #endif</span><br><span>@@ -63,14 +64,6 @@</span><br><span>         GPRS_RLCMAC_RELEASING,  /* releasing, wait to free TBI/USF */</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-enum gprs_rlcmac_tbf_poll_type {</span><br><span style="color: hsl(0, 100%, 40%);">- GPRS_RLCMAC_POLL_UL_ASS,</span><br><span style="color: hsl(0, 100%, 40%);">-        GPRS_RLCMAC_POLL_DL_ASS,</span><br><span style="color: hsl(0, 100%, 40%);">-        GPRS_RLCMAC_POLL_UL_ACK,</span><br><span style="color: hsl(0, 100%, 40%);">-        GPRS_RLCMAC_POLL_DL_ACK,</span><br><span style="color: hsl(0, 100%, 40%);">-        GPRS_RLCMAC_POLL_CELL_CHG_CONTINUE,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> enum gprs_rlcmac_tbf_poll_state {</span><br><span>   GPRS_RLCMAC_POLL_NONE = 0,</span><br><span>   GPRS_RLCMAC_POLL_SCHED, /* a polling was scheduled */</span><br><span>@@ -208,8 +201,8 @@</span><br><span> uint8_t tbf_tfi(const struct gprs_rlcmac_tbf *tbf);</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 style="color: hsl(0, 100%, 40%);">-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(0, 100%, 40%);">-void tbf_poll_timeout(struct gprs_rlcmac_tbf *tbf);</span><br><span style="color: hsl(120, 100%, 40%);">+void tbf_set_polling(struct gprs_rlcmac_tbf *tbf, uint32_t new_poll_fn, uint8_t ts, enum pdch_ulc_tbf_poll_reason t);</span><br><span style="color: hsl(120, 100%, 40%);">+void tbf_poll_timeout(struct gprs_rlcmac_tbf *tbf, enum pdch_ulc_tbf_poll_reason reason);</span><br><span> #ifdef __cplusplus</span><br><span> }</span><br><span> #endif</span><br><span>@@ -267,8 +260,8 @@</span><br><span> </span><br><span>         int check_polling(uint32_t fn, uint8_t ts,</span><br><span>           uint32_t *poll_fn, unsigned int *rrbp) const;</span><br><span style="color: hsl(0, 100%, 40%);">-   void set_polling(uint32_t poll_fn, uint8_t ts, enum gprs_rlcmac_tbf_poll_type t);</span><br><span style="color: hsl(0, 100%, 40%);">-       void poll_timeout();</span><br><span style="color: hsl(120, 100%, 40%);">+  void set_polling(uint32_t poll_fn, uint8_t ts, enum pdch_ulc_tbf_poll_reason reason);</span><br><span style="color: hsl(120, 100%, 40%);">+ void poll_timeout(enum pdch_ulc_tbf_poll_reason reason);</span><br><span> </span><br><span>         /** tlli handling */</span><br><span>         uint32_t tlli() const;</span><br><span>diff --git a/src/tbf_dl.cpp b/src/tbf_dl.cpp</span><br><span>index 44baa00..a59b03b 100644</span><br><span>--- a/src/tbf_dl.cpp</span><br><span>+++ b/src/tbf_dl.cpp</span><br><span>@@ -975,7 +975,7 @@</span><br><span> </span><br><span>                rc = check_polling(fn, ts, &new_poll_fn, &rrbp);</span><br><span>             if (rc >= 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       set_polling(new_poll_fn, ts, GPRS_RLCMAC_POLL_DL_ACK);</span><br><span style="color: hsl(120, 100%, 40%);">+                        set_polling(new_poll_fn, ts, PDCH_ULC_POLL_DL_ACK);</span><br><span> </span><br><span>                      m_tx_counter = 0;</span><br><span>                    /* start timer whenever we send the final block */</span><br><span>diff --git a/src/tbf_ul.cpp b/src/tbf_ul.cpp</span><br><span>index ba491f6..063d0ff 100644</span><br><span>--- a/src/tbf_ul.cpp</span><br><span>+++ b/src/tbf_ul.cpp</span><br><span>@@ -275,10 +275,10 @@</span><br><span>      return false; /* GPRS_RLCMAC_FLAG_TO_UL_ACK was unset, now set */</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-bool gprs_rlcmac_ul_tbf::handle_ctrl_ack()</span><br><span style="color: hsl(120, 100%, 40%);">+bool gprs_rlcmac_ul_tbf::handle_ctrl_ack(enum pdch_ulc_tbf_poll_reason reason)</span><br><span> {</span><br><span>    /* check if this control ack belongs to packet uplink ack */</span><br><span style="color: hsl(0, 100%, 40%);">-    if (ul_ack_state_is(GPRS_RLCMAC_UL_ACK_WAIT_ACK)) {</span><br><span style="color: hsl(120, 100%, 40%);">+   if (reason == PDCH_ULC_POLL_UL_ACK && ul_ack_state_is(GPRS_RLCMAC_UL_ACK_WAIT_ACK)) {</span><br><span>                TBF_SET_ACK_STATE(this, GPRS_RLCMAC_UL_ACK_NONE);</span><br><span>            return true;</span><br><span>         }</span><br><span>@@ -324,7 +324,7 @@</span><br><span>      m_contention_resolution_done = 1;</span><br><span> </span><br><span>        if (final) {</span><br><span style="color: hsl(0, 100%, 40%);">-            set_polling(new_poll_fn, ts, GPRS_RLCMAC_POLL_UL_ACK);</span><br><span style="color: hsl(120, 100%, 40%);">+                set_polling(new_poll_fn, ts, PDCH_ULC_POLL_UL_ACK);</span><br><span>          /* waiting for final acknowledge */</span><br><span>          m_final_ack_sent = 1;</span><br><span>        } else</span><br><span>diff --git a/src/tbf_ul.h b/src/tbf_ul.h</span><br><span>index e3de1da..a2ad25e 100644</span><br><span>--- a/src/tbf_ul.h</span><br><span>+++ b/src/tbf_ul.h</span><br><span>@@ -57,7 +57,7 @@</span><br><span>      gprs_rlc_window *window();</span><br><span>   struct msgb *create_ul_ack(uint32_t fn, uint8_t ts);</span><br><span>         bool ctrl_ack_to_toggle();</span><br><span style="color: hsl(0, 100%, 40%);">-      bool handle_ctrl_ack();</span><br><span style="color: hsl(120, 100%, 40%);">+       bool handle_ctrl_ack(enum pdch_ulc_tbf_poll_reason reason);</span><br><span>  /* blocks were acked */</span><br><span>      int rcv_data_block_acknowledged(</span><br><span>             const struct gprs_rlc_data_info *rlc,</span><br><span>diff --git a/tests/ulc/PdchUlcTest.cpp b/tests/ulc/PdchUlcTest.cpp</span><br><span>index 3372d2f..84035d1 100644</span><br><span>--- a/tests/ulc/PdchUlcTest.cpp</span><br><span>+++ b/tests/ulc/PdchUlcTest.cpp</span><br><span>@@ -88,16 +88,16 @@</span><br><span>         node = pdch_ulc_get_node(pdch->ulc, sba2->fn);</span><br><span>         OSMO_ASSERT(node->type == PDCH_ULC_NODE_SBA && node->sba.sba == sba2);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        rc = pdch_ulc_reserve_tbf_poll(pdch->ulc, sba1->fn, tbf1);</span><br><span style="color: hsl(120, 100%, 40%);">+      rc = pdch_ulc_reserve_tbf_poll(pdch->ulc, sba1->fn, tbf1, PDCH_ULC_POLL_UL_ASS);</span><br><span>       OSMO_ASSERT(rc == -EEXIST);</span><br><span>  OSMO_ASSERT(pdch_ulc_get_tbf_poll(pdch->ulc, sba1->fn) == NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-  rc = pdch_ulc_reserve_tbf_poll(pdch->ulc, sba2->fn, tbf1);</span><br><span style="color: hsl(120, 100%, 40%);">+      rc = pdch_ulc_reserve_tbf_poll(pdch->ulc, sba2->fn, tbf1, PDCH_ULC_POLL_UL_ASS);</span><br><span>       OSMO_ASSERT(rc == -EEXIST);</span><br><span>  OSMO_ASSERT(pdch_ulc_get_tbf_poll(pdch->ulc, sba2->fn) == NULL);</span><br><span> </span><br><span>   /* Now Reserve correctly TBF1 */</span><br><span>     OSMO_ASSERT(pdch_ulc_fn_is_free(pdch->ulc, tbf1_poll_fn1) == true);</span><br><span style="color: hsl(0, 100%, 40%);">-  rc = pdch_ulc_reserve_tbf_poll(pdch->ulc, tbf1_poll_fn1, tbf1);</span><br><span style="color: hsl(120, 100%, 40%);">+    rc = pdch_ulc_reserve_tbf_poll(pdch->ulc, tbf1_poll_fn1, tbf1, PDCH_ULC_POLL_UL_ASS);</span><br><span>     OSMO_ASSERT(rc == 0);</span><br><span>        OSMO_ASSERT(pdch_ulc_get_tbf_poll(pdch->ulc, tbf1_poll_fn1) == tbf1);</span><br><span>     OSMO_ASSERT(pdch_ulc_fn_is_free(pdch->ulc, tbf1_poll_fn1) == false);</span><br><span>@@ -107,7 +107,7 @@</span><br><span> </span><br><span>    /* Now reserve correctly TBF2 */</span><br><span>     OSMO_ASSERT(pdch_ulc_fn_is_free(pdch->ulc, tbf2_poll_fn1) == true);</span><br><span style="color: hsl(0, 100%, 40%);">-  rc = pdch_ulc_reserve_tbf_poll(pdch->ulc, tbf2_poll_fn1, tbf2);</span><br><span style="color: hsl(120, 100%, 40%);">+    rc = pdch_ulc_reserve_tbf_poll(pdch->ulc, tbf2_poll_fn1, tbf2, PDCH_ULC_POLL_UL_ASS);</span><br><span>     OSMO_ASSERT(rc == 0);</span><br><span>        OSMO_ASSERT(pdch_ulc_get_tbf_poll(pdch->ulc, tbf2_poll_fn1) == tbf2);</span><br><span>     OSMO_ASSERT(pdch_ulc_fn_is_free(pdch->ulc, tbf2_poll_fn1) == false);</span><br><span>@@ -117,7 +117,7 @@</span><br><span> </span><br><span>    /* Now Reserve TBF1 for POLL again on a later FN, which is totally expected: */</span><br><span>      OSMO_ASSERT(pdch_ulc_fn_is_free(pdch->ulc, tbf1_poll_fn2) == true);</span><br><span style="color: hsl(0, 100%, 40%);">-  rc = pdch_ulc_reserve_tbf_poll(pdch->ulc, tbf1_poll_fn2, tbf1);</span><br><span style="color: hsl(120, 100%, 40%);">+    rc = pdch_ulc_reserve_tbf_poll(pdch->ulc, tbf1_poll_fn2, tbf1, PDCH_ULC_POLL_UL_ASS);</span><br><span>     OSMO_ASSERT(rc == 0);</span><br><span>        OSMO_ASSERT(pdch_ulc_get_tbf_poll(pdch->ulc, tbf1_poll_fn2) == tbf1);</span><br><span>     OSMO_ASSERT(pdch_ulc_fn_is_free(pdch->ulc, tbf1_poll_fn2) == false);</span><br><span>@@ -182,7 +182,7 @@</span><br><span>        fn = start_fn;</span><br><span>       while (fn < 40 || fn >= start_fn) {</span><br><span>            printf("*** RESERVE FN=%" PRIu32 ":\n", fn);</span><br><span style="color: hsl(0, 100%, 40%);">-                rc = pdch_ulc_reserve_tbf_poll(pdch->ulc, fn, tbf1);</span><br><span style="color: hsl(120, 100%, 40%);">+               rc = pdch_ulc_reserve_tbf_poll(pdch->ulc, fn, tbf1, PDCH_ULC_POLL_UL_ASS);</span><br><span>                OSMO_ASSERT(rc == 0);</span><br><span>                print_ulc_nodes(pdch->ulc);</span><br><span>               fn = fn_next_block(fn);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-pcu/+/23525">change 23525</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/+/23525"/><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: Ie8fefd1f47ad674ce597a8065b15284088956bde </div>
<div style="display:none"> Gerrit-Change-Number: 23525 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </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: dexter <pmaier@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>