Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions cmd/xdpcap/flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,8 @@ type flags struct {
// Filter provided as input. Not in any particular format, for metadata / debugging only.
filterExpr string
filterOpts filterOpts

maxPackets uint64
}

// parseFlags creates the flags, and attempts to parse args.
Expand All @@ -196,6 +198,7 @@ func parseFlags(name string, args []string) (flags, error) {

flags.IntVar(&flags.filterOpts.perfPerCPUBuffer, "buffer", 8192, "Per CPU perf buffer size to create (`bytes`)")
flags.IntVar(&flags.filterOpts.perfWatermark, "watermark", 1, "Perf watermark (`bytes`). Must be < buffer.")
flags.Uint64Var(&flags.maxPackets, "c", 0, "Maximum number of packets to capture across all `actions`. 0 indicates unlimited")
flags.BoolVar(&flags.quiet, "q", false, "Don't print statistics")
flags.BoolVar(&flags.flush, "flush", false, "Flush pcap data written to <output> for every packet received")

Expand Down
3 changes: 2 additions & 1 deletion cmd/xdpcap/flags_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ func TestFilterRawInvalid(t *testing.T) {
func TestOptions(t *testing.T) {
output := tempOutput(t)

flags, err := parseFlags("", []string{"-buffer", "1234", "-watermark", "5678", "-q", "-flush", "-actions", "pass,drop", "-linktype", "802.11", "foo", output})
flags, err := parseFlags("", []string{"-buffer", "1234", "-watermark", "5678", "-q", "-flush", "-actions", "pass,drop", "-linktype", "802.11", "-c", "1000", "foo", output})
if err != nil {
t.Fatal(err)
}
Expand All @@ -148,6 +148,7 @@ func TestOptions(t *testing.T) {
expected.flush = true
expected.filterOpts.actions = []xdpAction{xdpPass, xdpDrop}
expected.linkType = layers.LinkTypeIEEE802_11
expected.maxPackets = 1000

requireFlags(t, output, expected, flags)
}
Expand Down
9 changes: 9 additions & 0 deletions cmd/xdpcap/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,8 @@ func capture(flags flags) error {

// Write out a pcap file from aggregated packets
go func() {
totalPackets := uint64(0)

for {
pkt, err := filter.read()
switch {
Expand Down Expand Up @@ -134,6 +136,13 @@ func capture(flags flags) error {
fmt.Fprintln(os.Stderr, "Error flushing data:", err)
}
}

if flags.maxPackets != 0 {
totalPackets++
if totalPackets >= flags.maxPackets {
sigs <- syscall.SIGTERM
}
}
}
}()

Expand Down