aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2010-01-14 00:15:44 +0100
committerHolger Hans Peter Freyther <zecke@selfish.org>2010-01-14 00:15:44 +0100
commit433d6ee1a26d1fb1240c4e7fb7a5b6f66fc3e98a (patch)
tree8c5f480896c4a82f7dd818a59c6129651b0d112a
parent203a6eddf836f8b79e6acd63221379abecb763c9 (diff)
[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
-rw-r--r--openbsc/src/bsc_mgcp.c9
1 files changed, 5 insertions, 4 deletions
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)