From: Joshua Colp Date: Wed, 8 May 2019 15:41:43 +0000 (+0000) Subject: res_rtp_asterisk: Fix sequence number cycling and packet loss count. X-Git-Tag: 16.4.0-rc1~3^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ece29db9bdf604a01f7ab3a50a1a7195cd2baee0;p=thirdparty%2Fasterisk.git res_rtp_asterisk: Fix sequence number cycling and packet loss count. This change fixes two bugs which both resulted in the packet loss count exceeding 65,000. The first issue is that the sequence number check to determine if cycling had occurred was using the wrong variable resulting in the check never seeing that cycling has occurred, throwing off the packet loss calculation. It now uses the correct variable. The second issue is that the packet loss calculation assumed that the received number of packets in an interval could never exceed the expected number. In practice this isn't true due to delayed or retransmitted packets. The expected will now be updated to the received number if the received exceeds it. ASTERISK-28379 Change-Id: If888ebc194ab69ac3194113a808c414b014ce0f6 --- diff --git a/res/res_rtp_asterisk.c b/res/res_rtp_asterisk.c index 023273aa95..c4df6a40fd 100644 --- a/res/res_rtp_asterisk.c +++ b/res/res_rtp_asterisk.c @@ -4126,6 +4126,14 @@ static void calculate_lost_packet_statistics(struct ast_rtp *rtp, *lost_packets = expected_packets - rtp->rxcount; expected_interval = expected_packets - rtp->rtcp->expected_prior; received_interval = rtp->rxcount - rtp->rtcp->received_prior; + if (received_interval > expected_interval) { + /* If we receive some late packets it is possible for the packets + * we received in this interval to exceed the number we expected. + * We update the expected so that the packet loss calculations + * show that no packets are lost. + */ + expected_interval = received_interval; + } lost_interval = expected_interval - received_interval; if (expected_interval == 0 || lost_interval <= 0) { *fraction_lost = 0; @@ -6801,7 +6809,7 @@ static struct ast_frame *ast_rtp_interpret(struct ast_rtp_instance *instance, st ast_log(LOG_WARNING, "scheduling RTCP transmission failed.\n"); } } - if ((int)rtp->lastrxseqno - (int)seqno > 100) /* if so it would indicate that the sender cycled; allow for misordering */ + if ((int)prev_seqno - (int)seqno > 100) /* if so it would indicate that the sender cycled; allow for misordering */ rtp->cycles += RTP_SEQ_MOD; /* If we are directly bridged to another instance send the audio directly out,