From 4e1d5dc0d96e099f12ea0127434b4f7029e95b2b Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Tue, 11 Mar 2008 21:38:05 +0000 Subject: Ticket #479: allow media transport framework to return transport specific info (for example, to know whether SRTP is enabled) git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1860 74dad513-b988-da41-8d7b-12977e46ad98 --- pjmedia/src/pjmedia/transport_ice.c | 17 +++++++++-------- pjmedia/src/pjmedia/transport_srtp.c | 30 ++++++++++++++++++++++++++---- pjmedia/src/pjmedia/transport_udp.c | 13 +++++++------ 3 files changed, 42 insertions(+), 18 deletions(-) (limited to 'pjmedia/src') diff --git a/pjmedia/src/pjmedia/transport_ice.c b/pjmedia/src/pjmedia/transport_ice.c index 8a6124f3..0534ad4b 100644 --- a/pjmedia/src/pjmedia/transport_ice.c +++ b/pjmedia/src/pjmedia/transport_ice.c @@ -55,7 +55,7 @@ struct transport_ice * These are media transport operations. */ static pj_status_t transport_get_info (pjmedia_transport *tp, - pjmedia_sock_info *info); + pjmedia_transport_info *info); static pj_status_t transport_attach (pjmedia_transport *tp, void *user_data, const pj_sockaddr_t *rem_addr, @@ -673,20 +673,20 @@ static pj_status_t transport_media_stop(pjmedia_transport *tp) static pj_status_t transport_get_info(pjmedia_transport *tp, - pjmedia_sock_info *info) + pjmedia_transport_info *info) { struct transport_ice *tp_ice = (struct transport_ice*)tp; pj_ice_strans *ice_st = tp_ice->ice_st; pj_ice_strans_comp *comp; - pj_bzero(info, sizeof(*info)); - info->rtp_sock = info->rtcp_sock = PJ_INVALID_SOCKET; + pj_bzero(&info->sock_info, sizeof(info->sock_info)); + info->sock_info.rtp_sock = info->sock_info.rtcp_sock = PJ_INVALID_SOCKET; /* Retrieve address of default candidate for component 1 (RTP) */ comp = ice_st->comp[0]; pj_assert(comp->default_cand >= 0); - info->rtp_sock = comp->sock; - pj_memcpy(&info->rtp_addr_name, + info->sock_info.rtp_sock = comp->sock; + pj_memcpy(&info->sock_info.rtp_addr_name, &comp->cand_list[comp->default_cand].addr, sizeof(pj_sockaddr_in)); @@ -694,12 +694,13 @@ static pj_status_t transport_get_info(pjmedia_transport *tp, if (ice_st->comp_cnt > 1) { comp = ice_st->comp[1]; pj_assert(comp->default_cand >= 0); - info->rtp_sock = comp->sock; - pj_memcpy(&info->rtcp_addr_name, + info->sock_info.rtp_sock = comp->sock; + pj_memcpy(&info->sock_info.rtcp_addr_name, &comp->cand_list[comp->default_cand].addr, sizeof(pj_sockaddr_in)); } + info->specific_info_cnt = 0; return PJ_SUCCESS; } diff --git a/pjmedia/src/pjmedia/transport_srtp.c b/pjmedia/src/pjmedia/transport_srtp.c index 5dadb207..3bd95c88 100644 --- a/pjmedia/src/pjmedia/transport_srtp.c +++ b/pjmedia/src/pjmedia/transport_srtp.c @@ -125,7 +125,7 @@ static void srtp_rtcp_cb( void *user_data, void *pkt, pj_ssize_t size); * These are media transport operations. */ static pj_status_t transport_get_info (pjmedia_transport *tp, - pjmedia_sock_info *info); + pjmedia_transport_info *info); static pj_status_t transport_attach (pjmedia_transport *tp, void *user_data, const pj_sockaddr_t *rem_addr, @@ -551,12 +551,34 @@ PJ_DEF(pjmedia_transport *) pjmedia_transport_srtp_get_member( static pj_status_t transport_get_info(pjmedia_transport *tp, - pjmedia_sock_info *info) + pjmedia_transport_info *info) { transport_srtp *srtp = (transport_srtp*) tp; + pjmedia_srtp_info srtp_info; + int spc_info_idx; + pj_status_t status; + + PJ_ASSERT_RETURN(tp && info, PJ_EINVAL); + PJ_ASSERT_RETURN(info->specific_info_cnt < + PJMEDIA_TRANSPORT_SPECIFIC_INFO_MAXCNT, PJ_ETOOMANY); + PJ_ASSERT_RETURN(sizeof(pjmedia_srtp_info) <= + PJMEDIA_TRANSPORT_SPECIFIC_INFO_MAXSIZE, PJ_ENOMEM); + + status = pjmedia_transport_get_info(srtp->real_tp, info); + if (status != PJ_SUCCESS) + return status; + + srtp_info.active = srtp->session_inited; + srtp_info.rx_policy = srtp->rx_policy; + srtp_info.tx_policy = srtp->tx_policy; - /* put SRTP info as well? */ - return pjmedia_transport_get_info(srtp->real_tp, info); + spc_info_idx = info->specific_info_cnt++; + info->spc_info[spc_info_idx].type = PJMEDIA_TRANSPORT_TYPE_SRTP; + info->spc_info[spc_info_idx].cbsize = sizeof(srtp_info); + pj_memcpy(&info->spc_info[spc_info_idx].buffer, &srtp_info, + sizeof(srtp_info)); + + return PJ_SUCCESS; } static pj_status_t transport_attach(pjmedia_transport *tp, diff --git a/pjmedia/src/pjmedia/transport_udp.c b/pjmedia/src/pjmedia/transport_udp.c index a341d44a..f4e12cd1 100644 --- a/pjmedia/src/pjmedia/transport_udp.c +++ b/pjmedia/src/pjmedia/transport_udp.c @@ -101,7 +101,7 @@ static void on_rx_rtcp(pj_ioqueue_key_t *key, * These are media transport operations. */ static pj_status_t transport_get_info (pjmedia_transport *tp, - pjmedia_sock_info *info); + pjmedia_transport_info *info); static pj_status_t transport_attach (pjmedia_transport *tp, void *user_data, const pj_sockaddr_t *rem_addr, @@ -584,15 +584,16 @@ static void on_rx_rtcp(pj_ioqueue_key_t *key, /* Called to get the transport info */ static pj_status_t transport_get_info(pjmedia_transport *tp, - pjmedia_sock_info *info) + pjmedia_transport_info *info) { struct transport_udp *udp = (struct transport_udp*)tp; PJ_ASSERT_RETURN(tp && info, PJ_EINVAL); - info->rtp_sock = udp->rtp_sock; - info->rtp_addr_name = udp->rtp_addr_name; - info->rtcp_sock = udp->rtcp_sock; - info->rtcp_addr_name = udp->rtcp_addr_name; + info->sock_info.rtp_sock = udp->rtp_sock; + info->sock_info.rtp_addr_name = udp->rtp_addr_name; + info->sock_info.rtcp_sock = udp->rtcp_sock; + info->sock_info.rtcp_addr_name = udp->rtcp_addr_name; + info->specific_info_cnt = 0; return PJ_SUCCESS; } -- cgit v1.2.3