From f71c6c98a6e3a1093ac7a6696a10d7bdf6478554 Mon Sep 17 00:00:00 2001 From: Joshua Colp Date: Fri, 16 Nov 2012 21:24:35 +0000 Subject: [PATCH] Fix Incrementing Sequence Number For Retransmitted DTMF End Packets In Asterisk 1.4+, a fix was put in place to increment the sequence number for retransmitted DTMF end packets. With the introduction of the RTP engine API in 1.8, the sequence number was no longer being incremented. This patch fixes this regression as well as cleans up a few lines that were not doing anything. (closes issue ASTERISK-20295) Reported by: Nitesh Bansal Tested by: Michael L. Young Patches: 01_rtp_event_seq_num.patch uploaded by Nitesh Bansal (license 6418) asterisk-20295-dtmf-fix-cleanup.diff uploaded by Michael L. Young (license 5026) Review: https://reviewboard.asterisk.org/r/2083/ ........ Merged revisions 372185 from http://svn.asterisk.org/svn/asterisk/branches/1.8 git-svn-id: https://origsvn.digium.com/svn/asterisk/certified/branches/1.8.15@376409 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- res/res_rtp_asterisk.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/res/res_rtp_asterisk.c b/res/res_rtp_asterisk.c index 139fbb63d8..42df85f6d4 100644 --- a/res/res_rtp_asterisk.c +++ b/res/res_rtp_asterisk.c @@ -717,11 +717,10 @@ static int ast_rtp_dtmf_continuation(struct ast_rtp_instance *instance) } /* Actually create the packet we will be sending */ - rtpheader[0] = htonl((2 << 30) | (1 << 23) | (rtp->send_payload << 16) | (rtp->seqno)); + rtpheader[0] = htonl((2 << 30) | (rtp->send_payload << 16) | (rtp->seqno)); rtpheader[1] = htonl(rtp->lastdigitts); rtpheader[2] = htonl(rtp->ssrc); rtpheader[3] = htonl((rtp->send_digit << 24) | (0xa << 16) | (rtp->send_duration)); - rtpheader[0] = htonl((2 << 30) | (rtp->send_payload << 16) | (rtp->seqno)); /* Boom, send it on out */ res = rtp_sendto(instance, (void *) rtpheader, hdrlen + 4, 0, &remote_address); @@ -784,15 +783,16 @@ static int ast_rtp_dtmf_end_with_duration(struct ast_rtp_instance *instance, cha } /* Construct the packet we are going to send */ - rtpheader[0] = htonl((2 << 30) | (1 << 23) | (rtp->send_payload << 16) | (rtp->seqno)); rtpheader[1] = htonl(rtp->lastdigitts); rtpheader[2] = htonl(rtp->ssrc); rtpheader[3] = htonl((digit << 24) | (0xa << 16) | (rtp->send_duration)); rtpheader[3] |= htonl((1 << 23)); - rtpheader[0] = htonl((2 << 30) | (rtp->send_payload << 16) | (rtp->seqno)); /* Send it 3 times, that's the magical number */ for (i = 0; i < 3; i++) { + + rtpheader[0] = htonl((2 << 30) | (rtp->send_payload << 16) | (rtp->seqno)); + res = rtp_sendto(instance, (void *) rtpheader, hdrlen + 4, 0, &remote_address); if (res < 0) { ast_log(LOG_ERROR, "RTP Transmission error to %s: %s\n", @@ -804,6 +804,8 @@ static int ast_rtp_dtmf_end_with_duration(struct ast_rtp_instance *instance, cha ast_sockaddr_stringify(&remote_address), rtp->send_payload, rtp->seqno, rtp->lastdigitts, res - hdrlen); } + + rtp->seqno++; } /* Oh and we can't forget to turn off the stuff that says we are sending DTMF */ -- 2.47.2