From 433d6ee1a26d1fb1240c4e7fb7a5b6f66fc3e98a Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Thu, 14 Jan 2010 00:15:44 +0100 Subject: [mgcp] Handle BTS and NET being on the same host * Do not only check the IP but also the port to figure out where to send the data * Do not memset the endp->remote inside the bind_rtp but from inside the crcx as this will be modified by the MDCX --- openbsc/src/bsc_mgcp.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'openbsc/src') diff --git a/openbsc/src/bsc_mgcp.c b/openbsc/src/bsc_mgcp.c index 0880aecd4..7f14f9ecd 100644 --- a/openbsc/src/bsc_mgcp.c +++ b/openbsc/src/bsc_mgcp.c @@ -252,7 +252,8 @@ static int rtp_data_cb(struct bsc_fd *fd, unsigned int what) * able to tell if this is legitimate. */ #warning "Slight spec violation. With connection mode recvonly we should attempt to forward." - dest = memcmp(&addr.sin_addr, &endp->remote, sizeof(addr.sin_addr)) == 0 + dest = memcmp(&addr.sin_addr, &endp->remote, sizeof(addr.sin_addr)) == 0 && + (endp->net_rtp == addr.sin_port || endp->net_rtcp == addr.sin_port) ? DEST_BTS : DEST_NETWORK; proto = fd == &endp->local_rtp ? PROTO_RTP : PROTO_RTCP; @@ -310,9 +311,6 @@ static int create_bind(struct bsc_fd *fd, int port) static int bind_rtp(struct mgcp_endpoint *endp) { - /* set to zero until we get the info */ - memset(&endp->remote, 0, sizeof(endp->remote)); - if (create_bind(&endp->local_rtp, endp->rtp_port) != 0) { DEBUGP(DMGCP, "Failed to create RTP port: %d on 0x%x\n", endp->rtp_port, ENDPOINT_NUMBER(endp)); @@ -645,6 +643,9 @@ static void handle_create_con(struct msgb *msg, struct sockaddr_in *source) /* initialize */ endp->net_rtp = endp->net_rtcp = endp->bts_rtp = endp->bts_rtcp = 0; + /* set to zero until we get the info */ + memset(&endp->remote, 0, sizeof(endp->remote)); + /* bind to the port now */ endp->rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp), rtp_base_port); if (!early_bind && bind_rtp(endp) != 0) -- cgit v1.2.3