summaryrefslogtreecommitdiff
path: root/pjsip/src/pjsua-lib/pjsua_core.c
diff options
context:
space:
mode:
Diffstat (limited to 'pjsip/src/pjsua-lib/pjsua_core.c')
-rw-r--r--pjsip/src/pjsua-lib/pjsua_core.c55
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)