diff options
author | Benny Prijono <bennylp@teluu.com> | 2009-10-14 13:13:18 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2009-10-14 13:13:18 +0000 |
commit | 4533e1452749d9c4060d63971eabc7a6baeb9e1e (patch) | |
tree | b12b132dd8af76ba68df84a2ba3d45b60824578a /pjsip/src | |
parent | 6bdbb51b9b880efd0f2f9d833189bdfc8e469934 (diff) |
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
Diffstat (limited to 'pjsip/src')
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_call.c | 22 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_media.c | 33 |
2 files changed, 51 insertions, 4 deletions
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; i<tpinfo.specific_info_cnt; ++i) { + if (tpinfo.spc_info[i].type==PJMEDIA_TRANSPORT_TYPE_ICE) { + ii = (pjmedia_ice_transport_info*) + tpinfo.spc_info[i].buffer; + break; + } + } + + if (ii && ii->role==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) { |