mgcp: Attempt to separate the RTP/RTCP port for the Network and for the BTS
We plan to have two different ports for the network and for the BTS to avoid detecting the BTS and to dynamically allocate the port to have old data not go to a new socket.
This commit is contained in:
parent
a17d701a70
commit
58ff219c85
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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");
|
||||
|
|
Loading…
Reference in New Issue