diff options
author | Holger Hans Peter Freyther <zecke@selfish.org> | 2010-03-31 07:30:58 +0200 |
---|---|---|
committer | Holger Hans Peter Freyther <zecke@selfish.org> | 2010-03-31 07:30:58 +0200 |
commit | 538ea6d5c64cb048ba10bf7ec7e6dae6385ce142 (patch) | |
tree | 613f9b41392a673007aec0225724035b5dda8e01 /openbsc/src/nat | |
parent | e14ec0dab48029bb4746b6c49d22a0ee6fa6b47c (diff) |
[nat] Send a RSIP down to the BSC after it connects
Make sure the MGCP attached to the BSC is resetting all
endpoints whenever the BSC is connecting to us as we assume
that all endpoints are available.
Diffstat (limited to 'openbsc/src/nat')
-rw-r--r-- | openbsc/src/nat/bsc_nat.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/openbsc/src/nat/bsc_nat.c b/openbsc/src/nat/bsc_nat.c index 744a30e6b..4cc6549eb 100644 --- a/openbsc/src/nat/bsc_nat.c +++ b/openbsc/src/nat/bsc_nat.c @@ -127,6 +127,15 @@ static void send_id_req(struct bsc_connection *bsc) bsc_write(bsc, id_req, sizeof(id_req)); } +static void send_mgcp_reset(struct bsc_connection *bsc) +{ + static const u_int8_t mgcp_reset[] = { + "RSIP 1 13@mgw MGCP 1.0\r\n" + }; + + bsc_write_mgcp(bsc, mgcp_reset, sizeof mgcp_reset - 1); +} + /* * Below is the handling of messages coming * from the MSC and need to be forwarded to @@ -166,6 +175,37 @@ static void bsc_write(struct bsc_connection *bsc, const u_int8_t *data, unsigned } } +int bsc_write_mgcp(struct bsc_connection *bsc, const u_int8_t *data, unsigned int length) +{ + struct msgb *msg; + + if (length > 4096 - 128) { + LOGP(DINP, LOGL_ERROR, "Can not send message of that size.\n"); + return -1; + } + + msg = msgb_alloc_headroom(4096, 128, "to-bsc"); + if (!msg) { + LOGP(DINP, LOGL_ERROR, "Failed to allocate memory for BSC msg.\n"); + return -1; + } + + /* copy the data */ + msg->l3h = msgb_put(msg, length); + memcpy(msg->l3h, data, length); + + /* prepend the header */ + ipaccess_prepend_header(msg, NAT_IPAC_PROTO_MGCP); + + if (write_queue_enqueue(&bsc->write_queue, msg) != 0) { + LOGP(DINP, LOGL_ERROR, "Failed to enqueue the write.\n"); + msgb_free(msg); + return -1; + } + + return 0; +} + static int forward_sccp_to_bts(struct msgb *msg) { struct sccp_connections *con; @@ -558,6 +598,7 @@ static int ipaccess_listen_bsc_cb(struct bsc_fd *bfd, unsigned int what) llist_add(&bsc->list_entry, &nat->bsc_connections); send_id_ack(bsc); send_id_req(bsc); + send_mgcp_reset(bsc); /* * start the hangup timer |