diff options
-rw-r--r-- | openbsc/src/bsc_msc_ip.c | 9 | ||||
-rw-r--r-- | openbsc/src/bssap.c | 4 |
2 files changed, 13 insertions, 0 deletions
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; } |