diff options
-rw-r--r-- | pjmedia/include/pjmedia/transport.h | 6 | ||||
-rw-r--r-- | pjmedia/src/pjmedia/transport_ice.c | 29 | ||||
-rw-r--r-- | pjmedia/src/pjmedia/transport_udp.c | 4 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_call.c | 26 |
4 files changed, 48 insertions, 17 deletions
diff --git a/pjmedia/include/pjmedia/transport.h b/pjmedia/include/pjmedia/transport.h index 6c5ffde6..2ce195e5 100644 --- a/pjmedia/include/pjmedia/transport.h +++ b/pjmedia/include/pjmedia/transport.h @@ -493,6 +493,12 @@ struct pjmedia_transport_info pjmedia_sock_info sock_info; /** + * Remote address where RTP/RTCP originated from. + */ + pj_sockaddr rem_rtp_name; + pj_sockaddr rem_rtcp_name; + + /** * Specifies number of transport specific info included. */ int specific_info_cnt; diff --git a/pjmedia/src/pjmedia/transport_ice.c b/pjmedia/src/pjmedia/transport_ice.c index 99964aab..461d5768 100644 --- a/pjmedia/src/pjmedia/transport_ice.c +++ b/pjmedia/src/pjmedia/transport_ice.c @@ -1424,6 +1424,10 @@ static pj_status_t transport_get_info(pjmedia_transport *tp, pj_sockaddr_cp(&info->sock_info.rtcp_addr_name, &cand.addr); } + /* Get remote address originating RTP & RTCP. */ + info->rem_rtp_name = tp_ice->rtp_src_addr; + info->rem_rtcp_name = tp_ice->rtcp_src_addr; + return PJ_SUCCESS; } @@ -1547,7 +1551,6 @@ static void ice_on_rx_data(pj_ice_strans *ice_st, unsigned comp_id, * have been received. */ if (!tp_ice->use_ice && - (tp_ice->options & PJMEDIA_ICE_NO_SRC_ADDR_CHECKING) == 0 && pj_sockaddr_cmp(&tp_ice->remote_rtp, src_addr) != 0 ) { /* Check if the source address is recognized. */ @@ -1561,7 +1564,9 @@ static void ice_on_rx_data(pj_ice_strans *ice_st, unsigned comp_id, tp_ice->rtp_src_cnt++; - if (tp_ice->rtp_src_cnt >= PJMEDIA_RTP_NAT_PROBATION_CNT) { + if ((tp_ice->options & PJMEDIA_ICE_NO_SRC_ADDR_CHECKING) == 0 && + tp_ice->rtp_src_cnt >= PJMEDIA_RTP_NAT_PROBATION_CNT) + { char addr_text[80]; @@ -1605,20 +1610,22 @@ static void ice_on_rx_data(pj_ice_strans *ice_st, unsigned comp_id, * different. */ if (!tp_ice->use_ice && - (tp_ice->options & PJMEDIA_ICE_NO_SRC_ADDR_CHECKING)==0 && pj_sockaddr_cmp(&tp_ice->remote_rtcp, src_addr) != 0) { - char addr_text[80]; - - pj_sockaddr_cp(&tp_ice->remote_rtcp, src_addr); pj_sockaddr_cp(&tp_ice->rtcp_src_addr, src_addr); - pj_assert(tp_ice->addr_len == pj_sockaddr_get_len(src_addr)); + if ((tp_ice->options & PJMEDIA_ICE_NO_SRC_ADDR_CHECKING)==0) { + char addr_text[80]; - PJ_LOG(4,(tp_ice->base.name, - "Remote RTCP address switched to %s", - pj_sockaddr_print(&tp_ice->remote_rtcp, addr_text, - sizeof(addr_text), 3))); + pj_sockaddr_cp(&tp_ice->remote_rtcp, src_addr); + + pj_assert(tp_ice->addr_len == pj_sockaddr_get_len(src_addr)); + + PJ_LOG(4,(tp_ice->base.name, + "Remote RTCP address switched to %s", + pj_sockaddr_print(&tp_ice->remote_rtcp, addr_text, + sizeof(addr_text), 3))); + } } } diff --git a/pjmedia/src/pjmedia/transport_udp.c b/pjmedia/src/pjmedia/transport_udp.c index 0ef28ccb..3b49421b 100644 --- a/pjmedia/src/pjmedia/transport_udp.c +++ b/pjmedia/src/pjmedia/transport_udp.c @@ -605,6 +605,10 @@ static pj_status_t transport_get_info(pjmedia_transport *tp, info->sock_info.rtcp_sock = udp->rtcp_sock; info->sock_info.rtcp_addr_name = udp->rtcp_addr_name; + /* Get remote address originating RTP & RTCP. */ + info->rem_rtp_name = udp->rtp_src_addr; + info->rem_rtcp_name = udp->rtcp_src_addr; + return PJ_SUCCESS; } diff --git a/pjsip/src/pjsua-lib/pjsua_call.c b/pjsip/src/pjsua-lib/pjsua_call.c index c1d5441c..de9a7976 100644 --- a/pjsip/src/pjsua-lib/pjsua_call.c +++ b/pjsip/src/pjsua-lib/pjsua_call.c @@ -2018,13 +2018,18 @@ const char *good_number(char *buf, pj_int32_t val) /* Dump media session */ static void dump_media_session(const char *indent, char *buf, unsigned maxlen, - pjmedia_session *session) + pjsua_call *call) { unsigned i; char *p = buf, *end = buf+maxlen; int len; pjmedia_session_info info; + pjmedia_session *session = call->session; + pjmedia_transport_info tp_info; + + pjmedia_transport_info_init(&tp_info); + pjmedia_transport_get_info(call->med_tp, &tp_info); pjmedia_session_get_info(session, &info); for (i=0; i<info.stream_cnt; ++i) { @@ -2037,8 +2042,17 @@ static void dump_media_session(const char *indent, pj_time_val media_duration, now; pjmedia_session_get_stream_stat(session, i, &stat); - rem_addr = pj_sockaddr_print(&info.stream_info[i].rem_addr, - rem_addr_buf, sizeof(rem_addr_buf), 3); + // rem_addr will contain actual address of RTP originator, instead of + // remote RTP address specified by stream which is fetched from the SDP. + // Please note that we are assuming only one stream per call. + //rem_addr = pj_sockaddr_print(&info.stream_info[i].rem_addr, + // rem_addr_buf, sizeof(rem_addr_buf), 3); + if (pj_sockaddr_has_addr(&tp_info.rem_rtp_name)) { + rem_addr = pj_sockaddr_print(&tp_info.rem_rtp_name, rem_addr_buf, + sizeof(rem_addr_buf), 3); + } else { + pj_ansi_snprintf(rem_addr_buf, sizeof(rem_addr_buf), "-"); + } if (info.stream_info[i].dir == PJMEDIA_DIR_ENCODING) dir = "sendonly"; @@ -2627,8 +2641,8 @@ static void dump_media_session(const char *indent, /* Print call info */ void print_call(const char *title, - int call_id, - char *buf, pj_size_t size) + int call_id, + char *buf, pj_size_t size) { int len; pjsip_inv_session *inv = pjsua_var.calls[call_id].inv; @@ -2758,7 +2772,7 @@ PJ_DEF(pj_status_t) pjsua_call_dump( pjsua_call_id call_id, /* Dump session statistics */ if (with_media && call->session) - dump_media_session(indent, p, end-p, call->session); + dump_media_session(indent, p, end-p, call); pjsip_dlg_dec_lock(dlg); |