.. _libmemif_example_setup_doc:

Example setup
=============

VPP-memif master icmp_responder slave
-------------------------------------

   Libmemif example app(s) use memif default socket file:
   ``/run/vpp/memif.sock``.

Run VPP and icmpr-epoll example (default example when running in
container).

   Other examples work similar to icmpr-epoll. Brief explanation can be
   found in :ref:`libmemif_examples_doc` .

VPP-side config:

::

   DBGvpp# create interface memif id 0 master
   DBGvpp# set int state memif0/0 up
   DBGvpp# set int ip address memif0/0 192.168.1.1/24

icmpr-epoll:

::

   conn 0 0

Memif in slave mode will try to connect every 2 seconds. If connection
establishment is successful, a message will show.

::

   INFO: memif connected!

..

   Error messages like “unmatched interface id” are printed only in
   debug mode.

Check connected status. Use show command in icmpr-epoll:

::

   show
   MEMIF DETAILS
   ==============================
   interface index: 0
       interface ip: 192.168.1.2
       interface name: memif_connection
       app name: ICMP_Responder
       remote interface name: memif0/0
       remote app name: VPP 17.10-rc0~132-g62f9cdd
       id: 0
       secret:
       role: slave
       mode: ethernet
       socket filename: /run/vpp/memif.sock
       rx queues:
           queue id: 0
           ring size: 1024
           buffer size: 2048
       tx queues:
           queue id: 0
           ring size: 1024
           buffer size: 2048
       link: up
   interface index: 1
       no connection

Use sh memif command in VPP:

::

   DBGvpp# sh memif
   interface memif0/0
     remote-name "ICMP_Responder"
     remote-interface "memif_connection"
     id 0 mode ethernet file /run/vpp/memif.sock
     flags admin-up connected
     listener-fd 12 conn-fd 13
     num-s2m-rings 1 num-m2s-rings 1 buffer-size 0
       master-to-slave ring 0:
         region 0 offset 32896 ring-size 1024 int-fd 16
         head 0 tail 0 flags 0x0000 interrupts 0
       master-to-slave ring 0:
         region 0 offset 0 ring-size 1024 int-fd 15
         head 0 tail 0 flags 0x0001 interrupts 0

Send ping from VPP to icmpr-epoll:

::

   DBGvpp# ping 192.168.1.2
   64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=.1888 ms
   64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=.1985 ms
   64 bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=.1813 ms
   64 bytes from 192.168.1.2: icmp_seq=5 ttl=64 time=.1929 ms

   Statistics: 5 sent, 4 received, 20% packet loss

multiple queues VPP-memif slave icmp_responder master
-----------------------------------------------------

Run icmpr-epoll as in previous example setup. Run VPP with startup conf,
enabling 2 worker threads. Example startup.conf:

::

   unix {
     interactive
     nodaemon
     full-coredump
   }

   cpu {
     workers 2
   }

VPP-side config:

::

   DBGvpp# create memif id 0 slave rx-queues 2 tx-queues 2
   DBGvpp# set int state memif0/0 up
   DBGvpp# set int ip address memif0/0 192.168.1.1/24

icmpr-epoll:

::

   conn 0 1

When connection is established a message will print:

::

   INFO: memif connected!

..

   Error messages like “unmatched interface id” are printed only in
   debug mode.

Check connected status. Use show command in icmpr-epoll:

::

   show
   MEMIF DETAILS
   ==============================
   interface index: 0
       interface ip: 192.168.1.2
       interface name: memif_connection
       app name: ICMP_Responder
       remote interface name: memif0/0
       remote app name: VPP 17.10-rc0~132-g62f9cdd
       id: 0
       secret:
       role: master
       mode: ethernet
       socket filename: /run/vpp/memif.sock
       rx queues:
           queue id: 0
           ring size: 1024
           buffer size: 2048
           queue id: 1
           ring size: 1024
           buffer size: 2048
       tx queues:
           queue id: 0
           ring size: 1024
           buffer size: 2048
           queue id: 1
           ring size: 1024
           buffer size: 2048
       link: up
   interface index: 1
       no connection

Use sh memif command in VPP:

::

   DBGvpp# sh memif
   interface memif0/0
     remote-name "ICMP_Responder"
     remote-interface "memif_connection"
     id 0 mode ethernet file /run/vpp/memif.sock
     flags admin-up slave connected
     listener-fd -1 conn-fd 12
     num-s2m-rings 2 num-m2s-rings 2 buffer-size 2048
       slave-to-master ring 0:
         region 0 offset 0 ring-size 1024 int-fd 14
         head 0 tail 0 flags 0x0000 interrupts 0
       slave-to-master ring 1:
         region 0 offset 32896 ring-size 1024 int-fd 15
         head 0 tail 0 flags 0x0000 interrupts 0
       slave-to-master ring 0:
         region 0 offset 65792 ring-size 1024 int-fd 16
         head 0 tail 0 flags 0x0001 interrupts 0
       slave-to-master ring 1:
         region 0 offset 98688 ring-size 1024 int-fd 17
         head 0 tail 0 flags 0x0001 interrupts 0

Send ping from VPP to icmpr-epoll:

::

   DBGvpp# ping 192.168.1.2
   64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=.1439 ms
   64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=.2184 ms
   64 bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=.1458 ms
   64 bytes from 192.168.1.2: icmp_seq=5 ttl=64 time=.1687 ms

   Statistics: 5 sent, 4 received, 20% packet loss

icmp_responder master icmp_responder slave
------------------------------------------

   This setup creates connection between two applications using
   libmemif. Traffic functionality is the same as when connection to
   VPP. App can receive ARP/ICMP request and transmit response.

Run two instances of icmpr-epoll example. > If not running in container,
make sure folder /run/vpp/ exists before creating memif master. Instance
1 will be in master mode, instance 2 in slave mode. instance 1:

::

   conn 0 1

instance 2:

::

   conn 0 0

In 2 seconds, both instances should print connected! message:

::

   INFO: memif connected!

Check peer interface names using show command.