summaryrefslogtreecommitdiff
path: root/pjmedia/src
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2008-03-11 21:38:05 +0000
committerBenny Prijono <bennylp@teluu.com>2008-03-11 21:38:05 +0000
commit4e1d5dc0d96e099f12ea0127434b4f7029e95b2b (patch)
tree8471f75aefe77e864a4c9216f29ad04f2c8bf945 /pjmedia/src
parentcedeaec6e1f22463dc1e13e3dee467fc4dcd4019 (diff)
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
Diffstat (limited to 'pjmedia/src')
-rw-r--r--pjmedia/src/pjmedia/transport_ice.c17
-rw-r--r--pjmedia/src/pjmedia/transport_srtp.c30
-rw-r--r--pjmedia/src/pjmedia/transport_udp.c13
3 files changed, 42 insertions, 18 deletions
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;
}