.. _handoff_queue_demo_plugin:

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#