diff --git a/scripts/base/init-bare.bro b/scripts/base/init-bare.bro index 0097e4d47b..e2b0e169df 100644 --- a/scripts/base/init-bare.bro +++ b/scripts/base/init-bare.bro @@ -3710,28 +3710,20 @@ export { ## external harness and shouldn't output anything to the console. const errors_to_stderr = T &redef; } +module GLOBAL; -module Fanout; - -type Method: enum { - METHOD_HASH = 0, - METHOD_LB = 1, - METHOD_CPU = 2, - METHOD_ROLLOVER = 3 -}; - -type Flag: enum { - FLAG_NONE = 0, - FLAG_DEFRAG = 0x8000, - FLAG_ROLLOVER = 0x1000 -}; - +module PacketFanout; export { + ## Toggle whether to do packet fanout. const enable = F &redef; + + ## The packet fanout id should be shared amongst worker processes operating + ## the same socket. const id = 0 &redef; - const method = METHOD_HASH &redef; - const flag = FLAG_NONE &redef; -} + + ## If true, causes packets to be defragmented before fanout is applied. + const flag_defrag = T &redef; +} # end export module GLOBAL; ## Number of bytes per packet to capture from live interfaces. diff --git a/src/const.bif b/src/const.bif index f96b15818b..2129a22578 100644 --- a/src/const.bif +++ b/src/const.bif @@ -9,8 +9,8 @@ const detect_filtered_trace: bool; const report_gaps_for_partial: bool; const exit_only_after_terminate: bool; -const Fanout::enable: bool; -const Fanout::id: count; +const PacketFanout::enable: bool; +const PacketFanout::id: count; const NFS3::return_data: bool; const NFS3::return_data_max: count; diff --git a/src/iosource/IOSource.h b/src/iosource/IOSource.h index a129429e0e..356b8eee70 100644 --- a/src/iosource/IOSource.h +++ b/src/iosource/IOSource.h @@ -5,25 +5,8 @@ #ifdef HAVE_PACKET_FANOUT #include -#ifndef PACKET_FANOUT -#define PACKET_FANOUT 18 -#define PACKET_FANOUT_HASH 0 -#define PACKET_FANOUT_LB 1 -#define PACKET_FANOUT_CPU 2 -#define PACKET_FANOUT_FLAG_DEFRAG 0x8000 - -#ifndef PACKET_FANOUT_ROLLOVER -#define PACKET_FANOUT_ROLLOVER 3 #endif -#ifndef PACKET_FANOUT_FLAG_ROLLOVER -#define PACKET_FANOUT_FLAG_ROLLOVER 0x1000 -#endif - -#define PACKET_FANOUT_FLAG_NONE -1 -#endif /* PACKET_FANOUT */ -#endif /* HAVE_PACKET_FANOUT */ - extern "C" { #include } diff --git a/src/iosource/pcap/Source.cc b/src/iosource/pcap/Source.cc index e430dfc6a7..9dc36cfa5f 100644 --- a/src/iosource/pcap/Source.cc +++ b/src/iosource/pcap/Source.cc @@ -161,10 +161,14 @@ void PcapSource::OpenLive() #ifdef HAVE_PACKET_FANOUT /* Turn on cluster mode for the device. */ - if ( fanout_enable ) + if ( packet_fanout_enable ) { - uint32_t fanout_arg = (fanout_method << 16) | (fanout_id & 0xffff); - if (setsockopt(props.selectable_fd, SOL_PACKET, PACKET_FANOUT, &fanout_arg, sizeof(fanout_arg)) == -1) + uint32_t packet_fanout_arg = (PACKET_FANOUT_HASH << 16) | (packet_fanout_id & 0xffff); + + if ( packet_fanout_flag_defrag ) + packet_fanout_arg |= (PACKET_FANOUT_FLAG_DEFRAG << 16); + + if (setsockopt(props.selectable_fd, SOL_PACKET, PACKET_FANOUT, &packet_fanout_arg, sizeof(packet_fanout_arg)) == -1) { Error(fmt("%s: setsockopt: %s", __FUNCTION__, strerror(errno))); return; diff --git a/src/iosource/pcap/Source.h b/src/iosource/pcap/Source.h index 2f169f7819..0e618e06e3 100644 --- a/src/iosource/pcap/Source.h +++ b/src/iosource/pcap/Source.h @@ -6,10 +6,9 @@ #include "../PktSrc.h" #ifdef HAVE_PACKET_FANOUT -extern bool fanout_enable; -extern int fanout_id; -extern int fanout_method; -extern int fanout_flag; +extern bool packet_fanout_enable; +extern int packet_fanout_id; +extern bool packet_fanout_flag_defrag; #endif namespace iosource { diff --git a/src/main.cc b/src/main.cc index b7d1bbfa40..207dae6193 100644 --- a/src/main.cc +++ b/src/main.cc @@ -125,10 +125,9 @@ int snaplen = 0; // this gets set from the scripting-layer's value int bufsize = 0; #ifdef HAVE_PACKET_FANOUT -bool fanout_enable = false; -int fanout_id = 0; -int fanout_method = PACKET_FANOUT_HASH; -int fanout_flag = 0; +bool packet_fanout_enable = false; +int packet_fanout_id = 0; +bool packet_fanout_flag_defrag = false; #endif OpaqueType* md5_type = 0; @@ -1001,10 +1000,9 @@ int main(int argc, char** argv) bufsize = internal_val("bufsize")->AsCount() * 1024 * 1024; #ifdef HAVE_PACKET_FANOUT - fanout_enable = internal_val("Fanout::enable")->AsBool(); - fanout_id = internal_val("Fanout::id")->AsCount(); - fanout_method = internal_val("Fanout::method")->AsEnum(); - fanout_flag = internal_val("Fanout::flag")->AsEnum(); + packet_fanout_enable = internal_val("PacketFanout::enable")->AsBool(); + packet_fanout_id = internal_val("PacketFanout::id")->AsCount(); + packet_fanout_flag_defrag = internal_val("PacketFanout::flag_defrag")->AsBool(); #endif if ( dns_type != DNS_PRIME )