NFQ: use per thread allocated data for recv buffer.

remotes/origin/master-1.1.x
Eric Leblond 16 years ago committed by Victor Julien
parent fb6494abc1
commit bc68c108a7

@ -119,6 +119,7 @@ static SCMutex nfq_init_lock;
TmEcode ReceiveNFQ(ThreadVars *, Packet *, void *, PacketQueue *, PacketQueue *); TmEcode ReceiveNFQ(ThreadVars *, Packet *, void *, PacketQueue *, PacketQueue *);
TmEcode ReceiveNFQThreadInit(ThreadVars *, void *, void **); TmEcode ReceiveNFQThreadInit(ThreadVars *, void *, void **);
TmEcode ReceiveNFQThreadDeinit(ThreadVars *, void *);
void ReceiveNFQThreadExitStats(ThreadVars *, void *); void ReceiveNFQThreadExitStats(ThreadVars *, void *);
TmEcode VerdictNFQ(ThreadVars *, Packet *, void *, PacketQueue *, PacketQueue *); TmEcode VerdictNFQ(ThreadVars *, Packet *, void *, PacketQueue *, PacketQueue *);
@ -152,7 +153,7 @@ void TmModuleReceiveNFQRegister (void) {
tmm_modules[TMM_RECEIVENFQ].ThreadInit = ReceiveNFQThreadInit; tmm_modules[TMM_RECEIVENFQ].ThreadInit = ReceiveNFQThreadInit;
tmm_modules[TMM_RECEIVENFQ].Func = ReceiveNFQ; tmm_modules[TMM_RECEIVENFQ].Func = ReceiveNFQ;
tmm_modules[TMM_RECEIVENFQ].ThreadExitPrintStats = ReceiveNFQThreadExitStats; tmm_modules[TMM_RECEIVENFQ].ThreadExitPrintStats = ReceiveNFQThreadExitStats;
tmm_modules[TMM_RECEIVENFQ].ThreadDeinit = NULL; tmm_modules[TMM_RECEIVENFQ].ThreadDeinit = ReceiveNFQThreadDeinit;
tmm_modules[TMM_RECEIVENFQ].RegisterTests = NULL; tmm_modules[TMM_RECEIVENFQ].RegisterTests = NULL;
} }
@ -475,11 +476,35 @@ TmEcode ReceiveNFQThreadInit(ThreadVars *tv, void *initdata, void **data) {
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
#define T_DATA_SIZE 70000
ntv->data = SCMalloc(T_DATA_SIZE);
if (ntv->data == NULL) {
SCMutexUnlock(&nfq_init_lock);
return TM_ECODE_FAILED;
}
ntv->datalen = T_DATA_SIZE;
#undef T_DATA_SIZE
*data = (void *)ntv; *data = (void *)ntv;
SCMutexUnlock(&nfq_init_lock); SCMutexUnlock(&nfq_init_lock);
return TM_ECODE_OK; return TM_ECODE_OK;
} }
TmEcode ReceiveNFQThreadDeinit(ThreadVars *t, void *data)
{
NFQThreadVars *ntv = (NFQThreadVars *)data;
if (ntv->data != NULL) {
SCFree(ntv->data);
ntv->data = NULL;
}
ntv->datalen = 0;
return TM_ECODE_OK;
}
TmEcode VerdictNFQThreadInit(ThreadVars *tv, void *initdata, void **data) { TmEcode VerdictNFQThreadInit(ThreadVars *tv, void *initdata, void **data) {
*data = (void *)initdata; *data = (void *)initdata;
@ -609,7 +634,7 @@ void NFQRecvPkt(NFQQueueVars *t, NFQThreadVars *tv) {
int rv, ret; int rv, ret;
/* XXX what happens on rv == 0? */ /* XXX what happens on rv == 0? */
rv = recv(t->fd, tv->buf, sizeof(tv->buf), 0); rv = recv(t->fd, tv->data, tv->datalen, 0);
if (rv < 0) { if (rv < 0) {
if (errno == EINTR || errno == EWOULDBLOCK) { if (errno == EINTR || errno == EWOULDBLOCK) {
@ -632,7 +657,7 @@ void NFQRecvPkt(NFQQueueVars *t, NFQThreadVars *tv) {
//printf("NFQRecvPkt: t %p, rv = %" PRId32 "\n", t, rv); //printf("NFQRecvPkt: t %p, rv = %" PRId32 "\n", t, rv);
SCMutexLock(&t->mutex_qh); SCMutexLock(&t->mutex_qh);
ret = nfq_handle_packet(t->h, tv->buf, rv); ret = nfq_handle_packet(t->h, tv->data, rv);
SCMutexUnlock(&t->mutex_qh); SCMutexUnlock(&t->mutex_qh);
if (ret != 0) { if (ret != 0) {

@ -55,7 +55,8 @@ typedef struct NFQThreadVars_
uint16_t nfq_index; uint16_t nfq_index;
ThreadVars *tv; ThreadVars *tv;
char buf[70000]; char *data; /** Per function and thread data */
int datalen; /** Length of per function and thread data */
} NFQThreadVars; } NFQThreadVars;

Loading…
Cancel
Save