Change in osmo-bsc[master]: lchan_fsm: add in_release_handler flag

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

Neels Hofmeyr gerrit-no-reply at lists.osmocom.org
Sat Jul 28 10:44:05 UTC 2018


Neels Hofmeyr has submitted this change and it was merged. ( https://gerrit.osmocom.org/10104 )

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

lchan_fsm: add in_release_handler flag

If a release event is being handled, ignore other ricocheting release events
until that release handling has concluded.

For example, if an lchan is regularly released, it signals the lchan RTP FSM to
release, which then calls back to say "RTP is released" on termination -- this
should not trigger other state changes than the initial release intends.

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

Approvals:
  Jenkins Builder: Verified
  Neels Hofmeyr: Looks good to me, approved



diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h
index 12bc5c3..448924c 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 1ecec7c..940afe8 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: merged
Gerrit-Change-Id: Iec41e006b6ab9d0f618d36925341f9536353e5d8
Gerrit-Change-Number: 10104
Gerrit-PatchSet: 9
Gerrit-Owner: Neels Hofmeyr <nhofmeyr at sysmocom.de>
Gerrit-Reviewer: Harald Welte <laforge at gnumonks.org>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr at sysmocom.de>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20180728/52cdd0f8/attachment.htm>


More information about the gerrit-log mailing list