diff options
author | Benny Prijono <bennylp@teluu.com> | 2008-03-11 21:38:05 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2008-03-11 21:38:05 +0000 |
commit | 4e1d5dc0d96e099f12ea0127434b4f7029e95b2b (patch) | |
tree | 8471f75aefe77e864a4c9216f29ad04f2c8bf945 /pjmedia | |
parent | cedeaec6e1f22463dc1e13e3dee467fc4dcd4019 (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')
-rw-r--r-- | pjmedia/include/pjmedia/config.h | 21 | ||||
-rw-r--r-- | pjmedia/include/pjmedia/transport.h | 70 | ||||
-rw-r--r-- | pjmedia/include/pjmedia/transport_srtp.h | 24 | ||||
-rw-r--r-- | pjmedia/src/pjmedia/transport_ice.c | 17 | ||||
-rw-r--r-- | pjmedia/src/pjmedia/transport_srtp.c | 30 | ||||
-rw-r--r-- | pjmedia/src/pjmedia/transport_udp.c | 13 |
6 files changed, 154 insertions, 21 deletions
diff --git a/pjmedia/include/pjmedia/config.h b/pjmedia/include/pjmedia/config.h index 0640b184..38dd872c 100644 --- a/pjmedia/include/pjmedia/config.h +++ b/pjmedia/include/pjmedia/config.h @@ -525,6 +525,27 @@ /** + * Transport info (pjmedia_transport_info) contains a socket info and list + * of transport specific info, since transports can be chained together + * (for example, SRTP transport uses UDP transport as the underlying + * transport). This constant specifies maximum number of transport specific + * infos that can be held in a transport info. + */ +#ifndef PJMEDIA_TRANSPORT_SPECIFIC_INFO_MAXCNT +# define PJMEDIA_TRANSPORT_SPECIFIC_INFO_MAXCNT 4 +#endif + + +/** + * Maximum size in bytes of storage buffer of a transport specific info. + */ +#ifndef PJMEDIA_TRANSPORT_SPECIFIC_INFO_MAXSIZE +# define PJMEDIA_TRANSPORT_SPECIFIC_INFO_MAXSIZE (12*sizeof(long)) +#endif + + + +/** * @} */ diff --git a/pjmedia/include/pjmedia/transport.h b/pjmedia/include/pjmedia/transport.h index 2629cf87..fcf120da 100644 --- a/pjmedia/include/pjmedia/transport.h +++ b/pjmedia/include/pjmedia/transport.h @@ -207,12 +207,18 @@ PJ_BEGIN_DECL #include <pjmedia/sdp.h> + /** * Forward declaration for media transport. */ typedef struct pjmedia_transport pjmedia_transport; /** + * Forward declaration for media transport info. + */ +typedef struct pjmedia_transport_info pjmedia_transport_info; + +/** * This enumeration specifies the general behaviour of media processing */ typedef enum pjmedia_tranport_media_option @@ -228,6 +234,7 @@ typedef enum pjmedia_tranport_media_option } pjmedia_tranport_media_option; + /** * This structure describes the operations for the stream transport. */ @@ -239,7 +246,7 @@ struct pjmedia_transport_op * Application should call #pjmedia_transport_get_info() instead */ pj_status_t (*get_info)(pjmedia_transport *tp, - pjmedia_sock_info *info); + pjmedia_transport_info *info); /** * This function is called by the stream when the transport is about @@ -368,7 +375,14 @@ typedef enum pjmedia_transport_type PJMEDIA_TRANSPORT_TYPE_UDP, /** Media transport using ICE */ - PJMEDIA_TRANSPORT_TYPE_ICE + PJMEDIA_TRANSPORT_TYPE_ICE, + + /** + * Media transport SRTP, this transport is actually security adapter to be + * stacked with other transport to enable encryption on the underlying + * transport. + */ + PJMEDIA_TRANSPORT_TYPE_SRTP } pjmedia_transport_type; @@ -390,6 +404,56 @@ struct pjmedia_transport pjmedia_transport_op *op; }; +/** + * This structure describes buffer storage of transport specific info. + * The actual transport specific info contents will be defined by transport + * implementation. Note that some transport implementations do not need to + * provide specific info, since the general socket info is enough. + */ +typedef struct pjmedia_transport_specific_info +{ + /** + * Specify media transport type. + */ + pjmedia_transport_type type; + + /** + * Specify storage buffer size of transport specific info. + */ + int cbsize; + + /** + * Storage buffer of transport specific info. + */ + char buffer[PJMEDIA_TRANSPORT_SPECIFIC_INFO_MAXSIZE]; + +} pjmedia_transport_specific_info; + + +/** + * This structure describes transport informations, including general + * socket information and specific information of single transport or + * stacked transports (e.g: SRTP stacked on top of UDP) + */ +struct pjmedia_transport_info +{ + /** + * General socket info. + */ + pjmedia_sock_info sock_info; + + /** + * Specifies number of transport specific info included. + */ + int specific_info_cnt; + + /** + * Buffer storage of transport specific info. + */ + pjmedia_transport_specific_info spc_info[PJMEDIA_TRANSPORT_SPECIFIC_INFO_MAXCNT]; + +}; + /** * Get media socket info from the specified transport. The socket info @@ -403,7 +467,7 @@ struct pjmedia_transport * @return PJ_SUCCESS on success. */ PJ_INLINE(pj_status_t) pjmedia_transport_get_info(pjmedia_transport *tp, - pjmedia_sock_info *info) + pjmedia_transport_info *info) { if (tp->op->get_info) return (*tp->op->get_info)(tp, info); diff --git a/pjmedia/include/pjmedia/transport_srtp.h b/pjmedia/include/pjmedia/transport_srtp.h index a04e28b6..d2b6a015 100644 --- a/pjmedia/include/pjmedia/transport_srtp.h +++ b/pjmedia/include/pjmedia/transport_srtp.h @@ -160,6 +160,30 @@ typedef struct pjmedia_srtp_setting /** + * This structure specifies SRTP transport specific info. This will fit + * into \a buffer field of pjmedia_transport_specific_info. + */ +typedef struct pjmedia_srtp_info +{ + /** + * Specify whether the SRTP transport is active for SRTP session. + */ + pj_bool_t active; + + /** + * Specify the policy used by the SRTP session for receive direction. + */ + pjmedia_srtp_crypto rx_policy; + + /** + * Specify the policy used by the SRTP session for transmit direction. + */ + pjmedia_srtp_crypto tx_policy; + +} pjmedia_srtp_info; + + +/** * Initialize SRTP setting with its default values. * * @param opt SRTP setting to be initialized. 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; } |