From c49212778f84736f1cc59fccf7946595c629ed91 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Thu, 5 Aug 2010 03:37:22 +0800 Subject: mgcp: Move the bfd for rtp/rtcp into the port Stop using the memset in the mgcp_rtp_end_reset as we will reset the list pointers and then have a mess.. --- openbsc/include/openbsc/mgcp_internal.h | 14 +++++------- openbsc/src/mgcp/mgcp_network.c | 40 ++++++++++++++++----------------- openbsc/src/mgcp/mgcp_protocol.c | 17 +++++++++----- 3 files changed, 38 insertions(+), 33 deletions(-) (limited to 'openbsc') diff --git a/openbsc/include/openbsc/mgcp_internal.h b/openbsc/include/openbsc/mgcp_internal.h index 7f999a35d..357f3bf82 100644 --- a/openbsc/include/openbsc/mgcp_internal.h +++ b/openbsc/include/openbsc/mgcp_internal.h @@ -59,6 +59,12 @@ struct mgcp_rtp_end { int payload_type; + /* + * Each end has a socket... + */ + struct bsc_fd rtp; + struct bsc_fd rtcp; + int local_port; }; @@ -69,14 +75,6 @@ struct mgcp_endpoint { int conn_mode; int orig_mode; - /* - * RTP mangling: - * - we get RTP and RTCP to us and need to forward to the BTS - * - we get RTP and RTCP from the BTS and forward to the network - */ - struct bsc_fd local_rtp; - struct bsc_fd local_rtcp; - /* backpointer */ struct mgcp_config *cfg; diff --git a/openbsc/src/mgcp/mgcp_network.c b/openbsc/src/mgcp/mgcp_network.c index 2fe5f116d..94f88b95a 100644 --- a/openbsc/src/mgcp/mgcp_network.c +++ b/openbsc/src/mgcp/mgcp_network.c @@ -90,7 +90,7 @@ int mgcp_send_dummy(struct mgcp_endpoint *endp) { static char buf[] = { DUMMY_LOAD }; - return udp_send(endp->local_rtp.fd, &endp->net_end.addr, + return udp_send(endp->net_end.rtp.fd, &endp->net_end.addr, endp->net_end.rtp_port, buf, 1); } @@ -192,7 +192,7 @@ static int rtp_data_cb(struct bsc_fd *fd, unsigned int what) dest = memcmp(&addr.sin_addr, &endp->net_end.addr, sizeof(addr.sin_addr)) == 0 && (endp->net_end.rtp_port == addr.sin_port || endp->net_end.rtcp_port == addr.sin_port) ? DEST_BTS : DEST_NETWORK; - proto = fd == &endp->local_rtp ? PROTO_RTP : PROTO_RTCP; + proto = (fd == &endp->net_end.rtp || fd == &endp->bts_end.rtp) ? PROTO_RTP : PROTO_RTCP; /* We have no idea who called us, maybe it is the BTS. */ if (dest == DEST_NETWORK && endp->bts_end.rtp_port == 0) { @@ -200,7 +200,7 @@ static int rtp_data_cb(struct bsc_fd *fd, unsigned int what) if (!cfg->bts_ip || memcmp(&addr.sin_addr, &cfg->bts_in, sizeof(cfg->bts_in)) == 0 || memcmp(&addr.sin_addr, &endp->bts_end.addr, sizeof(endp->bts_end.addr)) == 0) { - if (fd == &endp->local_rtp) { + if (proto == PROTO_RTP) { endp->bts_end.rtp_port = addr.sin_port; } else { endp->bts_end.rtcp_port = addr.sin_port; @@ -290,34 +290,34 @@ static int bind_rtp(struct mgcp_endpoint *endp) { struct mgcp_config *cfg = endp->cfg; - if (create_bind(cfg->source_addr, &endp->local_rtp, endp->bts_end.local_port) != 0) { + if (create_bind(cfg->source_addr, &endp->bts_end.rtp, endp->bts_end.local_port) != 0) { LOGP(DMGCP, LOGL_ERROR, "Failed to create RTP port: %s:%d on 0x%x\n", cfg->source_addr, endp->bts_end.local_port, ENDPOINT_NUMBER(endp)); goto cleanup0; } - if (create_bind(cfg->source_addr, &endp->local_rtcp, endp->bts_end.local_port + 1) != 0) { + if (create_bind(cfg->source_addr, &endp->bts_end.rtcp, endp->bts_end.local_port + 1) != 0) { LOGP(DMGCP, LOGL_ERROR, "Failed to create RTCP port: %s:%d on 0x%x\n", cfg->source_addr, endp->bts_end.local_port + 1, ENDPOINT_NUMBER(endp)); goto cleanup1; } - set_ip_tos(endp->local_rtp.fd, cfg->endp_dscp); - set_ip_tos(endp->local_rtcp.fd, cfg->endp_dscp); + set_ip_tos(endp->bts_end.rtp.fd, cfg->endp_dscp); + set_ip_tos(endp->bts_end.rtcp.fd, cfg->endp_dscp); - endp->local_rtp.cb = rtp_data_cb; - endp->local_rtp.data = endp; - endp->local_rtp.when = BSC_FD_READ; - if (bsc_register_fd(&endp->local_rtp) != 0) { + endp->bts_end.rtp.cb = rtp_data_cb; + endp->bts_end.rtp.data = endp; + endp->bts_end.rtp.when = BSC_FD_READ; + if (bsc_register_fd(&endp->bts_end.rtp) != 0) { LOGP(DMGCP, LOGL_ERROR, "Failed to register RTP port %d on 0x%x\n", endp->bts_end.local_port, ENDPOINT_NUMBER(endp)); goto cleanup2; } - endp->local_rtcp.cb = rtp_data_cb; - endp->local_rtcp.data = endp; - endp->local_rtcp.when = BSC_FD_READ; - if (bsc_register_fd(&endp->local_rtcp) != 0) { + endp->bts_end.rtcp.cb = rtp_data_cb; + endp->bts_end.rtcp.data = endp; + endp->bts_end.rtcp.when = BSC_FD_READ; + if (bsc_register_fd(&endp->bts_end.rtcp) != 0) { LOGP(DMGCP, LOGL_ERROR, "Failed to register RTCP port %d on 0x%x\n", endp->bts_end.local_port + 1, ENDPOINT_NUMBER(endp)); goto cleanup3; @@ -326,13 +326,13 @@ static int bind_rtp(struct mgcp_endpoint *endp) return 0; cleanup3: - bsc_unregister_fd(&endp->local_rtp); + bsc_unregister_fd(&endp->bts_end.rtp); cleanup2: - close(endp->local_rtcp.fd); - endp->local_rtcp.fd = -1; + close(endp->bts_end.rtcp.fd); + endp->bts_end.rtcp.fd = -1; cleanup1: - close(endp->local_rtp.fd); - endp->local_rtp.fd = -1; + close(endp->bts_end.rtp.fd); + endp->bts_end.rtp.fd = -1; cleanup0: return -1; } diff --git a/openbsc/src/mgcp/mgcp_protocol.c b/openbsc/src/mgcp/mgcp_protocol.c index 8b990221a..69362e4b0 100644 --- a/openbsc/src/mgcp/mgcp_protocol.c +++ b/openbsc/src/mgcp/mgcp_protocol.c @@ -715,10 +715,19 @@ struct mgcp_config *mgcp_config_alloc(void) static void mgcp_rtp_end_reset(struct mgcp_rtp_end *end) { - memset(end, 0, sizeof(*end)); + end->packets = 0; + memset(&end->addr, 0, sizeof(end->addr)); + end->rtp_port = end->rtcp_port = end->local_port; end->payload_type = -1; } +static void mgcp_rtp_end_init(struct mgcp_rtp_end *end) +{ + mgcp_rtp_end_reset(end); + end->rtp.fd = -1; + end->rtcp.fd = -1; +} + int mgcp_endpoints_allocate(struct mgcp_config *cfg) { int i; @@ -731,12 +740,10 @@ int mgcp_endpoints_allocate(struct mgcp_config *cfg) return -1; for (i = 0; i < cfg->number_endpoints; ++i) { - cfg->endpoints[i].local_rtp.fd = -1; - cfg->endpoints[i].local_rtcp.fd = -1; cfg->endpoints[i].ci = CI_UNUSED; cfg->endpoints[i].cfg = cfg; - mgcp_rtp_end_reset(&cfg->endpoints[i].net_end); - mgcp_rtp_end_reset(&cfg->endpoints[i].bts_end); + mgcp_rtp_end_init(&cfg->endpoints[i].net_end); + mgcp_rtp_end_init(&cfg->endpoints[i].bts_end); } return 0; -- cgit v1.2.3