Difference between revisions of "VPP/How To Use The Packet Generator and Packet Tracer"
Line 13: | Line 13: | ||
==== Step 1. Start a debug version of vpp ==== | ==== Step 1. Start a debug version of vpp ==== | ||
− | From the command line, make the | + | From the command line, make the VPP source directory the working directory and run VPP as shown in the following example. |
In the following example, including the <code>dpdk</code> argument means that no physical interfaces will be discovered. | In the following example, including the <code>dpdk</code> argument means that no physical interfaces will be discovered. | ||
− | $ | + | $ ./build-root/install-vpp_debug-native/vpp/bin/vpp unix interactive plugins { plugin dpdk_plugin.so { disable } } |
− | + | ||
==== Step 2. Execute the arp4 setup script ==== | ==== Step 2. Execute the arp4 setup script ==== | ||
Line 24: | Line 23: | ||
From the vpp debug command-line, execute the arp4 script. | From the vpp debug command-line, execute the arp4 script. | ||
− | DBGvpp# exec / | + | DBGvpp# exec src/scripts/vnet/arp4 |
==== Step 3. Examine the setup script ==== | ==== Step 3. Examine the setup script ==== | ||
Line 42: | Line 41: | ||
} | } | ||
} | } | ||
− | + | ||
trace add pg-input 100 | trace add pg-input 100 | ||
loop create | loop create | ||
Line 52: | Line 51: | ||
set int ip address loop1 2.0.0.1/24 | set int ip address loop1 2.0.0.1/24 | ||
− | The first stanza creates a packet generator stream called "x" which sends a single ipv4 icmp echo-request when enabled. The <code>trace add</code> command arranges to trace 100 packets originating at the <code>pg-input</code> graph node. If you want to trace packets originating at the " | + | The first stanza creates a packet generator stream called "x" which sends a single ipv4 icmp echo-request when enabled. The <code>trace add</code> command arranges to trace 100 packets originating at the <code>pg-input</code> graph node. If you want to trace packets originating at the "ethernet-input" node - which is probably the most typical real-world use-case - make the substitution for that graph node. |
Finally, the script configures a couple of loopback interfaces; primarily, so that ip4-input / ip4-lookup won't immediately ditch the generated packet. | Finally, the script configures a couple of loopback interfaces; primarily, so that ip4-input / ip4-lookup won't immediately ditch the generated packet. | ||
Line 68: | Line 67: | ||
DBGvpp# show trace | DBGvpp# show trace | ||
− | + | ------------------- Start of thread 0 vpp_main ------------------- | |
− | ------------------- Start of thread 0 | + | |
Packet 1 | Packet 1 | ||
− | 00: | + | 00:00:21:923147: pg-input |
− | stream x, 64 bytes | + | stream x, 64 bytes, sw_if_index 1 |
− | current data 0, length 64, | + | current data 0, length 64, buffer-pool 0, ref-count 1, trace handle 0x0 |
ICMP: 1.0.0.2 -> 2.0.0.2 | ICMP: 1.0.0.2 -> 2.0.0.2 | ||
− | tos 0x00, ttl 64, length 64, checksum 0x77ba | + | tos 0x00, ttl 64, length 64, checksum 0x77ba dscp CS0 ecn NON_ECN |
fragment id 0x0000 | fragment id 0x0000 | ||
− | ICMP echo_request checksum 0x7a6e | + | ICMP echo_request checksum 0x7a6e id 1 |
− | 00: | + | 00:00:21:923216: ip4-input |
ICMP: 1.0.0.2 -> 2.0.0.2 | ICMP: 1.0.0.2 -> 2.0.0.2 | ||
− | tos 0x00, ttl 64, length 64, checksum 0x77ba | + | tos 0x00, ttl 64, length 64, checksum 0x77ba dscp CS0 ecn NON_ECN |
fragment id 0x0000 | fragment id 0x0000 | ||
− | ICMP echo_request checksum 0x7a6e | + | ICMP echo_request checksum 0x7a6e id 1 |
− | 00: | + | 00:00:21:923252: ip4-not-enabled |
− | + | ICMP: 1.0.0.2 -> 2.0.0.2 | |
− | + | tos 0x00, ttl 64, length 64, checksum 0x77ba dscp CS0 ecn NON_ECN | |
− | + | fragment id 0x0000 | |
− | + | ICMP echo_request checksum 0x7a6e id 1 | |
− | + | 00:00:21:923261: error-drop | |
− | + | rx:pg0 | |
− | 00: | + | 00:00:21:923270: drop |
− | + | null-node: blackholed packets | |
− | + | ||
− | ==== Step 6. | + | ==== Step 6. Analyze the information ==== |
− | + | You can see in the trace above that the packet goes through "ip4-not-enabled" before being dropped. This is because the interface used to inject the packet (pg0 by default) has no IPv4 configuration and hence ARP is not enabled. | |
− | + | Inspecting the error counters you see what we might expect in light of the packet tracer output: | |
− | DBGvpp# | + | DBGvpp# sh err |
− | + | Count Node Reason Severity | |
− | + | 1 null-node blackholed packets error | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | You can enable IPv4 on pg0 by configuring it as eg. unnumbered: | |
− | DBGvpp# | + | DBGvpp# set int unnumbered pg0 use loop0 |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | And look at the result when re-injecting the packet: | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
+ | DBGvpp# clear trace | ||
+ | DBGvpp# trace add pg-input 10 | ||
+ | DBGvpp# packet-generator enable-stream | ||
+ | DBGvpp# show trace | ||
+ | ------------------- Start of thread 0 vpp_main ------------------- | ||
+ | Packet 1 | ||
+ | |||
+ | 00:05:44:786471: pg-input | ||
+ | stream x, 64 bytes, sw_if_index 1 | ||
+ | current data 0, length 64, buffer-pool 0, ref-count 1, trace handle 0x0 | ||
+ | ICMP: 1.0.0.2 -> 2.0.0.2 | ||
+ | tos 0x00, ttl 64, length 64, checksum 0x77ba dscp CS0 ecn NON_ECN | ||
+ | fragment id 0x0000 | ||
+ | ICMP echo_request checksum 0x7a6e id 1 | ||
+ | 00:05:44:786501: ip4-input | ||
+ | ICMP: 1.0.0.2 -> 2.0.0.2 | ||
+ | tos 0x00, ttl 64, length 64, checksum 0x77ba dscp CS0 ecn NON_ECN | ||
+ | fragment id 0x0000 | ||
+ | ICMP echo_request checksum 0x7a6e id 1 | ||
+ | 00:05:44:786513: ip4-lookup | ||
+ | fib 0 dpo-idx 3 flow hash: 0x00000000 | ||
+ | ICMP: 1.0.0.2 -> 2.0.0.2 | ||
+ | tos 0x00, ttl 64, length 64, checksum 0x77ba dscp CS0 ecn NON_ECN | ||
+ | fragment id 0x0000 | ||
+ | ICMP echo_request checksum 0x7a6e id 1 | ||
+ | 00:05:44:786523: ip4-glean | ||
+ | ICMP: 1.0.0.2 -> 2.0.0.2 | ||
+ | tos 0x00, ttl 64, length 64, checksum 0x77ba dscp CS0 ecn NON_ECN | ||
+ | fragment id 0x0000 | ||
+ | ICMP echo_request checksum 0x7a6e id 1 | ||
+ | 00:05:44:786547: ip4-drop | ||
+ | ICMP: 1.0.0.2 -> 2.0.0.2 | ||
+ | tos 0x00, ttl 64, length 64, checksum 0x77ba dscp CS0 ecn NON_ECN | ||
+ | fragment id 0x0000 | ||
+ | ICMP echo_request checksum 0x7a6e id 1 | ||
+ | 00:05:44:786568: error-drop | ||
+ | rx:pg0 | ||
+ | 00:05:44:786591: drop | ||
+ | ip4-glean: ARP requests sent | ||
=== Convert a PCAP file to a PG file === | === Convert a PCAP file to a PG file === |
Revision as of 08:45, 6 January 2021
Introduction
The VPP platform includes packet generation and packet tracing facilities.
The following example shows steps that you might typically use to run a debug version of the vpp executable file, generate packets, and to analyze results.
Example with IP4 ARP Messages
In the following steps, the VPP executable does not need to be started with superuser permissions. The VPP executable will not discover physical devices when run as a normal user.
Step 1. Start a debug version of vpp
From the command line, make the VPP source directory the working directory and run VPP as shown in the following example.
In the following example, including the dpdk
argument means that no physical interfaces will be discovered.
$ ./build-root/install-vpp_debug-native/vpp/bin/vpp unix interactive plugins { plugin dpdk_plugin.so { disable } }
Step 2. Execute the arp4 setup script
From the vpp debug command-line, execute the arp4 script.
DBGvpp# exec src/scripts/vnet/arp4
Step 3. Examine the setup script
Let's tale a look at the contents of the setup script that you just executed. The script .../vpp/vnet/etc/scripts/arp4 contains:
packet-generator new { name x limit 1 node ip4-input size 64-64 no-recycle data { ICMP: 1.0.0.2 -> 2.0.0.2 ICMP echo_request incrementing 100 } } trace add pg-input 100 loop create loop create set int state loop0 up set int state loop1 up set int ip address loop0 1.0.0.1/24 set int ip address loop1 2.0.0.1/24
The first stanza creates a packet generator stream called "x" which sends a single ipv4 icmp echo-request when enabled. The trace add
command arranges to trace 100 packets originating at the pg-input
graph node. If you want to trace packets originating at the "ethernet-input" node - which is probably the most typical real-world use-case - make the substitution for that graph node.
Finally, the script configures a couple of loopback interfaces; primarily, so that ip4-input / ip4-lookup won't immediately ditch the generated packet.
Step 4. Generate packets
On the vpp debug command-line, enable the packet generator.
DBGvpp# packet-generator enable
Step 5. Run the packet tracer
Use the show trace
command to run the packet tracer.
DBGvpp# show trace ------------------- Start of thread 0 vpp_main ------------------- Packet 1 00:00:21:923147: pg-input stream x, 64 bytes, sw_if_index 1 current data 0, length 64, buffer-pool 0, ref-count 1, trace handle 0x0 ICMP: 1.0.0.2 -> 2.0.0.2 tos 0x00, ttl 64, length 64, checksum 0x77ba dscp CS0 ecn NON_ECN fragment id 0x0000 ICMP echo_request checksum 0x7a6e id 1 00:00:21:923216: ip4-input ICMP: 1.0.0.2 -> 2.0.0.2 tos 0x00, ttl 64, length 64, checksum 0x77ba dscp CS0 ecn NON_ECN fragment id 0x0000 ICMP echo_request checksum 0x7a6e id 1 00:00:21:923252: ip4-not-enabled ICMP: 1.0.0.2 -> 2.0.0.2 tos 0x00, ttl 64, length 64, checksum 0x77ba dscp CS0 ecn NON_ECN fragment id 0x0000 ICMP echo_request checksum 0x7a6e id 1 00:00:21:923261: error-drop rx:pg0 00:00:21:923270: drop null-node: blackholed packets
Step 6. Analyze the information
You can see in the trace above that the packet goes through "ip4-not-enabled" before being dropped. This is because the interface used to inject the packet (pg0 by default) has no IPv4 configuration and hence ARP is not enabled.
Inspecting the error counters you see what we might expect in light of the packet tracer output:
DBGvpp# sh err Count Node Reason Severity 1 null-node blackholed packets error
You can enable IPv4 on pg0 by configuring it as eg. unnumbered:
DBGvpp# set int unnumbered pg0 use loop0
And look at the result when re-injecting the packet:
DBGvpp# clear trace DBGvpp# trace add pg-input 10 DBGvpp# packet-generator enable-stream DBGvpp# show trace ------------------- Start of thread 0 vpp_main ------------------- Packet 1 00:05:44:786471: pg-input stream x, 64 bytes, sw_if_index 1 current data 0, length 64, buffer-pool 0, ref-count 1, trace handle 0x0 ICMP: 1.0.0.2 -> 2.0.0.2 tos 0x00, ttl 64, length 64, checksum 0x77ba dscp CS0 ecn NON_ECN fragment id 0x0000 ICMP echo_request checksum 0x7a6e id 1 00:05:44:786501: ip4-input ICMP: 1.0.0.2 -> 2.0.0.2 tos 0x00, ttl 64, length 64, checksum 0x77ba dscp CS0 ecn NON_ECN fragment id 0x0000 ICMP echo_request checksum 0x7a6e id 1 00:05:44:786513: ip4-lookup fib 0 dpo-idx 3 flow hash: 0x00000000 ICMP: 1.0.0.2 -> 2.0.0.2 tos 0x00, ttl 64, length 64, checksum 0x77ba dscp CS0 ecn NON_ECN fragment id 0x0000 ICMP echo_request checksum 0x7a6e id 1 00:05:44:786523: ip4-glean ICMP: 1.0.0.2 -> 2.0.0.2 tos 0x00, ttl 64, length 64, checksum 0x77ba dscp CS0 ecn NON_ECN fragment id 0x0000 ICMP echo_request checksum 0x7a6e id 1 00:05:44:786547: ip4-drop ICMP: 1.0.0.2 -> 2.0.0.2 tos 0x00, ttl 64, length 64, checksum 0x77ba dscp CS0 ecn NON_ECN fragment id 0x0000 ICMP echo_request checksum 0x7a6e id 1 00:05:44:786568: error-drop rx:pg0 00:05:44:786591: drop ip4-glean: ARP requests sent
Convert a PCAP file to a PG file
The below is a ping PCAP capture converted into Packet Generator (PG) format.
1. Use the PCAP2PG converter utility in the source tree
cd /vpp/build-root/build-vpp_debug-native/vnet/ ./pcap2pg -i vpp1.pcap > vpp1.pg edit vpp1.pg
2. Each line in the PCAP file is wrapped in Packet-Generator specific information:
packet-generator new { name s0 limit 1 size 98-98 node ethernet-input data { 0x0800: b66a.2a78.efb3 -> 02fe.6613.e729 hex 0x45000054c622400040011962ac100102ac1002020800cb807f4f00016cf0f756000000008514050000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637 } } packet-generator new { name s1 limit 1 size 98-98 node ethernet-input data { 0x0800: 02fe.6613.e729 -> b66a.2a78.efb3 hex 0x450000543fee00003f01e096ac100202ac1001020000d3807f4f00016cf0f756000000008514050000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637 } } packet-generator new { name s2 limit 1 size 98-98 node ethernet-input data { 0x0800: b66a.2a78.efb3 -> 02fe.6613.e729 hex 0x45000054c63540004001194fac100102ac10020208006d837f4f00026df0f75600000000e210050000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637 } }
3. Remove any lines of PCAP and add an interface. You can also change the limit to increase the number of packets (useful for testing dual loop)
packet-generator new { name s0 limit 1 size 98-98 node ethernet-input interface GigabitEthernet0/8/0 data { 0x0800: b66a.2a78.efb3 -> 02fe.6613.e729 hex 0x45000054c622400040011962ac100102ac1002020800cb807f4f00016cf0f756000000008514050000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637 } }
4. Proceed as per above example
DBGvpp# exec <fullpath>/vpp1.pg DBGvpp# packet-generator enable etc etc