// readARP watches a handle for incoming ARP responses we might care about, and prints them. // // readARP loops until 'stop' is closed. func readARP(handle *pcap.Handle, iface *net.Interface, stop chan struct{}) { src := gopacket.NewPacketSource(handle, layers.LayerTypeEthernet) in := src.Packets() for { var packet gopacket.Packet select { case <-stop: return case packet = <-in: arpLayer := packet.Layer(layers.LayerTypeARP) if arpLayer == nil { continue } arp := arpLayer.(*layers.ARP) if arp.Operation != layers.ARPReply || bytes.Equal([]byte(iface.HardwareAddr), arp.SourceHwAddress) { // This is a packet I sent. continue } // Note: we might get some packets here that aren't responses to ones we've sent, // if for example someone else sends US an ARP request. Doesn't much matter, though... // all information is good information :) log.Printf("IP %v is at %v", net.IP(arp.SourceProtAddress), net.HardwareAddr(arp.SourceHwAddress)) } } }
func checkLayers(p gopacket.Packet, want []gopacket.LayerType, t *testing.T) { layers := p.Layers() t.Log("Checking packet layers, want", want) for _, l := range layers { t.Logf(" Got layer %v, %d bytes, payload of %d bytes", l.LayerType(), len(l.LayerContents()), len(l.LayerPayload())) } t.Log(p) if len(layers) != len(want) { t.Errorf(" Number of layers mismatch: got %d want %d", len(layers), len(want)) return } for i, l := range layers { if l.LayerType() != want[i] { t.Errorf(" Layer %d mismatch: got %v want %v", i, l.LayerType(), want[i]) } } }