func (sniffer *SnifferSetup) Reopen() error { var err error if sniffer.config.Type != "pcap" || sniffer.config.File == "" { return fmt.Errorf("Reopen is only possible for files") } sniffer.pcapHandle.Close() sniffer.pcapHandle, err = pcap.OpenOffline(sniffer.config.File) if err != nil { return err } sniffer.DataSource = gopacket.PacketDataSource(sniffer.pcapHandle) return nil }
func (sniffer *SnifferSetup) setFromConfig(config *config.InterfacesConfig) error { var err error sniffer.config = config if len(sniffer.config.File) > 0 { logp.Debug("sniffer", "Reading from file: %s", sniffer.config.File) // we read file with the pcap provider sniffer.config.Type = "pcap" } // set defaults if len(sniffer.config.Device) == 0 { sniffer.config.Device = "any" } if index, err := strconv.Atoi(sniffer.config.Device); err == nil { // Device is numeric devices, err := ListDeviceNames() if err != nil { return fmt.Errorf("Error getting devices list: %v", err) } sniffer.config.Device, err = deviceNameFromIndex(index, devices) if err != nil { return fmt.Errorf("Couldn't understand device index %d: %v", index, err) } logp.Info("Resolved device index %d to device: %s", index, sniffer.config.Device) } if sniffer.config.Snaplen == 0 { sniffer.config.Snaplen = 65535 } if sniffer.config.Type == "autodetect" || sniffer.config.Type == "" { sniffer.config.Type = "pcap" } logp.Debug("sniffer", "Sniffer type: %s device: %s", sniffer.config.Type, sniffer.config.Device) switch sniffer.config.Type { case "pcap": if len(sniffer.config.File) > 0 { sniffer.pcapHandle, err = pcap.OpenOffline(sniffer.config.File) if err != nil { return err } } else { sniffer.pcapHandle, err = pcap.OpenLive( sniffer.config.Device, int32(sniffer.config.Snaplen), true, 500*time.Millisecond) if err != nil { return err } err = sniffer.pcapHandle.SetBPFFilter(sniffer.config.Bpf_filter) if err != nil { return err } } sniffer.DataSource = gopacket.PacketDataSource(sniffer.pcapHandle) case "af_packet": if sniffer.config.Buffer_size_mb == 0 { sniffer.config.Buffer_size_mb = 24 } frame_size, block_size, num_blocks, err := afpacketComputeSize( sniffer.config.Buffer_size_mb, sniffer.config.Snaplen, os.Getpagesize()) if err != nil { return err } sniffer.afpacketHandle, err = NewAfpacketHandle( sniffer.config.Device, frame_size, block_size, num_blocks, 500*time.Millisecond) if err != nil { return err } err = sniffer.afpacketHandle.SetBPFFilter(sniffer.config.Bpf_filter) if err != nil { return fmt.Errorf("SetBPFFilter failed: %s", err) } sniffer.DataSource = gopacket.PacketDataSource(sniffer.afpacketHandle) case "pfring": sniffer.pfringHandle, err = NewPfringHandle( sniffer.config.Device, sniffer.config.Snaplen, true) if err != nil { return err } err = sniffer.pfringHandle.SetBPFFilter(sniffer.config.Bpf_filter) if err != nil { return fmt.Errorf("SetBPFFilter failed: %s", err) } err = sniffer.pfringHandle.Enable() if err != nil { return fmt.Errorf("Enable failed: %s", err) } sniffer.DataSource = gopacket.PacketDataSource(sniffer.pfringHandle) default: return fmt.Errorf("Unknown sniffer type: %s", sniffer.config.Type) } return nil }
func (sniffer *SnifferSetup) setFromConfig(config *config.InterfacesConfig) error { var err error sniffer.config = config if len(sniffer.config.File) > 0 { logp.Debug("sniffer", "Reading from file: %s", sniffer.config.File) // we read file with the pcap provider sniffer.config.Type = "pcap" } // set defaults if len(sniffer.config.Device) == 0 { sniffer.config.Device = "any" } if len(sniffer.config.Devices) == 0 { // 'devices' not set but 'device' is set. For backwards compatibility, // use the one configured device if len(sniffer.config.Device) > 0 { sniffer.config.Devices = []string{sniffer.config.Device} } } if sniffer.config.Snaplen == 0 { sniffer.config.Snaplen = 65535 } if sniffer.config.Type == "autodetect" || sniffer.config.Type == "" { sniffer.config.Type = "pcap" } logp.Debug("sniffer", "Sniffer type: %s devices: %s", sniffer.config.Type, sniffer.config.Devices) switch sniffer.config.Type { case "pcap": if len(sniffer.config.File) > 0 { sniffer.pcapHandle, err = pcap.OpenOffline(sniffer.config.File) if err != nil { return err } } else { if len(sniffer.config.Devices) > 1 { return fmt.Errorf("Pcap sniffer only supports one device. You can use 'any' if you want") } sniffer.pcapHandle, err = pcap.OpenLive( sniffer.config.Devices[0], int32(sniffer.config.Snaplen), true, 500*time.Millisecond) if err != nil { return err } err = sniffer.pcapHandle.SetBPFFilter(sniffer.config.Bpf_filter) if err != nil { return err } } sniffer.DataSource = gopacket.PacketDataSource(sniffer.pcapHandle) case "af_packet": if sniffer.config.Buffer_size_mb == 0 { sniffer.config.Buffer_size_mb = 24 } if len(sniffer.config.Devices) > 1 { return fmt.Errorf("Afpacket sniffer only supports one device. You can use 'any' if you want") } frame_size, block_size, num_blocks, err := afpacketComputeSize( sniffer.config.Buffer_size_mb, sniffer.config.Snaplen, os.Getpagesize()) if err != nil { return err } sniffer.afpacketHandle, err = NewAfpacketHandle( sniffer.config.Devices[0], frame_size, block_size, num_blocks, 500*time.Millisecond) if err != nil { return err } err = sniffer.afpacketHandle.SetBPFFilter(sniffer.config.Bpf_filter) if err != nil { return fmt.Errorf("SetBPFFilter failed: %s", err) } sniffer.DataSource = gopacket.PacketDataSource(sniffer.afpacketHandle) case "pfring": if len(sniffer.config.Devices) > 1 { return fmt.Errorf("Afpacket sniffer only supports one device. You can use 'any' if you want") } sniffer.pfringHandle, err = NewPfringHandle( sniffer.config.Devices[0], sniffer.config.Snaplen, true) if err != nil { return err } err = sniffer.pfringHandle.SetBPFFilter(sniffer.config.Bpf_filter) if err != nil { return fmt.Errorf("SetBPFFilter failed: %s", err) } err = sniffer.pfringHandle.Enable() if err != nil { return fmt.Errorf("Enable failed: %s", err) } sniffer.DataSource = gopacket.PacketDataSource(sniffer.pfringHandle) default: return fmt.Errorf("Unknown sniffer type: %s", sniffer.config.Type) } return nil }