From 2300d69df6d59b2e615691fe341eab18018ac128 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Mon, 14 Jun 2010 17:25:16 +0800 Subject: bsc: Increase the hand_off variable when we are done with the lchan. Every time the highlevel code is done with the channel, increase the value. This way we will be able to see if we are leaking a channel that was never used or should have returned to the system. --- openbsc/src/bsc_msc_ip.c | 9 +++++++++ openbsc/src/bssap.c | 4 ++++ 2 files changed, 13 insertions(+) diff --git a/openbsc/src/bsc_msc_ip.c b/openbsc/src/bsc_msc_ip.c index 558c0345e..032d057ef 100644 --- a/openbsc/src/bsc_msc_ip.c +++ b/openbsc/src/bsc_msc_ip.c @@ -136,12 +136,14 @@ static void bss_close_lchans(struct bss_sccp_connection_data *bss) { if (bss->lchan) { bss->lchan->msc_data = NULL; + bss->lchan->conn.hand_off += 1; put_subscr_con(&bss->lchan->conn, 0); bss->lchan = NULL; } if (bss->secondary_lchan) { bss->secondary_lchan->msc_data = NULL; + bss->secondary_lchan->conn.hand_off += 1; put_subscr_con(&bss->secondary_lchan->conn, 0); bss->secondary_lchan = NULL; } @@ -422,12 +424,14 @@ static int handle_ass_compl(struct msgb *msg) if (!msg->lchan->msc_data) { LOGP(DMSC, LOGL_ERROR, "No MSC data\n"); + msg->lchan->conn.hand_off += 1; put_subscr_con(&msg->lchan->conn, 0); return -1; } if (msg->lchan->msc_data->secondary_lchan != msg->lchan) { LOGP(DMSC, LOGL_ERROR, "Wrong assignment complete.\n"); + msg->lchan->conn.hand_off += 1; put_subscr_con(&msg->lchan->conn, 0); return -1; } @@ -435,6 +439,7 @@ static int handle_ass_compl(struct msgb *msg) if (msgb_l3len(msg) - sizeof(*gh) != 1) { LOGP(DMSC, LOGL_ERROR, "assignment compl invalid: %d\n", msgb_l3len(msg) - sizeof(*gh)); + msg->lchan->conn.hand_off += 1; put_subscr_con(&msg->lchan->conn, 0); return -1; } @@ -453,6 +458,7 @@ static int handle_ass_compl(struct msgb *msg) if (old_chan->conn.subscr) subscr_put(old_chan->conn.subscr); old_chan->conn.subscr = NULL; + old_chan->conn.hand_off += 1; put_subscr_con(&old_chan->conn, 1); } @@ -476,6 +482,7 @@ static int handle_ass_fail(struct msgb *msg) LOGP(DMSC, LOGL_ERROR, "ASSIGNMENT FAILURE from MS, forwarding to MSC\n"); if (!msg->lchan->msc_data) { LOGP(DMSC, LOGL_ERROR, "No MSC data\n"); + msg->lchan->conn.hand_off += 1; put_subscr_con(&msg->lchan->conn, 0); return -1; } @@ -484,6 +491,7 @@ static int handle_ass_fail(struct msgb *msg) if (msg->lchan->msc_data->lchan != msg->lchan) { LOGP(DMSC, LOGL_NOTICE, "Failure should come on the old link.\n"); msg->lchan->msc_data = NULL; + msg->lchan->conn.hand_off += 1; put_subscr_con(&msg->lchan->conn, 0); return -1; } @@ -612,6 +620,7 @@ int gsm0408_rcvmsg(struct msgb *msg, u_int8_t link_id) } else if (rc <= 0 && !msg->lchan->msc_data && msg->lchan->conn.use_count == 0) { if (msg->lchan->state == LCHAN_S_ACTIVE) { LOGP(DMSC, LOGL_NOTICE, "Closing unowned channel.\n"); + msg->lchan->conn.hand_off += 1; use_subscr_con(&msg->lchan->conn); put_subscr_con(&msg->lchan->conn, 0); } diff --git a/openbsc/src/bssap.c b/openbsc/src/bssap.c index 0cd124c88..1fc5d558c 100644 --- a/openbsc/src/bssap.c +++ b/openbsc/src/bssap.c @@ -170,6 +170,7 @@ static int bssmap_handle_clear_command(struct sccp_connection *conn, bssmap_free_secondary(msg->lchan->msc_data); msg->lchan->msc_data = NULL; + msg->lchan->conn.hand_off += 1; put_subscr_con(&msg->lchan->conn, 0); } @@ -294,6 +295,7 @@ static void bssmap_free_secondary(struct bss_sccp_connection_data *data) if (lchan->conn.subscr) subscr_put(lchan->conn.subscr); lchan->conn.subscr = NULL; + lchan->conn.hand_off += 1; put_subscr_con(&lchan->conn, 1); } @@ -451,6 +453,7 @@ static void continue_new_assignment(struct gsm_lchan *new_lchan) { if (!new_lchan->msc_data) { LOGP(DMSC, LOGL_ERROR, "No BSS data found.\n"); + new_lchan->conn.hand_off += 1; put_subscr_con(&new_lchan->conn, 0); return; } @@ -458,6 +461,7 @@ static void continue_new_assignment(struct gsm_lchan *new_lchan) if (new_lchan->msc_data->secondary_lchan != new_lchan) { LOGP(DMSC, LOGL_ERROR, "This is not the secondary channel?\n"); new_lchan->msc_data = NULL; + new_lchan->conn.hand_off += 1; put_subscr_con(&new_lchan->conn, 0); return; } -- cgit v1.2.3