aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Eversberg <jolly@eversberg.eu>2013-05-31 15:05:52 +0200
committerNeels Hofmeyr <neels@hofmeyr.de>2018-01-12 03:28:14 +0100
commit2113c4b4a3670f46520fc0b42e25f2cc3ace3740 (patch)
treea45bd31e3cf73024cc824345f6a3c1757760b530
parent02afe465bfdbc381a7c174b0d83b4720d7d18fe9 (diff)
HO: Assign SDCCH on channel request
This is needed, so channel can be negotiated before the actual channel type is assigned. In case there is no SDCCH available, try to assign what ever the MS requested. If this is not possible try to assign TCH/F. If this is still not possible, reject channel request. Change-Id: I10fc9f60c58c6b7ed424a86ce23bf6b9802c9eb1
-rw-r--r--src/libbsc/abis_rsl.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/src/libbsc/abis_rsl.c b/src/libbsc/abis_rsl.c
index 980b3e662..cb2828753 100644
--- a/src/libbsc/abis_rsl.c
+++ b/src/libbsc/abis_rsl.c
@@ -1890,8 +1890,26 @@ static int rsl_rx_chan_rqd(struct msgb *msg)
*/
is_lu = !!(chreq_reason == GSM_CHREQ_REASON_LOCATION_UPD);
- /* check availability / allocate channel */
- lchan = lchan_alloc(bts, lctype, is_lu);
+ /* check availability / allocate channel
+ *
+ * - First try to allocate SDCCH.
+ * - If SDCCH is not available, try whatever MS requested, if not SDCCH.
+ * - If there is still no channel available, reject channel request.
+ *
+ * lchan_alloc() possibly tries to allocate larger lchans.
+ *
+ * Note: If the MS requests not TCH/H, we don't know if the phone
+ * supports TCH/H, so we must assign TCH/F or SDCCH.
+ */
+ lchan = lchan_alloc(bts, GSM_LCHAN_SDCCH, 0);
+ if (!lchan && lctype != GSM_LCHAN_SDCCH) {
+ LOGP(DRSL, LOGL_NOTICE, "BTS %d CHAN RQD: no resources for %s "
+ "0x%x, retrying with %s\n",
+ msg->lchan->ts->trx->bts->nr,
+ gsm_lchant_name(GSM_LCHAN_SDCCH), rqd_ref->ra,
+ gsm_lchant_name(lctype));
+ lchan = lchan_alloc(bts, lctype, 0);
+ }
if (!lchan) {
LOGP(DRSL, LOGL_NOTICE, "BTS %d CHAN RQD: no resources for %s 0x%x\n",
msg->lchan->ts->trx->bts->nr, gsm_lchant_name(lctype), rqd_ref->ra);