diff options
author | Benny Prijono <bennylp@teluu.com> | 2007-10-12 12:14:27 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2007-10-12 12:14:27 +0000 |
commit | b0f62471ea72f5767d859f18e41d4326f57b85c5 (patch) | |
tree | 5be22dd454663b8e8daee9e322ed794ccf54e8c4 /pjsip/src/pjsua-lib | |
parent | 9ca491d9d373e4f9114b429bcd61b72b1ff97048 (diff) |
Ticket #399: Initial implementation of tool to perform NAT type detection/classification
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1495 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip/src/pjsua-lib')
-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) |