<p>pespin <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-pcu/+/25749">View Change</a></p><div style="white-space:pre-wrap">Approvals:
dexter: Looks good to me, but someone else must approve
pespin: Looks good to me, approved
osmith: Looks good to me, but someone else must approve
fixeria: Looks good to me, but someone else must approve
Jenkins Builder: Verified
</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Handle Final UL ACK/NACK Confirmation in tbf_fsm<br><br>Pass the event over the FSM for better understading of the entire<br>lifecycle of the TBF.<br><br>Change-Id: If30d881037209d33b2b41ecf8bb8419caf36e367<br>---<br>M src/pdch.cpp<br>M src/tbf_fsm.c<br>M src/tbf_fsm.h<br>3 files changed, 23 insertions(+), 11 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/pdch.cpp b/src/pdch.cpp</span><br><span>index a503a55..dbdd47f 100644</span><br><span>--- a/src/pdch.cpp</span><br><span>+++ b/src/pdch.cpp</span><br><span>@@ -355,9 +355,9 @@</span><br><span> }</span><br><span> pdch_ulc_release_fn(ulc, fn);</span><br><span> osmo_fsm_inst_dispatch(ul_tbf->ul_ack_fsm.fi, TBF_UL_ACK_EV_RX_CTRL_ACK, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">- /* We can free since we only set polling on final UL ACK/NACK */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* We only set polling on final UL ACK/NACK */</span><br><span> LOGPTBF(tbf, LOGL_DEBUG, "[UPLINK] END\n");</span><br><span style="color: hsl(0, 100%, 40%);">- tbf_free(tbf);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_inst_dispatch(ul_tbf->state_fsm.fi, TBF_EV_FINAL_UL_ACK_CONFIRMED, NULL);</span><br><span> return;</span><br><span> </span><br><span> case PDCH_ULC_POLL_UL_ASS:</span><br><span>@@ -616,6 +616,7 @@</span><br><span> void gprs_rlcmac_pdch::rcv_resource_request(Packet_Resource_Request_t *request, uint32_t fn, struct pcu_l1_meas *meas)</span><br><span> {</span><br><span> struct gprs_rlcmac_sba *sba;</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc;</span><br><span> </span><br><span> if (request->ID.UnionType) {</span><br><span> struct gprs_rlcmac_ul_tbf *ul_tbf = NULL;</span><br><span>@@ -682,12 +683,23 @@</span><br><span> "block of final UL ACK/NACK\n", fn);</span><br><span> ul_tbf->n_reset(N3103);</span><br><span> pdch_ulc_release_node(ulc, item);</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = osmo_fsm_inst_dispatch(ul_tbf->state_fsm.fi, TBF_EV_FINAL_UL_ACK_CONFIRMED, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FSM failed handling, get rid of previous finished UL TBF before providing a new one */</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPTBFUL(ul_tbf, LOGL_NOTICE,</span><br><span style="color: hsl(120, 100%, 40%);">+ "Got PACKET RESOURCE REQ while TBF not finished, killing pending UL TBF\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ tbf_free(ul_tbf);</span><br><span style="color: hsl(120, 100%, 40%);">+ } /* else: ul_tbf has been freed by state_fsm */</span><br><span style="color: hsl(120, 100%, 40%);">+ ul_tbf = NULL;</span><br><span> break;</span><br><span> default:</span><br><span> OSMO_ASSERT(0);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* here ul_tbf may be NULL in SBA case (no previous TBF) */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Here ul_tbf is NULL:</span><br><span style="color: hsl(120, 100%, 40%);">+ * - SBA case: no previous TBF) and in</span><br><span style="color: hsl(120, 100%, 40%);">+ * - POLL case: PktResReq is a final ACk confirmation and ul_tbf was freed</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span> </span><br><span> if (request->Exist_MS_Radio_Access_capability2) {</span><br><span> uint8_t ms_class, egprs_ms_class;</span><br><span>@@ -699,14 +711,6 @@</span><br><span> ms_set_egprs_ms_class(ms, egprs_ms_class);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Get rid of previous finished UL TBF before providing a new one */</span><br><span style="color: hsl(0, 100%, 40%);">- if (ul_tbf) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (!ul_tbf->state_is(TBF_ST_FINISHED))</span><br><span style="color: hsl(0, 100%, 40%);">- LOGPTBFUL(ul_tbf, LOGL_NOTICE,</span><br><span style="color: hsl(0, 100%, 40%);">- "Got PACKET RESOURCE REQ while TBF not finished, killing pending UL TBF\n");</span><br><span style="color: hsl(0, 100%, 40%);">- tbf_free(ul_tbf);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> ul_tbf = tbf_alloc_ul_pacch(bts(), ms, trx_no(), tlli);</span><br><span> if (!ul_tbf) {</span><br><span> handle_tbf_reject(bts(), ms, trx_no(), ts_no);</span><br><span>diff --git a/src/tbf_fsm.c b/src/tbf_fsm.c</span><br><span>index 4202a0c..0b6a2a3 100644</span><br><span>--- a/src/tbf_fsm.c</span><br><span>+++ b/src/tbf_fsm.c</span><br><span>@@ -50,6 +50,7 @@</span><br><span> { TBF_EV_LAST_DL_DATA_SENT, "LAST_DL_DATA_SENT" },</span><br><span> { TBF_EV_LAST_UL_DATA_RECVD, "LAST_UL_DATA_RECVD" },</span><br><span> { TBF_EV_FINAL_ACK_RECVD, "FINAL_ACK_RECVD" },</span><br><span style="color: hsl(120, 100%, 40%);">+ { TBF_EV_FINAL_UL_ACK_CONFIRMED, "FINAL_UL_ACK_CONFIRMED" },</span><br><span> { TBF_EV_MAX_N3101 , "MAX_N3101" },</span><br><span> { TBF_EV_MAX_N3103 , "MAX_N3103" },</span><br><span> { TBF_EV_MAX_N3105 , "MAX_N3105" },</span><br><span>@@ -253,6 +254,11 @@</span><br><span> case we receive more DL data to tx */</span><br><span> tbf_fsm_state_chg(fi, TBF_ST_WAIT_RELEASE);</span><br><span> break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case TBF_EV_FINAL_UL_ACK_CONFIRMED:</span><br><span style="color: hsl(120, 100%, 40%);">+ /* UL TBF ACKed our transmitted UL ACK/NACK with final Ack</span><br><span style="color: hsl(120, 100%, 40%);">+ * Indicator set to '1' t. We can free the TBF right away. */</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> case TBF_EV_MAX_N3103:</span><br><span> ctx->T_release = 3169;</span><br><span> tbf_fsm_state_chg(fi, TBF_ST_RELEASING);</span><br><span>@@ -432,6 +438,7 @@</span><br><span> .in_event_mask =</span><br><span> X(TBF_EV_DL_ACKNACK_MISS) |</span><br><span> X(TBF_EV_FINAL_ACK_RECVD) |</span><br><span style="color: hsl(120, 100%, 40%);">+ X(TBF_EV_FINAL_UL_ACK_CONFIRMED) |</span><br><span> X(TBF_EV_MAX_N3103) |</span><br><span> X(TBF_EV_MAX_N3105),</span><br><span> .out_state_mask =</span><br><span>diff --git a/src/tbf_fsm.h b/src/tbf_fsm.h</span><br><span>index d6fe41f..d62e091 100644</span><br><span>--- a/src/tbf_fsm.h</span><br><span>+++ b/src/tbf_fsm.h</span><br><span>@@ -36,6 +36,7 @@</span><br><span> TBF_EV_LAST_DL_DATA_SENT, /* DL TBF sends RLCMAC block containing last DL avilable data buffered */</span><br><span> TBF_EV_LAST_UL_DATA_RECVD, /* UL TBF sends RLCMAC block containing last UL data (cv=0) */</span><br><span> TBF_EV_FINAL_ACK_RECVD, /* DL ACK/NACK with FINAL_ACK=1 received from MS */</span><br><span style="color: hsl(120, 100%, 40%);">+ TBF_EV_FINAL_UL_ACK_CONFIRMED, /* UL TBF: MS ACKs (CtrlAck or PktResReq) our UL ACK/NACK w/ FinalAckInd=1 */</span><br><span> TBF_EV_MAX_N3101, /* MAX N3101 (max usf timeout) reached (UL TBF) */</span><br><span> TBF_EV_MAX_N3103, /* MAX N3103 (max Pkt Ctrl Ack for last UL ACK/NACK timeout) reached (UL TBF) */</span><br><span> TBF_EV_MAX_N3105, /* MAX N3105 (max poll timeout) reached (UL/DL TBF) */</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-pcu/+/25749">change 25749</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/+/25749"/><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: If30d881037209d33b2b41ecf8bb8419caf36e367 </div>
<div style="display:none"> Gerrit-Change-Number: 25749 </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: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </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>