<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/26613">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">fix gscon clear 2/n: proper state transition to ST_CLEARING<br><br>The way the ST_CLEARING is entered before this patch has various<br>symptoms of how I / we used osmo_fsm when we were still FSM amateurs in<br>Osmocom. Patch that up:<br><br>- Do state transitioning into gscon_bssmap_clear(), move the Clear<br> Request messaging to ST_CLEARING's onenter function.<br><br>- In gscon_bssmap_clear(), ask for a state transition to ST_CLEARING<br> first. Go ahead only if it is allowed.<br><br>- Fix the timeout behavior: by using conn_fsm_state_chg(), use the<br> actual proper X4 timer value from VTY configuration instead of<br> hardcoded magic numbers in various places.<br><br>Related: OS#5337<br>Change-Id: I234b2a754d0c98031056981823cdbc187e977741<br>---<br>M src/osmo-bsc/bsc_subscr_conn_fsm.c<br>1 file changed, 20 insertions(+), 15 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/13/26613/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo-bsc/bsc_subscr_conn_fsm.c b/src/osmo-bsc/bsc_subscr_conn_fsm.c</span><br><span>index ff742a2..e33fe43 100644</span><br><span>--- a/src/osmo-bsc/bsc_subscr_conn_fsm.c</span><br><span>+++ b/src/osmo-bsc/bsc_subscr_conn_fsm.c</span><br><span>@@ -141,10 +141,24 @@</span><br><span> static void gscon_bssmap_clear(struct gsm_subscriber_connection *conn,</span><br><span> enum gsm0808_cause cause)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* already clearing? */</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (conn->fi->state) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case ST_CLEARING:</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+ default:</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ conn->clear_cause = cause;</span><br><span style="color: hsl(120, 100%, 40%);">+ conn_fsm_state_chg(ST_CLEARING);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void gscon_fsm_clearing_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span> struct msgb *resp;</span><br><span> int rc;</span><br><span style="color: hsl(0, 100%, 40%);">- conn->clear_cause = cause;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_subscriber_connection *conn = fi->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+ enum gsm0808_cause cause = conn->clear_cause;</span><br><span> </span><br><span> if (conn->rx_clear_command) {</span><br><span> LOGPFSML(conn->fi, LOGL_DEBUG, "Not sending BSSMAP CLEAR REQUEST, already got CLEAR COMMAND from MSC\n");</span><br><span>@@ -152,14 +166,14 @@</span><br><span> }</span><br><span> </span><br><span> if (!conn->sccp.msc) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGPFSML(conn->fi, LOGL_ERROR, "Unable to deliver BSSMAP Clear Request message, no MSC for this conn\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPFSML(fi, LOGL_ERROR, "Unable to deliver BSSMAP Clear Request message, no MSC for this conn\n");</span><br><span> return;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- LOGPFSML(conn->fi, LOGL_DEBUG, "Tx BSSMAP CLEAR REQUEST(%s) to MSC\n", gsm0808_cause_name(cause));</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPFSML(fi, LOGL_DEBUG, "Tx BSSMAP CLEAR REQUEST(%s) to MSC\n", gsm0808_cause_name(cause));</span><br><span> resp = gsm0808_create_clear_rqst(cause);</span><br><span> if (!resp) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGPFSML(conn->fi, LOGL_ERROR, "Unable to compose BSSMAP Clear Request message\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPFSML(fi, LOGL_ERROR, "Unable to compose BSSMAP Clear Request message\n");</span><br><span> return;</span><br><span> }</span><br><span> </span><br><span>@@ -355,8 +369,6 @@</span><br><span> osmo_fsm_inst_state_name(conn->fi));</span><br><span> }</span><br><span> gscon_bssmap_clear(conn, GSM0808_CAUSE_EQUIPMENT_FAILURE);</span><br><span style="color: hsl(0, 100%, 40%);">- if (conn->fi->state != ST_CLEARING)</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_fsm_inst_state_chg(fi, ST_CLEARING, 60, -4);</span><br><span> return;</span><br><span> default:</span><br><span> OSMO_ASSERT(false);</span><br><span>@@ -376,7 +388,6 @@</span><br><span> confirmed connection, then instead simply drop the connection */</span><br><span> LOGPFSML(fi, LOGL_INFO,</span><br><span> "Connection confirmed but lchan was dropped previously, clearing conn\n");</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_fsm_inst_state_chg(conn->fi, ST_CLEARING, 60, -4);</span><br><span> gscon_bssmap_clear(conn, GSM0808_CAUSE_EQUIPMENT_FAILURE);</span><br><span> break;</span><br><span> }</span><br><span>@@ -705,6 +716,7 @@</span><br><span> },</span><br><span> [ST_CLEARING] = {</span><br><span> .name = "CLEARING",</span><br><span style="color: hsl(120, 100%, 40%);">+ .onenter = gscon_fsm_clearing_onenter,</span><br><span> /* dead end state */</span><br><span> },</span><br><span> };</span><br><span>@@ -763,11 +775,6 @@</span><br><span> yet so we cannot release it. First wait for the CC, and release in gscon_fsm_wait_cc(). */</span><br><span> break;</span><br><span> default:</span><br><span style="color: hsl(0, 100%, 40%);">- /* Ensure that the FSM is in ST_CLEARING. */</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_fsm_inst_state_chg(conn->fi, ST_CLEARING, 60, -4);</span><br><span style="color: hsl(0, 100%, 40%);">- /* fall thru, omit an error log if already in ST_CLEARING */</span><br><span style="color: hsl(0, 100%, 40%);">- case ST_CLEARING:</span><br><span style="color: hsl(0, 100%, 40%);">- /* Request a Clear Command from the MSC. */</span><br><span> gscon_bssmap_clear(conn, GSM0808_CAUSE_EQUIPMENT_FAILURE);</span><br><span> break;</span><br><span> }</span><br><span>@@ -806,8 +813,7 @@</span><br><span> osmo_fsm_inst_name(conn->fi), detach_label);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if ((conn->fi && conn->fi->state != ST_CLEARING)</span><br><span style="color: hsl(0, 100%, 40%);">- && !conn->lchan</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!conn->lchan</span><br><span> && !conn->ho.new_lchan</span><br><span> && !conn->assignment.new_lchan</span><br><span> && !conn->lcs.loc_req)</span><br><span>@@ -1205,7 +1211,6 @@</span><br><span> failed_to_send:</span><br><span> LOGPFSML(conn->fi, LOGL_ERROR, "Tx BSSMAP CLEAR REQUEST to MSC\n");</span><br><span> gscon_bssmap_clear(conn, GSM0808_CAUSE_EQUIPMENT_FAILURE);</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_fsm_inst_state_chg(conn->fi, ST_ACTIVE, 0, 0);</span><br><span> }</span><br><span> </span><br><span> void gscon_submit_rsl_dtap(struct gsm_subscriber_connection *conn,</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/26613">change 26613</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-bsc/+/26613"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-bsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I234b2a754d0c98031056981823cdbc187e977741 </div>
<div style="display:none"> Gerrit-Change-Number: 26613 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: ipse <Alexander.Chemeris@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>