From 8264e09ca2f3bd93eba5eefa342267f303085629 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Wed, 29 Jun 2011 19:22:47 +0200 Subject: lapdm: make sure we flush all queues whenever entering IDLE state this fixes a memory leak where the final UA would always remain in memory after a LAPDm entity has been disconnected. --- src/gsm/lapdm.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/gsm/lapdm.c b/src/gsm/lapdm.c index 2679ca06..e496461e 100644 --- a/src/gsm/lapdm.c +++ b/src/gsm/lapdm.c @@ -594,6 +594,7 @@ static void lapdm_t200_cb(void *data) rsl_rll_error(RLL_CAUSE_T200_EXPIRED, &dl->mctx); /* flush tx buffers */ lapdm_dl_flush_tx(dl); + lapdm_dl_flush_send(dl); /* go back to idle state */ lapdm_dl_newstate(dl, LAPDm_STATE_IDLE); /* NOTE: we must not change any other states or buffers @@ -893,6 +894,8 @@ static int lapdm_rx_u(struct msgb *msg, struct lapdm_msg_ctx *mctx) /* reset Timer T200 */ osmo_timer_del(&dl->t200); /* go to idle state */ + lapdm_dl_flush_tx(dl); + lapdm_dl_flush_send(dl); lapdm_dl_newstate(dl, LAPDm_STATE_IDLE); rc = send_rll_simple(RSL_MT_REL_CONF, mctx); msgb_free(msg); @@ -1024,6 +1027,8 @@ static int lapdm_rx_u(struct msgb *msg, struct lapdm_msg_ctx *mctx) /* reset Timer T200 */ osmo_timer_del(&dl->t200); /* enter idle state */ + lapdm_dl_flush_tx(dl); + lapdm_dl_flush_send(dl); lapdm_dl_newstate(dl, LAPDm_STATE_IDLE); /* send notification to L3 */ rc = send_rll_simple(rsl_msg, mctx); @@ -1074,6 +1079,8 @@ static int lapdm_rx_u(struct msgb *msg, struct lapdm_msg_ctx *mctx) /* reset Timer T200 */ osmo_timer_del(&dl->t200); /* go to idle state */ + lapdm_dl_flush_tx(dl); + lapdm_dl_flush_send(dl); lapdm_dl_newstate(dl, LAPDm_STATE_IDLE); rc = send_rll_simple(RSL_MT_REL_CONF, mctx); msgb_free(msg); @@ -1096,6 +1103,8 @@ static int lapdm_rx_u(struct msgb *msg, struct lapdm_msg_ctx *mctx) rc = send_rll_simple(RSL_MT_REL_IND, mctx); msgb_free(msg); /* go to idle state */ + lapdm_dl_flush_tx(dl); + lapdm_dl_flush_send(dl); lapdm_dl_newstate(dl, LAPDm_STATE_IDLE); return 0; } @@ -1108,6 +1117,8 @@ static int lapdm_rx_u(struct msgb *msg, struct lapdm_msg_ctx *mctx) rc = send_rll_simple(RSL_MT_REL_IND, mctx); msgb_free(msg); /* go to idle state */ + lapdm_dl_flush_tx(dl); + lapdm_dl_flush_send(dl); lapdm_dl_newstate(dl, LAPDm_STATE_IDLE); return 0; } -- cgit v1.2.3