diff options
author | Neels Hofmeyr <neels@hofmeyr.de> | 2021-04-24 14:48:19 +0200 |
---|---|---|
committer | Neels Hofmeyr <neels@hofmeyr.de> | 2021-06-10 16:15:35 +0200 |
commit | d163aa380588bb8628c45d7ce34838595dc6e1f2 (patch) | |
tree | fd3d33492be42dac286977fc9a3866a4fb7f88e0 /src/osmo-bsc/abis_rsl.c | |
parent | 52a6b2cebfb3aba0f631c6121361b8d07318984b (diff) |
add VAMOS secondary lchans to timeslot struct
So far there is a bunch of code setting a primary lchan in VAMOS mode.
This patch now adds the actual secondary "shadow" lchans that may be
combined with a primary lchan in VAMOS mode to form a multiplex.
VAMOS lchans are put in the same ts->lchan[] array that keeps the
primary lchans. They are at most two additional usable lchans (for a
TCH/H shadow) added to either TCH/F or TCH/H.
Keeping these in the same array allows looping over all lchans easily.
The ts->max_primary_lchans indicates the index of the first VAMOS shadow
lchan.
Related: SYS#5315 OS#4940
Change-Id: I928af99498bba488d317693f3144d4fccbbe9af3
Diffstat (limited to 'src/osmo-bsc/abis_rsl.c')
-rw-r--r-- | src/osmo-bsc/abis_rsl.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/src/osmo-bsc/abis_rsl.c b/src/osmo-bsc/abis_rsl.c index c20693785..1f7b639fb 100644 --- a/src/osmo-bsc/abis_rsl.c +++ b/src/osmo-bsc/abis_rsl.c @@ -1708,10 +1708,11 @@ static bool force_free_lchan_for_emergency(struct chan_rqd *rqd) * This will take a short amount of time. We need to come back and check regulary to see if we managed to * free up another lchan. */ if (!rqd->release_lchan) { + struct gsm_lchan *release_lchan; /* Pick any busy TCH/F or TCH/H lchan and inititate a channel * release to make room for the incoming emergency call */ - rqd->release_lchan = get_any_lchan(rqd->bts); - if (!rqd->release_lchan) { + rqd->release_lchan = release_lchan = get_any_lchan(rqd->bts); + if (!release_lchan) { /* It can not happen that we first find out that there * is no TCH/H or TCH/F available and at the same time * we ware unable to find any busy TCH/H or TCH/F. In @@ -1724,10 +1725,16 @@ static bool force_free_lchan_for_emergency(struct chan_rqd *rqd) LOG_BTS(rqd->bts, DRSL, LOGL_NOTICE, "CHAN RQD/EMERGENCY-PRIORITY: inducing termination of lchan %s (state:%s) in favor of incoming EMERGENCY CALL!\n", - gsm_lchan_name(rqd->release_lchan), osmo_fsm_inst_state_name(rqd->release_lchan->fi)); + gsm_lchan_name(release_lchan), osmo_fsm_inst_state_name(release_lchan->fi)); + + lchan_release(release_lchan, !!(release_lchan->conn), true, 0, + gscon_last_eutran_plmn(release_lchan->conn)); - lchan_release(rqd->release_lchan, !!(rqd->release_lchan->conn), true, 0, - gscon_last_eutran_plmn(rqd->release_lchan->conn)); + /* Also release any overlapping VAMOS multiplexes on this lchan */ + release_lchan = gsm_lchan_primary_to_vamos(release_lchan); + if (release_lchan) + lchan_release(release_lchan, !!(release_lchan->conn), true, 0, + gscon_last_eutran_plmn(release_lchan->conn)); } else { /* BTS is shutting down, give up... */ if (rqd->release_lchan->ts->fi->state == TS_ST_NOT_INITIALIZED) |