summaryrefslogtreecommitdiff
path: root/pjsip/src
diff options
context:
space:
mode:
authorLiong Sauw Ming <ming@teluu.com>2016-05-13 10:56:48 +0000
committerLiong Sauw Ming <ming@teluu.com>2016-05-13 10:56:48 +0000
commit7f59e4d6d01926c2535937463095e8d769be4ad9 (patch)
tree8b95e6a62838cb82e8856a9b19fdc64fcafe259a /pjsip/src
parentf5034fe8896342601b10dd2381b06dcb754e3f6c (diff)
Fixed #1918: Add API to update STUN servers and option to retry STUN for media on failure
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@5297 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip/src')
-rw-r--r--pjsip/src/pjsua-lib/pjsua_core.c31
-rw-r--r--pjsip/src/pjsua-lib/pjsua_media.c27
-rw-r--r--pjsip/src/pjsua2/endpoint.cpp15
3 files changed, 73 insertions, 0 deletions
diff --git a/pjsip/src/pjsua-lib/pjsua_core.c b/pjsip/src/pjsua-lib/pjsua_core.c
index 55e7ef10..45918bd7 100644
--- a/pjsip/src/pjsua-lib/pjsua_core.c
+++ b/pjsip/src/pjsua-lib/pjsua_core.c
@@ -1376,6 +1376,36 @@ on_return:
/*
+ * Update STUN servers.
+ */
+PJ_DEF(pj_status_t) pjsua_update_stun_servers(unsigned count, pj_str_t srv[],
+ pj_bool_t wait)
+{
+ unsigned i;
+ pj_status_t status;
+
+ PJ_ASSERT_RETURN(count && srv, PJ_EINVAL);
+
+ PJSUA_LOCK();
+
+ pjsua_var.ua_cfg.stun_srv_cnt = count;
+ for (i = 0; i < count; i++) {
+ if (pj_strcmp(&pjsua_var.ua_cfg.stun_srv[i], &srv[i]))
+ pj_strdup(pjsua_var.pool, &pjsua_var.ua_cfg.stun_srv[i], &srv[i]);
+ }
+ pjsua_var.stun_status = PJ_EUNKNOWN;
+
+ status = resolve_stun_server(wait);
+ if (wait == PJ_FALSE && status == PJ_EPENDING)
+ status = PJ_SUCCESS;
+
+ PJSUA_UNLOCK();
+
+ return status;
+}
+
+
+/*
* Resolve STUN server.
*/
PJ_DEF(pj_status_t) pjsua_resolve_stun_servers( unsigned count,
@@ -1481,6 +1511,7 @@ static void internal_stun_resolve_cb(const pj_stun_resolve_result *result)
/* Perform NAT type detection if not yet */
if (pjsua_var.nat_type == PJ_STUN_NAT_TYPE_UNKNOWN &&
+ !pjsua_var.nat_in_progress &&
pjsua_var.ua_cfg.nat_type_in_sdp)
{
pjsua_detect_nat_type();
diff --git a/pjsip/src/pjsua-lib/pjsua_media.c b/pjsip/src/pjsua-lib/pjsua_media.c
index 37f81572..7a8404c8 100644
--- a/pjsip/src/pjsua-lib/pjsua_media.c
+++ b/pjsip/src/pjsua-lib/pjsua_media.c
@@ -389,6 +389,33 @@ static pj_status_t create_rtp_rtcp_sock(pjsua_call_media *call_med,
}
else
#endif
+
+ if (status != PJ_SUCCESS && pjsua_var.ua_cfg.stun_srv_cnt > 1 &&
+ ((acc->cfg.media_stun_use & PJSUA_STUN_RETRY_ON_FAILURE)!=0))
+ {
+ PJ_LOG(4,(THIS_FILE, "Failed to get STUN mapped address, "
+ "retrying other STUN servers"));
+ status=pjsua_update_stun_servers(pjsua_var.ua_cfg.stun_srv_cnt,
+ pjsua_var.ua_cfg.stun_srv,
+ PJ_TRUE);
+ if (status == PJ_SUCCESS) {
+ if (pjsua_var.stun_srv.addr.sa_family != 0) {
+ pj_ansi_strcpy(ip_addr,
+ pj_inet_ntoa(pjsua_var.stun_srv.ipv4.sin_addr));
+ stun_srv = pj_str(ip_addr);
+ } else {
+ stun_srv.slen = 0;
+ }
+
+ stun_opt.srv1 = stun_opt.srv2 = stun_srv;
+ stun_opt.port1 = stun_opt.port2 =
+ pj_ntohs(pjsua_var.stun_srv.ipv4.sin_port);
+ status = pjstun_get_mapped_addr2(&pjsua_var.cp.factory,
+ &stun_opt, 2, sock,
+ resolved_addr);
+ }
+ }
+
if (status != PJ_SUCCESS) {
if (!pjsua_var.ua_cfg.stun_ignore_failure) {
pjsua_perror(THIS_FILE, "STUN resolve error", status);
diff --git a/pjsip/src/pjsua2/endpoint.cpp b/pjsip/src/pjsua2/endpoint.cpp
index d089b0c9..077190ec 100644
--- a/pjsip/src/pjsua2/endpoint.cpp
+++ b/pjsip/src/pjsua2/endpoint.cpp
@@ -1561,6 +1561,21 @@ pj_stun_nat_type Endpoint::natGetType() throw(Error)
return type;
}
+void Endpoint::natUpdateStunServers(const StringVector &servers,
+ bool wait) throw(Error)
+{
+ pj_str_t srv[MAX_STUN_SERVERS];
+ unsigned i, count = 0;
+
+ for (i=0; i<servers.size() && i<MAX_STUN_SERVERS; ++i) {
+ srv[count].ptr = (char*)servers[i].c_str();
+ srv[count].slen = servers[i].size();
+ ++count;
+ }
+
+ PJSUA2_CHECK_EXPR(pjsua_update_stun_servers(count, srv, wait) );
+}
+
void Endpoint::natCheckStunServers(const StringVector &servers,
bool wait,
Token token) throw(Error)