diff --git a/input_raw.go b/input_raw.go index 7b10fc3..d022c73 100644 --- a/input_raw.go +++ b/input_raw.go @@ -81,7 +81,7 @@ func (i *RAWInput) listen(address string) { log.Fatal("input-raw: error while parsing address", err) } - i.listener = raw.NewListener(host, port, i.engine, i.trackResponse, i.expire, i.bpfFilter, i.timestampType, i.bufferSize, Settings.inputRAWOverrideSnapLen) + i.listener = raw.NewListener(host, port, i.engine, i.trackResponse, i.expire, i.bpfFilter, i.timestampType, i.bufferSize, Settings.inputRAWOverrideSnapLen, Settings.inputRAWImmediateMode) ch := i.listener.Receiver() diff --git a/raw_socket_listener/listener.go b/raw_socket_listener/listener.go index c2b9bba..0d5fa6d 100644 --- a/raw_socket_listener/listener.go +++ b/raw_socket_listener/listener.go @@ -75,6 +75,7 @@ type Listener struct { bpfFilter string timestampType string overrideSnapLen bool + immediateMode bool bufferSize int @@ -99,7 +100,7 @@ const ( ) // NewListener creates and initializes new Listener object -func NewListener(addr string, port string, engine int, trackResponse bool, expire time.Duration, bpfFilter string, timestampType string, bufferSize int, overrideSnapLen bool) (l *Listener) { +func NewListener(addr string, port string, engine int, trackResponse bool, expire time.Duration, bpfFilter string, timestampType string, bufferSize int, overrideSnapLen bool, immediateMode bool) (l *Listener) { l = &Listener{} l.packetsChan = make(chan *packet, 10000) @@ -115,6 +116,7 @@ func NewListener(addr string, port string, engine int, trackResponse bool, expir l.trackResponse = trackResponse l.bpfFilter = bpfFilter l.timestampType = timestampType + l.immediateMode = immediateMode l.bufferSize = bufferSize l.overrideSnapLen = overrideSnapLen @@ -360,7 +362,10 @@ func (t *Listener) readPcap() { inactive.SetTimeout(t.messageExpire) inactive.SetPromisc(true) - + inactive.SetImmediateMode(t.immediateMode) + if t.immediateMode { + log.Println("Setting immediate mode") + } if t.bufferSize > 0 { inactive.SetBufferSize(t.bufferSize) } diff --git a/settings.go b/settings.go index 92b8f9d..5eb2596 100644 --- a/settings.go +++ b/settings.go @@ -58,6 +58,7 @@ type AppSettings struct { inputRAWBpfFilter string inputRAWTimestampType string copyBufferSize int + inputRAWImmediateMode bool inputRawBufferSize int inputRAWOverrideSnapLen bool @@ -142,6 +143,7 @@ func init() { flag.StringVar(&Settings.inputRAWTimestampType, "input-raw-timestamp-type", "", "Possible values: PCAP_TSTAMP_HOST, PCAP_TSTAMP_HOST_LOWPREC, PCAP_TSTAMP_HOST_HIPREC, PCAP_TSTAMP_ADAPTER, PCAP_TSTAMP_ADAPTER_UNSYNCED. This values not supported on all systems, GoReplay will tell you available values of you put wrong one.") flag.IntVar(&Settings.copyBufferSize, "copy-buffer-size", 5*1024*1024, "Set the buffer size for an individual request (default 5M)") flag.BoolVar(&Settings.inputRAWOverrideSnapLen, "input-raw-override-snaplen", false, "Override the capture snaplen to be 64k. Required for some Virtualized environments") + flag.BoolVar(&Settings.inputRAWImmediateMode, "input-raw-immediate-mode", false, "Set pcap interface to immediate mode.") flag.IntVar(&Settings.inputRawBufferSize, "input-raw-buffer-size", 0, "Controls size of the OS buffer (in bytes) which holds packets until they dispatched. Default value depends by system: in Linux around 2MB. If you see big package drop, increase this value.")