FD.io VPP  v21.01
Vector Packet Processing
Handoff queue demo plugin

This plugin provides a simplified example of how to hand off packets between threads. I used it to debug packet-tracer handoff tracing support.

Packet generator input script

packet-generator new {
name x
limit 5
size 128-128
interface local0
node handoffdemo-1
data {
incrementing 30
}
}

Start vpp with 2 worker threads

The demo plugin hands packets from worker 1 to worker 2.

Enable tracing, and start the packet generator

trace add pg-input 100
packet-generator enable

Sample Run

DBGvpp# ex /tmp/pg_input_script
DBGvpp# pa en
DBGvpp# sh err
Count Node Reason
5 handoffdemo-1 packets handed off processed
5 handoffdemo-2 completed packets
DBGvpp# show run
Thread 1 vpp_wk_0 (lcore 0)
Time 133.9, average vectors/node 5.00, last 128 main loops 0.00 per node 0.00
vector rates in 3.7331e-2, out 0.0000e0, drop 0.0000e0, punt 0.0000e0
Name State Calls Vectors Suspends Clocks Vectors/Call
handoffdemo-1 active 1 5 0 4.76e3 5.00
pg-input disabled 2 5 0 5.58e4 2.50
unix-epoll-input polling 22760 0 0 2.14e7 0.00
---------------
Thread 2 vpp_wk_1 (lcore 2)
Time 133.9, average vectors/node 5.00, last 128 main loops 0.00 per node 0.00
vector rates in 0.0000e0, out 0.0000e0, drop 3.7331e-2, punt 0.0000e0
Name State Calls Vectors Suspends Clocks Vectors/Call
drop active 1 5 0 1.35e4 5.00
error-drop active 1 5 0 2.52e4 5.00
handoffdemo-2 active 1 5 0 2.56e4 5.00
unix-epoll-input polling 22406 0 0 2.18e7 0.00

Enable the packet tracer and run it again...

DBGvpp# trace add pg-input 100
DBGvpp# pa en
DBGvpp# sh trace
sh trace
------------------- Start of thread 0 vpp_main -------------------
No packets in trace buffer
------------------- Start of thread 1 vpp_wk_0 -------------------
Packet 1
00:06:50:520688: pg-input
stream x, 128 bytes, 0 sw_if_index
current data 0, length 128, buffer-pool 0, ref-count 1, trace handle 0x1000000
00000000: 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d0000
00000020: 0000000000000000000000000000000000000000000000000000000000000000
00000040: 0000000000000000000000000000000000000000000000000000000000000000
00000060: 0000000000000000000000000000000000000000000000000000000000000000
00:06:50:520762: handoffdemo-1
HANDOFFDEMO: current thread 1
Packet 2
00:06:50:520688: pg-input
stream x, 128 bytes, 0 sw_if_index
current data 0, length 128, buffer-pool 0, ref-count 1, trace handle 0x1000001
00000000: 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d0000
00000020: 0000000000000000000000000000000000000000000000000000000000000000
00000040: 0000000000000000000000000000000000000000000000000000000000000000
00000060: 0000000000000000000000000000000000000000000000000000000000000000
00:06:50:520762: handoffdemo-1
HANDOFFDEMO: current thread 1
Packet 3
00:06:50:520688: pg-input
stream x, 128 bytes, 0 sw_if_index
current data 0, length 128, buffer-pool 0, ref-count 1, trace handle 0x1000002
00000000: 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d0000
00000020: 0000000000000000000000000000000000000000000000000000000000000000
00000040: 0000000000000000000000000000000000000000000000000000000000000000
00000060: 0000000000000000000000000000000000000000000000000000000000000000
00:06:50:520762: handoffdemo-1
HANDOFFDEMO: current thread 1
Packet 4
00:06:50:520688: pg-input
stream x, 128 bytes, 0 sw_if_index
current data 0, length 128, buffer-pool 0, ref-count 1, trace handle 0x1000003
00000000: 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d0000
00000020: 0000000000000000000000000000000000000000000000000000000000000000
00000040: 0000000000000000000000000000000000000000000000000000000000000000
00000060: 0000000000000000000000000000000000000000000000000000000000000000
00:06:50:520762: handoffdemo-1
HANDOFFDEMO: current thread 1
Packet 5
00:06:50:520688: pg-input
stream x, 128 bytes, 0 sw_if_index
current data 0, length 128, buffer-pool 0, ref-count 1, trace handle 0x1000004
00000000: 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d0000
00000020: 0000000000000000000000000000000000000000000000000000000000000000
00000040: 0000000000000000000000000000000000000000000000000000000000000000
00000060: 0000000000000000000000000000000000000000000000000000000000000000
00:06:50:520762: handoffdemo-1
HANDOFFDEMO: current thread 1
------------------- Start of thread 2 vpp_wk_1 -------------------
Packet 1
00:06:50:520796: handoff_trace
HANDED-OFF: from thread 1 trace index 0
00:06:50:520796: handoffdemo-2
HANDOFFDEMO: current thread 2
00:06:50:520867: error-drop
rx:local0
00:06:50:520914: drop
handoffdemo-2: completed packets
Packet 2
00:06:50:520796: handoff_trace
HANDED-OFF: from thread 1 trace index 1
00:06:50:520796: handoffdemo-2
HANDOFFDEMO: current thread 2
00:06:50:520867: error-drop
rx:local0
00:06:50:520914: drop
handoffdemo-2: completed packets
Packet 3
00:06:50:520796: handoff_trace
HANDED-OFF: from thread 1 trace index 2
00:06:50:520796: handoffdemo-2
HANDOFFDEMO: current thread 2
00:06:50:520867: error-drop
rx:local0
00:06:50:520914: drop
handoffdemo-2: completed packets
Packet 4
00:06:50:520796: handoff_trace
HANDED-OFF: from thread 1 trace index 3
00:06:50:520796: handoffdemo-2
HANDOFFDEMO: current thread 2
00:06:50:520867: error-drop
rx:local0
00:06:50:520914: drop
handoffdemo-2: completed packets
Packet 5
00:06:50:520796: handoff_trace
HANDED-OFF: from thread 1 trace index 4
00:06:50:520796: handoffdemo-2
HANDOFFDEMO: current thread 2
00:06:50:520867: error-drop
rx:local0
00:06:50:520914: drop
handoffdemo-2: completed packets
DBGvpp#