aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2021-10-25 12:52:49 +0200
committerpespin <pespin@sysmocom.de>2021-11-15 09:49:41 +0000
commitc672ed8428bf3175ec6ea192555f9b256bd7cf01 (patch)
tree84f34c00991c996eb4c0bf09470edfb0240f1759
parentff1bd7e361c4e2d612c22ea296aee5c5c1cf767a (diff)
Properly handle dyn TS TCH with vamos after updating subslots_per_pchan
In the case of ts->pchan_from_config=GSM_PCHAN_OSMO_DYN, ts->max_primary_lchans will be 8 due to SDCCH8 support, and we don't want to set lchan->vamos.is_secondary=true for lchans at the end of the array. Related: OS#5278 Change-Id: If86af5fafe059d5e830c1f6d37034f7325d9a96c
-rw-r--r--src/osmo-bsc/timeslot_fsm.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/src/osmo-bsc/timeslot_fsm.c b/src/osmo-bsc/timeslot_fsm.c
index 93fc38031..86fea3c8d 100644
--- a/src/osmo-bsc/timeslot_fsm.c
+++ b/src/osmo-bsc/timeslot_fsm.c
@@ -201,19 +201,24 @@ void ts_set_pchan_is(struct gsm_bts_trx_ts *ts, enum gsm_phys_chan_config pchan_
{
int i;
struct gsm_lchan *lchan;
+ uint8_t max_lchans_possible_vamos;
+
ts->pchan_is = pchan_is;
ts->max_primary_lchans = pchan_subslots(ts->pchan_is);
- LOG_TS(ts, LOGL_DEBUG, "pchan_is=%s max_primary_lchans=%d max_lchans_possible=%d\n",
- gsm_pchan_name(ts->pchan_is), ts->max_primary_lchans, ts->max_lchans_possible);
+ max_lchans_possible_vamos = pchan_subslots_vamos(ts->pchan_is);
+ LOG_TS(ts, LOGL_DEBUG, "pchan_is=%s max_primary_lchans=%d max_lchans_possible=%d (%u VAMOS)\n",
+ gsm_pchan_name(ts->pchan_is), ts->max_primary_lchans, ts->max_lchans_possible,
+ max_lchans_possible_vamos);
switch (ts->pchan_is) {
case GSM_PCHAN_TCH_F:
case GSM_PCHAN_TCH_H:
for (i = 0; i < ts->max_lchans_possible; i++) {
lchan = &ts->lchan[i];
- if (i < ts->max_primary_lchans)
- lchan->vamos.is_secondary = false;
- else
+ if (i >= ts->max_primary_lchans &&
+ (i - ts->max_primary_lchans) < (int)max_lchans_possible_vamos)
lchan->vamos.is_secondary = true;
+ else
+ lchan->vamos.is_secondary = false;
lchan_fsm_update_id(lchan);
}
break;