func (b *Bridge) snooper() { var ( dot1q layers.Dot1Q eth layers.Ethernet ip4 layers.IPv4 ip6 layers.IPv6 arp layers.ARP ) parser := gopacket.NewDecodingLayerParser(layers.LayerTypeEthernet, &dot1q, ð, &ip4, &ip6, &arp, ) decodedLayers := []gopacket.LayerType{} for { data, _, err := b.handle.ReadPacketData() if err != nil { if err != io.EOF { log.Error("error reading packet data: ", err) } break } if err := parser.DecodeLayers(data, &decodedLayers); err != nil { if err2, ok := err.(gopacket.UnsupportedLayerType); ok { switch gopacket.LayerType(err2) { case layers.LayerTypeICMPv6, gopacket.LayerTypePayload: // ignore err = nil default: continue } } if err != nil { log.Error("error parsing packet: %v", err) continue } } for _, layerType := range decodedLayers { switch layerType { case layers.LayerTypeICMPv6: b.updateIP(eth.SrcMAC.String(), ip6.SrcIP) case layers.LayerTypeARP: b.updateIP(eth.SrcMAC.String(), net.IP(arp.SourceProtAddress)) } } } log.Info("%v snoop out", b.Name) }
func (f *tomLayerFactory) Create(layerType gopacket.LayerType) gopacket.DecodingLayer { d := int(layerType - gopacket.LayerType(TOM_LAYERS_BASE_NUM)) if d < 0 || d > 255 { panic("FIXME") //return gopacket.LayerTypeZero // FIXME } m := TomMessageTypeMetadata[d] errs.Check(m.LayerType == layerType) return m.CreateLayer() }