From: Russ Combs Date: Wed, 26 Nov 2014 12:57:12 +0000 (-0500) Subject: fix daq break X-Git-Tag: 3.0.0-233~1152^2~8 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c9d495ae8f0d730db7974f0e1d8de21092d242fd;p=thirdparty%2Fsnort3.git fix daq break --- diff --git a/src/main/analyzer.cc b/src/main/analyzer.cc index 046fdad02..ecbccdc18 100644 --- a/src/main/analyzer.cc +++ b/src/main/analyzer.cc @@ -46,6 +46,7 @@ Analyzer::Analyzer(const char* s) source = s; command = AC_NONE; swap = nullptr; + daqh = nullptr; } void Analyzer::operator()(unsigned id, Swapper* ps) @@ -55,6 +56,7 @@ void Analyzer::operator()(unsigned id, Swapper* ps) pin_thread_to_cpu(source); snort_thread_init(source); + daqh = DAQ_GetHandle(); analyze(); @@ -69,10 +71,14 @@ bool Analyzer::execute(AnalyzerCommand ac) if ( command && command != AC_PAUSE ) return false; + if ( ac == AC_STOP ) + DAQ_BreakLoop(-1, daqh); + // FIXIT-L executing a command while paused // will cause a resume command = ac; take_break(); + return true; } diff --git a/src/main/analyzer.h b/src/main/analyzer.h index 773e25048..045f30d9a 100644 --- a/src/main/analyzer.h +++ b/src/main/analyzer.h @@ -62,6 +62,7 @@ private: const char* source; volatile AnalyzerCommand command; Swapper* swap; + void* daqh; }; #endif diff --git a/src/main/snort.cc b/src/main/snort.cc index 225faa00b..40a9cdb56 100644 --- a/src/main/snort.cc +++ b/src/main/snort.cc @@ -840,7 +840,7 @@ DAQ_Verdict packet_callback( if ( snort_conf->pkt_cnt && pc.total_from_daq >= snort_conf->pkt_cnt ) DAQ_BreakLoop(-1); - if ( break_time() ) + else if ( break_time() ) DAQ_BreakLoop(0); MODULE_PROFILE_END(totalPerfStats); diff --git a/src/packet_io/sfdaq.cc b/src/packet_io/sfdaq.cc index e56ade841..2990e6be7 100644 --- a/src/packet_io/sfdaq.cc +++ b/src/packet_io/sfdaq.cc @@ -543,10 +543,17 @@ int DAQ_Inject(const DAQ_PktHdr_t* h, int rev, const uint8_t* buf, uint32_t len) return err; } -int DAQ_BreakLoop (int error) +//-------------------------------------------------------------------- + +void* DAQ_GetHandle() +{ return daq_hand; } + +int DAQ_BreakLoop (int error, void* hand) { + if ( !hand ) + hand = daq_hand; s_error = error; - return ( daq_breakloop(daq_mod, daq_hand) == DAQ_SUCCESS ); + return ( daq_breakloop(daq_mod, hand) == DAQ_SUCCESS ); } //-------------------------------------------------------------------- diff --git a/src/packet_io/sfdaq.h b/src/packet_io/sfdaq.h index 3d932dc68..c7585250d 100644 --- a/src/packet_io/sfdaq.h +++ b/src/packet_io/sfdaq.h @@ -76,7 +76,10 @@ int DAQ_Stop(void); // (but only where performance justifies exposing implementation!) int DAQ_Acquire(int max, DAQ_Analysis_Func_t, uint8_t* user); int DAQ_Inject(const DAQ_PktHdr_t*, int rev, const uint8_t* buf, uint32_t len); -int DAQ_BreakLoop(int error); + +void* DAQ_GetHandle(); +int DAQ_BreakLoop(int error, void* handle = nullptr); + #ifdef HAVE_DAQ_ACQUIRE_WITH_META void DAQ_Set_MetaCallback(DAQ_Meta_Func_t meta_callback); #endif