in pcap-cli/internal/transformer/translator_worker.go [182:243]
func (w *pcapTranslatorWorker) translateLayer(
ctx context.Context, layer gopacket.LayerType, deep bool,
) fmt.Stringer {
// confirm that the packet actually contains the requested layer
l := w.asLayer(ctx, layer)
if l == nil {
return nil
}
switch lType := l.(type) {
default:
return nil
case *layers.Ethernet:
return w.translator.translateEthernetLayer(ctx, lType)
case *layers.ARP:
return w.translator.translateARPLayer(ctx, lType)
case *layers.IPv4:
return w.translator.translateIPv4Layer(ctx, lType)
case *layers.IPv6:
return w.translator.translateIPv6Layer(ctx, lType)
case *layers.ICMPv4:
return w.translator.translateICMPv4Layer(ctx, lType)
case *layers.ICMPv6:
icmp6 := w.translator.translateICMPv6Layer(ctx, lType)
// [ToDo]: handle layers.ICMPv6TypePacketTooBig
if lType.TypeCode.Type() == layers.ICMPv6TypeDestinationUnreachable ||
lType.TypeCode.Type() == layers.ICMPv6TypeTimeExceeded {
return w.translator.translateICMPv6L3HeaderLayer(ctx, icmp6, lType)
}
if !deep {
return icmp6
}
_l := w.asLayer(ctx, lType.NextLayerType())
switch _lType := _l.(type) {
default:
return icmp6
case *layers.ICMPv6Echo:
return w.translator.translateICMPv6EchoLayer(ctx, icmp6, _lType)
case *layers.ICMPv6Redirect:
return w.translator.translateICMPv6RedirectLayer(ctx, icmp6, _lType)
}
case *layers.ICMPv6Echo:
return w.translator.translateICMPv6EchoLayer(ctx, nil, lType)
case *layers.ICMPv6Redirect:
return w.translator.translateICMPv6RedirectLayer(ctx, nil, lType)
case *layers.TCP:
return w.translator.translateTCPLayer(ctx, lType)
case *layers.UDP:
return w.translator.translateUDPLayer(ctx, lType)
case *layers.DNS:
return w.translator.translateDNSLayer(ctx, lType)
case *layers.TLS:
return w.translator.translateTLSLayer(ctx, lType)
case *gopacket.DecodeFailure:
// see: https://github.com/google/gopacket/blob/v1.1.19/decode.go#L118-L126
return w.translator.translateErrorLayer(ctx, lType)
}
}