<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>