From f662a26ea08dd8888e476955ac9469802c4a80e1 Mon Sep 17 00:00:00 2001
From: Alexei Gradinari <alex2grad@gmail.com>
Date: Fri, 4 Jan 2019 10:57:06 -0500
Subject: [PATCH] RTP: reset DTMF last seqno/timestamp on RTP renegotiation

The remote side may start a new stream when renegotiating RTP.
Need to reset the DTMF last sequence number and the timestamp
of the last END packet on RTP renegotiation.

If the new time stamp is lower then the timestamp of the last DTMF END packet
the asterisk drops all DTMF frames as out of order.

This bug was caught using Cisco ip-phone SPA5XX and codec g722.
On SIP session update the SPA50X resets stream and a new timestamp is twice
smaller then the previous.

ASTERISK-28162 #close

Change-Id: Ic72b4497e74d801b27a635559c1cf29c16c95254
---
 res/res_rtp_asterisk.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/res/res_rtp_asterisk.c b/res/res_rtp_asterisk.c
index a13725a492..9e603f2fb5 100644
--- a/res/res_rtp_asterisk.c
+++ b/res/res_rtp_asterisk.c
@@ -7369,6 +7369,10 @@ static void ast_rtp_remote_address_set(struct ast_rtp_instance *instance, struct
 		ast_rtp_instance_set_remote_address(mapping->instance, addr);
 	}
 
+	/* Need to reset the DTMF last sequence number and the timestamp of the last END packet */
+	rtp->last_seqno = 0;
+	rtp->last_end_timestamp = 0;
+
 	if (strictrtp && rtp->strict_rtp_state != STRICT_RTP_OPEN
 		&& !ast_sockaddr_isnull(addr) && ast_sockaddr_cmp(addr, &rtp->strict_rtp_address)) {
 		/* We only need to learn a new strict source address if we've been told the source is
-- 
GitLab