summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Harwell <kharwell@digium.com>2017-05-01 13:04:16 -0500
committerKevin Harwell <kharwell@digium.com>2017-05-03 12:29:22 -0500
commit008e25def96eaf58ccaef2276eb0cb36ff4b67bf (patch)
tree4a7476e4bb6c83b027c8bf351b61ad2b65347eb2
parentbdec0852b96a9475a013f88949ad162511fd8404 (diff)
res_rtp_asterisk: Clearing the remote RTCP address causes RTCP failures
When a call gets put on hold RTP is temporarily stopped and Asterisk was setting the remote RTCP address to NULL. Then when RTCP data was received from the remote endpoint, Asterisk would be missing this information when publishing the rtcp_message stasis event. Consequently, message subscribers (in this case res_hep_rtcp) trying to parse the "from" field output the following error: "ast_sockaddr_split_hostport: Port missing in (null)" This patch makes it so the remote RTCP address is no longer set to NULL when stopping RTP. There was only one place that appeared to check if the remote RTCP address was NULL as a way to tell if RTCP was running. This patch added an additional check on the RTCP schedid for that case to make sure RTCP was truly not running. ASTERISK-26860 #close Change-Id: I6be200fb20db647e48b5138ea4b81dfa7962974b
-rw-r--r--res/res_rtp_asterisk.c24
1 files changed, 10 insertions, 14 deletions
diff --git a/res/res_rtp_asterisk.c b/res/res_rtp_asterisk.c
index 85e2425cb..f7e976272 100644
--- a/res/res_rtp_asterisk.c
+++ b/res/res_rtp_asterisk.c
@@ -3908,7 +3908,7 @@ static int ast_rtp_write(struct ast_rtp_instance *instance, struct ast_frame *fr
return 0;
}
- if (ast_sockaddr_isnull(&rtp->rtcp->them)) {
+ if (ast_sockaddr_isnull(&rtp->rtcp->them) || rtp->rtcp->schedid < 0) {
/*
* RTCP was stopped.
*/
@@ -5527,21 +5527,20 @@ static void ast_rtp_remote_address_set(struct ast_rtp_instance *instance, struct
}
}
- if (rtp->rtcp) {
+ if (rtp->rtcp && !ast_sockaddr_isnull(addr)) {
ast_debug(1, "Setting RTCP address on RTP instance '%p'\n", instance);
ast_sockaddr_copy(&rtp->rtcp->them, addr);
- if (!ast_sockaddr_isnull(addr)) {
- if (rtp->rtcp->type == AST_RTP_INSTANCE_RTCP_STANDARD) {
- ast_sockaddr_set_port(&rtp->rtcp->them, ast_sockaddr_port(addr) + 1);
- /* Update the local RTCP address with what is being used */
- ast_sockaddr_set_port(&local, ast_sockaddr_port(&local) + 1);
- }
- ast_sockaddr_copy(&rtp->rtcp->us, &local);
+ if (rtp->rtcp->type == AST_RTP_INSTANCE_RTCP_STANDARD) {
+ ast_sockaddr_set_port(&rtp->rtcp->them, ast_sockaddr_port(addr) + 1);
- ast_free(rtp->rtcp->local_addr_str);
- rtp->rtcp->local_addr_str = ast_strdup(ast_sockaddr_stringify(&local));
+ /* Update the local RTCP address with what is being used */
+ ast_sockaddr_set_port(&local, ast_sockaddr_port(&local) + 1);
}
+ ast_sockaddr_copy(&rtp->rtcp->us, &local);
+
+ ast_free(rtp->rtcp->local_addr_str);
+ rtp->rtcp->local_addr_str = ast_strdup(ast_sockaddr_stringify(&local));
}
rtp->rxseqno = 0;
@@ -5751,9 +5750,6 @@ static void ast_rtp_stop(struct ast_rtp_instance *instance)
}
ast_rtp_instance_set_remote_address(instance, &addr);
- if (rtp->rtcp) {
- ast_sockaddr_setnull(&rtp->rtcp->them);
- }
ast_set_flag(rtp, FLAG_NEED_MARKER_BIT);
}