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: https://svn.pjsip.org/repos/pjproject/trunk@2945 74dad513-b988-da41-8d7b-12977e46ad98
diff --git a/pjsip/include/pjsua-lib/pjsua_internal.h b/pjsip/include/pjsua-lib/pjsua_internal.h
index d165bf3..e469186 100644
--- a/pjsip/include/pjsua-lib/pjsua_internal.h
+++ b/pjsip/include/pjsua-lib/pjsua_internal.h
@@ -82,6 +82,9 @@
     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 a845940..06cddb5 100644
--- a/pjsip/src/pjsua-lib/pjsua_call.c
+++ b/pjsip/src/pjsua-lib/pjsua_call.c
@@ -2829,11 +2829,11 @@
 	*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 @@
 		    *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 01f33a1..fff917b 100644
--- a/pjsip/src/pjsua-lib/pjsua_media.c
+++ b/pjsip/src/pjsua-lib/pjsua_media.c
@@ -821,6 +821,33 @@
 	    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 @@
 	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 @@
 	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) 
 		{