[PATCH 1/3] lchan: Speculative "fix" for error and late reply

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/OpenBSC@lists.osmocom.org/.

Holger Hans Peter Freyther holger at freyther.de
Mon May 26 06:22:36 UTC 2014


From: Holger Hans Peter Freyther <holger at moiji-mobile.com>

Looking at the code it seemed possible that a channel would
transition from BROKEN to NONE. Or worse from NONE to BROKEN.
Start the timer _after_ the channel has been released.
---
 openbsc/src/libbsc/abis_rsl.c | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)

diff --git a/openbsc/src/libbsc/abis_rsl.c b/openbsc/src/libbsc/abis_rsl.c
index 5d40794..984fa7e 100644
--- a/openbsc/src/libbsc/abis_rsl.c
+++ b/openbsc/src/libbsc/abis_rsl.c
@@ -52,6 +52,7 @@ enum sacch_deact {
 };
 
 static int rsl_send_imm_assignment(struct gsm_lchan *lchan);
+static void error_timeout_cb(void *data);
 
 static void send_lchan_signal(int sig_no, struct gsm_lchan *lchan,
 			      struct gsm_meas_rep *resp)
@@ -64,9 +65,15 @@ static void send_lchan_signal(int sig_no, struct gsm_lchan *lchan,
 
 static void do_lchan_free(struct gsm_lchan *lchan)
 {
-	/* we have an error timer pending to release that */
-	if (lchan->state != LCHAN_S_REL_ERR)
+	/* We start the error timer to make the channel available again */
+	if (lchan->state == LCHAN_S_REL_ERR) {
+		lchan->error_timer.data = lchan;
+		lchan->error_timer.cb = error_timeout_cb;
+		osmo_timer_schedule(&lchan->error_timer,
+				   lchan->ts->trx->bts->network->T3111 + 2, 0);
+	} else {
 		rsl_lchan_set_state(lchan, LCHAN_S_NONE);
+	}
 	lchan_free(lchan);
 }
 
@@ -679,8 +686,6 @@ static int rsl_rf_chan_release(struct gsm_lchan *lchan, int error,
 	DEBUGP(DRSL, "%s RF Channel Release CMD due error %d\n", gsm_lchan_name(lchan), error);
 
 	if (error) {
-		struct e1inp_sign_link *sign_link = msg->dst;
-
 		/*
 		 * FIXME: GSM 04.08 gives us two options for the abnormal
 		 * chanel release. This can be either like in the non-existent
@@ -708,10 +713,6 @@ static int rsl_rf_chan_release(struct gsm_lchan *lchan, int error,
 		 * TODO: start T3109 now.
 		 */
 		rsl_lchan_set_state(lchan, LCHAN_S_REL_ERR);
-		lchan->error_timer.data = lchan;
-		lchan->error_timer.cb = error_timeout_cb;
-		osmo_timer_schedule(&lchan->error_timer,
-				   sign_link->trx->bts->network->T3111 + 2, 0);
 	}
 
 	/* Start another timer or assume the BTS sends a ACK/NACK? */
-- 
1.9.1





More information about the OpenBSC mailing list