diff options
author | Joshua Colp <jcolp@digium.com> | 2007-06-13 21:20:32 +0000 |
---|---|---|
committer | Joshua Colp <jcolp@digium.com> | 2007-06-13 21:20:32 +0000 |
commit | 6a35e6cfb6761d2a8623645cbd0a8cfef3b93afc (patch) | |
tree | b0cabcee9ad642a72ba4e0d8fe44e340a6cfa58e | |
parent | 8e11d6c147e524a02eb88eab76282a3c810e6297 (diff) |
Merged revisions 69221 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r69221 | file | 2007-06-13 17:17:28 -0400 (Wed, 13 Jun 2007) | 2 lines
Let's make chan_iax2 media only native transfers actually work. (issue #9376 reported by simone cittadini)
........
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@69223 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r-- | channels/chan_iax2.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index a814c5f04..030fd8257 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -1224,7 +1224,7 @@ static int match(struct sockaddr_in *sin, unsigned short callno, unsigned short if ((cur->transfer.sin_addr.s_addr == sin->sin_addr.s_addr) && (cur->transfer.sin_port == sin->sin_port) && (cur->transferring)) { /* We're transferring */ - if (dcallno == cur->callno) + if ((dcallno == cur->callno) || (cur->transferring == TRANSFER_MEDIAPASS && cur->transfercallno == callno)) return 1; } return 0; @@ -1326,6 +1326,7 @@ static int find_callno(unsigned short callno, unsigned short dcallno, struct soc int x; struct timeval now; char host[80]; + if (new <= NEW_ALLOW) { for (x=1;(res < 1) && (x<maxnontrunkcall);x++) { ast_mutex_lock(&iaxsl[x]); @@ -6839,7 +6840,7 @@ static int socket_process(struct iax2_thread *thread) if (!fr->callno) fr->callno = find_callno(ntohs(mh->callno) & ~IAX_FLAG_FULL, dcallno, &sin, new, 1, fd); - if (fr->callno > 0) + if (fr->callno > 0) ast_mutex_lock(&iaxsl[fr->callno]); if (!fr->callno || !iaxs[fr->callno]) { @@ -7924,6 +7925,14 @@ retryowner2: break; case IAX_COMMAND_TXMEDIA: if (iaxs[fr->callno]->transferring == TRANSFER_READY) { + AST_LIST_LOCK(&queue); + AST_LIST_TRAVERSE(&queue, cur, list) { + /* Cancel any outstanding frames and start anew */ + if ((fr->callno == cur->callno) && (cur->transfer)) { + cur->retries = -1; + } + } + AST_LIST_UNLOCK(&queue); /* Start sending our media to the transfer address, but otherwise leave the call as-is */ iaxs[fr->callno]->transferring = TRANSFER_MEDIAPASS; } |