aboutsummaryrefslogtreecommitdiffstats
path: root/channels
diff options
context:
space:
mode:
authorfile <file@f38db490-d61c-443f-a65b-d21fe96a405b>2007-06-13 21:17:28 +0000
committerfile <file@f38db490-d61c-443f-a65b-d21fe96a405b>2007-06-13 21:17:28 +0000
commit4f546b5f2418bdbcd5ff0b5ef3bb1883a9376bf3 (patch)
treeadec21737b26b7ffab2f95f5470a66c9f2bbe8ac /channels
parentc3567a1accbeb72677410a199d4d20b0c3e47803 (diff)
Let's make chan_iax2 media only native transfers actually work. (issue #9376 reported by simone cittadini)
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@69221 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_iax2.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index 527b48977..d80771e54 100644
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -1139,7 +1139,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;
@@ -1226,6 +1226,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) {
/* Look for an existing connection first */
for (x=1;(res < 1) && (x<maxnontrunkcall);x++) {
@@ -6549,7 +6550,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]) {
@@ -7604,6 +7605,14 @@ retryowner2:
break;
case IAX_COMMAND_TXMEDIA:
if (iaxs[fr->callno]->transferring == TRANSFER_READY) {
+ AST_LIST_LOCK(&iaxq.queue);
+ AST_LIST_TRAVERSE(&iaxq.queue, cur, list) {
+ /* Cancel any outstanding frames and start anew */
+ if ((fr->callno == cur->callno) && (cur->transfer)) {
+ cur->retries = -1;
+ }
+ }
+ AST_LIST_UNLOCK(&iaxq.queue);
/* Start sending our media to the transfer address, but otherwise leave the call as-is */
iaxs[fr->callno]->transferring = TRANSFER_MEDIAPASS;
}