diff options
author | dvossel <dvossel@f38db490-d61c-443f-a65b-d21fe96a405b> | 2010-03-03 18:03:19 +0000 |
---|---|---|
committer | dvossel <dvossel@f38db490-d61c-443f-a65b-d21fe96a405b> | 2010-03-03 18:03:19 +0000 |
commit | d86eba05fd497b5d0a75d3973c17feac07c90b03 (patch) | |
tree | 5b1c72228c241230c772a12f24ad3537e395b235 /channels | |
parent | 3212543aebf684e5e2a47d854b749b25ad597e3e (diff) |
Merged revisions 250394 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r250394 | dvossel | 2010-03-03 12:02:27 -0600 (Wed, 03 Mar 2010) | 16 lines
fixes problem with duplicate TXREQ packets
When Asterisk receives an IAX2 TXREQ packet, try_transfer()
will call store_by_transfercallno() to link the chan_iax2_pvt
struct into iax_transfercallno_pvts. If a duplicate TXREQ
packet is received for the same call, the pvt struct will be
linked into iax_transfercallno_pvts multiple times. This patch
fixes this. Thanks rain for debugging this and providing a patch!
(closes issue #16904)
Reported by: rain
Patches:
iax2-double-txreq-fix.diff uploaded by rain (license 327)
Tested by: rain, dvossel
........
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@250395 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r-- | channels/chan_iax2.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index cb15ca01b..1d89eab3c 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -8063,9 +8063,14 @@ static int try_transfer(struct chan_iax2_pvt *pvt, struct iax_ies *ies) memcpy(&pvt->transfer, &new, sizeof(pvt->transfer)); inet_aton(newip, &pvt->transfer.sin_addr); pvt->transfer.sin_family = AF_INET; - pvt->transferring = TRANSFER_BEGIN; pvt->transferid = ies->transferid; - store_by_transfercallno(pvt); + /* only store by transfercallno if this is a new transfer, + * just in case we get a duplicate TXREQ */ + if (pvt->transferring == TRANSFER_NONE) { + store_by_transfercallno(pvt); + } + pvt->transferring = TRANSFER_BEGIN; + if (ies->transferid) iax_ie_append_int(&ied, IAX_IE_TRANSFERID, ies->transferid); send_command_transfer(pvt, AST_FRAME_IAX, IAX_COMMAND_TXCNT, 0, ied.buf, ied.pos); @@ -8159,7 +8164,7 @@ static int complete_transfer(int callno, struct iax_ies *ies) pvt->voiceformat = 0; pvt->svideoformat = -1; pvt->videoformat = 0; - pvt->transfercallno = -1; + pvt->transfercallno = 0; memset(&pvt->rxcore, 0, sizeof(pvt->rxcore)); memset(&pvt->offset, 0, sizeof(pvt->offset)); /* reset jitterbuffer */ |