summaryrefslogtreecommitdiff
path: root/pjsip
diff options
context:
space:
mode:
authorLiong Sauw Ming <ming@teluu.com>2013-06-21 07:47:41 +0000
committerLiong Sauw Ming <ming@teluu.com>2013-06-21 07:47:41 +0000
commit0a2c5325be043699024c91a0268c22050975f5ff (patch)
tree45a156fdac517639ff549bf518d95e3f6bd340ff /pjsip
parent785f04d8e79d1fed579c8bdb2523646ceb00cbaf (diff)
Re #1682: Use account specific variable to keep track of the next rtp port to use.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4542 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip')
-rw-r--r--pjsip/include/pjsua-lib/pjsua_internal.h2
-rw-r--r--pjsip/src/pjsua-lib/pjsua_acc.c1
-rw-r--r--pjsip/src/pjsua-lib/pjsua_media.c37
3 files changed, 19 insertions, 21 deletions
diff --git a/pjsip/include/pjsua-lib/pjsua_internal.h b/pjsip/include/pjsua-lib/pjsua_internal.h
index 12048ade..d1a696ae 100644
--- a/pjsip/include/pjsua-lib/pjsua_internal.h
+++ b/pjsip/include/pjsua-lib/pjsua_internal.h
@@ -263,6 +263,8 @@ typedef struct pjsua_acc
pjsip_evsub *mwi_sub; /**< MWI client subscription */
pjsip_dialog *mwi_dlg; /**< Dialog for MWI sub. */
+
+ pj_uint16_t next_rtp_port; /**< Next RTP port to be used. */
} pjsua_acc;
diff --git a/pjsip/src/pjsua-lib/pjsua_acc.c b/pjsip/src/pjsua-lib/pjsua_acc.c
index ccd272e6..19206b19 100644
--- a/pjsip/src/pjsua-lib/pjsua_acc.c
+++ b/pjsip/src/pjsua-lib/pjsua_acc.c
@@ -652,6 +652,7 @@ PJ_DEF(pj_status_t) pjsua_acc_del(pjsua_acc_id acc_id)
acc->contact.slen = 0;
pj_bzero(&acc->via_addr, sizeof(acc->via_addr));
acc->via_tp = NULL;
+ acc->next_rtp_port = 0;
/* Remove from array */
for (i=0; i<pjsua_var.acc_cnt; ++i) {
diff --git a/pjsip/src/pjsua-lib/pjsua_media.c b/pjsip/src/pjsua-lib/pjsua_media.c
index 31112652..22da8ec7 100644
--- a/pjsip/src/pjsua-lib/pjsua_media.c
+++ b/pjsip/src/pjsua-lib/pjsua_media.c
@@ -29,9 +29,6 @@
# define PJSUA_REQUIRE_CONSECUTIVE_RTCP_PORT 0
#endif
-/* Next RTP port to be used */
-static pj_uint16_t next_rtp_port;
-
static void pjsua_media_config_dup(pj_pool_t *pool,
pjsua_media_config *dst,
const pjsua_media_config *src)
@@ -219,9 +216,6 @@ pj_status_t pjsua_media_subsys_destroy(unsigned flags)
//pjmedia_snd_deinit();
}
- /* Reset RTP port */
- next_rtp_port = 0;
-
pj_log_pop_indent();
return PJ_SUCCESS;
@@ -246,9 +240,9 @@ static pj_status_t create_rtp_rtcp_sock(pjsua_call_media *call_med,
pj_status_t status = PJ_SUCCESS;
char addr_buf[PJ_INET6_ADDRSTRLEN+10];
pj_sock_t sock[2];
+ pjsua_acc *acc = &pjsua_var.acc[call_med->call->acc_id];
- use_ipv6 = (pjsua_var.acc[call_med->call->acc_id].cfg.ipv6_media_use !=
- PJSUA_IPV6_DISABLED);
+ use_ipv6 = (acc->cfg.ipv6_media_use != PJSUA_IPV6_DISABLED);
af = use_ipv6 ? pj_AF_INET6() : pj_AF_INET();
/* Make sure STUN server resolution has completed */
@@ -260,11 +254,11 @@ static pj_status_t create_rtp_rtcp_sock(pjsua_call_media *call_med,
}
}
- if (next_rtp_port == 0)
- next_rtp_port = (pj_uint16_t)cfg->port;
+ if (acc->next_rtp_port == 0)
+ acc->next_rtp_port = (pj_uint16_t)cfg->port;
- if (next_rtp_port == 0)
- next_rtp_port = (pj_uint16_t)40000;
+ if (acc->next_rtp_port == 0)
+ acc->next_rtp_port = (pj_uint16_t)DEFAULT_RTP_PORT;
for (i=0; i<2; ++i)
sock[i] = PJ_INVALID_SOCKET;
@@ -280,12 +274,13 @@ static pj_status_t create_rtp_rtcp_sock(pjsua_call_media *call_med,
}
/* Loop retry to bind RTP and RTCP sockets. */
- for (i=0; i<RTP_RETRY; ++i, next_rtp_port += 2) {
+ for (i=0; i<RTP_RETRY; ++i, acc->next_rtp_port += 2) {
if (cfg->port > 0 && cfg->port_range > 0 &&
- next_rtp_port > cfg->port + cfg->port_range)
+ (acc->next_rtp_port > cfg->port + cfg->port_range ||
+ acc->next_rtp_port < cfg->port))
{
- next_rtp_port = (pj_uint16_t)cfg->port;
+ acc->next_rtp_port = (pj_uint16_t)cfg->port;
}
/* Create RTP socket. */
@@ -301,7 +296,7 @@ static pj_status_t create_rtp_rtcp_sock(pjsua_call_media *call_med,
2, THIS_FILE, "RTP socket");
/* Bind RTP socket */
- pj_sockaddr_set_port(&bound_addr, next_rtp_port);
+ pj_sockaddr_set_port(&bound_addr, acc->next_rtp_port);
status=pj_sock_bind(sock[0], &bound_addr,
pj_sockaddr_get_len(&bound_addr));
if (status != PJ_SUCCESS) {
@@ -324,7 +319,7 @@ static pj_status_t create_rtp_rtcp_sock(pjsua_call_media *call_med,
2, THIS_FILE, "RTCP socket");
/* Bind RTCP socket */
- pj_sockaddr_set_port(&bound_addr, (pj_uint16_t)(next_rtp_port+1));
+ pj_sockaddr_set_port(&bound_addr, (pj_uint16_t)(acc->next_rtp_port+1));
status=pj_sock_bind(sock[1], &bound_addr,
pj_sockaddr_get_len(&bound_addr));
if (status != PJ_SUCCESS) {
@@ -416,12 +411,12 @@ static pj_status_t create_rtp_rtcp_sock(pjsua_call_media *call_med,
} else if (cfg->public_addr.slen) {
status = pj_sockaddr_init(af, &mapped_addr[0], &cfg->public_addr,
- (pj_uint16_t)next_rtp_port);
+ (pj_uint16_t)acc->next_rtp_port);
if (status != PJ_SUCCESS)
goto on_error;
status = pj_sockaddr_init(af, &mapped_addr[1], &cfg->public_addr,
- (pj_uint16_t)(next_rtp_port+1));
+ (pj_uint16_t)(acc->next_rtp_port+1));
if (status != PJ_SUCCESS)
goto on_error;
@@ -444,7 +439,7 @@ static pj_status_t create_rtp_rtcp_sock(pjsua_call_media *call_med,
pj_sockaddr_init(af, &mapped_addr[i], NULL, 0);
pj_sockaddr_copy_addr(&mapped_addr[i], &bound_addr);
pj_sockaddr_set_port(&mapped_addr[i],
- (pj_uint16_t)(next_rtp_port+i));
+ (pj_uint16_t)(acc->next_rtp_port+i));
}
break;
@@ -471,7 +466,7 @@ static pj_status_t create_rtp_rtcp_sock(pjsua_call_media *call_med,
pj_sockaddr_print(&skinfo->rtcp_addr_name, addr_buf,
sizeof(addr_buf), 3)));
- next_rtp_port += 2;
+ acc->next_rtp_port += 2;
return PJ_SUCCESS;
on_error: