aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/libbsc/chan_alloc.c
diff options
context:
space:
mode:
authorNeels Hofmeyr <nhofmeyr@sysmocom.de>2016-06-06 12:57:22 +0200
committerHolger Freyther <holger@freyther.de>2016-06-07 11:10:40 +0000
commitf5713a5c6376db139250debd9c2ae36f8e974982 (patch)
tree6ea2733ba37c4feded75626deb32a81bc438d207 /openbsc/src/libbsc/chan_alloc.c
parent6079528b4858ec15dc029778d86fb43197ba77db (diff)
lchan_alloc(): on alloc failure, report original type
In lchan_alloc(), there are several decisions to fall back to another type of channel, followed by setting the channel type to the fall back type. So far, this was set regardless of allocation success or failure. If such fall back type is not available, do not modify the local type variable and thus report an S_CHALLOC_ALLOC_FAIL on the type originally requested (report is at the end of lchan_alloc()). Change-Id: Ie3d4cb74f91db0b8c4f5e595a963099de339ad1a
Diffstat (limited to 'openbsc/src/libbsc/chan_alloc.c')
-rw-r--r--openbsc/src/libbsc/chan_alloc.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/openbsc/src/libbsc/chan_alloc.c b/openbsc/src/libbsc/chan_alloc.c
index de9da810d..c9c5fa8c8 100644
--- a/openbsc/src/libbsc/chan_alloc.c
+++ b/openbsc/src/libbsc/chan_alloc.c
@@ -161,12 +161,14 @@ struct gsm_lchan *lchan_alloc(struct gsm_bts *bts, enum gsm_chan_t type,
if (allow_bigger) {
if (lchan == NULL) {
lchan = _lc_find_bts(bts, GSM_PCHAN_TCH_H);
- type = GSM_LCHAN_TCH_H;
+ if (lchan)
+ type = GSM_LCHAN_TCH_H;
}
if (lchan == NULL) {
lchan = _lc_find_bts(bts, GSM_PCHAN_TCH_F);
- type = GSM_LCHAN_TCH_F;
+ if (lchan)
+ type = GSM_LCHAN_TCH_F;
}
}
break;
@@ -175,7 +177,8 @@ struct gsm_lchan *lchan_alloc(struct gsm_bts *bts, enum gsm_chan_t type,
/* If we don't have TCH/F available, fall-back to TCH/H */
if (!lchan) {
lchan = _lc_find_bts(bts, GSM_PCHAN_TCH_H);
- type = GSM_LCHAN_TCH_H;
+ if (lchan)
+ type = GSM_LCHAN_TCH_H;
}
break;
case GSM_LCHAN_TCH_H:
@@ -183,7 +186,8 @@ struct gsm_lchan *lchan_alloc(struct gsm_bts *bts, enum gsm_chan_t type,
/* If we don't have TCH/H available, fall-back to TCH/F */
if (!lchan) {
lchan = _lc_find_bts(bts, GSM_PCHAN_TCH_F);
- type = GSM_LCHAN_TCH_F;
+ if (lchan)
+ type = GSM_LCHAN_TCH_F;
}
break;
default: