summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2007-10-31 08:59:29 +0000
committerBenny Prijono <bennylp@teluu.com>2007-10-31 08:59:29 +0000
commita5465795aef807c0afbc86b600a2fcf2d8df4b37 (patch)
tree2b16246043dc97ef301727d822e33dcc2dd0ed3d
parente18d0df84bf1c68fb0cd42ec33b567f37b11d986 (diff)
More ticket #399: added PJSUA API to retrieve the remote NAT type
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1533 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--build.symbian/pjsua_libU.def170
-rw-r--r--pjsip/include/pjsua-lib/pjsua.h34
-rw-r--r--pjsip/include/pjsua-lib/pjsua_internal.h1
-rw-r--r--pjsip/src/pjsua-lib/pjsua_call.c48
-rw-r--r--pjsip/src/pjsua-lib/pjsua_core.c2
5 files changed, 165 insertions, 90 deletions
diff --git a/build.symbian/pjsua_libU.def b/build.symbian/pjsua_libU.def
index 932587e5..a277601d 100644
--- a/build.symbian/pjsua_libU.def
+++ b/build.symbian/pjsua_libU.def
@@ -32,87 +32,89 @@ EXPORTS
pjsua_call_get_count @ 31 NONAME
pjsua_call_get_info @ 32 NONAME
pjsua_call_get_max_count @ 33 NONAME
- pjsua_call_get_user_data @ 34 NONAME
- pjsua_call_hangup @ 35 NONAME
- pjsua_call_hangup_all @ 36 NONAME
- pjsua_call_has_media @ 37 NONAME
- pjsua_call_is_active @ 38 NONAME
- pjsua_call_make_call @ 39 NONAME
- pjsua_call_reinvite @ 40 NONAME
- pjsua_call_send_im @ 41 NONAME
- pjsua_call_send_request @ 42 NONAME
- pjsua_call_send_typing_ind @ 43 NONAME
- pjsua_call_set_hold @ 44 NONAME
- pjsua_call_set_user_data @ 45 NONAME
- pjsua_call_update @ 46 NONAME
- pjsua_call_xfer @ 47 NONAME
- pjsua_call_xfer_replaces @ 48 NONAME
- pjsua_codec_get_param @ 49 NONAME
- pjsua_codec_set_param @ 50 NONAME
- pjsua_codec_set_priority @ 51 NONAME
- pjsua_conf_add_port @ 52 NONAME
- pjsua_conf_adjust_rx_level @ 53 NONAME
- pjsua_conf_adjust_tx_level @ 54 NONAME
- pjsua_conf_connect @ 55 NONAME
- pjsua_conf_disconnect @ 56 NONAME
- pjsua_conf_get_active_ports @ 57 NONAME
- pjsua_conf_get_max_ports @ 58 NONAME
- pjsua_conf_get_port_info @ 59 NONAME
- pjsua_conf_get_signal_level @ 60 NONAME
- pjsua_conf_remove_port @ 61 NONAME
- pjsua_config_default @ 62 NONAME
- pjsua_config_dup @ 63 NONAME
- pjsua_create @ 64 NONAME
- pjsua_destroy @ 65 NONAME
- pjsua_detect_nat_type @ 66 NONAME
- pjsua_dump @ 67 NONAME
- pjsua_enum_accs @ 68 NONAME
- pjsua_enum_buddies @ 69 NONAME
- pjsua_enum_calls @ 70 NONAME
- pjsua_enum_codecs @ 71 NONAME
- pjsua_enum_conf_ports @ 72 NONAME
- pjsua_enum_snd_devs @ 73 NONAME
- pjsua_enum_transports @ 74 NONAME
- pjsua_get_buddy_count @ 75 NONAME
- pjsua_get_ec_tail @ 76 NONAME
- pjsua_get_nat_type @ 77 NONAME
- pjsua_get_pjmedia_endpt @ 78 NONAME
- pjsua_get_pjsip_endpt @ 79 NONAME
- pjsua_get_pool_factory @ 80 NONAME
- pjsua_get_snd_dev @ 81 NONAME
- pjsua_handle_events @ 82 NONAME
- pjsua_im_send @ 83 NONAME
- pjsua_im_typing @ 84 NONAME
- pjsua_init @ 85 NONAME
- pjsua_logging_config_default @ 86 NONAME
- pjsua_logging_config_dup @ 87 NONAME
- pjsua_media_config_default @ 88 NONAME
- pjsua_media_transports_create @ 89 NONAME
- pjsua_msg_data_init @ 90 NONAME
- pjsua_perror @ 91 NONAME
- pjsua_player_create @ 92 NONAME
- pjsua_player_destroy @ 93 NONAME
- pjsua_player_get_conf_port @ 94 NONAME
- pjsua_player_get_port @ 95 NONAME
- pjsua_player_set_pos @ 96 NONAME
- pjsua_playlist_create @ 97 NONAME
- pjsua_pool_create @ 98 NONAME
- pjsua_pres_dump @ 99 NONAME
- pjsua_reconfigure_logging @ 100 NONAME
- pjsua_recorder_create @ 101 NONAME
- pjsua_recorder_destroy @ 102 NONAME
- pjsua_recorder_get_conf_port @ 103 NONAME
- pjsua_recorder_get_port @ 104 NONAME
- pjsua_set_ec @ 105 NONAME
- pjsua_set_no_snd_dev @ 106 NONAME
- pjsua_set_null_snd_dev @ 107 NONAME
- pjsua_set_snd_dev @ 108 NONAME
- pjsua_start @ 109 NONAME
- pjsua_transport_close @ 110 NONAME
- pjsua_transport_config_default @ 111 NONAME
- pjsua_transport_config_dup @ 112 NONAME
- pjsua_transport_create @ 113 NONAME
- pjsua_transport_get_info @ 114 NONAME
- pjsua_transport_register @ 115 NONAME
- pjsua_transport_set_enable @ 116 NONAME
- pjsua_verify_sip_url @ 117 NONAME
+ pjsua_call_get_rem_nat_type @ 34 NONAME
+ pjsua_call_get_user_data @ 35 NONAME
+ pjsua_call_hangup @ 36 NONAME
+ pjsua_call_hangup_all @ 37 NONAME
+ pjsua_call_has_media @ 38 NONAME
+ pjsua_call_is_active @ 39 NONAME
+ pjsua_call_make_call @ 40 NONAME
+ pjsua_call_reinvite @ 41 NONAME
+ pjsua_call_send_im @ 42 NONAME
+ pjsua_call_send_request @ 43 NONAME
+ pjsua_call_send_typing_ind @ 44 NONAME
+ pjsua_call_set_hold @ 45 NONAME
+ pjsua_call_set_user_data @ 46 NONAME
+ pjsua_call_update @ 47 NONAME
+ pjsua_call_xfer @ 48 NONAME
+ pjsua_call_xfer_replaces @ 49 NONAME
+ pjsua_codec_get_param @ 50 NONAME
+ pjsua_codec_set_param @ 51 NONAME
+ pjsua_codec_set_priority @ 52 NONAME
+ pjsua_conf_add_port @ 53 NONAME
+ pjsua_conf_adjust_rx_level @ 54 NONAME
+ pjsua_conf_adjust_tx_level @ 55 NONAME
+ pjsua_conf_connect @ 56 NONAME
+ pjsua_conf_disconnect @ 57 NONAME
+ pjsua_conf_get_active_ports @ 58 NONAME
+ pjsua_conf_get_max_ports @ 59 NONAME
+ pjsua_conf_get_port_info @ 60 NONAME
+ pjsua_conf_get_signal_level @ 61 NONAME
+ pjsua_conf_remove_port @ 62 NONAME
+ pjsua_config_default @ 63 NONAME
+ pjsua_config_dup @ 64 NONAME
+ pjsua_create @ 65 NONAME
+ pjsua_destroy @ 66 NONAME
+ pjsua_detect_nat_type @ 67 NONAME
+ pjsua_dump @ 68 NONAME
+ pjsua_enum_accs @ 69 NONAME
+ pjsua_enum_buddies @ 70 NONAME
+ pjsua_enum_calls @ 71 NONAME
+ pjsua_enum_codecs @ 72 NONAME
+ pjsua_enum_conf_ports @ 73 NONAME
+ pjsua_enum_snd_devs @ 74 NONAME
+ pjsua_enum_transports @ 75 NONAME
+ pjsua_get_buddy_count @ 76 NONAME
+ pjsua_get_ec_tail @ 77 NONAME
+ pjsua_get_nat_type @ 78 NONAME
+ pjsua_get_pjmedia_endpt @ 79 NONAME
+ pjsua_get_pjsip_endpt @ 80 NONAME
+ pjsua_get_pool_factory @ 81 NONAME
+ pjsua_get_snd_dev @ 82 NONAME
+ pjsua_get_var @ 83 NONAME
+ pjsua_handle_events @ 84 NONAME
+ pjsua_im_send @ 85 NONAME
+ pjsua_im_typing @ 86 NONAME
+ pjsua_init @ 87 NONAME
+ pjsua_logging_config_default @ 88 NONAME
+ pjsua_logging_config_dup @ 89 NONAME
+ pjsua_media_config_default @ 90 NONAME
+ pjsua_media_transports_create @ 91 NONAME
+ pjsua_msg_data_init @ 92 NONAME
+ pjsua_perror @ 93 NONAME
+ pjsua_player_create @ 94 NONAME
+ pjsua_player_destroy @ 95 NONAME
+ pjsua_player_get_conf_port @ 96 NONAME
+ pjsua_player_get_port @ 97 NONAME
+ pjsua_player_set_pos @ 98 NONAME
+ pjsua_playlist_create @ 99 NONAME
+ pjsua_pool_create @ 100 NONAME
+ pjsua_pres_dump @ 101 NONAME
+ pjsua_reconfigure_logging @ 102 NONAME
+ pjsua_recorder_create @ 103 NONAME
+ pjsua_recorder_destroy @ 104 NONAME
+ pjsua_recorder_get_conf_port @ 105 NONAME
+ pjsua_recorder_get_port @ 106 NONAME
+ pjsua_set_ec @ 107 NONAME
+ pjsua_set_no_snd_dev @ 108 NONAME
+ pjsua_set_null_snd_dev @ 109 NONAME
+ pjsua_set_snd_dev @ 110 NONAME
+ pjsua_start @ 111 NONAME
+ pjsua_transport_close @ 112 NONAME
+ pjsua_transport_config_default @ 113 NONAME
+ pjsua_transport_config_dup @ 114 NONAME
+ pjsua_transport_create @ 115 NONAME
+ pjsua_transport_get_info @ 116 NONAME
+ pjsua_transport_register @ 117 NONAME
+ pjsua_transport_set_enable @ 118 NONAME
+ pjsua_verify_sip_url @ 119 NONAME
diff --git a/pjsip/include/pjsua-lib/pjsua.h b/pjsip/include/pjsua-lib/pjsua.h
index d076c668..695e2c8c 100644
--- a/pjsip/include/pjsua-lib/pjsua.h
+++ b/pjsip/include/pjsua-lib/pjsua.h
@@ -989,13 +989,13 @@ typedef struct pjsua_config
pj_str_t stun_relay_host;
/**
- * Include local endpoint's NAT type in the SDP to assist troubleshooting.
- * The valid values are:
- * - 0: no information will be added in SDP.
+ * Support for adding and parsing NAT type in the SDP to assist
+ * troubleshooting. The valid values are:
+ * - 0: no information will be added in SDP, and parsing is disabled.
* - 1: only the NAT type number is added.
* - 2: add both NAT type number and name.
*
- * Default: 2
+ * Default: 1
*/
int nat_type_in_sdp;
@@ -1365,6 +1365,8 @@ PJ_DECL(pj_status_t) pjsua_detect_nat_type(void);
* PJ_SUCCESS and \a type will be set to the correct
* value. Other return values indicate error and
* \a type will be set to PJ_STUN_NAT_TYPE_ERR_UNKNOWN.
+ *
+ * @see pjsua_call_get_rem_nat_type()
*/
PJ_DECL(pj_status_t) pjsua_get_nat_type(pj_stun_nat_type *type);
@@ -2731,6 +2733,30 @@ PJ_DECL(void*) pjsua_call_get_user_data(pjsua_call_id call_id);
/**
+ * Get the NAT type of remote's endpoint. This is a proprietary feature
+ * of PJSUA-LIB which sends its NAT type in the SDP when \a nat_type_in_sdp
+ * is set in #pjsua_config.
+ *
+ * This function can only be called after SDP has been received from remote,
+ * which means for incoming call, this function can be called as soon as
+ * call is received as long as incoming call contains SDP, and for outgoing
+ * call, this function can be called only after SDP is received (normally in
+ * 200/OK response to INVITE). As a general case, application should call
+ * this function after or in \a on_call_media_state() callback.
+ *
+ * @param call_id Call identification.
+ * @param p_type Pointer to store the NAT type. Application can then
+ * retrieve the string description of the NAT type
+ * by calling pj_stun_get_nat_name().
+ *
+ * @return PJ_SUCCESS on success.
+ *
+ * @see pjsua_get_nat_type(), nat_type_in_sdp
+ */
+PJ_DECL(pj_status_t) pjsua_call_get_rem_nat_type(pjsua_call_id call_id,
+ pj_stun_nat_type *p_type);
+
+/**
* Send response to incoming INVITE request. Depending on the status
* code specified as parameter, this function may send provisional
* response, establish the call, or terminate the call.
diff --git a/pjsip/include/pjsua-lib/pjsua_internal.h b/pjsip/include/pjsua-lib/pjsua_internal.h
index 530dc89d..004c1ca1 100644
--- a/pjsip/include/pjsua-lib/pjsua_internal.h
+++ b/pjsip/include/pjsua-lib/pjsua_internal.h
@@ -52,6 +52,7 @@ typedef struct pjsua_call
pjmedia_transport *med_tp; /**< Media transport. */
pj_timer_entry refresh_tm;/**< Timer to send re-INVITE. */
pj_timer_entry hangup_tm; /**< Timer to hangup call. */
+ pj_stun_nat_type rem_nat_type; /**< NAT type of remote endpoint. */
char last_text_buf_[128]; /**< Buffer for last_text. */
diff --git a/pjsip/src/pjsua-lib/pjsua_call.c b/pjsip/src/pjsua-lib/pjsua_call.c
index 220e2b19..f1fe3208 100644
--- a/pjsip/src/pjsua-lib/pjsua_call.c
+++ b/pjsip/src/pjsua-lib/pjsua_call.c
@@ -98,6 +98,7 @@ static void reset_call(pjsua_call_id id)
call->conn_time.msec = 0;
call->res_time.sec = 0;
call->res_time.msec = 0;
+ call->rem_nat_type = PJ_STUN_NAT_TYPE_UNKNOWN;
}
@@ -429,6 +430,24 @@ on_error:
}
+/* Get the NAT type information in remote's SDP */
+static void update_remote_nat_type(pjsua_call *call,
+ const pjmedia_sdp_session *sdp)
+{
+ const pjmedia_sdp_attr *xnat;
+
+ xnat = pjmedia_sdp_attr_find2(sdp->attr_count, sdp->attr, "X-nat", NULL);
+ if (xnat) {
+ call->rem_nat_type = (pj_stun_nat_type) (xnat->value.ptr[0] - '0');
+ } else {
+ call->rem_nat_type = PJ_STUN_NAT_TYPE_UNKNOWN;
+ }
+
+ PJ_LOG(5,(THIS_FILE, "Call %d: remote NAT type is %d (%s)", call->index,
+ call->rem_nat_type, pj_stun_get_nat_name(call->rem_nat_type)));
+}
+
+
/**
* Handle incoming INVITE request.
* Called by pjsua_core.c
@@ -658,6 +677,13 @@ pj_bool_t pjsua_call_on_incoming(pjsip_rx_data *rdata)
return PJ_TRUE;
}
+ /* Update NAT type of remote endpoint */
+ if (pjsua_var.ua_cfg.nat_type_in_sdp) {
+ const pjmedia_sdp_session *remote_sdp;
+
+ if (pjmedia_sdp_neg_get_neg_remote(inv->neg, &remote_sdp)==PJ_SUCCESS)
+ update_remote_nat_type(call, remote_sdp);
+ }
/* Create and attach pjsua_var data to the dialog: */
call->inv = inv;
@@ -1023,6 +1049,21 @@ PJ_DEF(void*) pjsua_call_get_user_data(pjsua_call_id call_id)
/*
+ * Get remote's NAT type.
+ */
+PJ_DEF(pj_status_t) pjsua_call_get_rem_nat_type(pjsua_call_id call_id,
+ pj_stun_nat_type *p_type)
+{
+ PJ_ASSERT_RETURN(call_id>=0 && call_id<(int)pjsua_var.ua_cfg.max_calls,
+ PJ_EINVAL);
+ PJ_ASSERT_RETURN(p_type != NULL, PJ_EINVAL);
+
+ *p_type = pjsua_var.calls[call_id].rem_nat_type;
+ return PJ_SUCCESS;
+}
+
+
+/*
* Send response to incoming INVITE request.
*/
PJ_DEF(pj_status_t) pjsua_call_answer( pjsua_call_id call_id,
@@ -2267,7 +2308,6 @@ static void pjsua_call_on_media_update(pjsip_inv_session *inv,
return;
}
-
status = pjmedia_sdp_neg_get_active_remote(call->inv->neg, &remote_sdp);
if (status != PJ_SUCCESS) {
pjsua_perror(THIS_FILE,
@@ -2278,6 +2318,12 @@ static void pjsua_call_on_media_update(pjsip_inv_session *inv,
return;
}
+ /* Update remote's NAT type */
+ if (pjsua_var.ua_cfg.nat_type_in_sdp) {
+ update_remote_nat_type(call, remote_sdp);
+ }
+
+ /* Update media channel with the new SDP */
status = pjsua_media_channel_update(call->index, local_sdp, remote_sdp);
if (status != PJ_SUCCESS) {
pjsua_perror(THIS_FILE, "Unable to create media session",
diff --git a/pjsip/src/pjsua-lib/pjsua_core.c b/pjsip/src/pjsua-lib/pjsua_core.c
index a60301ad..2cfca8d9 100644
--- a/pjsip/src/pjsua-lib/pjsua_core.c
+++ b/pjsip/src/pjsua-lib/pjsua_core.c
@@ -86,7 +86,7 @@ PJ_DEF(void) pjsua_config_default(pjsua_config *cfg)
cfg->max_calls = 4;
cfg->thread_cnt = 1;
- cfg->nat_type_in_sdp = 2;
+ cfg->nat_type_in_sdp = 1;
}
PJ_DEF(void) pjsua_config_dup(pj_pool_t *pool,