summaryrefslogtreecommitdiff
path: root/pjmedia
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2008-02-01 14:47:31 +0000
committerBenny Prijono <bennylp@teluu.com>2008-02-01 14:47:31 +0000
commitee6b6b350c8220606c1fbe6db689e53188a8818f (patch)
tree320ee02efedd9ac6716c7bc1d061c3da4bbbc995 /pjmedia
parent62a458ff636b57a18da4532dd9e6c62cf1f8b13b (diff)
More ticket #61: removed const from rtp and rtcp callback function declaration to allow in-place packet modification
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1763 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia')
-rw-r--r--pjmedia/include/pjmedia/transport.h8
-rw-r--r--pjmedia/include/pjmedia/transport_srtp.h24
-rw-r--r--pjmedia/src/pjmedia/transport_ice.c12
-rw-r--r--pjmedia/src/pjmedia/transport_srtp.c92
-rw-r--r--pjmedia/src/pjmedia/transport_udp.c16
5 files changed, 110 insertions, 42 deletions
diff --git a/pjmedia/include/pjmedia/transport.h b/pjmedia/include/pjmedia/transport.h
index 14b84e7d..b2b16d5e 100644
--- a/pjmedia/include/pjmedia/transport.h
+++ b/pjmedia/include/pjmedia/transport.h
@@ -241,10 +241,10 @@ struct pjmedia_transport_op
const pj_sockaddr_t *rem_rtcp,
unsigned addr_len,
void (*rtp_cb)(void *user_data,
- const void *pkt,
+ void *pkt,
pj_ssize_t size),
void (*rtcp_cb)(void *user_data,
- const void *pkt,
+ void *pkt,
pj_ssize_t size));
/**
@@ -423,10 +423,10 @@ PJ_INLINE(pj_status_t) pjmedia_transport_attach(pjmedia_transport *tp,
const pj_sockaddr_t *rem_rtcp,
unsigned addr_len,
void (*rtp_cb)(void *user_data,
- const void *pkt,
+ void *pkt,
pj_ssize_t),
void (*rtcp_cb)(void *usr_data,
- const void*pkt,
+ void*pkt,
pj_ssize_t))
{
return tp->op->attach(tp, user_data, rem_addr, rem_rtcp, addr_len,
diff --git a/pjmedia/include/pjmedia/transport_srtp.h b/pjmedia/include/pjmedia/transport_srtp.h
index d6ccc2e1..a04e28b6 100644
--- a/pjmedia/include/pjmedia/transport_srtp.h
+++ b/pjmedia/include/pjmedia/transport_srtp.h
@@ -225,6 +225,30 @@ PJ_DECL(pj_status_t) pjmedia_transport_srtp_stop(pjmedia_transport *srtp);
/**
+ * This is a utility function to decrypt SRTP packet using SRTP transport.
+ * This function is not part of SRTP transport's API, but it can be used
+ * to decrypt SRTP packets from non-network (for example, from a saved file)
+ * without having to use the transport framework. See pcaputil.c in the
+ * samples collection on how to use this function.
+ *
+ * @param tp The SRTP transport.
+ * @param is_rtp Set to non-zero if the packet is SRTP, otherwise set
+ * to zero if the packet is SRTCP.
+ * @param pkt On input, it contains SRTP or SRTCP packet. On
+ * output, it contains the decrypted RTP/RTCP packet.
+ * @param pkt_len On input, specify the length of the buffer. On
+ * output, it will be filled with the actual length
+ * of decrypted packet.
+ *
+ * @return PJ_SUCCESS on success.
+ */
+PJ_DECL(pj_status_t) pjmedia_transport_srtp_decrypt_pkt(pjmedia_transport *tp,
+ pj_bool_t is_rtp,
+ void *pkt,
+ int *pkt_len);
+
+
+/**
* Query member transport of SRTP.
*
* @param srtp The SRTP media transport.
diff --git a/pjmedia/src/pjmedia/transport_ice.c b/pjmedia/src/pjmedia/transport_ice.c
index 87c2ed8d..ed7efbc8 100644
--- a/pjmedia/src/pjmedia/transport_ice.c
+++ b/pjmedia/src/pjmedia/transport_ice.c
@@ -40,10 +40,10 @@ struct transport_ice
unsigned rx_drop_pct; /**< Percent of rx pkts to drop. */
void (*rtp_cb)(void*,
- const void*,
+ void*,
pj_ssize_t);
void (*rtcp_cb)(void*,
- const void*,
+ void*,
pj_ssize_t);
};
@@ -59,10 +59,10 @@ static pj_status_t transport_attach (pjmedia_transport *tp,
const pj_sockaddr_t *rem_rtcp,
unsigned addr_len,
void (*rtp_cb)(void*,
- const void*,
+ void*,
pj_ssize_t),
void (*rtcp_cb)(void*,
- const void*,
+ void*,
pj_ssize_t));
static void transport_detach (pjmedia_transport *tp,
void *strm);
@@ -674,10 +674,10 @@ static pj_status_t transport_attach (pjmedia_transport *tp,
const pj_sockaddr_t *rem_rtcp,
unsigned addr_len,
void (*rtp_cb)(void*,
- const void*,
+ void*,
pj_ssize_t),
void (*rtcp_cb)(void*,
- const void*,
+ void*,
pj_ssize_t))
{
struct transport_ice *tp_ice = (struct transport_ice*)tp;
diff --git a/pjmedia/src/pjmedia/transport_srtp.c b/pjmedia/src/pjmedia/transport_srtp.c
index ec6435fb..1109325b 100644
--- a/pjmedia/src/pjmedia/transport_srtp.c
+++ b/pjmedia/src/pjmedia/transport_srtp.c
@@ -83,7 +83,6 @@ typedef struct transport_srtp
pj_pool_t *pool;
pj_lock_t *mutex;
char tx_buffer[MAX_BUFFER_LEN];
- char rx_buffer[MAX_BUFFER_LEN];
pjmedia_srtp_setting setting;
/* SRTP policy */
@@ -102,10 +101,10 @@ typedef struct transport_srtp
/* Stream information */
void *user_data;
void (*rtp_cb)( void *user_data,
- const void *pkt,
+ void *pkt,
pj_ssize_t size);
void (*rtcp_cb)(void *user_data,
- const void *pkt,
+ void *pkt,
pj_ssize_t size);
/* Transport information */
@@ -117,12 +116,12 @@ typedef struct transport_srtp
/*
* This callback is called by transport when incoming rtp is received
*/
-static void srtp_rtp_cb( void *user_data, const void *pkt, pj_ssize_t size);
+static void srtp_rtp_cb( void *user_data, void *pkt, pj_ssize_t size);
/*
* This callback is called by transport when incoming rtcp is received
*/
-static void srtp_rtcp_cb( void *user_data, const void *pkt, pj_ssize_t size);
+static void srtp_rtcp_cb( void *user_data, void *pkt, pj_ssize_t size);
/*
@@ -136,10 +135,10 @@ static pj_status_t transport_attach (pjmedia_transport *tp,
const pj_sockaddr_t *rem_rtcp,
unsigned addr_len,
void (*rtp_cb)(void*,
- const void*,
+ void*,
pj_ssize_t),
void (*rtcp_cb)(void*,
- const void*,
+ void*,
pj_ssize_t));
static void transport_detach (pjmedia_transport *tp,
void *strm);
@@ -357,7 +356,10 @@ PJ_DEF(pj_status_t) pjmedia_transport_srtp_create(
/* Initialize base pjmedia_transport */
pj_memcpy(srtp->base.name, pool->obj_name, PJ_MAX_OBJ_NAME);
- srtp->base.type = tp->type;
+ if (tp)
+ srtp->base.type = tp->type;
+ else
+ srtp->base.type = PJMEDIA_TRANSPORT_TYPE_UDP;
srtp->base.op = &transport_srtp_op;
/* Set underlying transport */
@@ -564,9 +566,9 @@ static pj_status_t transport_attach(pjmedia_transport *tp,
const pj_sockaddr_t *rem_addr,
const pj_sockaddr_t *rem_rtcp,
unsigned addr_len,
- void (*rtp_cb) (void*, const void*,
+ void (*rtp_cb) (void*, void*,
pj_ssize_t),
- void (*rtcp_cb)(void*, const void*,
+ void (*rtcp_cb)(void*, void*,
pj_ssize_t))
{
transport_srtp *srtp = (transport_srtp*) tp;
@@ -590,10 +592,12 @@ static void transport_detach(pjmedia_transport *tp, void *strm)
{
transport_srtp *srtp = (transport_srtp*) tp;
- PJ_ASSERT_ON_FAIL(tp && srtp->real_tp, return);
-
PJ_UNUSED_ARG(strm);
- pjmedia_transport_detach(srtp->real_tp, srtp);
+ PJ_ASSERT_ON_FAIL(tp, return);
+
+ if (srtp->real_tp) {
+ pjmedia_transport_detach(srtp->real_tp, srtp);
+ }
/* Clear up application infos from transport */
srtp->rtp_cb = NULL;
@@ -687,7 +691,7 @@ static pj_status_t transport_destroy (pjmedia_transport *tp)
pjmedia_transport_detach(tp, NULL);
- if (srtp->setting.close_member_tp) {
+ if (srtp->setting.close_member_tp && srtp->real_tp) {
pjmedia_transport_close(srtp->real_tp);
}
@@ -704,7 +708,7 @@ static pj_status_t transport_destroy (pjmedia_transport *tp)
/*
* This callback is called by transport when incoming rtp is received
*/
-static void srtp_rtp_cb( void *user_data, const void *pkt, pj_ssize_t size)
+static void srtp_rtp_cb( void *user_data, void *pkt, pj_ssize_t size)
{
transport_srtp *srtp = (transport_srtp *) user_data;
int len = size;
@@ -715,17 +719,19 @@ static void srtp_rtp_cb( void *user_data, const void *pkt, pj_ssize_t size)
return;
}
- if (size < 0 || size > sizeof(srtp->rx_buffer) || !srtp->session_inited) {
+ if (size < 0 || !srtp->session_inited) {
return;
}
+ /* Make sure buffer is 32bit aligned */
+ PJ_ASSERT_ON_FAIL( (((long)pkt) & 0x03)==0, return );
+
pj_lock_acquire(srtp->mutex);
- pj_memcpy(srtp->rx_buffer, pkt, size);
- err = srtp_unprotect(srtp->srtp_rx_ctx, srtp->rx_buffer, &len);
+ err = srtp_unprotect(srtp->srtp_rx_ctx, (pj_uint8_t*)pkt, &len);
if (err == err_status_ok) {
- srtp->rtp_cb(srtp->user_data, srtp->rx_buffer, len);
+ srtp->rtp_cb(srtp->user_data, pkt, len);
} else {
PJ_LOG(5,(srtp->pool->obj_name,
"Failed to unprotect SRTP, pkt size=%d, err=%s",
@@ -738,7 +744,7 @@ static void srtp_rtp_cb( void *user_data, const void *pkt, pj_ssize_t size)
/*
* This callback is called by transport when incoming rtcp is received
*/
-static void srtp_rtcp_cb( void *user_data, const void *pkt, pj_ssize_t size)
+static void srtp_rtcp_cb( void *user_data, void *pkt, pj_ssize_t size)
{
transport_srtp *srtp = (transport_srtp *) user_data;
int len = size;
@@ -749,17 +755,19 @@ static void srtp_rtcp_cb( void *user_data, const void *pkt, pj_ssize_t size)
return;
}
- if (size < 0 || size > sizeof(srtp->rx_buffer) || !srtp->session_inited) {
+ if (size < 0 || !srtp->session_inited) {
return;
}
+ /* Make sure buffer is 32bit aligned */
+ PJ_ASSERT_ON_FAIL( (((long)pkt) & 0x03)==0, return );
+
pj_lock_acquire(srtp->mutex);
- pj_memcpy(srtp->rx_buffer, pkt, size);
- err = srtp_unprotect_rtcp(srtp->srtp_rx_ctx, srtp->rx_buffer, &len);
+ err = srtp_unprotect_rtcp(srtp->srtp_rx_ctx, (pj_uint8_t*)pkt, &len);
if (err == err_status_ok) {
- srtp->rtcp_cb(srtp->user_data, srtp->rx_buffer, len);
+ srtp->rtcp_cb(srtp->user_data, pkt, len);
} else {
PJ_LOG(5,(srtp->pool->obj_name,
"Failed to unprotect SRTCP, pkt size=%d, err=%s",
@@ -1264,6 +1272,42 @@ static pj_status_t transport_media_stop(pjmedia_transport *tp)
return pjmedia_transport_srtp_stop(tp);
}
+/* Utility */
+PJ_DEF(pj_status_t) pjmedia_transport_srtp_decrypt_pkt(pjmedia_transport *tp,
+ pj_bool_t is_rtp,
+ void *pkt,
+ int *pkt_len)
+{
+ transport_srtp *srtp = (transport_srtp *)tp;
+ err_status_t err;
+
+ if (srtp->bypass_srtp)
+ return PJ_SUCCESS;
+
+ PJ_ASSERT_RETURN(*pkt_len>0, PJ_EINVAL);
+ PJ_ASSERT_RETURN(srtp->session_inited, PJ_EINVALIDOP);
+
+ /* Make sure buffer is 32bit aligned */
+ PJ_ASSERT_ON_FAIL( (((long)pkt) & 0x03)==0, return PJ_EINVAL);
+
+ pj_lock_acquire(srtp->mutex);
+
+ if (is_rtp)
+ err = srtp_unprotect(srtp->srtp_rx_ctx, pkt, pkt_len);
+ else
+ err = srtp_unprotect_rtcp(srtp->srtp_rx_ctx, pkt, pkt_len);
+
+ if (err != err_status_ok) {
+ PJ_LOG(5,(srtp->pool->obj_name,
+ "Failed to unprotect SRTP, pkt size=%d, err=%s",
+ *pkt_len, get_libsrtp_errstr(err)));
+ }
+
+ pj_lock_release(srtp->mutex);
+
+ return (err==err_status_ok) ? PJ_SUCCESS : PJMEDIA_ERRNO_FROM_LIBSRTP(err);
+}
+
#endif
diff --git a/pjmedia/src/pjmedia/transport_udp.c b/pjmedia/src/pjmedia/transport_udp.c
index 3caea680..faaf7674 100644
--- a/pjmedia/src/pjmedia/transport_udp.c
+++ b/pjmedia/src/pjmedia/transport_udp.c
@@ -55,10 +55,10 @@ struct transport_udp
pj_sockaddr rem_rtcp_addr; /**< Remote RTCP address */
int addr_len; /**< Length of addresses. */
void (*rtp_cb)( void*, /**< To report incoming RTP. */
- const void*,
+ void*,
pj_ssize_t);
void (*rtcp_cb)( void*, /**< To report incoming RTCP. */
- const void*,
+ void*,
pj_ssize_t);
unsigned tx_drop_pct; /**< Percent of tx pkts to drop. */
@@ -105,10 +105,10 @@ static pj_status_t transport_attach (pjmedia_transport *tp,
const pj_sockaddr_t *rem_rtcp,
unsigned addr_len,
void (*rtp_cb)(void*,
- const void*,
+ void*,
pj_ssize_t),
void (*rtcp_cb)(void*,
- const void*,
+ void*,
pj_ssize_t));
static void transport_detach (pjmedia_transport *tp,
void *strm);
@@ -419,7 +419,7 @@ static void on_rx_rtp( pj_ioqueue_key_t *key,
udp = (struct transport_udp*) pj_ioqueue_get_user_data(key);
do {
- void (*cb)(void*,const void*,pj_ssize_t);
+ void (*cb)(void*,void*,pj_ssize_t);
void *user_data;
cb = udp->rtp_cb;
@@ -523,7 +523,7 @@ static void on_rx_rtcp(pj_ioqueue_key_t *key,
udp = (struct transport_udp*) pj_ioqueue_get_user_data(key);
do {
- void (*cb)(void*,const void*,pj_ssize_t);
+ void (*cb)(void*,void*,pj_ssize_t);
void *user_data;
cb = udp->rtcp_cb;
@@ -587,10 +587,10 @@ static pj_status_t transport_attach( pjmedia_transport *tp,
const pj_sockaddr_t *rem_rtcp,
unsigned addr_len,
void (*rtp_cb)(void*,
- const void*,
+ void*,
pj_ssize_t),
void (*rtcp_cb)(void*,
- const void*,
+ void*,
pj_ssize_t))
{
struct transport_udp *udp = (struct transport_udp*) tp;