aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/chan_alloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'openbsc/src/chan_alloc.c')
-rw-r--r--openbsc/src/chan_alloc.c30
1 files changed, 8 insertions, 22 deletions
diff --git a/openbsc/src/chan_alloc.c b/openbsc/src/chan_alloc.c
index cd48e4359..5ca47f909 100644
--- a/openbsc/src/chan_alloc.c
+++ b/openbsc/src/chan_alloc.c
@@ -33,8 +33,6 @@
#include <openbsc/debug.h>
#include <openbsc/signal.h>
-static void auto_release_channel(void *_lchan);
-
static int ts_is_usable(struct gsm_bts_trx_ts *ts)
{
/* FIXME: How does this behave for BS-11 ? */
@@ -268,16 +266,13 @@ struct gsm_lchan *lchan_alloc(struct gsm_bts *bts, enum gsm_chan_t type)
/* clear multi rate config */
memset(&lchan->mr_conf, 0, sizeof(lchan->mr_conf));
+ /* clear any msc reference */
+ lchan->msc_data = NULL;
+
/* clear per MSC/BSC data */
memset(&lchan->conn, 0, sizeof(lchan->conn));
-
- /* Configure the time and start it so it will be closed */
lchan->conn.lchan = lchan;
lchan->conn.bts = lchan->ts->trx->bts;
- lchan->conn.release_timer.cb = auto_release_channel;
- lchan->conn.release_timer.data = lchan;
- bsc_schedule_timer(&lchan->conn.release_timer, LCHAN_RELEASE_TIMEOUT);
-
} else {
struct challoc_signal_data sig;
sig.bts = bts;
@@ -307,8 +302,6 @@ void lchan_free(struct gsm_lchan *lchan)
lchan->conn.use_count = 0;
}
- /* stop the timer */
- bsc_del_timer(&lchan->conn.release_timer);
bsc_del_timer(&lchan->T3101);
/* clear cached measuement reports */
@@ -319,7 +312,6 @@ void lchan_free(struct gsm_lchan *lchan)
}
for (i = 0; i < ARRAY_SIZE(lchan->neigh_meas); i++)
lchan->neigh_meas[i].arfcn = 0;
-
lchan->conn.silent_call = 0;
sig.lchan = lchan;
@@ -331,15 +323,18 @@ void lchan_free(struct gsm_lchan *lchan)
}
/* Consider releasing the channel now */
-int lchan_auto_release(struct gsm_lchan *lchan)
+int _lchan_release(struct gsm_lchan *lchan, u_int8_t release_reason)
{
if (lchan->conn.use_count > 0) {
+ DEBUGP(DRLL, "BUG: _lchan_release called without zero use_count.\n");
return 0;
}
/* Assume we have GSM04.08 running and send a release */
if (lchan->conn.subscr) {
+ ++lchan->conn.use_count;
gsm48_send_rr_release(lchan);
+ --lchan->conn.use_count;
}
/* spoofed? message */
@@ -348,19 +343,10 @@ int lchan_auto_release(struct gsm_lchan *lchan)
lchan->conn.use_count);
DEBUGP(DRLL, "%s Recycling Channel\n", gsm_lchan_name(lchan));
- rsl_release_request(lchan, 0);
+ rsl_release_request(lchan, 0, release_reason);
return 1;
}
-/* Auto release the channel when the use count is zero */
-static void auto_release_channel(void *_lchan)
-{
- struct gsm_lchan *lchan = _lchan;
-
- if (!lchan_auto_release(lchan))
- bsc_schedule_timer(&lchan->conn.release_timer, LCHAN_RELEASE_TIMEOUT);
-}
-
struct gsm_lchan* lchan_find(struct gsm_bts *bts, struct gsm_subscriber *subscr) {
struct gsm_bts_trx *trx;
int ts_no, lchan_no;