aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/libbsc/chan_alloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'openbsc/src/libbsc/chan_alloc.c')
-rw-r--r--openbsc/src/libbsc/chan_alloc.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/openbsc/src/libbsc/chan_alloc.c b/openbsc/src/libbsc/chan_alloc.c
index 6f4fe20f8..d0fd9ae33 100644
--- a/openbsc/src/libbsc/chan_alloc.c
+++ b/openbsc/src/libbsc/chan_alloc.c
@@ -397,6 +397,8 @@ static void _lchan_handle_release(struct gsm_lchan *lchan)
if (lchan->sach_deact) {
gsm48_send_rr_release(lchan);
+ /* Make sure we don't stay in release request state forever. */
+ lchan_timer_rel_req_schedule(lchan);
return;
}
@@ -509,3 +511,20 @@ void network_chan_load(struct pchan_load *pl, struct gsm_network *net)
bts_chan_load(pl, bts);
}
+static void lchan_rel_tmr_cb(void *data)
+{
+ struct gsm_lchan *lchan = data;
+
+ LOGP(DRSL, LOGL_NOTICE, "%s Timeout while in release request state!\n",
+ gsm_lchan_name(lchan));
+
+ rsl_lchan_set_state(lchan, LCHAN_S_NONE);
+ lchan_free(lchan);
+}
+
+void lchan_timer_rel_req_schedule(struct gsm_lchan *lchan)
+{
+ lchan->rel_timer.cb = lchan_rel_tmr_cb;
+ lchan->rel_timer.data = lchan;
+ osmo_timer_schedule(&lchan->rel_timer, 4, 0);
+}