|
|
|
@ -196,8 +196,9 @@ static int NFQCallBack(struct nfq_q_handle *qh, struct nfgenmsg *nfmsg,
|
|
|
|
|
|
|
|
|
|
|
|
TmEcode NFQInitThread(NFQThreadVars *nfq_t, uint16_t queue_num, uint32_t queue_maxlen)
|
|
|
|
TmEcode NFQInitThread(NFQThreadVars *nfq_t, uint16_t queue_num, uint32_t queue_maxlen)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
#ifndef OS_WIN32
|
|
|
|
struct timeval tv;
|
|
|
|
struct timeval tv;
|
|
|
|
|
|
|
|
#endif
|
|
|
|
nfq_t->queue_num = queue_num;
|
|
|
|
nfq_t->queue_num = queue_num;
|
|
|
|
|
|
|
|
|
|
|
|
SCLogDebug("opening library handle");
|
|
|
|
SCLogDebug("opening library handle");
|
|
|
|
@ -268,6 +269,7 @@ TmEcode NFQInitThread(NFQThreadVars *nfq_t, uint16_t queue_num, uint32_t queue_m
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif /* HAVE_NFQ_MAXLEN */
|
|
|
|
#endif /* HAVE_NFQ_MAXLEN */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef OS_WIN32
|
|
|
|
/* set netlink buffer size to a decent value */
|
|
|
|
/* set netlink buffer size to a decent value */
|
|
|
|
nfnl_rcvbufsiz(nfq_nfnlh(nfq_t->h), queue_maxlen * 1500);
|
|
|
|
nfnl_rcvbufsiz(nfq_nfnlh(nfq_t->h), queue_maxlen * 1500);
|
|
|
|
SCLogInfo("setting nfnl bufsize to %" PRId32 "", queue_maxlen * 1500);
|
|
|
|
SCLogInfo("setting nfnl bufsize to %" PRId32 "", queue_maxlen * 1500);
|
|
|
|
@ -286,6 +288,12 @@ TmEcode NFQInitThread(NFQThreadVars *nfq_t, uint16_t queue_num, uint32_t queue_m
|
|
|
|
|
|
|
|
|
|
|
|
SCLogDebug("nfq_t->h %p, nfq_t->nh %p, nfq_t->qh %p, nfq_t->fd %" PRId32 "",
|
|
|
|
SCLogDebug("nfq_t->h %p, nfq_t->nh %p, nfq_t->qh %p, nfq_t->fd %" PRId32 "",
|
|
|
|
nfq_t->h, nfq_t->nh, nfq_t->qh, nfq_t->fd);
|
|
|
|
nfq_t->h, nfq_t->nh, nfq_t->qh, nfq_t->fd);
|
|
|
|
|
|
|
|
#else /* OS_WIN32 */
|
|
|
|
|
|
|
|
SCMutexInit(&nfq_t->mutex_qh, NULL);
|
|
|
|
|
|
|
|
nfq_t->ovr.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
|
|
|
|
|
|
|
|
nfq_t->fd = nfq_fd(nfq_t->h);
|
|
|
|
|
|
|
|
SCLogDebug("nfq_t->h %p, nfq_t->qh %p, nfq_t->fd %p", nfq_t->h, nfq_t->qh, nfq_t->fd);
|
|
|
|
|
|
|
|
#endif /* OS_WIN32 */
|
|
|
|
return TM_ECODE_OK;
|
|
|
|
return TM_ECODE_OK;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -293,9 +301,11 @@ TmEcode ReceiveNFQThreadInit(ThreadVars *tv, void *initdata, void **data) {
|
|
|
|
SCMutexLock(&nfq_init_lock);
|
|
|
|
SCMutexLock(&nfq_init_lock);
|
|
|
|
SCLogDebug("starting... will bind to queuenum %" PRIu32 "", receive_queue_num);
|
|
|
|
SCLogDebug("starting... will bind to queuenum %" PRIu32 "", receive_queue_num);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef OS_WIN32
|
|
|
|
sigset_t sigs;
|
|
|
|
sigset_t sigs;
|
|
|
|
sigfillset(&sigs);
|
|
|
|
sigfillset(&sigs);
|
|
|
|
pthread_sigmask(SIG_BLOCK, &sigs, NULL);
|
|
|
|
pthread_sigmask(SIG_BLOCK, &sigs, NULL);
|
|
|
|
|
|
|
|
#endif /* OS_WIN32 */
|
|
|
|
|
|
|
|
|
|
|
|
NFQThreadVars *ntv = &nfq_t[receive_queue_num];
|
|
|
|
NFQThreadVars *ntv = &nfq_t[receive_queue_num];
|
|
|
|
|
|
|
|
|
|
|
|
@ -354,10 +364,49 @@ void NFQRecvPkt(NFQThreadVars *t) {
|
|
|
|
int rv, ret;
|
|
|
|
int rv, ret;
|
|
|
|
char buf[70000];
|
|
|
|
char buf[70000];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef OS_WIN32
|
|
|
|
|
|
|
|
static int timeouted = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (timeouted) {
|
|
|
|
|
|
|
|
if (WaitForSingleObject(t->ovr.hEvent, 1000) == WAIT_TIMEOUT) {
|
|
|
|
|
|
|
|
rv = -1;
|
|
|
|
|
|
|
|
errno = EINTR;
|
|
|
|
|
|
|
|
goto process_rv;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
timeouted = 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
read_packet_again:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!ReadFile(t->fd, buf, sizeof(buf), (DWORD*)&rv, &t->ovr)) {
|
|
|
|
|
|
|
|
if (GetLastError() != ERROR_IO_PENDING) {
|
|
|
|
|
|
|
|
rv = -1;
|
|
|
|
|
|
|
|
errno = EIO;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
if (WaitForSingleObject(t->ovr.hEvent, 1000) == WAIT_TIMEOUT) {
|
|
|
|
|
|
|
|
rv = -1;
|
|
|
|
|
|
|
|
errno = EINTR;
|
|
|
|
|
|
|
|
timeouted = 1;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
/* We needn't to call GetOverlappedResult() because it always fail with our error code ERROR_MORE_DATA. */
|
|
|
|
|
|
|
|
goto read_packet_again;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
process_rv:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#else /* OS_WIN32 */
|
|
|
|
/* XXX what happens on rv == 0? */
|
|
|
|
/* XXX what happens on rv == 0? */
|
|
|
|
rv = recv(t->fd, buf, sizeof(buf), 0);
|
|
|
|
rv = recv(t->fd, buf, sizeof(buf), 0);
|
|
|
|
|
|
|
|
#endif /* OS_WIN32 */
|
|
|
|
|
|
|
|
|
|
|
|
if (rv < 0) {
|
|
|
|
if (rv < 0) {
|
|
|
|
if (errno == EINTR || errno == EWOULDBLOCK) {
|
|
|
|
if (errno == EINTR
|
|
|
|
|
|
|
|
#ifndef OS_WIN32
|
|
|
|
|
|
|
|
|| errno == EWOULDBLOCK
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
) {
|
|
|
|
/* no error on timeout */
|
|
|
|
/* no error on timeout */
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
#ifdef COUNTERS
|
|
|
|
#ifdef COUNTERS
|
|
|
|
|