[PATCH] osmocom-bb[master]: trxcon/scheduler: reset lchan state after deactivation

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

Harald Welte gerrit-no-reply at lists.osmocom.org
Thu Feb 22 15:33:36 UTC 2018


Review at  https://gerrit.osmocom.org/6815

trxcon/scheduler: reset lchan state after deactivation

Let's assume that a logical channel, which was already in use,
is activated again for a new connection. As we don't reset the
state variables, such as burst masks or ciphering data, it may
cause an unexpected behaviour.

In order to avoid this, let's always reset the logical channel
state after deactivation.

Change-Id: I91e736a97cb05b167614cb488a00d847a9a859e0
---
M src/host/trxcon/sched_trx.c
1 file changed, 45 insertions(+), 13 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/15/6815/1

diff --git a/src/host/trxcon/sched_trx.c b/src/host/trxcon/sched_trx.c
index 120098b..2142119 100644
--- a/src/host/trxcon/sched_trx.c
+++ b/src/host/trxcon/sched_trx.c
@@ -406,6 +406,42 @@
 	return 0;
 }
 
+static void sched_trx_reset_lchan(struct trx_lchan_state *lchan)
+{
+	/* Prevent NULL-pointer deference */
+	OSMO_ASSERT(lchan != NULL);
+
+	/* Reset internal state variables */
+	lchan->rx_burst_mask = 0x00;
+	lchan->tx_burst_mask = 0x00;
+	lchan->rx_first_fn = 0;
+
+	/* Free burst memory */
+	talloc_free(lchan->rx_bursts);
+	talloc_free(lchan->tx_bursts);
+
+	lchan->rx_bursts = NULL;
+	lchan->tx_bursts = NULL;
+
+	/* Forget the current prim */
+	sched_prim_drop(lchan);
+
+	/* TCH specific variables */
+	if (CHAN_IS_TCH(lchan->type)) {
+		lchan->dl_ongoing_facch = 0;
+		lchan->ul_ongoing_facch = 0;
+
+		lchan->rsl_cmode = 0x00;
+		lchan->tch_mode = 0x00;
+
+		/* Reset AMR state */
+		memset(&lchan->amr, 0x00, sizeof(lchan->amr));
+	}
+
+	/* Reset ciphering state */
+	memset(&lchan->a5, 0x00, sizeof(lchan->a5));
+}
+
 int sched_trx_deactivate_lchan(struct trx_ts *ts, enum trx_lchan_type chan)
 {
 	struct trx_lchan_state *lchan;
@@ -424,16 +460,10 @@
 	LOGP(DSCH, LOGL_DEBUG, "Deactivating lchan=%s "
 		"on ts=%d\n", trx_lchan_desc[chan].name, ts->index);
 
-	/* Free memory */
-	talloc_free(lchan->rx_bursts);
-	talloc_free(lchan->tx_bursts);
+	/* Reset internal state, free memory */
+	sched_trx_reset_lchan(lchan);
 
-	/* Reset ciphering state */
-	memset(&lchan->a5, 0x00, sizeof(lchan->a5));
-
-	/* Forget the current prim */
-	sched_prim_drop(lchan);
-
+	/* Update activation flag */
 	lchan->active = 0;
 
 	return 0;
@@ -451,12 +481,14 @@
 	for (i = 0; i < len; i++) {
 		lchan = ts->lchans + i;
 
-		talloc_free(lchan->rx_bursts);
-		talloc_free(lchan->tx_bursts);
+		/* Omit inactive channels */
+		if (!lchan->active)
+			continue;
 
-		/* Forget the current prim */
-		sched_prim_drop(lchan);
+		/* Reset internal state, free memory */
+		sched_trx_reset_lchan(lchan);
 
+		/* Update activation flag */
 		lchan->active = 0;
 	}
 }

-- 
To view, visit https://gerrit.osmocom.org/6815
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I91e736a97cb05b167614cb488a00d847a9a859e0
Gerrit-PatchSet: 1
Gerrit-Project: osmocom-bb
Gerrit-Branch: master
Gerrit-Owner: Harald Welte <laforge at gnumonks.org>



More information about the gerrit-log mailing list