Handoff queue in a 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#