diff --git a/src/channels/chan_voicemngr.c b/src/channels/chan_voicemngr.c index 4934f4558e0850955ab7996322262da9d4679dec..48f4632c639ccc61ed0454407016be97b01a8ded 100644 --- a/src/channels/chan_voicemngr.c +++ b/src/channels/chan_voicemngr.c @@ -5641,21 +5641,28 @@ static void chan_voicemngr_process_incoming_rtcp_packet(struct chan_voicemngr_su struct rtcp_header_t *rtcp_hdr = (struct rtcp_header_t *)rtcp_frame; uint8_t *packet_end = rtcp_frame + rtcp_size; + /* + RTCP packet with RC=0 in the RTCP header does not contain any reception report block + so we cannot get any parameters from such packets for calculations + */ + if (!RTCP_GET_RC(rtcp_hdr)) + return; + while ((uint8_t *)rtcp_hdr + sizeof(struct rtcp_header_t) <= packet_end && // Minimum RTCP packet size validation RTCP_GET_VERSION(rtcp_hdr) == RTP_VERSION && // RTP version validation RTCP_PKT_END(rtcp_hdr) <= packet_end) { // Packet length validation switch (rtcp_hdr->pt) { case RTCP_SR: + case RTCP_RR: p->remote_jitter_count++; - p->farEndInterarrivalJitter = RTCP_SR_GET_INTERARRIVAL_JITTER(rtcp_hdr); + p->farEndInterarrivalJitter = (rtcp_hdr->pt == RTCP_SR ? RTCP_SR_GET_INTERARRIVAL_JITTER(rtcp_hdr) : + RTCP_RR_GET_INTERARRIVAL_JITTER(rtcp_hdr)); p->totalFarEndInterarrivalJitter += p->farEndInterarrivalJitter; - /* Intentional fall through */ - case RTCP_RR: + break; case RTCP_SDES: case RTCP_XR: case RTCP_BYE: break; - default: ast_log(LOG_ERROR, "Unknown incoming RTCP packet type:%hhu\n", rtcp_hdr->pt); break; @@ -5670,21 +5677,28 @@ static void chan_voicemngr_process_outgoing_rtcp_packet(struct chan_voicemngr_su struct rtcp_header_t *rtcp_hdr = (struct rtcp_header_t *)rtcp_frame; uint8_t *packet_end = rtcp_frame + rtcp_size; + /* + RTCP packet with RC=0 in the RTCP header does not contain any reception report block + so we cannot get any parameters from such packets for calculations + */ + if (!RTCP_GET_RC(rtcp_hdr)) + return; + while ((uint8_t *)rtcp_hdr + sizeof(struct rtcp_header_t) <= packet_end && // Minimum RTCP packet size validation RTCP_GET_VERSION(rtcp_hdr) == RTP_VERSION && // RTP version validation RTCP_PKT_END(rtcp_hdr) <= packet_end) { // Packet length validation switch (rtcp_hdr->pt) { case RTCP_SR: + case RTCP_RR: p->local_jitter_count++; - p->receiveInterarrivalJitter = RTCP_SR_GET_INTERARRIVAL_JITTER(rtcp_hdr); + p->receiveInterarrivalJitter = (rtcp_hdr->pt == RTCP_SR ? RTCP_SR_GET_INTERARRIVAL_JITTER(rtcp_hdr) : + RTCP_RR_GET_INTERARRIVAL_JITTER(rtcp_hdr)); p->totalReceiveInterarrivalJitter += p->receiveInterarrivalJitter; break; - case RTCP_RR: case RTCP_SDES: case RTCP_XR: case RTCP_BYE: break; - default: ast_log(LOG_ERROR, "Unknown outgoing RTCP packet type:%hhu\n", rtcp_hdr->pt); break; diff --git a/src/channels/chan_voicemngr.h b/src/channels/chan_voicemngr.h index 38343ab19521bdf7b75a0d1d90a41927ec132f0f..2c2312c89f3dec8c87c27bf5d0b1732e86d8276c 100644 --- a/src/channels/chan_voicemngr.h +++ b/src/channels/chan_voicemngr.h @@ -138,7 +138,9 @@ struct __attribute__((packed)) rtcp_header_t { }; #define RTCP_PKT_END(header) ((uint8_t *)(header) + (ntohs((header)->length) + 1) * 4) #define RTCP_GET_VERSION(header) ((header)->v_p_rc >> 6) +#define RTCP_GET_RC(header) ((header)->v_p_rc & 0x1F) #define RTCP_SR_GET_INTERARRIVAL_JITTER(header) ntohl(*((uint32_t *)(header) + 10)) +#define RTCP_RR_GET_INTERARRIVAL_JITTER(header) ntohl(*((uint32_t *)(header) + 5)) struct chan_voicemngr_subchannel { int id;