in internal/command/pcap.go [57:98]
func (r *pcapRunner) sendPCAP(path string, out output.Output) error {
logger := r.logger.With("pcap", path)
f, err := pcap.OpenOffline(path)
if err != nil {
return err
}
defer f.Close()
// Process packets in PCAP and get flow records.
var totalBytes, totalPackets int
packetSource := gopacket.NewPacketSource(f, f.LinkType())
for packet := range packetSource.Packets() {
if r.cmd.Context().Err() != nil {
break
}
if packet == nil {
logger.Warnw("Skipping nil packet")
continue
}
tl := packet.TransportLayer()
if tl == nil {
logger.Warnw("Skipping packet with no transport layer")
continue
}
payloadData := tl.LayerPayload()
// TODO: Rate-limit for UDP.
n, err := out.Write(payloadData)
if err != nil {
return err
}
totalBytes += n
totalPackets++
}
logger.Infow("Sent PCAP payload data", "total_bytes", totalBytes, "total_packets", totalPackets)
return nil
}