diff options
author | Holger Hans Peter Freyther <zecke@selfish.org> | 2010-10-27 11:01:55 +0200 |
---|---|---|
committer | Holger Hans Peter Freyther <zecke@selfish.org> | 2010-10-27 11:01:55 +0200 |
commit | 54f5352e0777c6407b47b5d7f9ab366f66179e48 (patch) | |
tree | 28ab7e0485956c673c60dce2075406c7b5ba708b /openbsc/src/nat/bsc_nat.c | |
parent | 07dfc702764d2a148ce6e6c8869f76f47170f072 (diff) |
nat: Close SCCP connections when the USSD Provider is closed.
Send a RLSD down to the BSC in case the USSD Provider is gone. It
is not sending a Clear Command and ut depends if the BS+ will
like this kind of behavior. At least the data on the NAT will
be freed soon afterwards due the RLC message.
Diffstat (limited to 'openbsc/src/nat/bsc_nat.c')
-rw-r--r-- | openbsc/src/nat/bsc_nat.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/openbsc/src/nat/bsc_nat.c b/openbsc/src/nat/bsc_nat.c index 57818992f..e1d2f3219 100644 --- a/openbsc/src/nat/bsc_nat.c +++ b/openbsc/src/nat/bsc_nat.c @@ -231,6 +231,27 @@ static void nat_send_rlsd_msc(struct sccp_connections *conn) queue_for_msc(conn->msc_con, msg); } +static void nat_send_rlsd_bsc(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->real_ref; + rel->source_local_reference = conn->remote_ref; + + bsc_write(conn->bsc, msg, IPAC_PROTO_SCCP); +} + static void nat_send_rlc(struct bsc_msc_connection *msc_con, struct sccp_source_reference *src, struct sccp_source_reference *dst) @@ -1307,3 +1328,19 @@ int main(int argc, char **argv) return 0; } + +/* Close all connections handed out to the USSD module */ +int bsc_close_ussd_connections(struct bsc_nat *nat) +{ + struct sccp_connections *con; + llist_for_each_entry(con, &nat->sccp_connections, list_entry) { + if (con->con_local != 2) + continue; + if (!con->bsc) + continue; + + nat_send_rlsd_bsc(con); + } + + return 0; +} |