summaryrefslogtreecommitdiffstats
path: root/xdp-dump/xdpdump.8
diff options
context:
space:
mode:
Diffstat (limited to 'xdp-dump/xdpdump.8')
-rw-r--r--xdp-dump/xdpdump.8254
1 files changed, 254 insertions, 0 deletions
diff --git a/xdp-dump/xdpdump.8 b/xdp-dump/xdpdump.8
new file mode 100644
index 0000000..0ef8535
--- /dev/null
+++ b/xdp-dump/xdpdump.8
@@ -0,0 +1,254 @@
+.TH "xdpdump" "8" "JANUARY 13, 2021" "V1.3.1" "a simple tcpdump like tool for capturing packets at the XDP layer"
+
+.SH "NAME"
+xdpdump \- a simple tcpdump like tool for capturing packets at the XDP layer
+.SH "SYNOPSIS"
+.PP
+\fIxdpdump\fP is a simple XDP packet capture tool that tries to behave similar to
+\fItcpdump\fP, however, it has no packet filter or decode capabilities.
+
+.PP
+This can be used for debugging XDP programs that are already loaded on an
+interface. Packets can be dumped/inspected before on \fBentry\fP to XDP program,
+or after at \fBexit\fP from an XDP program. Furthermore, at \fBexit\fP the XDP
+action is also captured. This means that even packets that are dropped at the
+XDP layer can be captured via this tool.
+
+.PP
+\fIxdpdump\fP works by attaching a bpf trace program to the XDP entry and/or exit
+function which stores the raw packet in a perf trace buffer. If no XDP program
+is loaded this approach can not be used and the tool will use a libpcap
+live-capture to be backward compatible.
+
+.SS "Running xdpdump"
+.PP
+The syntax for running \fIxdpdump\fP is:
+
+.RS
+.nf
+\fCUsage: xdpdump [options]
+
+ XDPDump tool to dump network traffic
+
+Options:
+ --rx-capture <mode> Capture point for the rx direction (valid values: entry,exit)
+ -D, --list-interfaces Print the list of available interfaces
+ -i, --interface <ifname> Name of interface to capture on
+ --perf-wakeup <events> Wake up xdpdump every <events> packets
+ -p, --program-names <prog> Specific program to attach to
+ -s, --snapshot-length <snaplen> Minimum bytes of packet to capture
+ --use-pcap Use legacy pcap format for XDP traces
+ -w, --write <file> Write raw packets to pcap file
+ -x, --hex Print the full packet in hex
+ -v, --verbose Enable verbose logging (-vv: more verbose)
+ --version Display version information
+ -h, --help Show this help
+\fP
+.fi
+.RE
+
+.SH "The options explained"
+.PP
+The \fIxdpdump\fP tool tries to mimic the basic \fItcpdump\fP options, but just in case
+below each of the available options is explained:
+
+.SS "--rx-capture <mode>"
+.PP
+Specify where the ingress packet gets captured. Either at the entry of the XDP
+program and/or exit of the XDP program. Valid options are \fBentry\fP, \fBexit\fP,
+or both \fBentry,exit\fP. The packet at \fBexit\fP can be modified by the XDP
+program. If you are interested to see both the original and modified packet,
+use the \fBentry,exit\fP option. With this, each packet is captured twice. The
+default value for this is \fBentry\fP.
+.SS "-D, --list-interfaces"
+.PP
+Display a list of available interfaces and any XDP program loaded
+.SS "--load-xdp-mode"
+.PP
+Specifies which loader mode to use with the \fI\-\-load\-xdp\-program\fP option. The
+valid values are ‘native’, which is the default in-driver XDP mode, ‘skb’, which
+causes the so-called skb mode (also known as generic XDP) to be used, ‘hw’ which
+causes the program to be offloaded to the hardware, or ‘unspecified’ which
+leaves it up to the kernel to pick a mode (which it will do by picking native
+mode if the driver supports it, or generic mode otherwise). Note that using
+‘unspecified’ can make it difficult to predict what mode a program will end up
+being loaded in. For this reason, the default is ‘native’.
+.SS "--load-xdp-program"
+.PP
+If no XDP program is loaded on the interface, by default, xdpdump will fallback
+to libpcap's live capture mode to capture the packets. Alternatively, with this
+option, you can ask xdpdump to load an XDP program to capture the packets
+directly.
+.SS "-i, --interface <ifname>"
+.PP
+Listen on interface \fIifname\fP. Note that if no XDP program is loaded on the
+interface it will use libpcap's live capture mode to capture the packets.
+.SS "--perf-wakeup <events>"
+.PP
+Let the Kernel wake up \fIxdpdump\fP once for every \fI<events>\fP being posted in the
+perf ring buffer. The higher the number the less the impact is on the actual
+XDP program. The default value is 0, which automatically calculates the
+value based on the available CPUs/buffers. Use -v to see the actual used value.
+.SS "-p, --program-names [<prog>|all]"
+.PP
+This option allows you to capture packets for a specific, set of, or all XDP
+programs loaded on the interface. You can either specify the actual program
+names or program IDs separated by commas. In the case where multiple programs
+are attached with the same name, you should use the program ID. Use the -D
+option to see the loaded programs and their IDs.
+
+
+.PP
+In addition, the Linux API does not provide the full name of the attached eBPF
+entry function if it's longer than 15 characters. xdpdump will try to guess the
+correct function name from the available BTF debug information. However, if
+multiple functions exist with the same leading name, it can not pick the correct
+one. It will dump the available functions, and you can choose the correct one,
+and supply it with this option. If you have programs with duplicate long names,
+you also need to specify the program ID with the full name. This can be done by
+adding the id to the name with the \fI@<id>\fP suffix.
+.SS "-P, --promiscuous-mode"
+.PP
+This option puts the interface into promiscuous mode.
+.SS "-s, --snapshot-length <snaplen>"
+.PP
+Capture \fBsnaplen\fP bytes of a packet rather than the default 262144 bytes.
+.SS "--use-pcap"
+.PP
+Use legacy pcap format for XDP traces. By default, it will use the PcapNG format
+so that it can store various metadata.
+.SS "-w, --write <file>"
+.PP
+Write the raw packets to a pcap file rather than printing them out hexadecimal. Standard output is used if \fBfile\fP is \fI\-\fP.
+.SS "-x, --hex"
+.PP
+When dumping packets on the console also print the full packet content in hex.
+.SS "-v, --verbose"
+.PP
+Enable debug logging. Specify twice for even more verbosity.
+.SS "--version"
+.PP
+Display \fIxpdump\fP version information and exit.
+.SS "-h, --help"
+.PP
+Display a summary of the available options
+
+.SH "Examples"
+.PP
+The below will load the \fIxdp\-filter\fP program on eth0, but it does not do any
+actual filtering:
+
+.RS
+.nf
+\fC# xdp-filter load --mode skb eth0
+#
+# xdpdump -D
+Interface Prio Program name Mode ID Tag Chain actions
+--------------------------------------------------------------------------------------
+lo <No XDP program loaded!>
+eth0 xdp_dispatcher skb 10651 d51e469e988d81da
+ => 10 xdpfilt_alw_all 10669 0b394f43ab24501c XDP_PASS
+\fP
+.fi
+.RE
+
+.PP
+Now we can try \fIxdpdump\fP:
+
+.RS
+.nf
+\fC# xdpdump -i eth0 -x
+listening on eth0, ingress XDP program ID 10651 func xdp_dispatcher, capture mode entry, capture size 262144 bytes
+1584373839.460733895: xdp_dispatcher()@entry: packet size 102 bytes, captured 102 bytes on if_index 2, rx queue 0, id 1
+ 0x0000: 52 54 00 db 44 b6 52 54 00 34 38 da 08 00 45 48 RT..D.RT.48...EH
+ 0x0010: 00 58 d7 dd 40 00 40 06 ec c3 c0 a8 7a 01 c0 a8 .X..@.@.....z...
+ 0x0020: 7a 64 9c de 00 16 0d d5 c6 bc 46 c9 bb 11 80 18 zd........F.....
+ 0x0030: 01 f5 7b b4 00 00 01 01 08 0a 77 0a 8c b8 40 12 ..{.......w...@.
+ 0x0040: cc a6 00 00 00 10 54 ce 6e 20 c3 e7 da 6c 08 42 ......T.n ...l.B
+ 0x0050: d6 d9 ee 42 42 f0 82 c9 4f 12 ed 7b 19 ab 22 0d ...BB...O..{..".
+ 0x0060: 09 29 a9 ee df 89 .)....
+
+1584373839.462340808: xdp_dispatcher()@entry: packet size 66 bytes, captured 66 bytes on if_index 2, rx queue 0, id 2
+ 0x0000: 52 54 00 db 44 b6 52 54 00 34 38 da 08 00 45 48 RT..D.RT.48...EH
+ 0x0010: 00 34 d7 de 40 00 40 06 ec e6 c0 a8 7a 01 c0 a8 .4..@.@.....z...
+ 0x0020: 7a 64 9c de 00 16 0d d5 c6 e0 46 c9 bc 85 80 10 zd........F.....
+ 0x0030: 01 f5 74 0c 00 00 01 01 08 0a 77 0a 8c ba 40 12 ..t.......w...@.
+ 0x0040: d2 34 .4
+^C
+2 packets captured
+0 packets dropped by perf ring
+\fP
+.fi
+.RE
+
+.PP
+Below are two more examples redirecting the capture file to \fItcpdump\fP or
+\fItshark\fP:
+
+.RS
+.nf
+\fC# xdpdump -i eth0 -w - | tcpdump -r - -n
+listening on eth0, ingress XDP program ID 10651 func xdp_dispatcher, capture mode entry, capture size 262144 bytes
+reading from file -, link-type EN10MB (Ethernet)
+15:55:09.075887 IP 192.168.122.1.40928 > 192.168.122.100.ssh: Flags [P.], seq 3857553815:3857553851, ack 3306438882, win 501, options [nop,nop,TS val 1997449167 ecr 1075234328], length 36
+15:55:09.077756 IP 192.168.122.1.40928 > 192.168.122.100.ssh: Flags [.], ack 37, win 501, options [nop,nop,TS val 1997449169 ecr 1075244363], length 0
+15:55:09.750230 IP 192.168.122.1.40928 > 192.168.122.100.ssh: Flags [P.], seq 36:72, ack 37, win 501, options [nop,nop,TS val 1997449842 ecr 1075244363], length 36
+\fP
+.fi
+.RE
+
+.RS
+.nf
+\fC# xdpdump -i eth0 -w - | tshark -r - -n
+listening on eth0, ingress XDP program ID 10651 func xdp_dispatcher, capture mode entry, capture size 262144 bytes
+ 1 0.000000 192.168.122.1 → 192.168.122.100 SSH 102 Client: Encrypted packet (len=36)
+ 2 0.000646 192.168.122.1 → 192.168.122.100 TCP 66 40158 → 22 [ACK] Seq=37 Ack=37 Win=1467 Len=0 TSval=1997621571 TSecr=1075416765
+ 3 12.218164 192.168.122.1 → 192.168.122.100 SSH 102 Client: Encrypted packet (len=36)
+\fP
+.fi
+.RE
+
+.PP
+One final example capturing specific XDP programs loaded on the interface:
+
+.RS
+.nf
+\fC# xdpdump -D
+Interface Prio Program name Mode ID Tag Chain actions
+--------------------------------------------------------------------------------------
+lo <No XDP program loaded!>
+eth0 xdp_dispatcher skb 10558 d51e469e988d81da
+ => 5 xdp_test_prog_w 10576 b5a46c6e9935298c XDP_PASS
+ => 10 xdp_pass 10582 3b185187f1855c4c XDP_PASS
+ => 10 xdp_pass 10587 3b185187f1855c4c XDP_PASS
+\fP
+.fi
+.RE
+
+.PP
+We would like to see the packets on the \fIxdp_dispatcher()\fP and the 2nd \fIxdp_pass()\fP program:
+
+.RS
+.nf
+\fC# xdpdump -i eth0 --rx-capture=entry,exit -p xdp_dispatcher,xdp_pass@10587
+ or
+# xdpdump -i eth0 --rx-capture=entry,exit -p 10558,10587
+listening on eth0, ingress XDP program ID 10558 func xdp_dispatcher, ID 10587 func xdp_pass, capture mode entry/exit, capture size 262144 bytes
+1607694215.501287259: xdp_dispatcher()@entry: packet size 102 bytes on if_index 2, rx queue 0, id 1
+1607694215.501371504: xdp_pass()@entry: packet size 102 bytes on if_index 2, rx queue 0, id 1
+1607694215.501383099: xdp_pass()@exit[PASS]: packet size 102 bytes on if_index 2, rx queue 0, id 1
+1607694215.501394709: xdp_dispatcher()@exit[PASS]: packet size 102 bytes on if_index 2, rx queue 0, id 1
+^C
+4 packets captured
+0 packets dropped by perf ring
+\fP
+.fi
+.RE
+
+.SH "BUGS"
+.PP
+Please report any bugs on Github: \fIhttps://github.com/xdp-project/xdp-tools/issues\fP
+
+.SH "AUTHOR"
+.PP
+\fIxdpdump\fP was written by Eelco Chaudron