diff options
Diffstat (limited to 'pjsip/src/pjsua-lib/pjsua_core.c')
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_core.c | 55 |
1 files changed, 43 insertions, 12 deletions
diff --git a/pjsip/src/pjsua-lib/pjsua_core.c b/pjsip/src/pjsua-lib/pjsua_core.c index 29cee191..321d3405 100644 --- a/pjsip/src/pjsua-lib/pjsua_core.c +++ b/pjsip/src/pjsua-lib/pjsua_core.c @@ -678,6 +678,7 @@ PJ_DEF(pj_status_t) pjsua_init( const pjsua_config *ua_cfg, /* Start resolving STUN server */ + status = pjsua_resolve_stun_server(PJ_FALSE); if (status != PJ_SUCCESS && status != PJ_EPENDING) { pjsua_perror(THIS_FILE, "Error resolving STUN server", status); @@ -938,22 +939,27 @@ pj_status_t pjsua_resolve_stun_server(pj_bool_t wait) port = 3478; } + pjsua_var.stun_status = + pj_sockaddr_in_init(&pjsua_var.stun_srv.ipv4, &str_host, + (pj_uint16_t)port); - pjsua_var.stun_status = pj_gethostbyname(&str_host, &he); - - if (pjsua_var.stun_status == PJ_SUCCESS) { - pj_sockaddr_in_init(&pjsua_var.stun_srv.ipv4, NULL, 0); - pjsua_var.stun_srv.ipv4.sin_addr = *(pj_in_addr*)he.h_addr; - pjsua_var.stun_srv.ipv4.sin_port = pj_htons((pj_uint16_t)port); + if (pjsua_var.stun_status != PJ_SUCCESS) { + pjsua_var.stun_status = pj_gethostbyname(&str_host, &he); - PJ_LOG(3,(THIS_FILE, - "STUN server %.*s resolved, address is %s:%d", - (int)pjsua_var.ua_cfg.stun_host.slen, - pjsua_var.ua_cfg.stun_host.ptr, - pj_inet_ntoa(pjsua_var.stun_srv.ipv4.sin_addr), - (int)pj_ntohs(pjsua_var.stun_srv.ipv4.sin_port))); + if (pjsua_var.stun_status == PJ_SUCCESS) { + pj_sockaddr_in_init(&pjsua_var.stun_srv.ipv4, NULL, 0); + pjsua_var.stun_srv.ipv4.sin_addr = *(pj_in_addr*)he.h_addr; + pjsua_var.stun_srv.ipv4.sin_port = pj_htons((pj_uint16_t)port); + } } + PJ_LOG(3,(THIS_FILE, + "STUN server %.*s resolved, address is %s:%d", + (int)pjsua_var.ua_cfg.stun_host.slen, + pjsua_var.ua_cfg.stun_host.ptr, + pj_inet_ntoa(pjsua_var.stun_srv.ipv4.sin_addr), + (int)pj_ntohs(pjsua_var.stun_srv.ipv4.sin_port))); + } /* Otherwise disable STUN. */ else { @@ -1853,6 +1859,31 @@ void pjsua_init_tpselector(pjsua_transport_id tp_id, /* + * Detect NAT type. + */ +PJ_DEF(pj_status_t) pjsua_detect_nat_type( void *user_data, + pj_stun_nat_detect_cb *cb) +{ + pj_status_t status; + + /* Make sure STUN server resolution has completed */ + status = pjsua_resolve_stun_server(PJ_TRUE); + if (status != PJ_SUCCESS) { + return status; + } + + /* Make sure we have STUN */ + if (pjsua_var.stun_srv.ipv4.sin_family == 0) { + return PJ_EINVALIDOP; + } + + return pj_stun_detect_nat_type(&pjsua_var.stun_srv.ipv4, + &pjsua_var.stun_cfg, + user_data, cb); +} + + +/* * Verify that valid SIP url is given. */ PJ_DEF(pj_status_t) pjsua_verify_sip_url(const char *c_url) |