func run()

in cmd/pshark/main.go [129:206]


func run(input string, filter []ptp.MessageType) error {
	// register mapping betwenn ports and our custom PTP layer
	layers.RegisterUDPPortLayerType(layers.UDPPort(ptp.PortEvent), LayerTypePTP)
	layers.RegisterUDPPortLayerType(layers.UDPPort(ptp.PortGeneral), LayerTypePTP)

	filterMap := map[ptp.MessageType]bool{}
	for _, v := range filter {
		filterMap[v] = true
	}

	var handle packetHandle
	var err error

	// open the input file
	f, err := os.Open(input)
	if err != nil {
		return err
	}
	defer f.Close()

	// try NGReader, if it fails - fall back to Reader
	handle, err = pcapgo.NewNgReader(f, pcapgo.DefaultNgReaderOptions)
	if err != nil {
		if _, ierr := f.Seek(0, 0); ierr != nil {
			return fmt.Errorf("seeking in %s: %w", input, ierr)
		}
		handle, err = pcapgo.NewReader(f)
		if err != nil {
			return fmt.Errorf("decoding %s: %w", input, err)
		}
	}

	// Loop through packets in file
	packetSource := gopacket.NewPacketSource(handle, handle.LinkType())
	for packet := range packetSource.Packets() {
		// thanks to the mapping we can easily pick PTP packets
		ptpLayer := packet.Layer(LayerTypePTP)
		if ptpLayer != nil {
			ptpContent, _ := ptpLayer.(*LayerPTP)
			if !filterMap[ptpContent.Packet.MessageType()] {
				continue
			}
			// decode src and dst adddress and port
			var srcIP, dstIP net.IP
			var srcPort, dstPort layers.UDPPort
			ip6Layer := packet.Layer(layers.LayerTypeIPv6)
			if ip6Layer != nil {
				ip, _ := ip6Layer.(*layers.IPv6)
				srcIP = ip.SrcIP
				dstIP = ip.DstIP
			} else {
				ip4Layer := packet.Layer(layers.LayerTypeIPv4)
				ip, _ := ip4Layer.(*layers.IPv4)
				srcIP = ip.SrcIP
				dstIP = ip.DstIP
			}

			udpLayer := packet.Layer(layers.LayerTypeUDP)
			if udpLayer != nil {
				udp, _ := udpLayer.(*layers.UDP)
				srcPort = udp.SrcPort
				dstPort = udp.DstPort
			}
			// dump ip:port info on stdout
			spew.Printf("%s -> %s\n",
				net.JoinHostPort(srcIP.String(), strconv.Itoa(int(srcPort))),
				net.JoinHostPort(dstIP.String(), strconv.Itoa(int(dstPort))),
			)
			// dump the packet itself
			spew.Dump(ptpContent.Packet)
			spew.Println()
		}
		if err := packet.ErrorLayer(); err != nil {
			return fmt.Errorf("failed to decode: %w", err.Error())
		}
	}
	return nil
}