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