func decodeInGRELayer(data []byte, p gopacket.PacketBuilder) error { switch (data[0] >> 4) & 0xf { case 4: ip4 := &layers.IPv4{} err := ip4.DecodeFromBytes(data, p) p.AddLayer(ip4) p.SetNetworkLayer(ip4) if err != nil { return err } return p.NextDecoder(ip4.NextLayerType()) case 6: ip6 := &layers.IPv6{} err := ip6.DecodeFromBytes(data, p) p.AddLayer(ip6) p.SetNetworkLayer(ip6) if err != nil { return err } return p.NextDecoder(ip6.NextLayerType()) } packet := gopacket.NewPacket(data, layers.LayerTypeARP, gopacket.Lazy) layer := packet.Layer(layers.LayerTypeARP) p.AddLayer(layer) return nil }
func decodeIPv4(data []byte, p gopacket.PacketBuilder) error { ip := &IPv4{} err := ip.DecodeFromBytes(data, p) p.AddLayer(ip) p.SetNetworkLayer(ip) if err != nil { return err } return p.NextDecoder(ip.NextLayerType()) }
func decodeIPv6(data []byte, p gopacket.PacketBuilder) error { ip6 := &IPv6{} err := ip6.DecodeFromBytes(data, p) p.AddLayer(ip6) p.SetNetworkLayer(ip6) if ip6.HopByHop != nil { p.AddLayer(ip6.HopByHop) } if err != nil { return err } if ip6.HopByHop != nil { return p.NextDecoder(ip6.HopByHop.NextHeader) } return p.NextDecoder(ip6.NextHeader) }
func decodeIPv6(data []byte, p gopacket.PacketBuilder) error { ip6 := &IPv6{} err := ip6.DecodeFromBytes(data, p) p.AddLayer(ip6) p.SetNetworkLayer(ip6) if ip6.HopByHop != nil { // TODO(gconnell): Since HopByHop is now an integral part of the IPv6 // layer, should it actually be added as its own layer? I'm leaning towards // no. p.AddLayer(ip6.HopByHop) } if err != nil { return err } if ip6.HopByHop != nil { return p.NextDecoder(ip6.HopByHop.NextHeader) } return p.NextDecoder(ip6.NextHeader) }