diff options
author | dvossel <dvossel@f38db490-d61c-443f-a65b-d21fe96a405b> | 2010-03-03 18:06:19 +0000 |
---|---|---|
committer | dvossel <dvossel@f38db490-d61c-443f-a65b-d21fe96a405b> | 2010-03-03 18:06:19 +0000 |
commit | 43179f70ad610466795e08e0a012924edea555ac (patch) | |
tree | 37271711c4a575ea7e5c7ff0893e603da6d00c15 /channels/chan_iax2.c | |
parent | 5e9eaf97a239da0d14fea81f243c57cdf595348f (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.0@250398 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_iax2.c')
-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 6c7e7c00d..1a27d2b67 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -7742,9 +7742,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); @@ -7838,7 +7843,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 */ |