From 90ef6a14a7d75421f6ead90cf6aa1d48b92543fc Mon Sep 17 00:00:00 2001
From: Torrey Searle <tsearle@voxbone.com>
Date: Fri, 19 Feb 2021 12:50:21 +0100
Subject: [PATCH] res/res_rtp_asterisk: generate new SSRC on native bridge end

For RTCP to work, we update the ssrc to be the one corresponding to
the native bridge while active.  However when the bridge ends we
should generate a new SSRC as the sequence numbers will not continue
from the native bridge left off.

ASTERISK-29300 #close

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

diff --git a/res/res_rtp_asterisk.c b/res/res_rtp_asterisk.c
index a962d70267..21eff54511 100644
--- a/res/res_rtp_asterisk.c
+++ b/res/res_rtp_asterisk.c
@@ -362,6 +362,8 @@ struct ast_rtp {
 	struct ast_frame f;
 	unsigned char rawdata[8192 + AST_FRIENDLY_OFFSET];
 	unsigned int ssrc;		/*!< Synchronization source, RFC 3550, page 10. */
+	unsigned int ssrc_orig;		/*!< SSRC used before native bridge activated */
+	unsigned char ssrc_saved;	/*!< indicates if ssrc_orig has a value */
 	char cname[AST_UUID_STR_LEN]; /*!< Our local CNAME */
 	unsigned int themssrc;		/*!< Their SSRC */
 	unsigned int themssrc_valid;	/*!< True if their SSRC is available. */
@@ -8530,6 +8532,18 @@ static int ast_rtp_local_bridge(struct ast_rtp_instance *instance0, struct ast_r
 		ast_smoother_free(rtp->smoother);
 		rtp->smoother = NULL;
 	}
+
+	/* We must use a new SSRC when local bridge ends */
+	if (!instance1) {
+		rtp->ssrc = rtp->ssrc_orig;
+		rtp->ssrc_orig = 0;
+		rtp->ssrc_saved = 0;
+	} else if (!rtp->ssrc_saved) {
+		/* In case ast_rtp_local_bridge is called multiple times, only save the ssrc from before local bridge began */
+		rtp->ssrc_orig = rtp->ssrc;
+		rtp->ssrc_saved = 1;
+	}
+
 	ao2_unlock(instance0);
 
 	return 0;
-- 
GitLab