diff options
author | dvossel <dvossel@f38db490-d61c-443f-a65b-d21fe96a405b> | 2010-03-03 18:05:24 +0000 |
---|---|---|
committer | dvossel <dvossel@f38db490-d61c-443f-a65b-d21fe96a405b> | 2010-03-03 18:05:24 +0000 |
commit | a7485b863809fc1a3273c98d11344f22cfa682e0 (patch) | |
tree | cd4e31e0bf88cd332f09a486d5fef9f839253eba | |
parent | c807b5963a8a328abb96d05d0161f82f01a709fd (diff) |
Merged revisions 250395 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk
................
r250395 | dvossel | 2010-03-03 12:03:19 -0600 (Wed, 03 Mar 2010) | 22 lines
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/branches/1.6.1@250397 f38db490-d61c-443f-a65b-d21fe96a405b
-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 9ed5c6b07..b1b10aea6 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -7796,9 +7796,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); @@ -7892,7 +7897,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 */ |