## Example setup {#libmemif_example_setup_doc} #### 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.