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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Move T3169 and T3195 to tbf_fsm<br><br>Change-Id: I599f4e7e82b0a8c0f5cf633c2d8b1975435f0b60<br>---<br>M src/tbf.cpp<br>M src/tbf.h<br>M src/tbf_fsm.c<br>M src/tbf_fsm.h<br>M src/tbf_ul.cpp<br>M tests/tbf/TbfTest.err<br>6 files changed, 44 insertions(+), 28 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/tbf.cpp b/src/tbf.cpp</span><br><span>index c68d505..107c867 100644</span><br><span>--- a/src/tbf.cpp</span><br><span>+++ b/src/tbf.cpp</span><br><span>@@ -93,10 +93,8 @@</span><br><span> static const struct value_string tbf_timers_names[] = {</span><br><span>  OSMO_VALUE_STRING(T0),</span><br><span>       OSMO_VALUE_STRING(T3141),</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_VALUE_STRING(T3169),</span><br><span>    OSMO_VALUE_STRING(T3191),</span><br><span>    OSMO_VALUE_STRING(T3193),</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_VALUE_STRING(T3195),</span><br><span>    { 0, NULL }</span><br><span> };</span><br><span> </span><br><span>@@ -475,10 +473,8 @@</span><br><span>  * allocated temporary block flow is released as specified in 3GPP TS 44.060 and</span><br><span>  * the packet access is forgotten.*/</span><br><span> T_CBACK(T3141, true)</span><br><span style="color: hsl(0, 100%, 40%);">-T_CBACK(T3169, true)</span><br><span> T_CBACK(T3191, true)</span><br><span> T_CBACK(T3193, false)</span><br><span style="color: hsl(0, 100%, 40%);">-T_CBACK(T3195, true)</span><br><span> </span><br><span> void gprs_rlcmac_tbf::t_start(enum tbf_timers t, int T, const char *reason, bool force,</span><br><span>                           const char *file, unsigned line)</span><br><span>@@ -527,18 +523,12 @@</span><br><span>       case T3141:</span><br><span>          Tarr[t].cb = cb_T3141;</span><br><span>               break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case T3169:</span><br><span style="color: hsl(0, 100%, 40%);">-             Tarr[t].cb = cb_T3169;</span><br><span style="color: hsl(0, 100%, 40%);">-          break;</span><br><span>       case T3191:</span><br><span>          Tarr[t].cb = cb_T3191;</span><br><span>               break;</span><br><span>       case T3193:</span><br><span>          Tarr[t].cb = cb_T3193;</span><br><span>               break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case T3195:</span><br><span style="color: hsl(0, 100%, 40%);">-             Tarr[t].cb = cb_T3195;</span><br><span style="color: hsl(0, 100%, 40%);">-          break;</span><br><span>       default:</span><br><span>             LOGPSRC(DTBF, LOGL_ERROR, file, line, "%s attempting to set callback for unknown timer %s [%s], cur_fn=%d\n",</span><br><span>                   tbf_name(this), get_value_string(tbf_timers_names, t), reason, current_fn);</span><br><span>@@ -641,7 +631,6 @@</span><br><span>                       if (ul_tbf->n_inc(N3103)) {</span><br><span>                               bts_do_rate_ctr_inc(bts, CTR_PUAN_POLL_FAILED);</span><br><span>                              osmo_fsm_inst_dispatch(this->state_fsm.fi, TBF_EV_MAX_N3103, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-                          T_START(ul_tbf, T3169, 3169, "MAX N3103 reached", false);</span><br><span>                          return;</span><br><span>                      }</span><br><span>                    /* reschedule UL ack */</span><br><span>@@ -660,7 +649,6 @@</span><br><span>                bts_do_rate_ctr_inc(bts, CTR_PUA_POLL_TIMEDOUT);</span><br><span>             if (n_inc(N3105)) {</span><br><span>                  osmo_fsm_inst_dispatch(this->state_fsm.fi, TBF_EV_MAX_N3105, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-                  T_START(this, T3195, 3195, "MAX N3105 reached", true);</span><br><span>                     bts_do_rate_ctr_inc(bts, CTR_RLC_ASS_FAILED);</span><br><span>                        bts_do_rate_ctr_inc(bts, CTR_PUA_POLL_FAILED);</span><br><span>                       return;</span><br><span>@@ -679,7 +667,6 @@</span><br><span>                bts_do_rate_ctr_inc(bts, CTR_PDA_POLL_TIMEDOUT);</span><br><span>             if (n_inc(N3105)) {</span><br><span>                  osmo_fsm_inst_dispatch(this->state_fsm.fi, TBF_EV_MAX_N3105, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-                  T_START(this, T3195, 3195, "MAX N3105 reached", true);</span><br><span>                     bts_do_rate_ctr_inc(bts, CTR_RLC_ASS_FAILED);</span><br><span>                        bts_do_rate_ctr_inc(bts, CTR_PDA_POLL_FAILED);</span><br><span>                       return;</span><br><span>@@ -710,7 +697,6 @@</span><br><span> </span><br><span>            if (dl_tbf->n_inc(N3105)) {</span><br><span>                       osmo_fsm_inst_dispatch(this->state_fsm.fi, TBF_EV_MAX_N3105, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-                  T_START(dl_tbf, T3195, 3195, "MAX N3105 reached", true);</span><br><span>                   bts_do_rate_ctr_inc(bts, CTR_PDAN_POLL_FAILED);</span><br><span>                      bts_do_rate_ctr_inc(bts, CTR_RLC_ACK_FAILED);</span><br><span>                        return;</span><br><span>diff --git a/src/tbf.h b/src/tbf.h</span><br><span>index ded3a3c..6c33bc2 100644</span><br><span>--- a/src/tbf.h</span><br><span>+++ b/src/tbf.h</span><br><span>@@ -121,9 +121,6 @@</span><br><span>       /* Wait contention resolution success on UL TBFs assigned over CCCH */</span><br><span>       T3141,</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      /* Wait for reuse of USF and TFI(s) after the MS uplink assignment for this TBF is invalid. */</span><br><span style="color: hsl(0, 100%, 40%);">-  T3169,</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>       /* Wait for reuse of TFI(s) after sending of the last RLC Data Block on this TBF.</span><br><span>       Wait for reuse of TFI(s) after sending the PACKET TBF RELEASE for an MBMS radio bearer. */</span><br><span>        T3191,</span><br><span>@@ -132,9 +129,6 @@</span><br><span>            MS for this TBF. */</span><br><span>       T3193,</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      /* Wait for reuse of TFI(s) when there is no response from the MS</span><br><span style="color: hsl(0, 100%, 40%);">-          (radio failure or cell change) for this TBF/MBMS radio bearer. */</span><br><span style="color: hsl(0, 100%, 40%);">-    T3195,</span><br><span>       T_MAX</span><br><span> };</span><br><span> </span><br><span>diff --git a/src/tbf_fsm.c b/src/tbf_fsm.c</span><br><span>index 1ba1d61..a57dd08 100644</span><br><span>--- a/src/tbf_fsm.c</span><br><span>+++ b/src/tbf_fsm.c</span><br><span>@@ -145,6 +145,7 @@</span><br><span> </span><br><span> static void st_flow(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+  struct tbf_fsm_ctx *ctx = (struct tbf_fsm_ctx *)fi->priv;</span><br><span>         switch (event) {</span><br><span>     case TBF_EV_LAST_DL_DATA_SENT:</span><br><span>       case TBF_EV_LAST_UL_DATA_RECVD:</span><br><span>@@ -158,7 +159,11 @@</span><br><span>               tbf_fsm_state_chg(fi, TBF_ST_WAIT_RELEASE);</span><br><span>          break;</span><br><span>       case TBF_EV_MAX_N3101:</span><br><span style="color: hsl(120, 100%, 40%);">+                ctx->T_release = 3169;</span><br><span style="color: hsl(120, 100%, 40%);">+             tbf_fsm_state_chg(fi, TBF_ST_RELEASING);</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span>       case TBF_EV_MAX_N3105:</span><br><span style="color: hsl(120, 100%, 40%);">+                ctx->T_release = 3195;</span><br><span>            tbf_fsm_state_chg(fi, TBF_ST_RELEASING);</span><br><span>             break;</span><br><span>       default:</span><br><span>@@ -168,7 +173,7 @@</span><br><span> </span><br><span> static void st_finished(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        //struct tbf_fsm_ctx *ctx = (struct tbf_fsm_ctx *)fi->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct tbf_fsm_ctx *ctx = (struct tbf_fsm_ctx *)fi->priv;</span><br><span>         switch (event) {</span><br><span>     case TBF_EV_FINAL_ACK_RECVD:</span><br><span>                 /* We received Final Ack (DL ACK/NACK) from MS. move to</span><br><span>@@ -177,9 +182,11 @@</span><br><span>               tbf_fsm_state_chg(fi, TBF_ST_WAIT_RELEASE);</span><br><span>          break;</span><br><span>       case TBF_EV_MAX_N3103:</span><br><span style="color: hsl(120, 100%, 40%);">+                ctx->T_release = 3169;</span><br><span>            tbf_fsm_state_chg(fi, TBF_ST_RELEASING);</span><br><span>             break;</span><br><span>       case TBF_EV_MAX_N3105:</span><br><span style="color: hsl(120, 100%, 40%);">+                ctx->T_release = 3195;</span><br><span>            tbf_fsm_state_chg(fi, TBF_ST_RELEASING);</span><br><span>             break;</span><br><span>       default:</span><br><span>@@ -189,12 +196,17 @@</span><br><span> </span><br><span> static void st_wait_release(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+        struct tbf_fsm_ctx *ctx = (struct tbf_fsm_ctx *)fi->priv;</span><br><span>         switch (event) {</span><br><span>     case TBF_EV_FINAL_ACK_RECVD:</span><br><span>                 /* ignore, duplicate ACK, we already know about since we are in WAIT_RELEASE */</span><br><span>              break;</span><br><span>       case TBF_EV_MAX_N3101:</span><br><span style="color: hsl(120, 100%, 40%);">+                ctx->T_release = 3169;</span><br><span style="color: hsl(120, 100%, 40%);">+             tbf_fsm_state_chg(fi, TBF_ST_RELEASING);</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span>       case TBF_EV_MAX_N3105:</span><br><span style="color: hsl(120, 100%, 40%);">+                ctx->T_release = 3195;</span><br><span>            tbf_fsm_state_chg(fi, TBF_ST_RELEASING);</span><br><span>             break;</span><br><span>       default:</span><br><span>@@ -202,6 +214,26 @@</span><br><span>      }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void st_releasing_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       struct tbf_fsm_ctx *ctx = (struct tbf_fsm_ctx *)fi->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+  unsigned long val;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!ctx->T_release)</span><br><span style="color: hsl(120, 100%, 40%);">+               return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* In  general we should end up here with an assigned timer in ctx->T_release. Possible values are:</span><br><span style="color: hsl(120, 100%, 40%);">+        * T3195: Wait for reuse of TFI(s) when there is no response from the MS</span><br><span style="color: hsl(120, 100%, 40%);">+       *        (radio failure or cell change) for this TBF/MBMS radio bearer.</span><br><span style="color: hsl(120, 100%, 40%);">+       * T3169: Wait for reuse of USF and TFI(s) after the MS uplink assignment for this TBF is invalid.</span><br><span style="color: hsl(120, 100%, 40%);">+     */</span><br><span style="color: hsl(120, 100%, 40%);">+    val = osmo_tdef_get(tbf_ms(ctx->tbf)->bts->T_defs_bts, ctx->T_release, OSMO_TDEF_S, -1);</span><br><span style="color: hsl(120, 100%, 40%);">+  fi->T = ctx->T_release;</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPTBF(ctx->tbf, LOGL_DEBUG, "starting timer T%u with %lu sec. %u microsec\n",</span><br><span style="color: hsl(120, 100%, 40%);">+          ctx->T_release, val, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_timer_schedule(&fi->timer, val, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void tbf_fsm_cleanup(struct osmo_fsm_inst *fi, enum osmo_fsm_term_cause cause)</span><br><span> {</span><br><span>   /* TODO: needed ?</span><br><span>@@ -211,9 +243,14 @@</span><br><span> </span><br><span> static int tbf_fsm_timer_cb(struct osmo_fsm_inst *fi)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    struct tbf_fsm_ctx *ctx = (struct tbf_fsm_ctx *)fi->priv;</span><br><span>         switch (fi->T) {</span><br><span style="color: hsl(0, 100%, 40%);">-             default:</span><br><span style="color: hsl(0, 100%, 40%);">-                        break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case 3169:</span><br><span style="color: hsl(120, 100%, 40%);">+    case 3195:</span><br><span style="color: hsl(120, 100%, 40%);">+            tbf_free(ctx->tbf);</span><br><span style="color: hsl(120, 100%, 40%);">+                break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              OSMO_ASSERT(0);</span><br><span>      }</span><br><span>    return 0;</span><br><span> }</span><br><span>@@ -284,6 +321,7 @@</span><br><span>                 .out_state_mask =</span><br><span>                    0,</span><br><span>           .name = "RELEASING",</span><br><span style="color: hsl(120, 100%, 40%);">+                .onenter = st_releasing_on_enter,</span><br><span>    },</span><br><span> };</span><br><span> </span><br><span>diff --git a/src/tbf_fsm.h b/src/tbf_fsm.h</span><br><span>index ae0d6ae..1874bc3 100644</span><br><span>--- a/src/tbf_fsm.h</span><br><span>+++ b/src/tbf_fsm.h</span><br><span>@@ -53,6 +53,7 @@</span><br><span>    struct osmo_fsm_inst *fi;</span><br><span>    struct gprs_rlcmac_tbf* tbf; /* back pointer */</span><br><span>      uint32_t state_flags;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int T_release; /* Timer to be used to end release: T3169 or T3195 */</span><br><span> };</span><br><span> </span><br><span> extern const struct osmo_tdef_state_timeout tbf_fsm_timeouts[32];</span><br><span>diff --git a/src/tbf_ul.cpp b/src/tbf_ul.cpp</span><br><span>index a7a7c3e..d4575a3 100644</span><br><span>--- a/src/tbf_ul.cpp</span><br><span>+++ b/src/tbf_ul.cpp</span><br><span>@@ -816,11 +816,8 @@</span><br><span> </span><br><span> void gprs_rlcmac_ul_tbf::usf_timeout()</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     if (n_inc(N3101)) {</span><br><span style="color: hsl(120, 100%, 40%);">+   if (n_inc(N3101))</span><br><span>            osmo_fsm_inst_dispatch(this->state_fsm.fi, TBF_EV_MAX_N3101, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-          T_START(this, T3169, 3169, "MAX N3101 reached", false);</span><br><span style="color: hsl(0, 100%, 40%);">-               return;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span> }</span><br><span> </span><br><span> struct gprs_rlcmac_ul_tbf *as_ul_tbf(struct gprs_rlcmac_tbf *tbf)</span><br><span>diff --git a/tests/tbf/TbfTest.err b/tests/tbf/TbfTest.err</span><br><span>index 62a3a51..91b8459 100644</span><br><span>--- a/tests/tbf/TbfTest.err</span><br><span>+++ b/tests/tbf/TbfTest.err</span><br><span>@@ -3085,7 +3085,7 @@</span><br><span> TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW) N3101 exceeded MAX (10)</span><br><span> TBF(UL-TFI_0){FLOW}: Received Event MAX_N3101</span><br><span> TBF(UL-TFI_0){FLOW}: state_chg to RELEASING</span><br><span style="color: hsl(0, 100%, 40%);">-TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=RELEASING) starting timer T3169 [MAX N3101 reached] with 5 sec. 0 microsec, cur_fn=2654379</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=RELEASING) starting timer T3169 with 5 sec. 0 microsec</span><br><span> PDCH(bts=0,trx=0,ts=7) Expiring FN=2654379 but previous FN=2654322 is still reserved!</span><br><span> PDCH(bts=0,trx=0,ts=7) Timeout for registered USF (FN=2654322): TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=RELEASING)</span><br><span> TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=RELEASING) N3101 10 => 11 (< MAX 10)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-pcu/+/25048">change 25048</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/+/25048"/><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: I599f4e7e82b0a8c0f5cf633c2d8b1975435f0b60 </div>
<div style="display:none"> Gerrit-Change-Number: 25048 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </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: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>