From 2c9173986a0bee7db0a090b7cada8bd8123ffd9b Mon Sep 17 00:00:00 2001 From: "Kevin P. Fleming" Date: Thu, 7 Jun 2007 22:18:38 +0000 Subject: Merged revisions 68313 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r68313 | kpfleming | 2007-06-07 17:14:35 -0500 (Thu, 07 Jun 2007) | 6 lines some improvements to the IAX2 full frame dropping logic recently added: - use inaddrcmp(), since we have it - output the type of frame and subclass being dropped, and the type/subclass that is already being processed (which caused the drop) ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@68321 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_iax2.c | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index 086f4b03d..b218582ba 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -726,12 +726,16 @@ struct iax2_thread { time_t checktime; ast_mutex_t lock; ast_cond_t cond; - /*! If this thread is processing a full frame, the callno for that frame - * will be here, so we can avoid dispatching any more full frames - * or that callno to other threads */ - unsigned short ffcallno; - /*! Remember the peer IP/port number for a full frame in process */ - struct sockaddr_in ffsin; + /*! if this thread is processing a full frame, + some information about that frame will be stored + here, so we can avoid dispatching any more full + frames for that callno to other threads */ + struct { + unsigned short callno; + struct sockaddr_in sin; + unsigned char type; + unsigned char csub; + } ffinfo; }; /* Thread lists */ @@ -974,10 +978,8 @@ static struct iax2_thread *find_idle_thread(void) /* this thread is not processing a full frame (since it is idle), so ensure that the field for the full frame call number is empty */ - if (thread) { - thread->ffcallno = 0; - memset(&thread->ffsin, 0, sizeof(thread->ffsin)); - } + if (thread) + memset(&thread->ffinfo, 0, sizeof(thread->ffinfo)); return thread; } @@ -6562,22 +6564,24 @@ static int socket_read(int *id, int fd, short events, void *cbdata) AST_LIST_LOCK(&active_list); AST_LIST_TRAVERSE(&active_list, cur, list) { - if ((cur->ffcallno == ntohs(fh->scallno)) && - !memcmp(&cur->ffsin, &thread->iosin, sizeof(cur->ffsin))) + if ((cur->ffinfo.callno == ntohs(fh->scallno)) && + !inaddrcmp(&cur->ffinfo.sin, &thread->iosin)) break; } AST_LIST_UNLOCK(&active_list); if (cur) { /* we found another thread processing a full frame for this call, so we can't accept this frame */ - ast_log(LOG_WARNING, "Dropping full frame from %s (callno %d) received too rapidly\n", - ast_inet_ntoa(thread->iosin.sin_addr), cur->ffcallno); + ast_log(LOG_WARNING, "Dropping frame from %s (callno %d) of type %d (subclass %d) due to frame of type %d (subclass %d) already in process\n", + ast_inet_ntoa(thread->iosin.sin_addr), cur->ffinfo.callno, + fh->type, uncompress_subclass(fh->csub), + cur->ffinfo.type, uncompress_subclass(cur->ffinfo.csub)); insert_idle_thread(thread); return 1; } else { /* this thread is going to process this frame, so mark it */ - thread->ffcallno = ntohs(fh->scallno); - memcpy(&thread->ffsin, &thread->iosin, sizeof(thread->ffsin)); + thread->ffinfo.callno = ntohs(fh->scallno); + memcpy(&thread->ffinfo.sin, &thread->iosin, sizeof(thread->ffinfo.sin)); } } -- cgit v1.2.3