nfq: Add autofp mode support

remotes/origin/master-1.2.x
Eric Leblond 14 years ago committed by Victor Julien
parent 115c3499d2
commit aee2e3ddd6

@ -50,6 +50,9 @@ void RunModeIpsNFQRegister(void)
"Multi threaded NFQ IPS mode",
RunModeIpsNFQAuto);
RunModeRegisterNewRunMode(RUNMODE_NFQ, "autofp",
"Multi threaded NFQ IPS mode with respect to flow",
RunModeIpsNFQAutoFp);
return;
}
@ -90,3 +93,23 @@ int RunModeIpsNFQAuto(DetectEngineCtx *de_ctx)
#endif /* NFQ */
return ret;
}
int RunModeIpsNFQAutoFp(DetectEngineCtx *de_ctx)
{
SCEnter();
int ret = 0;
#ifdef NFQ
RunModeInitialize();
TimeModeSetLive();
ret = RunModeSetIPSAutoFp(de_ctx,
NFQGetThread,
"ReceiveNFQ",
"VerdictNFQ",
"DecodeNFQ");
#endif /* NFQ */
return ret;
}

@ -24,6 +24,7 @@
#define __RUNMODE_NFQ_H__
int RunModeIpsNFQAuto(DetectEngineCtx *);
int RunModeIpsNFQAutoFp(DetectEngineCtx *);
void RunModeIpsNFQRegister(void);
const char *RunModeIpsNFQGetDefaultMode(void);

@ -41,7 +41,6 @@
#include "conf.h"
#include "config.h"
#include "conf-yaml-loader.h"
#include "source-nfq.h"
#include "source-nfq-prototypes.h"
#include "action-globals.h"
@ -51,6 +50,8 @@
#include "util-privs.h"
#include "util-device.h"
#include "source-nfq.h"
#ifndef NFQ
/** Handle the case where no NFQ support is compiled in.
*
@ -114,6 +115,16 @@ int already_seen_warning;
//#define NFQ_DFT_QUEUE_LEN NFQ_BURST_FACTOR * MAX_PENDING
//#define NFQ_NF_BUFSIZE 1500 * NFQ_DFT_QUEUE_LEN
typedef struct NFQThreadVars_
{
uint16_t nfq_index;
ThreadVars *tv;
TmSlot *slot;
char *data; /** Per function and thread data */
int datalen; /** Length of per function and thread data */
} NFQThreadVars;
/* shared vars for all for nfq queues and threads */
static NFQGlobalVars nfq_g;
@ -123,6 +134,7 @@ static uint16_t receive_queue_num = 0;
static SCMutex nfq_init_lock;
TmEcode ReceiveNFQ(ThreadVars *, Packet *, void *, PacketQueue *, PacketQueue *);
TmEcode ReceiveNFQLoop(ThreadVars *tv, void *data, void *slot);
TmEcode ReceiveNFQThreadInit(ThreadVars *, void *, void **);
TmEcode ReceiveNFQThreadDeinit(ThreadVars *, void *);
void ReceiveNFQThreadExitStats(ThreadVars *, void *);
@ -157,6 +169,7 @@ void TmModuleReceiveNFQRegister (void) {
tmm_modules[TMM_RECEIVENFQ].name = "ReceiveNFQ";
tmm_modules[TMM_RECEIVENFQ].ThreadInit = ReceiveNFQThreadInit;
tmm_modules[TMM_RECEIVENFQ].Func = ReceiveNFQ;
tmm_modules[TMM_RECEIVENFQ].PktAcqLoop = ReceiveNFQLoop;
tmm_modules[TMM_RECEIVENFQ].ThreadExitPrintStats = ReceiveNFQThreadExitStats;
tmm_modules[TMM_RECEIVENFQ].ThreadDeinit = ReceiveNFQThreadDeinit;
tmm_modules[TMM_RECEIVENFQ].RegisterTests = NULL;
@ -341,8 +354,15 @@ static int NFQCallBack(struct nfq_q_handle *qh, struct nfgenmsg *nfmsg,
nfq_q->bytes += GET_PKT_LEN(p);
#endif /* COUNTERS */
/* pass on... */
tv->tmqh_out(tv, p);
if (ntv->slot) {
if (TmThreadsSlotProcessPkt(tv, ntv->slot, p) != TM_ECODE_OK) {
TmqhOutputPacketpool(ntv->tv, p);
return -1;
}
} else {
/* pass on... */
tv->tmqh_out(tv, p);
}
return 0;
}
@ -765,6 +785,28 @@ process_rv:
}
#endif /* OS_WIN32 */
/**
* \brief Main NFQ reading Loop function
*/
TmEcode ReceiveNFQLoop(ThreadVars *tv, void *data, void *slot)
{
SCEnter();
NFQThreadVars *ntv = (NFQThreadVars *)data;
NFQQueueVars *nq = NFQGetQueue(ntv->nfq_index);
ntv->slot = ((TmSlot *) slot)->slot_next;
while(1) {
if (suricata_ctl_flags != 0) {
break;
}
NFQRecvPkt(nq, ntv);
SCPerfSyncCountersIfSignalled(tv, 0);
}
SCReturnInt(TM_ECODE_OK);
}
/**
* \brief NFQ receive module main entry function: receive a packet from NFQ
*/

@ -50,16 +50,6 @@ typedef struct NFQPacketVars_
uint16_t hw_protocol;
} NFQPacketVars;
typedef struct NFQThreadVars_
{
uint16_t nfq_index;
ThreadVars *tv;
char *data; /** Per function and thread data */
int datalen; /** Length of per function and thread data */
} NFQThreadVars;
typedef struct NFQQueueVars_
{
struct nfq_handle *h;

Loading…
Cancel
Save