aboutsummaryrefslogtreecommitdiffstats
path: root/channels
diff options
context:
space:
mode:
authorkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2007-06-07 22:14:35 +0000
committerkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2007-06-07 22:14:35 +0000
commitdae70f0a07a35bc4df1291cb1f62a9cac4965d05 (patch)
tree3410fbad4e2a31acc618e9904c9aada738e6ae29 /channels
parent2927c4659f9c91aebf5bc6be212c92a01805479b (diff)
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: http://svn.digium.com/svn/asterisk/branches/1.4@68313 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_iax2.c36
1 files changed, 20 insertions, 16 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index 438b12f68..b2c4f19f0 100644
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -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));
}
}