diff --git a/openbsc/include/openbsc/mgcp.h b/openbsc/include/openbsc/mgcp.h index ed40ad175..d1da401ea 100644 --- a/openbsc/include/openbsc/mgcp.h +++ b/openbsc/include/openbsc/mgcp.h @@ -75,7 +75,7 @@ struct mgcp_config; #define MGCP_POLICY_REJECT 5 #define MGCP_POLICY_DEFER 6 -typedef int (*mgcp_change)(struct mgcp_config *cfg, int endpoint, int state, int local_rtp); +typedef int (*mgcp_change)(struct mgcp_config *cfg, int endpoint, int state); typedef int (*mgcp_policy)(struct mgcp_config *cfg, int endpoint, int state, const char *transactio_id); typedef int (*mgcp_reset)(struct mgcp_config *cfg); diff --git a/openbsc/include/openbsc/mgcp_internal.h b/openbsc/include/openbsc/mgcp_internal.h index 1ac8ad42f..872afbf2e 100644 --- a/openbsc/include/openbsc/mgcp_internal.h +++ b/openbsc/include/openbsc/mgcp_internal.h @@ -58,6 +58,8 @@ struct mgcp_rtp_end { int rtp_port, rtcp_port; int payload_type; + + int local_port; }; struct mgcp_endpoint { @@ -67,9 +69,6 @@ struct mgcp_endpoint { int conn_mode; int orig_mode; - /* the local rtp port we are binding to */ - int rtp_port; - /* * RTP mangling: * - we get RTP and RTCP to us and need to forward to the BTS diff --git a/openbsc/src/mgcp/mgcp_network.c b/openbsc/src/mgcp/mgcp_network.c index 8ffc2660e..88a331c5b 100644 --- a/openbsc/src/mgcp/mgcp_network.c +++ b/openbsc/src/mgcp/mgcp_network.c @@ -290,15 +290,15 @@ static int bind_rtp(struct mgcp_endpoint *endp) { struct mgcp_config *cfg = endp->cfg; - if (create_bind(cfg->source_addr, &endp->local_rtp, endp->rtp_port) != 0) { + if (create_bind(cfg->source_addr, &endp->local_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->rtp_port, ENDPOINT_NUMBER(endp)); + cfg->source_addr, endp->bts_end.local_port, ENDPOINT_NUMBER(endp)); goto cleanup0; } - if (create_bind(cfg->source_addr, &endp->local_rtcp, endp->rtp_port + 1) != 0) { + if (create_bind(cfg->source_addr, &endp->local_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->rtp_port + 1, ENDPOINT_NUMBER(endp)); + cfg->source_addr, endp->bts_end.local_port + 1, ENDPOINT_NUMBER(endp)); goto cleanup1; } @@ -310,7 +310,7 @@ static int bind_rtp(struct mgcp_endpoint *endp) endp->local_rtp.when = BSC_FD_READ; if (bsc_register_fd(&endp->local_rtp) != 0) { LOGP(DMGCP, LOGL_ERROR, "Failed to register RTP port %d on 0x%x\n", - endp->rtp_port, ENDPOINT_NUMBER(endp)); + endp->bts_end.local_port, ENDPOINT_NUMBER(endp)); goto cleanup2; } @@ -319,7 +319,7 @@ static int bind_rtp(struct mgcp_endpoint *endp) endp->local_rtcp.when = BSC_FD_READ; if (bsc_register_fd(&endp->local_rtcp) != 0) { LOGP(DMGCP, LOGL_ERROR, "Failed to register RTCP port %d on 0x%x\n", - endp->rtp_port + 1, ENDPOINT_NUMBER(endp)); + endp->bts_end.local_port + 1, ENDPOINT_NUMBER(endp)); goto cleanup3; } @@ -339,6 +339,7 @@ cleanup0: int mgcp_bind_rtp_port(struct mgcp_endpoint *endp, int rtp_port) { - endp->rtp_port = rtp_port; + endp->bts_end.local_port = rtp_port; + endp->net_end.local_port = rtp_port; return bind_rtp(endp); } diff --git a/openbsc/src/mgcp/mgcp_protocol.c b/openbsc/src/mgcp/mgcp_protocol.c index 5ef57ccd8..9bb315a49 100644 --- a/openbsc/src/mgcp/mgcp_protocol.c +++ b/openbsc/src/mgcp/mgcp_protocol.c @@ -174,7 +174,7 @@ static struct msgb *create_response_with_sdp(struct mgcp_endpoint *endp, "c=IN IP4 %s\r\n" "m=audio %d RTP/AVP %d\r\n" "a=rtpmap:%d %s\r\n", - endp->ci, addr, endp->rtp_port, + endp->ci, addr, endp->net_end.local_port, endp->bts_end.payload_type, endp->bts_end.payload_type, endp->cfg->audio_name); return mgcp_create_response_with_data(200, msg, trans_id, sdp_record); @@ -428,9 +428,10 @@ static struct msgb *handle_create_con(struct mgcp_config *cfg, struct msgb *msg) /* bind to the port now */ port = rtp_calculate_port(ENDPOINT_NUMBER(endp), cfg->rtp_base_port); - if (cfg->early_bind) - endp->rtp_port = port; - else if (mgcp_bind_rtp_port(endp, port) != 0) + if (cfg->early_bind) { + endp->bts_end.local_port = port; + endp->net_end.local_port = port; + } else if (mgcp_bind_rtp_port(endp, port) != 0) goto error2; /* assign a local call identifier or fail */ @@ -459,10 +460,11 @@ static struct msgb *handle_create_con(struct mgcp_config *cfg, struct msgb *msg) } } - LOGP(DMGCP, LOGL_NOTICE, "Creating endpoint on: 0x%x CI: %u port: %u\n", - ENDPOINT_NUMBER(endp), endp->ci, endp->rtp_port); + LOGP(DMGCP, LOGL_NOTICE, "Creating endpoint on: 0x%x CI: %u port: %u/%u\n", + ENDPOINT_NUMBER(endp), endp->ci, + endp->net_end.local_port, endp->bts_end.local_port); if (cfg->change_cb) - cfg->change_cb(cfg, ENDPOINT_NUMBER(endp), MGCP_ENDP_CRCX, endp->rtp_port); + cfg->change_cb(cfg, ENDPOINT_NUMBER(endp), MGCP_ENDP_CRCX); return create_response_with_sdp(endp, "CRCX", trans_id); error: @@ -583,7 +585,7 @@ static struct msgb *handle_modify_con(struct mgcp_config *cfg, struct msgb *msg) LOGP(DMGCP, LOGL_NOTICE, "Modified endpoint on: 0x%x Server: %s:%u\n", ENDPOINT_NUMBER(endp), inet_ntoa(endp->net_end.addr), ntohs(endp->net_end.rtp_port)); if (cfg->change_cb) - cfg->change_cb(cfg, ENDPOINT_NUMBER(endp), MGCP_ENDP_MDCX, endp->rtp_port); + cfg->change_cb(cfg, ENDPOINT_NUMBER(endp), MGCP_ENDP_MDCX); if (silent) goto out_silent; @@ -669,7 +671,7 @@ static struct msgb *handle_delete_con(struct mgcp_config *cfg, struct msgb *msg) ENDPOINT_NUMBER(endp), inet_ntoa(endp->net_end.addr), ntohs(endp->net_end.rtp_port)); mgcp_free_endp(endp); if (cfg->change_cb) - cfg->change_cb(cfg, ENDPOINT_NUMBER(endp), MGCP_ENDP_DLCX, endp->rtp_port); + cfg->change_cb(cfg, ENDPOINT_NUMBER(endp), MGCP_ENDP_DLCX); if (silent) goto out_silent; diff --git a/openbsc/src/nat/bsc_mgcp_utils.c b/openbsc/src/nat/bsc_mgcp_utils.c index d309ba213..e8f7e2461 100644 --- a/openbsc/src/nat/bsc_mgcp_utils.c +++ b/openbsc/src/nat/bsc_mgcp_utils.c @@ -121,7 +121,7 @@ static void bsc_mgcp_send_mdcx(struct bsc_connection *bsc, struct mgcp_endpoint "m=audio %d RTP/AVP 255\r\n", ENDPOINT_NUMBER(endp), bsc->nat->mgcp_cfg->source_addr, - endp->rtp_port); + endp->bts_end.local_port); if (len < 0) { LOGP(DMGCP, LOGL_ERROR, "snprintf for DLCX failed.\n"); return; @@ -229,7 +229,7 @@ int bsc_mgcp_policy_cb(struct mgcp_config *cfg, int endpoint, int state, const c /* we need to generate a new and patched message */ bsc_msg = bsc_mgcp_rewrite((char *) nat->mgcp_msg, nat->mgcp_length, - nat->mgcp_cfg->source_addr, mgcp_endp->rtp_port); + nat->mgcp_cfg->source_addr, mgcp_endp->bts_end.local_port); if (!bsc_msg) { LOGP(DMGCP, LOGL_ERROR, "Failed to patch the msg.\n"); return MGCP_POLICY_CONT; @@ -325,7 +325,7 @@ void bsc_mgcp_forward(struct bsc_connection *bsc, struct msgb *msg) * with the value of 0 should be no problem. */ output = bsc_mgcp_rewrite((char * ) msg->l2h, msgb_l2len(msg), - bsc->nat->mgcp_cfg->source_addr, endp->rtp_port); + bsc->nat->mgcp_cfg->source_addr, endp->net_end.local_port); if (!output) { LOGP(DMGCP, LOGL_ERROR, "Failed to rewrite MGCP msg.\n");