mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-04 12:12:48 +00:00
Merge "res_rtp_asterisk: rtcp mux using the wrong srtp unprotecting algorithm" into 13
This commit is contained in:
@@ -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] & 0XC0) >> 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] & 0XC0) >> 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)
|
||||
{
|
||||
|
Reference in New Issue
Block a user