diff options
author | Holger Hans Peter Freyther <zecke@selfish.org> | 2010-04-06 17:32:58 +0200 |
---|---|---|
committer | Holger Hans Peter Freyther <zecke@selfish.org> | 2010-06-15 20:24:12 +0800 |
commit | 6b087d18f5e0df654bdbbef18b79988d8e49b7ce (patch) | |
tree | 9aa17ec72efd67050b8cb45ebd9a91a8b1fc1910 /openbsc/src/nat/bsc_nat.c | |
parent | f464ea54d14d4c591119104211b6d63603e48e45 (diff) |
nat: Send a RLSD to the network for connections belonging to the BSC
Sending a RLSD with SCCP failure makes the MSC free all the resources
(MGCP, audio channels), right now we are ignoring the RLC we get from
the network and print a unhandled message.
Diffstat (limited to 'openbsc/src/nat/bsc_nat.c')
-rw-r--r-- | openbsc/src/nat/bsc_nat.c | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/openbsc/src/nat/bsc_nat.c b/openbsc/src/nat/bsc_nat.c index 734606b76..ff54b26bc 100644 --- a/openbsc/src/nat/bsc_nat.c +++ b/openbsc/src/nat/bsc_nat.c @@ -127,6 +127,32 @@ static void send_id_req(struct bsc_connection *bsc) bsc_write(bsc, id_req, sizeof(id_req)); } +static void nat_send_rlsd(struct sccp_connections *conn) +{ + struct sccp_connection_released *rel; + struct msgb *msg; + + msg = msgb_alloc_headroom(4096, 128, "rlsd"); + if (!msg) { + LOGP(DNAT, LOGL_ERROR, "Failed to allocate clear command.\n"); + return; + } + + msg->l2h = msgb_put(msg, sizeof(*rel)); + rel = (struct sccp_connection_released *) msg->l2h; + rel->type = SCCP_MSG_TYPE_RLSD; + rel->release_cause = SCCP_RELEASE_CAUSE_SCCP_FAILURE; + rel->destination_local_reference = conn->remote_ref; + rel->source_local_reference = conn->patched_ref; + + ipaccess_prepend_header(msg, IPAC_PROTO_SCCP); + + if (write_queue_enqueue(&msc_con->write_queue, msg) != 0) { + LOGP(DINP, LOGL_ERROR, "Failed to enqueue the write.\n"); + msgb_free(msg); + } +} + static void send_mgcp_reset(struct bsc_connection *bsc) { static const u_int8_t mgcp_reset[] = { @@ -354,7 +380,7 @@ static void remove_bsc_connection(struct bsc_connection *connection) if (sccp_patch->bsc != connection) continue; -#warning "TODO: Send a RLSD to the MSC. Or at least a clear command." + nat_send_rlsd(sccp_patch); sccp_connection_destroy(sccp_patch); } |