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