mirror of
https://github.com/asterisk/asterisk.git
synced 2026-07-22 14:34:09 -07:00
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/branches/1.4@68313 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
+20
-16
@@ -703,12 +703,16 @@ struct iax2_thread {
|
||||
time_t checktime;
|
||||
ast_mutex_t lock;
|
||||
ast_cond_t cond;
|
||||
unsigned short ffcallno; /* 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 for that
|
||||
callno to other threads */
|
||||
struct sockaddr_in ffsin; /* remember the peer IP/port number for a full frame
|
||||
in process */
|
||||
/*! 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 */
|
||||
@@ -888,10 +892,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;
|
||||
}
|
||||
@@ -6309,22 +6311,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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user