From 4533e1452749d9c4060d63971eabc7a6baeb9e1e Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Wed, 14 Oct 2009 13:13:18 +0000 Subject: Ticket #881: send UPDATE or re-INVITE after ICE negotiation, if the default candidate has changed - done - added pj_ice_strans_state (to be used for informational purposes for now) - added pjmedia ICE transport specific info, and display it in call dump output - misc fixes (changed pjmedia_transport_info.spec_info_cnt from int to unsigned) git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@2945 74dad513-b988-da41-8d7b-12977e46ad98 --- pjsip/include/pjsua-lib/pjsua_internal.h | 3 +++ pjsip/src/pjsua-lib/pjsua_call.c | 22 ++++++++++++++++++--- pjsip/src/pjsua-lib/pjsua_media.c | 33 +++++++++++++++++++++++++++++++- 3 files changed, 54 insertions(+), 4 deletions(-) (limited to 'pjsip') diff --git a/pjsip/include/pjsua-lib/pjsua_internal.h b/pjsip/include/pjsua-lib/pjsua_internal.h index d165bf3c..e4691868 100644 --- a/pjsip/include/pjsua-lib/pjsua_internal.h +++ b/pjsip/include/pjsua-lib/pjsua_internal.h @@ -82,6 +82,9 @@ typedef struct pjsua_call pjmedia_transport *med_orig; /**< Original media transport */ pj_bool_t med_tp_auto_del; /**< May delete media transport */ pjsua_med_tp_st med_tp_st; /**< Media transport state */ + pj_sockaddr med_rtp_addr; /**< Current RTP source address + (used to update ICE default + address) */ pj_stun_nat_type rem_nat_type; /**< NAT type of remote endpoint. */ pjmedia_srtp_use rem_srtp_use; /**< Remote's SRTP usage policy. */ diff --git a/pjsip/src/pjsua-lib/pjsua_call.c b/pjsip/src/pjsua-lib/pjsua_call.c index a845940c..06cddb5b 100644 --- a/pjsip/src/pjsua-lib/pjsua_call.c +++ b/pjsip/src/pjsua-lib/pjsua_call.c @@ -2829,11 +2829,11 @@ PJ_DEF(pj_status_t) pjsua_call_dump( pjsua_call_id call_id, *p = '\0'; } - /* Get SRTP status */ + /* Get and ICE SRTP status */ pjmedia_transport_info_init(&tp_info); pjmedia_transport_get_info(call->med_tp, &tp_info); if (tp_info.specific_info_cnt > 0) { - int i; + unsigned i; for (i = 0; i < tp_info.specific_info_cnt; ++i) { if (tp_info.spc_info[i].type == PJMEDIA_TRANSPORT_TYPE_SRTP) { @@ -2850,7 +2850,23 @@ PJ_DEF(pj_status_t) pjsua_call_dump( pjsua_call_id call_id, *p++ = '\n'; *p = '\0'; } - break; + } else if (tp_info.spc_info[i].type==PJMEDIA_TRANSPORT_TYPE_ICE) { + const pjmedia_ice_transport_info *ii; + + ii = (const pjmedia_ice_transport_info*) + tp_info.spc_info[i].buffer; + + len = pj_ansi_snprintf(p, end-p, + "%s ICE role: %s, state: %s, comp_cnt: %u", + indent, + pj_ice_sess_role_name(ii->role), + pj_ice_strans_state_name(ii->sess_state), + ii->comp_cnt); + if (len > 0 && len < end-p) { + p += len; + *p++ = '\n'; + *p = '\0'; + } } } } diff --git a/pjsip/src/pjsua-lib/pjsua_media.c b/pjsip/src/pjsua-lib/pjsua_media.c index 01f33a1c..fff917ba 100644 --- a/pjsip/src/pjsua-lib/pjsua_media.c +++ b/pjsip/src/pjsua-lib/pjsua_media.c @@ -821,6 +821,33 @@ static void on_ice_complete(pjmedia_transport *tp, if (pjsua_var.ua_cfg.cb.on_call_media_state) { pjsua_var.ua_cfg.cb.on_call_media_state(id); } + } else { + /* Send UPDATE if default transport address is different than + * what was advertised (ticket #881) + */ + pjmedia_transport_info tpinfo; + pjmedia_ice_transport_info *ii = NULL; + unsigned i; + + pjmedia_transport_info_init(&tpinfo); + pjmedia_transport_get_info(tp, &tpinfo); + for (i=0; irole==PJ_ICE_SESS_ROLE_CONTROLLING && + pj_sockaddr_cmp(&tpinfo.sock_info.rtp_addr_name, + &pjsua_var.calls[id].med_rtp_addr)) + { + PJ_LOG(4,(THIS_FILE, + "ICE default transport address has changed for " + "call %d, sending UPDATE", id)); + pjsua_call_update(id, 0, NULL); + } } break; } @@ -1320,6 +1347,10 @@ pj_status_t pjsua_media_channel_create_sdp(pjsua_call_id call_id, return status; } + /* Update currently advertised RTP source address */ + pj_memcpy(&call->med_rtp_addr, &tpinfo.sock_info.rtp_addr_name, + sizeof(pj_sockaddr)); + *p_sdp = sdp; return PJ_SUCCESS; } @@ -1482,7 +1513,7 @@ pj_status_t pjsua_media_channel_update(pjsua_call_id call_id, pjmedia_transport_info_init(&tp_info); pjmedia_transport_get_info(call->med_tp, &tp_info); if (tp_info.specific_info_cnt > 0) { - int i; + unsigned i; for (i = 0; i < tp_info.specific_info_cnt; ++i) { if (tp_info.spc_info[i].type == PJMEDIA_TRANSPORT_TYPE_SRTP) { -- cgit v1.2.3