@ -2373,6 +2373,39 @@ error:
}
# endif
static int rtcp_mux ( struct ast_rtp * rtp , const unsigned char * packet )
{
uint8_t version ;
uint8_t pt ;
uint8_t m ;
if ( ! rtp - > rtcp | | rtp - > rtcp - > type ! = AST_RTP_INSTANCE_RTCP_MUX ) {
return 0 ;
}
version = ( packet [ 0 ] & 0 XC0 ) > > 6 ;
if ( version = = 0 ) {
/* version 0 indicates this is a STUN packet and shouldn't
* be interpreted as a possible RTCP packet
*/
return 0 ;
}
/* The second octet of a packet will be one of the following:
* For RTP : The marker bit ( 1 bit ) and the RTP payload type ( 7 bits )
* For RTCP : The payload type ( 8 )
*
* RTP has a forbidden range of payload types ( 64 - 95 ) since these
* will conflict with RTCP payload numbers if the marker bit is set .
*/
m = packet [ 1 ] & 0x80 ;
pt = packet [ 1 ] & 0x7F ;
if ( m & & pt > = 64 & & pt < = 95 ) {
return 1 ;
}
return 0 ;
}
/*! \pre instance is locked */
static int __rtp_recvfrom ( struct ast_rtp_instance * instance , void * buf , size_t size , int flags , struct ast_sockaddr * sa , int rtcp )
{
@ -2495,7 +2528,8 @@ static int __rtp_recvfrom(struct ast_rtp_instance *instance, void *buf, size_t s
}
# endif
if ( ( * in & 0xC0 ) & & res_srtp & & srtp & & res_srtp - > unprotect ( srtp , buf , & len , rtcp ) < 0 ) {
if ( ( * in & 0xC0 ) & & res_srtp & & srtp & & res_srtp - > unprotect (
srtp , buf , & len , rtcp | | rtcp_mux ( rtp , buf ) ) < 0 ) {
return - 1 ;
}
@ -4859,39 +4893,6 @@ static int bridge_p2p_rtp_write(struct ast_rtp_instance *instance,
return 0 ;
}
static int rtcp_mux ( struct ast_rtp * rtp , const unsigned char * packet )
{
uint8_t version ;
uint8_t pt ;
uint8_t m ;
if ( ! rtp - > rtcp | | rtp - > rtcp - > type ! = AST_RTP_INSTANCE_RTCP_MUX ) {
return 0 ;
}
version = ( packet [ 0 ] & 0 XC0 ) > > 6 ;
if ( version = = 0 ) {
/* version 0 indicates this is a STUN packet and shouldn't
* be interpreted as a possible RTCP packet
*/
return 0 ;
}
/* The second octet of a packet will be one of the following:
* For RTP : The marker bit ( 1 bit ) and the RTP payload type ( 7 bits )
* For RTCP : The payload type ( 8 )
*
* RTP has a forbidden range of payload types ( 64 - 95 ) since these
* will conflict with RTCP payload numbers if the marker bit is set .
*/
m = packet [ 1 ] & 0x80 ;
pt = packet [ 1 ] & 0x7F ;
if ( m & & pt > = 64 & & pt < = 95 ) {
return 1 ;
}
return 0 ;
}
/*! \pre instance is locked */
static struct ast_frame * ast_rtp_read ( struct ast_rtp_instance * instance , int rtcp )
{