CaptureInterface dump all packet on specified network interface
(iface *net.Interface, devices *[]pcap.Interface, bpffilter string, f *os.File, verbose bool)
| 59 | |
| 60 | // CaptureInterface dump all packet on specified network interface |
| 61 | func CaptureInterface(iface *net.Interface, devices *[]pcap.Interface, bpffilter string, f *os.File, verbose bool) error { |
| 62 | // We just look for IPv4 addresses, so try to find if the interface has one. |
| 63 | var addr *net.IPNet |
| 64 | addrs, err := iface.Addrs() |
| 65 | if err != nil { |
| 66 | return err |
| 67 | } |
| 68 | |
| 69 | for _, a := range addrs { |
| 70 | if ipnet, ok := a.(*net.IPNet); ok { |
| 71 | if ip4 := ipnet.IP.To4(); ip4 != nil { |
| 72 | addr = &net.IPNet{ |
| 73 | IP: ip4, |
| 74 | Mask: ipnet.Mask[len(ipnet.Mask)-4:], |
| 75 | } |
| 76 | break |
| 77 | } |
| 78 | } |
| 79 | } |
| 80 | |
| 81 | fmt.Printf("[INFO] Using network range %v for interface \"%v\"", addr, iface.Name) |
| 82 | |
| 83 | // Try to find a match between device and interface |
| 84 | var deviceName string |
| 85 | for _, d := range *devices { |
| 86 | if strings.Contains(fmt.Sprint(d.Addresses), fmt.Sprint(addr.IP)) { |
| 87 | deviceName = d.Name |
| 88 | } |
| 89 | } |
| 90 | |
| 91 | if deviceName == "" { |
| 92 | return fmt.Errorf("Cannot find the corresponding device for the interface \"%v\"", iface.Name) |
| 93 | } |
| 94 | |
| 95 | // Open up a pcap handle for packet reads/writes. |
| 96 | handle, err := pcap.OpenLive(deviceName, 65536, true, pcap.BlockForever) |
| 97 | if err != nil { |
| 98 | return err |
| 99 | } |
| 100 | defer handle.Close() |
| 101 | |
| 102 | // BPF filter |
| 103 | if len(bpffilter) > 0 { |
| 104 | if err = handle.SetBPFFilter(bpffilter); err != nil { |
| 105 | return fmt.Errorf("BPF filter error: %s", err.Error()) |
| 106 | } |
| 107 | } |
| 108 | |
| 109 | // Starting capture |
| 110 | w := pcapgo.NewWriter(f) |
| 111 | w.WriteFileHeader(65536, layers.LinkTypeEthernet) |
| 112 | |
| 113 | packetSource := gopacket.NewPacketSource(handle, handle.LinkType()) |
| 114 | for packet := range packetSource.Packets() { |
| 115 | w.WritePacket(packet.Metadata().CaptureInfo, packet.Data()) |
| 116 | } |
| 117 | |
| 118 | return nil |
no outgoing calls
no test coverage detected