diff --git a/res/res_rtp_asterisk.c b/res/res_rtp_asterisk.c index b7cc059f1e..673f9c1240 100644 --- a/res/res_rtp_asterisk.c +++ b/res/res_rtp_asterisk.c @@ -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) {