Neels Hofmeyr has uploaded this change for review. ( 
https://gerrit.osmocom.org/10104


Change subject: lchan_fsm: add in_release_handler flag
......................................................................

lchan_fsm: add in_release_handler flag

Change-Id: Iec41e006b6ab9d0f618d36925341f9536353e5d8
---
M include/osmocom/bsc/gsm_data.h
M src/osmo-bsc/lchan_fsm.c
2 files changed, 21 insertions(+), 7 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/04/10104/1

diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h
index 7bd0943..425de0b 100644
--- a/include/osmocom/bsc/gsm_data.h
+++ b/include/osmocom/bsc/gsm_data.h
@@ -525,6 +525,10 @@
        /* RSL error code, RSL_ERR_* */
        uint8_t rsl_error_cause;

+       /* If a release event is being handled, ignore other ricocheting 
release events until that
+        * release handling has concluded. */
+       bool in_release_handler;
+
        /* The logical channel type */
        enum gsm_chan_t type;
        /* RSL channel mode */
diff --git a/src/osmo-bsc/lchan_fsm.c b/src/osmo-bsc/lchan_fsm.c
index 58adb99..6d090f6 100644
--- a/src/osmo-bsc/lchan_fsm.c
+++ b/src/osmo-bsc/lchan_fsm.c
@@ -521,7 +521,7 @@

        case LCHAN_EV_RTP_RELEASED:
        case LCHAN_EV_RTP_ERROR:
-               if (lchan->release_requested) {
+               if (lchan->in_release_handler) {
                        /* Already in release, the RTP is not the initial cause 
of failure.
                         * Just ignore. */
                        return;
@@ -581,6 +581,7 @@
                break;

        case LCHAN_EV_RSL_CHAN_ACTIV_NACK:
+               lchan->in_release_handler = true;
                if (data) {
                        uint32_t next_state;
                        lchan->rsl_error_cause = *(uint8_t*)data;
@@ -599,11 +600,12 @@
                        lchan->release_in_error = true;
                        lchan_fail_to(LCHAN_ST_BORKEN, "Chan Activ NACK without 
cause IE");
                }
+               lchan->in_release_handler = false;
                break;

        case LCHAN_EV_RTP_RELEASED:
        case LCHAN_EV_RTP_ERROR:
-               if (lchan->release_requested) {
+               if (lchan->in_release_handler) {
                        /* Already in release, the RTP is not the initial cause 
of failure.
                         * Just ignore. */
                        return;
@@ -715,7 +717,7 @@

        case LCHAN_EV_RTP_RELEASED:
        case LCHAN_EV_RTP_ERROR:
-               if (lchan->release_requested) {
+               if (lchan->in_release_handler) {
                        /* Already in release, the RTP is not the initial cause 
of failure.
                         * Just ignore. */
                        return;
@@ -826,7 +828,7 @@

        case LCHAN_EV_RTP_RELEASED:
        case LCHAN_EV_RTP_ERROR:
-               if (lchan->release_requested) {
+               if (lchan->in_release_handler) {
                        /* Already in release, the RTP is not the initial cause 
of failure.
                         * Just ignore. */
                        return;
@@ -1201,6 +1203,11 @@
 {
        if (!lchan || !lchan->fi)
                return;
+
+       if (lchan->in_release_handler)
+               return;
+       lchan->in_release_handler = true;
+
        struct osmo_fsm_inst *fi = lchan->fi;
        lchan->release_in_error = err;
        lchan->rsl_error_cause = cause_rr;
@@ -1223,13 +1230,13 @@
                        if (lchan->deact_sacch)
                                rsl_deact_sacch(lchan);
                        lchan_fsm_state_chg(LCHAN_ST_WAIT_RF_RELEASE_ACK);
-                       return;
+                       goto exit_release_handler;
                case LCHAN_ST_WAIT_TS_READY:
                        lchan_fsm_state_chg(LCHAN_ST_WAIT_RLL_RTP_RELEASED);
-                       return;
+                       goto exit_release_handler;
                case LCHAN_ST_WAIT_RF_RELEASE_ACK:
                case LCHAN_ST_BORKEN:
-                       return;
+                       goto exit_release_handler;
                }
        }
 
@@ -1237,6 +1244,9 @@
         * is: */
        if (fi->state == LCHAN_ST_ESTABLISHED)
                lchan_fsm_state_chg(LCHAN_ST_WAIT_RLL_RTP_RELEASED);
+
+exit_release_handler:
+       lchan->in_release_handler = false;
 }

 void lchan_fsm_cleanup(struct osmo_fsm_inst *fi, enum osmo_fsm_term_cause 
cause)

--
To view, visit https://gerrit.osmocom.org/10104
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-bsc
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: Iec41e006b6ab9d0f618d36925341f9536353e5d8
Gerrit-Change-Number: 10104
Gerrit-PatchSet: 1
Gerrit-Owner: Neels Hofmeyr <[email protected]>

Reply via email to