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
}