<p>Neels Hofmeyr has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/10104">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">lchan_fsm: add in_release_handler flag<br><br>Change-Id: Iec41e006b6ab9d0f618d36925341f9536353e5d8<br>---<br>M include/osmocom/bsc/gsm_data.h<br>M src/osmo-bsc/lchan_fsm.c<br>2 files changed, 21 insertions(+), 7 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/04/10104/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h</span><br><span>index 7bd0943..425de0b 100644</span><br><span>--- a/include/osmocom/bsc/gsm_data.h</span><br><span>+++ b/include/osmocom/bsc/gsm_data.h</span><br><span>@@ -525,6 +525,10 @@</span><br><span>         /* RSL error code, RSL_ERR_* */</span><br><span>      uint8_t rsl_error_cause;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  /* If a release event is being handled, ignore other ricocheting release events until that</span><br><span style="color: hsl(120, 100%, 40%);">+     * release handling has concluded. */</span><br><span style="color: hsl(120, 100%, 40%);">+ bool in_release_handler;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   /* The logical channel type */</span><br><span>       enum gsm_chan_t type;</span><br><span>        /* RSL channel mode */</span><br><span>diff --git a/src/osmo-bsc/lchan_fsm.c b/src/osmo-bsc/lchan_fsm.c</span><br><span>index 58adb99..6d090f6 100644</span><br><span>--- a/src/osmo-bsc/lchan_fsm.c</span><br><span>+++ b/src/osmo-bsc/lchan_fsm.c</span><br><span>@@ -521,7 +521,7 @@</span><br><span> </span><br><span>        case LCHAN_EV_RTP_RELEASED:</span><br><span>  case LCHAN_EV_RTP_ERROR:</span><br><span style="color: hsl(0, 100%, 40%);">-                if (lchan->release_requested) {</span><br><span style="color: hsl(120, 100%, 40%);">+            if (lchan->in_release_handler) {</span><br><span>                  /* Already in release, the RTP is not the initial cause of failure.</span><br><span>                   * Just ignore. */</span><br><span>                   return;</span><br><span>@@ -581,6 +581,7 @@</span><br><span>                break;</span><br><span> </span><br><span>   case LCHAN_EV_RSL_CHAN_ACTIV_NACK:</span><br><span style="color: hsl(120, 100%, 40%);">+            lchan->in_release_handler = true;</span><br><span>                 if (data) {</span><br><span>                  uint32_t next_state;</span><br><span>                         lchan->rsl_error_cause = *(uint8_t*)data;</span><br><span>@@ -599,11 +600,12 @@</span><br><span>                         lchan->release_in_error = true;</span><br><span>                   lchan_fail_to(LCHAN_ST_BORKEN, "Chan Activ NACK without cause IE");</span><br><span>                }</span><br><span style="color: hsl(120, 100%, 40%);">+             lchan->in_release_handler = false;</span><br><span>                break;</span><br><span> </span><br><span>   case LCHAN_EV_RTP_RELEASED:</span><br><span>  case LCHAN_EV_RTP_ERROR:</span><br><span style="color: hsl(0, 100%, 40%);">-                if (lchan->release_requested) {</span><br><span style="color: hsl(120, 100%, 40%);">+            if (lchan->in_release_handler) {</span><br><span>                  /* Already in release, the RTP is not the initial cause of failure.</span><br><span>                   * Just ignore. */</span><br><span>                   return;</span><br><span>@@ -715,7 +717,7 @@</span><br><span> </span><br><span>    case LCHAN_EV_RTP_RELEASED:</span><br><span>  case LCHAN_EV_RTP_ERROR:</span><br><span style="color: hsl(0, 100%, 40%);">-                if (lchan->release_requested) {</span><br><span style="color: hsl(120, 100%, 40%);">+            if (lchan->in_release_handler) {</span><br><span>                  /* Already in release, the RTP is not the initial cause of failure.</span><br><span>                   * Just ignore. */</span><br><span>                   return;</span><br><span>@@ -826,7 +828,7 @@</span><br><span> </span><br><span>    case LCHAN_EV_RTP_RELEASED:</span><br><span>  case LCHAN_EV_RTP_ERROR:</span><br><span style="color: hsl(0, 100%, 40%);">-                if (lchan->release_requested) {</span><br><span style="color: hsl(120, 100%, 40%);">+            if (lchan->in_release_handler) {</span><br><span>                  /* Already in release, the RTP is not the initial cause of failure.</span><br><span>                   * Just ignore. */</span><br><span>                   return;</span><br><span>@@ -1201,6 +1203,11 @@</span><br><span> {</span><br><span>        if (!lchan || !lchan->fi)</span><br><span>                 return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (lchan->in_release_handler)</span><br><span style="color: hsl(120, 100%, 40%);">+             return;</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan->in_release_handler = true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       struct osmo_fsm_inst *fi = lchan->fi;</span><br><span>     lchan->release_in_error = err;</span><br><span>    lchan->rsl_error_cause = cause_rr;</span><br><span>@@ -1223,13 +1230,13 @@</span><br><span>                      if (lchan->deact_sacch)</span><br><span>                           rsl_deact_sacch(lchan);</span><br><span>                      lchan_fsm_state_chg(LCHAN_ST_WAIT_RF_RELEASE_ACK);</span><br><span style="color: hsl(0, 100%, 40%);">-                      return;</span><br><span style="color: hsl(120, 100%, 40%);">+                       goto exit_release_handler;</span><br><span>           case LCHAN_ST_WAIT_TS_READY:</span><br><span>                         lchan_fsm_state_chg(LCHAN_ST_WAIT_RLL_RTP_RELEASED);</span><br><span style="color: hsl(0, 100%, 40%);">-                    return;</span><br><span style="color: hsl(120, 100%, 40%);">+                       goto exit_release_handler;</span><br><span>           case LCHAN_ST_WAIT_RF_RELEASE_ACK:</span><br><span>           case LCHAN_ST_BORKEN:</span><br><span style="color: hsl(0, 100%, 40%);">-                   return;</span><br><span style="color: hsl(120, 100%, 40%);">+                       goto exit_release_handler;</span><br><span>           }</span><br><span>    }</span><br><span> </span><br><span>@@ -1237,6 +1244,9 @@</span><br><span>         * is: */</span><br><span>    if (fi->state == LCHAN_ST_ESTABLISHED)</span><br><span>            lchan_fsm_state_chg(LCHAN_ST_WAIT_RLL_RTP_RELEASED);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+exit_release_handler:</span><br><span style="color: hsl(120, 100%, 40%);">+ lchan->in_release_handler = false;</span><br><span> }</span><br><span> </span><br><span> void lchan_fsm_cleanup(struct osmo_fsm_inst *fi, enum osmo_fsm_term_cause cause)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/10104">change 10104</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/10104"/><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-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Iec41e006b6ab9d0f618d36925341f9536353e5d8 </div>
<div style="display:none"> Gerrit-Change-Number: 10104 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>