| .. 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 |