// 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 handlePacket(p gopacket.Packet) { ap := AP{} // extract beacon // extract Ssid for _, l := range p.Layers() { switch l.LayerType() { case layers.LayerTypeDot11MgmtBeacon: beacon, ok := p.Layer(layers.LayerTypeDot11MgmtBeacon).(*layers.Dot11MgmtBeacon) if !ok { log.Println("Could not marshal layer thing") continue } pack := gopacket.NewPacket(beacon.LayerContents(), layers.LayerTypeDot11MgmtBeacon, gopacket.Default) for _, subpack := range pack.Layers() { info, ok := subpack.(*layers.Dot11InformationElement) if !ok { continue } if info.ID == layers.Dot11InformationElementIDSSID { ap.Ssid = fmt.Sprintf("%s", info.Info) break } } case layers.LayerTypeDot11: base, ok := p.Layer(layers.LayerTypeDot11).(*layers.Dot11) if !ok { continue } ap.Bssid = base.Address2 continue case layers.LayerTypeRadioTap: radio, ok := p.Layer(layers.LayerTypeRadioTap).(*layers.RadioTap) if !ok { continue } ap.Channel = radio.ChannelFrequency continue } } APList[ap.Ssid] = ap }
//Returns both the source & destination IP. func getSrcDstIP(packet gopacket.Packet) (net.IP, net.IP) { ipLayer := packet.Layer(layers.LayerTypeIPv4) // Get IP data from this layer ip, _ := ipLayer.(*layers.IPv4) return ip.SrcIP, ip.DstIP }