summaryrefslogtreecommitdiff
path: root/pjsip/src/pjsua-lib
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2007-10-16 01:34:14 +0000
committerBenny Prijono <bennylp@teluu.com>2007-10-16 01:34:14 +0000
commit5aea96f9de3908f2fc85c16001adc6c3f82d4705 (patch)
treee838b8a6077af937b2e834822540839c4e2515b2 /pjsip/src/pjsua-lib
parent4b289329774686a3e261fac70fbd902942cb9b1f (diff)
More ticket #399: added callback to report NAT detection result, and sends NAT type in SDP
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1501 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip/src/pjsua-lib')
-rw-r--r--pjsip/src/pjsua-lib/pjsua_core.c55
-rw-r--r--pjsip/src/pjsua-lib/pjsua_media.c27
2 files changed, 76 insertions, 6 deletions
diff --git a/pjsip/src/pjsua-lib/pjsua_core.c b/pjsip/src/pjsua-lib/pjsua_core.c
index 321d3405..95ad7aa8 100644
--- a/pjsip/src/pjsua-lib/pjsua_core.c
+++ b/pjsip/src/pjsua-lib/pjsua_core.c
@@ -51,6 +51,7 @@ static void init_data()
pjsua_var.tpdata[i].index = i;
pjsua_var.stun_status = PJ_EUNKNOWN;
+ pjsua_var.nat_status = PJ_EPENDING;
}
@@ -79,6 +80,7 @@ PJ_DEF(void) pjsua_config_default(pjsua_config *cfg)
cfg->max_calls = 4;
cfg->thread_cnt = 1;
+ cfg->nat_type_in_sdp = 2;
}
PJ_DEF(void) pjsua_config_dup(pj_pool_t *pool,
@@ -1858,28 +1860,69 @@ void pjsua_init_tpselector(pjsua_transport_id tp_id,
}
+/* Callback upon NAT detection completion */
+static void nat_detect_cb(void *user_data,
+ const pj_stun_nat_detect_result *res)
+{
+ PJ_UNUSED_ARG(user_data);
+
+ pjsua_var.nat_in_progress = PJ_FALSE;
+ pjsua_var.nat_status = res->status;
+ pjsua_var.nat_type = res->nat_type;
+
+ if (pjsua_var.ua_cfg.cb.on_nat_detect) {
+ (*pjsua_var.ua_cfg.cb.on_nat_detect)(res);
+ }
+}
+
+
/*
* Detect NAT type.
*/
-PJ_DEF(pj_status_t) pjsua_detect_nat_type( void *user_data,
- pj_stun_nat_detect_cb *cb)
+PJ_DEF(pj_status_t) pjsua_detect_nat_type()
{
pj_status_t status;
+ if (pjsua_var.nat_in_progress)
+ return PJ_SUCCESS;
+
/* Make sure STUN server resolution has completed */
status = pjsua_resolve_stun_server(PJ_TRUE);
if (status != PJ_SUCCESS) {
+ pjsua_var.nat_status = status;
+ pjsua_var.nat_type = PJ_STUN_NAT_TYPE_ERR_UNKNOWN;
return status;
}
/* Make sure we have STUN */
if (pjsua_var.stun_srv.ipv4.sin_family == 0) {
- return PJ_EINVALIDOP;
+ pjsua_var.nat_status = PJNATH_ESTUNINSERVER;
+ return PJNATH_ESTUNINSERVER;
+ }
+
+ status = pj_stun_detect_nat_type(&pjsua_var.stun_srv.ipv4,
+ &pjsua_var.stun_cfg,
+ NULL, &nat_detect_cb);
+
+ if (status != PJ_SUCCESS) {
+ pjsua_var.nat_status = status;
+ pjsua_var.nat_type = PJ_STUN_NAT_TYPE_ERR_UNKNOWN;
+ return status;
}
- return pj_stun_detect_nat_type(&pjsua_var.stun_srv.ipv4,
- &pjsua_var.stun_cfg,
- user_data, cb);
+ pjsua_var.nat_in_progress = PJ_TRUE;
+
+ return PJ_SUCCESS;
+}
+
+
+/*
+ * Get NAT type.
+ */
+PJ_DEF(pj_status_t) pjsua_get_nat_type(pj_stun_nat_type *type)
+{
+ *type = pjsua_var.nat_type;
+ return pjsua_var.nat_status;
}
diff --git a/pjsip/src/pjsua-lib/pjsua_media.c b/pjsip/src/pjsua-lib/pjsua_media.c
index 0f4547b9..f6424353 100644
--- a/pjsip/src/pjsua-lib/pjsua_media.c
+++ b/pjsip/src/pjsua-lib/pjsua_media.c
@@ -194,6 +194,9 @@ pj_status_t pjsua_media_subsys_init(const pjsua_media_config *cfg)
&pjsua_var.null_port);
PJ_ASSERT_RETURN(status == PJ_SUCCESS, status);
+ /* Perform NAT detection */
+ pjsua_detect_nat_type();
+
return PJ_SUCCESS;
}
@@ -759,6 +762,30 @@ pj_status_t pjsua_media_channel_create_sdp(pjsua_call_id call_id,
if (status != PJ_SUCCESS)
goto on_error;
+ /* Add NAT info in the SDP */
+ if (pjsua_var.ua_cfg.nat_type_in_sdp) {
+ pjmedia_sdp_attr *a;
+ pj_str_t value;
+ char nat_info[80];
+
+ value.ptr = nat_info;
+ if (pjsua_var.ua_cfg.nat_type_in_sdp == 1) {
+ value.slen = pj_ansi_snprintf(nat_info, sizeof(nat_info),
+ "%d", pjsua_var.nat_type);
+ } else {
+ const char *type_name = pj_stun_get_nat_name(pjsua_var.nat_type);
+ value.slen = pj_ansi_snprintf(nat_info, sizeof(nat_info),
+ "%d %s",
+ pjsua_var.nat_type,
+ type_name);
+ }
+
+ a = pjmedia_sdp_attr_create(pool, "X-nat", &value);
+
+ pjmedia_sdp_attr_add(&sdp->attr_count, sdp->attr, a);
+
+ }
+
if (pjsua_var.media_cfg.enable_ice) {
status = pjmedia_ice_modify_sdp(call->med_tp, pool, sdp);
if (status != PJ_SUCCESS)