.. zephyr:code-sample:: eth-ivshmem
:name: Inter-VM Shared Memory (ivshmem) Ethernet
:relevant-api: ivshmem ethernet
Communicate with another "cell" in the Jailhouse hypervisor using IVSHMEM Ethernet.
Overview
********
This application demonstrates how to use IVSHMEM Ethernet to communicate with
another "cell" in the Jailhouse hypervisor. Currently only the qemu_cortex_a53
board is supported.
Building Jailhouse Linux for QEMU
*********************************
Clone Jailhouse yocto project. At the time of writing, the "next" branch has
some fixes that are not yet on the "master" branch:
.. code-block:: console
git clone https://github.com/siemens/jailhouse-images.git
cd jailhouse-images
git checkout origin/next
Open the menu, select "QEMU ARM64 virtual target" then "Save & Build"
(this will take a while):
.. code-block:: console
./kas-container menu
Edit "start-qemu.sh":
* change ``-cpu cortex-a57`` -> ``-cpu cortex-a53``
under the ``arm64|aarch64`` case
* Enable SSH access by appending ``,hostfwd=tcp::2222-:22`` to
``-netdev user,id=net`` in the QEMU process arguments
(2222 can be replaced with any unused port)
Start QEMU:
.. code-block:: console
./start-qemu.sh arm64
This should boot Linux and drop into a shell.
Build the Zephyr sample
***********************
.. zephyr-app-commands::
:zephyr-app: samples/drivers/ethernet/eth_ivshmem
:board: qemu_cortex_a53
:goals: build
Running the sample
******************
Copy the generated zephyr.bin to the Jailhouse Linux root cell:
.. code-block:: console
scp -P 2222 path/to/zephyr.bin root@localhost:/root
Jailhouse has a prebuilt Zephyr cell configuration that works for
this sample "qemu-arm64-zephyr-demo".
Back in Jailhouse Linux shell, create the Zephyr cell:
.. code-block:: console
jailhouse enable /etc/jailhouse/qemu-arm64.cell
jailhouse console
jailhouse cell create /etc/jailhouse/qemu-arm64-zephyr-demo.cell
You may see a quirk here where the Linux shell stops taking input...
If you get this, open a second shell via SSH:
.. code-block:: console
ssh -p 2222 root@localhost
Load and start the Zephyr cell:
.. code-block:: console
jailhouse cell load qemu-arm64-zephyr-demo zephyr.bin --address 0x70000000
jailhouse cell start qemu-arm64-zephyr-demo
Now you can run Zephyr and Linux shell commands to communicate between
the cells.
Ping Linux from Zephyr
**********************
.. code-block:: console
*** Booting Zephyr OS build v3.3.0-475-g45b9e84c6013 ***
uart:~$ net ping 192.168.19.1
PING 192.168.19.1
28 bytes from 192.168.19.1 to 192.168.19.2: icmp_seq=1 ttl=64 time=5.06 ms
28 bytes from 192.168.19.1 to 192.168.19.2: icmp_seq=2 ttl=64 time=7.99 ms
28 bytes from 192.168.19.1 to 192.168.19.2: icmp_seq=3 ttl=64 time=1.77 ms
Ping Zephyr from Linux
**********************
.. code-block:: console
root@demo:~# ping -c 3 192.168.19.2
PING 192.168.19.2 (192.168.19.2) 56(84) bytes of data.
64 bytes from 192.168.19.2: icmp_seq=1 ttl=64 time=0.646 ms
64 bytes from 192.168.19.2: icmp_seq=2 ttl=64 time=1.45 ms
64 bytes from 192.168.19.2: icmp_seq=3 ttl=64 time=1.28 ms
--- 192.168.19.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2006ms
rtt min/avg/max/mdev = 0.646/1.124/1.450/0.345 ms
Run zperf / iPerf
*****************
:ref:`zperf` / iPerf can be used to perform network throughput measurements.
In Zephyr:
.. code-block:: console
# Start zperf TCP server
zperf tcp download 5001
In Linux:
.. code-block:: console
# Install iPerf 2.0.5
apt install wget
wget https://iperf.fr/download/ubuntu/iperf_2.0.5+dfsg1-2_arm64.deb
apt install ./iperf_2.0.5+dfsg1-2_arm64.deb
rm iperf_2.0.5+dfsg1-2_arm64.deb
# Connect iPerf TCP client
iperf -l 1K -V -c 192.168.19.2 -p 5001
Zephyr output:
.. code-block:: console
TCP server started on port 5001
New TCP session started.
TCP session ended
Duration: 10.01 s
rate: 57.72 Mbps
Linux output:
.. code-block:: console
------------------------------------------------------------
Client connecting to 192.168.19.2, TCP port 5001
TCP window size: 85.0 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.19.1 port 58430 connected with 192.168.19.2 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 72.2 MBytes 60.6 Mbits/sec