From be1502faa365d1ed7c2886a6257f4ed4b5445091 Mon Sep 17 00:00:00 2001 From: Russell Bryant Date: Thu, 5 Jul 2007 22:31:31 +0000 Subject: [PATCH] * Store the call number that a thread is processing without the full frame bit set to ease debugging * When deferring a full frame for processing, stick it into the queue for the thread that is processing frames for that call, not the one that read the current frame and is about to go back into the idle list (related to issue #9937) git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@73551 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_iax2.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index dd6749c8e5..79c121b6b3 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -6387,23 +6387,24 @@ static int socket_read(int *id, int fd, short events, void *cbdata) fh = (struct ast_iax2_full_hdr *) thread->buf; if (ntohs(fh->scallno) & IAX_FLAG_FULL) { struct iax2_thread *cur = NULL; + uint16_t callno = ntohs(fh->scallno) & ~IAX_FLAG_FULL; AST_LIST_LOCK(&active_list); AST_LIST_TRAVERSE(&active_list, cur, list) { - if ((cur->ffinfo.callno == ntohs(fh->scallno)) && + if ((cur->ffinfo.callno == callno) && !inaddrcmp(&cur->ffinfo.sin, &thread->iosin)) break; } if (cur) { /* we found another thread processing a full frame for this call, so queue it up for processing later. */ - defer_full_frame(thread); + defer_full_frame(cur); AST_LIST_UNLOCK(&active_list); insert_idle_thread(thread); return 1; } else { /* this thread is going to process this frame, so mark it */ - thread->ffinfo.callno = ntohs(fh->scallno); + thread->ffinfo.callno = callno; memcpy(&thread->ffinfo.sin, &thread->iosin, sizeof(thread->ffinfo.sin)); thread->ffinfo.type = fh->type; thread->ffinfo.csub = fh->csub;