aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src
diff options
context:
space:
mode:
Diffstat (limited to 'openbsc/src')
-rw-r--r--openbsc/src/libbsc/abis_rsl.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/openbsc/src/libbsc/abis_rsl.c b/openbsc/src/libbsc/abis_rsl.c
index 95d5c1ea7..6f50cee16 100644
--- a/openbsc/src/libbsc/abis_rsl.c
+++ b/openbsc/src/libbsc/abis_rsl.c
@@ -56,6 +56,14 @@ static void send_lchan_signal(int sig_no, struct gsm_lchan *lchan,
osmo_signal_dispatch(SS_LCHAN, sig_no, &sig);
}
+static void do_lchan_free(struct gsm_lchan *lchan)
+{
+ /* we have an error timer pending to release that */
+ if (lchan->state != LCHAN_S_REL_ERR)
+ rsl_lchan_set_state(lchan, LCHAN_S_NONE);
+ lchan_free(lchan);
+}
+
static uint8_t mdisc_by_msgtype(uint8_t msg_type)
{
/* mask off the transparent bit ? */
@@ -196,9 +204,7 @@ static void lchan_deact_tmr_cb(void *data)
LOGP(DRSL, LOGL_ERROR, "%s Timeout during deactivation!\n",
gsm_lchan_name(lchan));
- if (lchan->state != LCHAN_S_REL_ERR)
- rsl_lchan_set_state(lchan, LCHAN_S_NONE);
- lchan_free(lchan);
+ do_lchan_free(lchan);
}
@@ -696,17 +702,15 @@ static int rsl_rx_rf_chan_rel_ack(struct gsm_lchan *lchan)
DEBUGP(DRSL, "%s RF CHANNEL RELEASE ACK\n", gsm_lchan_name(lchan));
+ /* Stop all pending timers */
osmo_timer_del(&lchan->act_timer);
+ osmo_timer_del(&lchan->T3111);
if (lchan->state != LCHAN_S_REL_REQ && lchan->state != LCHAN_S_REL_ERR)
LOGP(DRSL, LOGL_NOTICE, "%s CHAN REL ACK but state %s\n",
gsm_lchan_name(lchan),
gsm_lchans_name(lchan->state));
- osmo_timer_del(&lchan->T3111);
- /* we have an error timer pending to release that */
- if (lchan->state != LCHAN_S_REL_ERR)
- rsl_lchan_set_state(lchan, LCHAN_S_NONE);
- lchan_free(lchan);
+ do_lchan_free(lchan);
return 0;
}