aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/libmgcp
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <holger@moiji-mobile.com>2014-07-09 00:38:06 +0200
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2014-07-22 15:15:13 +0200
commit48a071e3665a3e04fd7c341dd28422796682f5f5 (patch)
tree1365371e5c827fa1eaa04b40e83582dc8122256a /openbsc/src/libmgcp
parent07ec8eebe0537848e00ee346b8d8ac2bcbe22fab (diff)
osmux: Extract the dummy message, find the endpoint and set rtp port
Set the remote port for the endpoint. Somehow this needs to propagate all the way to the handle.
Diffstat (limited to 'openbsc/src/libmgcp')
-rw-r--r--openbsc/src/libmgcp/osmux.c35
1 files changed, 34 insertions, 1 deletions
diff --git a/openbsc/src/libmgcp/osmux.c b/openbsc/src/libmgcp/osmux.c
index 716b5f57a..ad9c2ee71 100644
--- a/openbsc/src/libmgcp/osmux.c
+++ b/openbsc/src/libmgcp/osmux.c
@@ -267,6 +267,39 @@ out:
return 0;
}
+/*
+ * Try to figure out where it came from and enter the rtp_port
+ */
+static int osmux_handle_dummy(struct mgcp_config *cfg,
+ struct sockaddr_in *addr, struct msgb *msg)
+{
+ struct mgcp_endpoint *endp;
+ uint32_t ci;
+
+ if (msg->len < 1 + sizeof(ci))
+ goto out;
+
+ /* extract the CI from the dummy message */
+ memcpy(&ci, &msg->data[1], sizeof(ci));
+ ci = ntohl(ci);
+
+ endp = endpoint_lookup(cfg, ci & 0xff, &addr->sin_addr, MGCP_DEST_BTS);
+ if (!endp) {
+ LOGP(DMGCP, LOGL_ERROR, "Can not find CI=%d\n", ci & 0xff);
+ goto out;
+ }
+
+ if (endp->bts_end.rtp_port == 0) {
+ endp->bts_end.rtp_port = addr->sin_port;
+ LOGP(DMGCP, LOGL_NOTICE, "0x%x found BTS on endpoint %s:%d\n",
+ ENDPOINT_NUMBER(endp),
+ inet_ntoa(addr->sin_addr), htons(addr->sin_port));
+ }
+out:
+ msgb_free(msg);
+ return 0;
+}
+
int osmux_read_from_bsc_cb(struct osmo_fd *ofd, unsigned int what)
{
struct msgb *msg;
@@ -282,7 +315,7 @@ int osmux_read_from_bsc_cb(struct osmo_fd *ofd, unsigned int what)
/* not any further processing dummy messages */
if (msg->data[0] == MGCP_DUMMY_LOAD)
- goto out;
+ return osmux_handle_dummy(cfg, &addr, msg);
osmux_snprintf(buf, sizeof(buf), msg);
LOGP(DMGCP, LOGL_DEBUG,