README.rst
1.. zephyr:code-sample:: eth-ivshmem
2 :name: Inter-VM Shared Memory (ivshmem) Ethernet
3 :relevant-api: ivshmem ethernet
4
5 Communicate with another "cell" in the Jailhouse hypervisor using IVSHMEM Ethernet.
6
7Overview
8********
9
10This application demonstrates how to use IVSHMEM Ethernet to communicate with
11another "cell" in the Jailhouse hypervisor. Currently only the qemu_cortex_a53
12board is supported.
13
14Building Jailhouse Linux for QEMU
15*********************************
16
17Clone Jailhouse yocto project. At the time of writing, the "next" branch has
18some fixes that are not yet on the "master" branch:
19
20.. code-block:: console
21
22 git clone https://github.com/siemens/jailhouse-images.git
23 cd jailhouse-images
24 git checkout origin/next
25
26Open the menu, select "QEMU ARM64 virtual target" then "Save & Build"
27(this will take a while):
28
29.. code-block:: console
30
31 ./kas-container menu
32
33Edit "start-qemu.sh":
34 * change ``-cpu cortex-a57`` -> ``-cpu cortex-a53``
35 under the ``arm64|aarch64`` case
36 * Enable SSH access by appending ``,hostfwd=tcp::2222-:22`` to
37 ``-netdev user,id=net`` in the QEMU process arguments
38 (2222 can be replaced with any unused port)
39
40Start QEMU:
41
42.. code-block:: console
43
44 ./start-qemu.sh arm64
45
46This should boot Linux and drop into a shell.
47
48Build the Zephyr sample
49***********************
50
51.. zephyr-app-commands::
52 :zephyr-app: samples/drivers/ethernet/eth_ivshmem
53 :board: qemu_cortex_a53
54 :goals: build
55
56Running the sample
57******************
58
59Copy the generated zephyr.bin to the Jailhouse Linux root cell:
60
61.. code-block:: console
62
63 scp -P 2222 path/to/zephyr.bin root@localhost:/root
64
65Jailhouse has a prebuilt Zephyr cell configuration that works for
66this sample "qemu-arm64-zephyr-demo".
67
68Back in Jailhouse Linux shell, create the Zephyr cell:
69
70.. code-block:: console
71
72 jailhouse enable /etc/jailhouse/qemu-arm64.cell
73 jailhouse console
74 jailhouse cell create /etc/jailhouse/qemu-arm64-zephyr-demo.cell
75
76You may see a quirk here where the Linux shell stops taking input...
77If you get this, open a second shell via SSH:
78
79.. code-block:: console
80
81 ssh -p 2222 root@localhost
82
83Load and start the Zephyr cell:
84
85.. code-block:: console
86
87 jailhouse cell load qemu-arm64-zephyr-demo zephyr.bin --address 0x70000000
88 jailhouse cell start qemu-arm64-zephyr-demo
89
90Now you can run Zephyr and Linux shell commands to communicate between
91the cells.
92
93Ping Linux from Zephyr
94**********************
95
96.. code-block:: console
97
98 *** Booting Zephyr OS build v3.3.0-475-g45b9e84c6013 ***
99 uart:~$ net ping 192.168.19.1
100 PING 192.168.19.1
101 28 bytes from 192.168.19.1 to 192.168.19.2: icmp_seq=1 ttl=64 time=5.06 ms
102 28 bytes from 192.168.19.1 to 192.168.19.2: icmp_seq=2 ttl=64 time=7.99 ms
103 28 bytes from 192.168.19.1 to 192.168.19.2: icmp_seq=3 ttl=64 time=1.77 ms
104
105Ping Zephyr from Linux
106**********************
107
108.. code-block:: console
109
110 root@demo:~# ping -c 3 192.168.19.2
111 PING 192.168.19.2 (192.168.19.2) 56(84) bytes of data.
112 64 bytes from 192.168.19.2: icmp_seq=1 ttl=64 time=0.646 ms
113 64 bytes from 192.168.19.2: icmp_seq=2 ttl=64 time=1.45 ms
114 64 bytes from 192.168.19.2: icmp_seq=3 ttl=64 time=1.28 ms
115
116 --- 192.168.19.2 ping statistics ---
117 3 packets transmitted, 3 received, 0% packet loss, time 2006ms
118 rtt min/avg/max/mdev = 0.646/1.124/1.450/0.345 ms
119
120Run zperf / iPerf
121*****************
122
123:ref:`zperf` / iPerf can be used to perform network throughput measurements.
124
125In Zephyr:
126
127.. code-block:: console
128
129 # Start zperf TCP server
130 zperf tcp download 5001
131
132In Linux:
133
134.. code-block:: console
135
136 # Install iPerf 2.0.5
137 apt install wget
138 wget https://iperf.fr/download/ubuntu/iperf_2.0.5+dfsg1-2_arm64.deb
139 apt install ./iperf_2.0.5+dfsg1-2_arm64.deb
140 rm iperf_2.0.5+dfsg1-2_arm64.deb
141
142 # Connect iPerf TCP client
143 iperf -l 1K -V -c 192.168.19.2 -p 5001
144
145Zephyr output:
146
147.. code-block:: console
148
149 TCP server started on port 5001
150 New TCP session started.
151 TCP session ended
152 Duration: 10.01 s
153 rate: 57.72 Mbps
154
155Linux output:
156
157.. code-block:: console
158
159 ------------------------------------------------------------
160 Client connecting to 192.168.19.2, TCP port 5001
161 TCP window size: 85.0 KByte (default)
162 ------------------------------------------------------------
163 [ 3] local 192.168.19.1 port 58430 connected with 192.168.19.2 port 5001
164 [ ID] Interval Transfer Bandwidth
165 [ 3] 0.0-10.0 sec 72.2 MBytes 60.6 Mbits/sec
166