// Creates and returns a new DecoderStruct. func NewDecoder(datalink layers.LinkType, tcp tcp.Processor, udp udp.Processor) (*DecoderStruct, error) { d := DecoderStruct{tcpProc: tcp, udpProc: udp} logp.Debug("pcapread", "Layer type: %s", datalink.String()) switch datalink { case layers.LinkTypeLinuxSLL: d.Parser = gopacket.NewDecodingLayerParser( layers.LayerTypeLinuxSLL, &d.sll, &d.d1q, &d.ip4, &d.ip6, &d.tcp, &d.udp, &d.payload) case layers.LinkTypeEthernet: d.Parser = gopacket.NewDecodingLayerParser( layers.LayerTypeEthernet, &d.eth, &d.d1q, &d.ip4, &d.ip6, &d.tcp, &d.udp, &d.payload) case layers.LinkTypeNull: // loopback on OSx d.Parser = gopacket.NewDecodingLayerParser( layers.LayerTypeLoopback, &d.lo, &d.d1q, &d.ip4, &d.ip6, &d.tcp, &d.udp, &d.payload) default: return nil, fmt.Errorf("Unsupported link type: %s", datalink.String()) } d.decoded = []gopacket.LayerType{} return &d, nil }
// Creates and returns a new DecoderStruct. func NewDecoder( f *flows.Flows, datalink layers.LinkType, icmp4 icmp.ICMPv4Processor, icmp6 icmp.ICMPv6Processor, tcp tcp.Processor, udp udp.Processor, ) (*DecoderStruct, error) { d := DecoderStruct{ flows: f, decoders: make(map[gopacket.LayerType]gopacket.DecodingLayer), icmp4Proc: icmp4, icmp6Proc: icmp6, tcpProc: tcp, udpProc: udp} d.stD1Q.init(&d.d1q[0], &d.d1q[1]) d.stIP4.init(&d.ip4[0], &d.ip4[1]) d.stIP6.init(&d.ip6[0], &d.ip6[1]) if f != nil { var err error d.statPackets, err = f.NewUint(netPacketsTotalCounter) if err != nil { return nil, err } d.statBytes, err = f.NewUint(netBytesTotalCounter) if err != nil { return nil, err } d.flowID = &flows.FlowID{} } defaultLayerTypes := []gopacket.DecodingLayer{ &d.sll, // LinuxSLL &d.eth, // Ethernet &d.lo, // loopback on OS X &d.stD1Q, // VLAN &d.stIP4, &d.stIP6, // IP &d.icmp4, &d.icmp6, // ICMP &d.tcp, &d.udp, // TCP/UDP } d.AddLayers(defaultLayerTypes) debugf("Layer type: %s", datalink.String()) switch datalink { case layers.LinkTypeLinuxSLL: d.linkLayerDecoder = &d.sll d.linkLayerType = layers.LayerTypeLinuxSLL case layers.LinkTypeEthernet: d.linkLayerDecoder = &d.eth d.linkLayerType = layers.LayerTypeEthernet case layers.LinkTypeNull: // loopback on OSx d.linkLayerDecoder = &d.lo d.linkLayerType = layers.LayerTypeLoopback default: return nil, fmt.Errorf("Unsupported link type: %s", datalink.String()) } return &d, nil }
// Creates and returns a new DecoderStruct. func NewDecoder( datalink layers.LinkType, icmp4 icmp.ICMPv4Processor, icmp6 icmp.ICMPv6Processor, tcp tcp.Processor, udp udp.Processor, ) (*DecoderStruct, error) { d := DecoderStruct{ decoders: make(map[gopacket.LayerType]gopacket.DecodingLayer), icmp4Proc: icmp4, icmp6Proc: icmp6, tcpProc: tcp, udpProc: udp} defaultLayerTypes := []gopacket.DecodingLayer{ &d.sll, // LinuxSLL &d.eth, // Ethernet &d.lo, // loopback on OS X &d.d1q, // VLAN &d.ip4, &d.ip6, &d.icmp4, &d.icmp6, // IP &d.tcp, &d.udp, // TCP/UDP } d.AddLayers(defaultLayerTypes) debugf("Layer type: %s", datalink.String()) switch datalink { case layers.LinkTypeLinuxSLL: d.linkLayerDecoder = &d.sll d.linkLayerType = layers.LayerTypeLinuxSLL case layers.LinkTypeEthernet: d.linkLayerDecoder = &d.eth d.linkLayerType = layers.LayerTypeEthernet case layers.LinkTypeNull: // loopback on OSx d.linkLayerDecoder = &d.lo d.linkLayerType = layers.LayerTypeLoopback default: return nil, fmt.Errorf("Unsupported link type: %s", datalink.String()) } return &d, nil }