summaryrefslogtreecommitdiffstats
path: root/doc/book-enea-nfv-access-guide/doc
diff options
context:
space:
mode:
Diffstat (limited to 'doc/book-enea-nfv-access-guide/doc')
-rw-r--r--doc/book-enea-nfv-access-guide/doc/benchmarks.xml1474
-rw-r--r--doc/book-enea-nfv-access-guide/doc/book.xml30
-rw-r--r--doc/book-enea-nfv-access-guide/doc/container_virtualization.xml136
-rw-r--r--doc/book-enea-nfv-access-guide/doc/dpdk.xml125
-rw-r--r--doc/book-enea-nfv-access-guide/doc/eltf_params_template.xml151
-rw-r--r--doc/book-enea-nfv-access-guide/doc/eltf_params_updated.xml165
-rw-r--r--doc/book-enea-nfv-access-guide/doc/getting_started.xml244
-rw-r--r--doc/book-enea-nfv-access-guide/doc/hypervisor_virtualization.xml774
-rw-r--r--doc/book-enea-nfv-access-guide/doc/images/select-linux-kernel-in-grub2-boot-loader-on-ubuntu-14.04.pngbin6403 -> 0 bytes
-rw-r--r--doc/book-enea-nfv-access-guide/doc/images/select-linux-kernel-in-grub2-boot-loader-on-ubuntu-14.04.svg3
-rwxr-xr-xdoc/book-enea-nfv-access-guide/doc/images/virtual_network_functions.pngbin82611 -> 0 bytes
-rwxr-xr-xdoc/book-enea-nfv-access-guide/doc/images/virtual_network_functions.svg1569
-rw-r--r--doc/book-enea-nfv-access-guide/doc/images/virtual_network_functions_old.pngbin24106 -> 0 bytes
-rw-r--r--doc/book-enea-nfv-access-guide/doc/overview.xml147
-rw-r--r--doc/book-enea-nfv-access-guide/doc/ovs.xml162
-rw-r--r--doc/book-enea-nfv-access-guide/doc/using_nfv_access_sdks.xml473
16 files changed, 0 insertions, 5453 deletions
diff --git a/doc/book-enea-nfv-access-guide/doc/benchmarks.xml b/doc/book-enea-nfv-access-guide/doc/benchmarks.xml
deleted file mode 100644
index 34748b8..0000000
--- a/doc/book-enea-nfv-access-guide/doc/benchmarks.xml
+++ /dev/null
@@ -1,1474 +0,0 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
3"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
4<chapter id="benchmarks">
5 <title>Benchmarks</title>
6
7 <section id="hw-setup">
8 <title>Hardware Setup</title>
9
10 <para>The following table describes all the needed prequisites for an apt
11 hardware setup:</para>
12
13 <table>
14 <title>Hardware Setup</title>
15
16 <tgroup cols="2">
17 <colspec align="left" />
18
19 <thead>
20 <row>
21 <entry align="center">Item</entry>
22
23 <entry align="center">Description</entry>
24 </row>
25 </thead>
26
27 <tbody>
28 <row>
29 <entry align="left">Server Platform</entry>
30
31 <entry align="left">Cavium CN8304</entry>
32 </row>
33
34 <row>
35 <entry align="left">ARCH</entry>
36
37 <entry>aarch64</entry>
38 </row>
39
40 <row>
41 <entry align="left">Processor</entry>
42
43 <entry>Cavium OcteonTX CN83XX</entry>
44 </row>
45
46 <row>
47 <entry align="left">CPU freq</entry>
48
49 <entry>1.8 GHz</entry>
50 </row>
51
52 <row>
53 <entry align="left">RAM</entry>
54
55 <entry>16GB</entry>
56 </row>
57
58 <row>
59 <entry align="left">Network</entry>
60
61 <entry>2x10G ports</entry>
62 </row>
63
64 <row>
65 <entry align="left">Storage</entry>
66
67 <entry>Seagate 500GB HDD</entry>
68 </row>
69 </tbody>
70 </tgroup>
71 </table>
72
73 <para>Generic tests configuration:</para>
74
75 <itemizedlist>
76 <listitem>
77 <para>All tests use one port, one core and one Rx/TX queue for fast
78 path traffic.</para>
79 </listitem>
80 </itemizedlist>
81 </section>
82
83 <section id="use-cases">
84 <title>Use Cases</title>
85
86 <section id="docker-benchmarks">
87 <title>Docker related benchmarks</title>
88
89 <section>
90 <title>Forward traffic in Docker</title>
91
92 <para>Benchmarking traffic forwarding using the testpmd application in
93 a Docker container.</para>
94
95 <para>Pktgen is used to generate UDP traffic that will reach testpmd,
96 running in a Docker image. It will then be forwarded back to source on
97 the return trip (<emphasis role="bold">Forwarding</emphasis>).</para>
98
99 <para>This test measures:</para>
100
101 <itemizedlist>
102 <listitem>
103 <para>pktgen TX, RX in packets per second (pps) and MBps</para>
104 </listitem>
105
106 <listitem>
107 <para>testpmd TX, RX in packets per second (pps)</para>
108 </listitem>
109
110 <listitem>
111 <para>divide testpmd RX / pktgen TX in pps to obtain throughput in
112 percentages (%)</para>
113 </listitem>
114 </itemizedlist>
115
116 <section id="usecase-one">
117 <title>Test Setup for Target 1</title>
118
119 <para>Start by following the steps below:</para>
120
121 <para>Boot the NFV Access Linux using the following kernel
122 parameters in U-Boot: <programlisting>&gt; setenv bootargs 'nohz_full=1-23 isolcpus=1-23 \
123rcu-nocbs=1-23 rcu_nocb_poll clocksource=tsc tsc=reliable nohpet \
124nosoftlockup audit=0'</programlisting></para>
125
126 <para>Configure hugepages and set up the DPDK:<programlisting>echo 4 &gt; /proc/sys/vm/nr_hugepages
127modprobe vfio-pci
128ifconfig enP1p1s0f1 down
129dpdk-devbind -b vfio-pci 0001:01:00.1</programlisting>Run
130 pktgen:<programlisting>cd /usr/share/apps/pktgen/
131./pktgen -v -c 0x7 -n 4 --proc-type auto -d /usr/lib/librte_pmd_thunderx_nicvf.so.1.1 \
132-w 0001:01:00.1 -- -P -m "[1:2].0"</programlisting>In the pktgen console
133 run:<programlisting>str</programlisting>Choose one of the values
134 from [64, 128, 256, 512] to change the packet size:<programlisting>set 0 size &lt;number&gt;</programlisting></para>
135 </section>
136
137 <section id="usecase-two">
138 <title>Test Setup for Target 2</title>
139
140 <para>Start by following the steps below:</para>
141
142 <para>Boot the NFV Access Linux using the following kernel
143 parameters in U-Boot:</para>
144
145 <programlisting>&gt; setenv bootargs 'nohz_full=1-23 isolcpus=1-23 \
146rcu-nocbs=1-23 rcu_nocb_poll clocksource=tsc tsc=reliable nohpet \
147nosoftlockup audit=0'</programlisting>
148
149 <para>It is expected that a NFV Access guest image is present on the
150 target.</para>
151
152 <para>Set up the DPDK and configure the OVS bridge:<programlisting># Clean up old OVS old config
153killall ovsdb-server ovs-vswitchd
154rm -rf /etc/openvswitch/*
155rm -rf /var/run/openvswitch/*
156rm -rf /var/log/openvswitch/*
157mkdir -p /var/run/openvswitch
158
159# Configure hugepages and bind interfaces to dpdk
160echo 20 &gt; /proc/sys/vm/nr_hugepages
161modprobe vfio-pci
162ifconfig enP1p1s0f1 down
163dpdk-devbind --b vfio-pci 0001:01:00.1
164
165# configure openvswitch with DPDK
166export DB_SOCK=/var/run/openvswitch/db.sock
167ovsdb-tool create /etc/openvswitch/conf.db /usr/share/openvswitch/vswitch.ovsschema
168ovsdb-server --remote=punix:$DB_SOCK \
169 --remote=db:Open_vSwitch,Open_vSwitch,manager_options --pidfile --detach
170ovs-vsctl --no-wait init
171ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-lcore-mask=0x10
172ovs-vsctl --no-wait set Open_vSwitch . other_config:pmd-cpu-mask=0xc
173ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-socket-mem=2048
174ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true
175ovs-vswitchd unix:$DB_SOCK --pidfile --detach \
176 --log-file=/var/log/openvswitch/ovs-vswitchd.log
177
178ovs-vsctl add-br ovsbr0 -- set bridge ovsbr0 datapath_type=netdev
179ovs-vsctl add-port ovsbr0 vhost-user1 -- set Interface vhost-user1 \
180 type=dpdkvhostuser -- set Interface vhost-user1 ofport_request=2
181ovs-vsctl add-port ovsbr0 dpdk0 -- set Interface dpdk0 type=dpdk \
182 options:dpdk-devargs=0001:01:00.1 -- set Interface dpdk0 ofport_request=1
183
184# configure static flows
185ovs-ofctl del-flows ovsbr0
186ovs-ofctl add-flow ovsbr0 in_port=1,action=output:2
187ovs-ofctl add-flow ovsbr0 in_port=2,action=output:1</programlisting>Import a
188 Docker container:<programlisting>docker import enea-nfv-access-guest-qemuarm64.tar.gz nfv_container</programlisting>Start
189 the Docker container:<programlisting>docker run -v /var/run/openvswitch/:/var/run/openvswitch/ \
190 -v /dev/hugepages/:/dev/hugepages/ -p nfv_container /bin/bash</programlisting>Start
191 the testpmd application in Docker:<programlisting>testpmd -c 0x30 -n 2 --file-prefix prog1 --socket-mem 512 \
192 --no-pci --vdev=virtio_user0,path=/var/run/openvswitch/vhost-user1 \
193 -d /usr/lib/librte_pmd_virtio.so.1.1 -- --burst 64 --disable-hw-vlan \
194 --disable-rss -i --portmask=0x1 --coremask=0x20 --nb-cores=1 --rxq=1 \
195 --txq=1 --txd=512 --rxd=512 --txqflags=0xf00 --port-topology=chained</programlisting>To
196 start traffic <emphasis role="bold">forwarding</emphasis>, run the
197 following command in testpmd CLI:<programlisting>start</programlisting>To
198 start traffic but in <emphasis role="bold">termination</emphasis>
199 mode (no traffic sent on TX), run the following commands in testpmd
200 CLI:<programlisting>set fwd rxonly
201start</programlisting><table>
202 <title>Results in forwarding mode</title>
203
204 <tgroup cols="8">
205 <tbody>
206 <row>
207 <entry align="center"><emphasis
208 role="bold">Bytes</emphasis></entry>
209
210 <entry align="center"><emphasis role="bold">pktgen pps
211 TX</emphasis></entry>
212
213 <entry align="center"><emphasis role="bold">pktgen MBits/s
214 TX</emphasis></entry>
215
216 <entry align="center"><emphasis role="bold">pktgen pps
217 RX</emphasis></entry>
218
219 <entry align="center"><emphasis role="bold">pktgen MBits/s
220 RX</emphasis></entry>
221
222 <entry align="center"><emphasis role="bold">testpmd pps
223 RX</emphasis></entry>
224
225 <entry align="center"><emphasis role="bold">testpmd pps
226 TX</emphasis></entry>
227
228 <entry align="center"><emphasis role="bold">throughput
229 (%)</emphasis></entry>
230 </row>
231
232 <row>
233 <entry role="bold"><emphasis
234 role="bold">64</emphasis></entry>
235
236 <entry>14682363</entry>
237
238 <entry>9867</entry>
239
240 <entry>1666666</entry>
241
242 <entry>1119</entry>
243
244 <entry>1976488</entry>
245
246 <entry>1666694</entry>
247
248 <entry>13.46%</entry>
249 </row>
250
251 <row>
252 <entry><emphasis role="bold">128</emphasis></entry>
253
254 <entry>8445993</entry>
255
256 <entry>10000</entry>
257
258 <entry>1600567</entry>
259
260 <entry>1894</entry>
261
262 <entry>1886851</entry>
263
264 <entry>1600573</entry>
265
266 <entry>22.34%</entry>
267 </row>
268
269 <row>
270 <entry role="bold"><emphasis
271 role="bold">256</emphasis></entry>
272
273 <entry>4529011</entry>
274
275 <entry>10000</entry>
276
277 <entry>1491449</entry>
278
279 <entry>3292</entry>
280
281 <entry>1715763</entry>
282
283 <entry>1491445</entry>
284
285 <entry>37.88%</entry>
286 </row>
287
288 <row>
289 <entry><emphasis role="bold">512</emphasis></entry>
290
291 <entry>2349638</entry>
292
293 <entry>10000</entry>
294
295 <entry>1422338</entry>
296
297 <entry>6052</entry>
298
299 <entry>1555351</entry>
300
301 <entry>1422330</entry>
302
303 <entry>66.20%</entry>
304 </row>
305
306 <row>
307 <entry><emphasis role="bold">1024</emphasis></entry>
308
309 <entry>1197323</entry>
310
311 <entry>10000</entry>
312
313 <entry>1197325</entry>
314
315 <entry>9999</entry>
316
317 <entry>1197320</entry>
318
319 <entry>1197320</entry>
320
321 <entry>100.00%</entry>
322 </row>
323 </tbody>
324 </tgroup>
325 </table><table>
326 <title>Results in termination mode</title>
327
328 <tgroup cols="4">
329 <tbody>
330 <row>
331 <entry align="center"><emphasis
332 role="bold">Bytes</emphasis></entry>
333
334 <entry align="center"><emphasis role="bold">pktgen pps
335 TX</emphasis></entry>
336
337 <entry align="center"><emphasis role="bold">testpmd pps
338 RX</emphasis></entry>
339
340 <entry align="center"><emphasis role="bold">throughput
341 (%)</emphasis></entry>
342 </row>
343
344 <row>
345 <entry role="bold"><emphasis
346 role="bold">64</emphasis></entry>
347
348 <entry>14676922</entry>
349
350 <entry>1984693</entry>
351
352 <entry>13.52%</entry>
353 </row>
354
355 <row>
356 <entry><emphasis role="bold">128</emphasis></entry>
357
358 <entry>8445991</entry>
359
360 <entry>1895099</entry>
361
362 <entry>22.44%</entry>
363 </row>
364
365 <row>
366 <entry role="bold"><emphasis
367 role="bold">256</emphasis></entry>
368
369 <entry>4528379</entry>
370
371 <entry>1722004</entry>
372
373 <entry>38.03%</entry>
374 </row>
375
376 <row>
377 <entry><emphasis role="bold">512</emphasis></entry>
378
379 <entry>2349639</entry>
380
381 <entry>1560988</entry>
382
383 <entry>66.44%</entry>
384 </row>
385
386 <row>
387 <entry><emphasis role="bold">1024</emphasis></entry>
388
389 <entry>1197325</entry>
390
391 <entry>1197325</entry>
392
393 <entry>100.00%</entry>
394 </row>
395 </tbody>
396 </tgroup>
397 </table></para>
398 </section>
399 </section>
400
401 <section id="usecase-three-four">
402 <title>Forward traffic from Docker to another Docker on the same
403 host</title>
404
405 <para>Benchmark a combo test using testpmd running in two Docker
406 instances, one which forwards traffic to the second one, which
407 terminates it.</para>
408
409 <para>Packets are generated with pktgen and transmitted to the first
410 testpmd instance, which will forward them to the second testpmd
411 instance, which terminates them.</para>
412
413 <para>This test measures:</para>
414
415 <itemizedlist>
416 <listitem>
417 <para>pktgen TX, RX in packets per second (pps) and MBps</para>
418 </listitem>
419
420 <listitem>
421 <para>testpmd TX, RX in packets per second in the first Docker
422 container</para>
423 </listitem>
424
425 <listitem>
426 <para>testpmd TX, RX in packets per second in the second Docker
427 container</para>
428 </listitem>
429
430 <listitem>
431 <para>divide testpmd RX pps for the second Docker container to
432 pktgen TX pps to obtain throughput in percentages (%)</para>
433 </listitem>
434 </itemizedlist>
435
436 <section id="target-one-usecase-three">
437 <title>Test Setup for Target 1</title>
438
439 <para>Start by following the steps below:</para>
440
441 <para>Boot the NFV Access Linux using the following kernel
442 parameters in U-Boot:</para>
443
444 <programlisting>setenv bootargs 'nohz_full=1-23 isolcpus=1-23 \
445rcu-nocbs=1-23 rcu_nocb_poll clocksource=tsc tsc=reliable nohpet \
446nosoftlockup audit=0'</programlisting>
447
448 <para>Configure hugepages and set up the DPDK:<programlisting>echo 4 &gt; /proc/sys/vm/nr_hugepages
449modprobe vfio-pci
450ifconfig enP1p1s0f1 down
451dpdk-devbind -b vfio-pci 0001:01:00.1</programlisting>Run
452 pktgen:<programlisting>cd /usr/share/apps/pktgen/
453./pktgen -v -c 0x7 -n 4 --proc-type auto -d /usr/lib/librte_pmd_thunderx_nicvf.so.1.1 \
454-w 0001:01:00.1 -- -P -m "[1:2].0"</programlisting>Choose one of the values
455 from [64, 128, 256, 512] to change the packet size:<programlisting>set 0 size &lt;number&gt;</programlisting></para>
456 </section>
457
458 <section id="target-two-usecase-four">
459 <title>Test Setup for Target 2</title>
460
461 <para>Start by following the steps below:</para>
462
463 <para>Boot the NFV Access Linux using the following kernel
464 parameters in U-Boot:</para>
465
466 <programlisting>setenv bootargs 'nohz_full=1-23 isolcpus=1-23 \
467rcu-nocbs=1-23 rcu_nocb_poll clocksource=tsc tsc=reliable nohpet \
468nosoftlockup audit=0'</programlisting>
469
470 <para>Set up the DPDK and configure the OVS bridge:<programlisting># Clean up old OVS old config
471killall ovsdb-server ovs-vswitchd
472rm -rf /etc/openvswitch/*
473rm -rf /var/run/openvswitch/*
474rm -rf /var/log/openvswitch/*
475mkdir -p /var/run/openvswitch
476
477# Configure hugepages and bind interfaces to dpdk
478echo 20 &gt; /proc/sys/vm/nr_hugepages
479modprobe vfio-pci
480ifconfig enP1p1s0f1 down
481dpdk-devbind --b vfio-pci 0001:01:00.1
482
483# configure openvswitch with DPDK
484export DB_SOCK=/var/run/openvswitch/db.sock
485ovsdb-tool create /etc/openvswitch/conf.db /usr/share/openvswitch/vswitch.ovsschema
486ovsdb-server --remote=punix:$DB_SOCK \
487 --remote=db:Open_vSwitch,Open_vSwitch,manager_options --pidfile --detach
488ovs-vsctl --no-wait init
489ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-lcore-mask=0x10
490ovs-vsctl --no-wait set Open_vSwitch . other_config:pmd-cpu-mask=0xc
491ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-socket-mem=2048
492ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true
493ovs-vswitchd unix:$DB_SOCK --pidfile --detach \
494 --log-file=/var/log/openvswitch/ovs-vswitchd.log
495
496ovs-vsctl add-br ovsbr0 -- set bridge ovsbr0 datapath_type=netdev
497ovs-vsctl add-port ovsbr0 vhost-user1 -- set Interface vhost-user1 \
498 type=dpdkvhostuser -- set Interface vhost-user1 ofport_request=1
499ovs-vsctl add-port ovsbr0 vhost-user2 -- set Interface vhost-user2 \
500 type=dpdkvhostuser -- set Interface vhost-user2 ofport_request=2
501ovs-vsctl add-port ovsbr0 dpdk0 -- set Interface dpdk0 type=dpdk \
502 options:dpdk-devargs=0001:01:00.1 -- set Interface dpdk0 ofport_request=3
503
504# configure static flows
505ovs-ofctl del-flows ovsbr0
506ovs-ofctl add-flow ovsbr0 in_port=3,action=output:2
507ovs-ofctl add-flow ovsbr0 in_port=2,action=output:1</programlisting>Import a
508 Docker container:<programlisting>docker import enea-nfv-access-guest-qemuarm64.tar.gz nfv_container</programlisting>Start
509 the first Docker container:<programlisting>docker run -v /var/run/openvswitch/:/var/run/openvswitch/ \
510 -v /dev/hugepages/:/dev/hugepages/ nfv_container /bin/bash</programlisting>Start
511 testpmd in the first Docker container:<programlisting>testpmd -c 0x300 -n 4 --file-prefix prog2 --socket-mem 512 \
512 --no-pci --vdev=virtio_user0,path=/var/run/openvswitch/vhost-user1 \
513 -d /usr/lib/librte_pmd_virtio.so.1.1 -- --burst 64 --disable-hw-vlan \
514 --disable-rss -i --portmask=0x1 --coremask=0x200 --nb-cores=1 --rxq=1 \
515 --txq=1 --txd=512 --rxd=512 --txqflags=0xf00 --port-topology=chained</programlisting>Configure
516 it in termination mode:<programlisting>set fwd rxonly</programlisting>Run
517 the testpmd application:<programlisting>start</programlisting>Open a
518 new console to the host and start the second Docker
519 instance:<programlisting>docker run -v /var/run/openvswitch/:/var/run/openvswitch/ \
520 -v /dev/hugepages/:/dev/hugepages/ nfv_container /bin/bash</programlisting>In
521 the second container start testpmd:<programlisting>testpmd -c 0x0F --file-prefix prog2 --socket-mem 512 --no-pci \
522--vdev=virtio_user0,path=/var/run/openvswitch/vhost-user2 \
523-d /usr/lib/librte_pmd_virtio.so.1.1 -- -i --disable-hw-vlan</programlisting>Start
524 testpmd in the second Docker container:<programlisting>testpmd -c 0x30 -n 4 --file-prefix prog1 --socket-mem 512 \
525 --no-pci --vdev=virtio_user0,path=/var/run/openvswitch/vhost-user2 \
526 -d /usr/lib/librte_pmd_virtio.so.1.1 -- --burst 64 --disable-hw-vlan \
527 --disable-rss -i --portmask=0x1 --coremask=0x20 --nb-cores=1 --rxq=1 \
528 --txq=1 --txd=512 --rxd=512 --txqflags=0xf00 --port-topology=chained</programlisting>In
529 the testpmd shell, run:<programlisting>start</programlisting>Start
530 pktgen traffic by running the following command in pktgen
531 CLI:<programlisting>start 0</programlisting>To record traffic
532 results, run:<programlisting>show port stats 0</programlisting></para>
533
534 <table>
535 <title>Results</title>
536
537 <tgroup cols="6">
538 <tbody>
539 <row>
540 <entry align="center"><emphasis
541 role="bold">Bytes</emphasis></entry>
542
543 <entry align="center"><emphasis role="bold">Target 1 -
544 pktgen pps TX</emphasis></entry>
545
546 <entry align="center"><emphasis role="bold">Target 2 -
547 (forwarding) testpmd pps RX</emphasis></entry>
548
549 <entry align="center"><emphasis role="bold">Target 2 -
550 (forwarding) testpmd pps TX</emphasis></entry>
551
552 <entry align="center"><emphasis role="bold">Target 2 -
553 (termination) testpmd pps RX</emphasis></entry>
554
555 <entry align="center"><emphasis role="bold">Throughput
556 (%)</emphasis></entry>
557 </row>
558
559 <row>
560 <entry role="bold"><emphasis
561 role="bold">64</emphasis></entry>
562
563 <entry>14683140</entry>
564
565 <entry>1979807</entry>
566
567 <entry>1366712</entry>
568
569 <entry>1366690</entry>
570
571 <entry>9.31%</entry>
572 </row>
573
574 <row>
575 <entry><emphasis role="bold">128</emphasis></entry>
576
577 <entry>8446005</entry>
578
579 <entry>1893514</entry>
580
581 <entry>1286628</entry>
582
583 <entry>1286621</entry>
584
585 <entry>15.23%</entry>
586 </row>
587
588 <row>
589 <entry role="bold"><emphasis
590 role="bold">256</emphasis></entry>
591
592 <entry>4529011</entry>
593
594 <entry>1716427</entry>
595
596 <entry>1140234</entry>
597
598 <entry>1140232</entry>
599
600 <entry>25.18%</entry>
601 </row>
602
603 <row>
604 <entry><emphasis role="bold">512</emphasis></entry>
605
606 <entry>2349638</entry>
607
608 <entry>1556898</entry>
609
610 <entry>1016661</entry>
611
612 <entry>1016659</entry>
613
614 <entry>43.27%</entry>
615 </row>
616
617 <row>
618 <entry><emphasis role="bold">1024</emphasis></entry>
619
620 <entry>1197326</entry>
621
622 <entry>1197319</entry>
623
624 <entry>869654</entry>
625
626 <entry>869652</entry>
627
628 <entry>72.63%</entry>
629 </row>
630
631 <row>
632 <entry><emphasis role="bold">1500</emphasis></entry>
633
634 <entry>822373</entry>
635
636 <entry>822369</entry>
637
638 <entry>760826</entry>
639
640 <entry>760821</entry>
641
642 <entry>92.52%</entry>
643 </row>
644 </tbody>
645 </tgroup>
646 </table>
647 </section>
648 </section>
649 </section>
650
651 <section id="vm-benchmarks">
652 <title>VM related benchmarks</title>
653
654 <section id="usecase-four">
655 <title>Forward/termination traffic in one VM</title>
656
657 <para>Benchmarking traffic (UDP) forwarding and termination using
658 testpmd in a virtual machine.</para>
659
660 <para>The pktgen application is used to generate traffic that will
661 reach testpmd running in a virtual machine, from where it will be
662 forwarded back to source. Within the same setup, a second measurement
663 will be done with traffic termination in the virtual machine.</para>
664
665 <para>This test case measures:</para>
666
667 <itemizedlist>
668 <listitem>
669 <para>pktgen TX, RX in packets per second (pps) and MBps</para>
670 </listitem>
671
672 <listitem>
673 <para>testpmd TX, RX in packets per second (pps)</para>
674 </listitem>
675
676 <listitem>
677 <para>divide <emphasis role="bold">testpmd RX</emphasis> by
678 <emphasis role="bold">pktgen TX</emphasis> in pps to obtain the
679 throughput in percentages (%)</para>
680 </listitem>
681 </itemizedlist>
682
683 <section id="targetone-usecasefour">
684 <title>Test Setup for Target 1</title>
685
686 <para>Start with the steps below:</para>
687
688 <para>Boot the NFV Access Linux using the following kernel
689 parameters in U-Boot: <programlisting>setenv bootargs 'nohz_full=1-23 isolcpus=1-23 \
690rcu-nocbs=1-23 rcu_nocb_poll clocksource=tsc tsc=reliable nohpet \
691nosoftlockup audit=0'</programlisting></para>
692
693 <para>Configure hugepages and set up the DPDK:<programlisting>echo 4 &gt; /proc/sys/vm/nr_hugepages
694modprobe vfio-pci
695ifconfig enP1p1s0f1 down
696dpdk-devbind -b vfio-pci 0001:01:00.1</programlisting>Run
697 pktgen:<programlisting>cd /usr/share/apps/pktgen/
698./pktgen -v -c 0x7 -n 4 --proc-type auto -d /usr/lib/librte_pmd_thunderx_nicvf.so.1.1 \
699-w 0001:01:00.1 -- -P -m "[1:2].0"</programlisting>Choose one of the values
700 from [64, 128, 256, 512] to change the packet size:<programlisting>set 0 size &lt;number&gt;</programlisting></para>
701 </section>
702
703 <section id="targettwo-usecasefive">
704 <title>Test Setup for Target 2</title>
705
706 <para>Start by following the steps below:</para>
707
708 <para>Boot the NFV Access Linux using the following kernel
709 parameters in U-Boot: <programlisting>setenv bootargs 'nohz_full=1-23 isolcpus=1-23 \
710rcu-nocbs=1-23 rcu_nocb_poll clocksource=tsc tsc=reliable nohpet \
711nosoftlockup audit=0'</programlisting>Kill unnecessary services:
712 <programlisting>killall ovsdb-server ovs-vswitchd
713rm -rf /etc/openvswitch/*
714rm -rf /var/run/openvswitch/*
715mkdir -p /var/run/openvswitch</programlisting>Configure hugepages, set up the
716 DPDK:<programlisting>echo 20 &gt; /proc/sys/vm/nr_hugepages
717modprobe vfio-pci
718dpdk-devbind --bind=vfio-pci 0001:01:00.1</programlisting>Configure
719 OVS:<programlisting>export DB_SOCK=/var/run/openvswitch/db.sock
720ovsdb-tool create /etc/openvswitch/conf.db /usr/share/openvswitch/vswitch.ovsschema
721ovsdb-server --remote=punix:$DB_SOCK \
722 --remote=db:Open_vSwitch,Open_vSwitch,manager_options --pidfile --detach
723ovs-vsctl --no-wait init
724ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-lcore-mask=0x10
725ovs-vsctl --no-wait set Open_vSwitch . other_config:pmd-cpu-mask=0xc
726ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-socket-mem=2048
727ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true
728ovs-vswitchd unix:$DB_SOCK --pidfile --detach \
729 --log-file=/var/log/openvswitch/ovs-vswitchd.log
730
731ovs-vsctl add-br ovsbr0 -- set bridge ovsbr0 \
732 datapath_type=netdev
733ovs-vsctl add-port ovsbr0 vhost-user1 -- set Interface \
734 vhost-user1 type=dpdkvhostuser -- set Interface vhost-user1 ofport_request=2
735ovs-vsctl add-port ovsbr0 dpdk0 -- set Interface dpdk0 \
736 type=dpdk options:dpdk-devargs=0001:01:00.1 -- set Interface dpdk0 ofport_request=1
737
738ovs-ofctl del-flows ovsbr0
739ovs-ofctl add-flow ovsbr0 in_port=1,action=output:2
740ovs-ofctl add-flow ovsbr0 in_port=2,action=output:1</programlisting>Create an
741 XML file with the content below (e.g.
742 <filename>/home/root/guest.xml</filename>):<programlisting>&lt;domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'&gt;
743 &lt;name&gt;nfv-ovs-vm&lt;/name&gt;
744 &lt;uuid&gt;ed204646-1ad5-11e7-93ae-92361f002671&lt;/uuid&gt;
745 &lt;memory unit='KiB'&gt;4194304&lt;/memory&gt;
746 &lt;currentMemory unit='KiB'&gt;4194304&lt;/currentMemory&gt;
747
748 &lt;memoryBacking&gt;
749 &lt;hugepages&gt;
750 &lt;page size='512' unit='M' nodeset='0'/&gt;
751 &lt;/hugepages&gt;
752 &lt;/memoryBacking&gt;
753
754 &lt;os&gt;
755 &lt;type arch='aarch64' machine='virt,gic_version=3'&gt;hvm&lt;/type&gt;
756 &lt;kernel&gt;Image&lt;/kernel&gt;
757 &lt;cmdline&gt;root=/dev/vda console=ttyAMA0,115200n8 maxcpus=24 coherent_pool=16M \
758 debug hugepagesz=512M hugepages=3 audit=0 isolcpus=1 nohz_full=1 rcu_nocbs=1 \
759 irqaffinity=0&lt;/cmdline&gt;
760 &lt;boot dev='hd'/&gt;
761 &lt;/os&gt;
762
763 &lt;features&gt;
764 &lt;acpi/&gt;
765 &lt;apic/&gt;
766 &lt;/features&gt;
767
768 &lt;vcpu placement='static'&gt;2&lt;/vcpu&gt;
769
770 &lt;cpu mode='host-model'&gt;
771 &lt;model fallback='allow'/&gt;
772 &lt;topology sockets='1' cores='2' threads='1'/&gt;
773 &lt;numa&gt;
774 &lt;cell id='0' cpus='0' memory='4194304' unit='KiB' memAccess='shared'/&gt;
775 &lt;/numa&gt;
776 &lt;/cpu&gt;
777
778 &lt;cputune&gt;
779 &lt;vcpupin vcpu="0" cpuset="4"/&gt;
780 &lt;vcpupin vcpu="1" cpuset="5"/&gt;
781 &lt;/cputune&gt;
782
783 &lt;on_poweroff&gt;destroy&lt;/on_poweroff&gt;
784 &lt;on_reboot&gt;restart&lt;/on_reboot&gt;
785 &lt;on_crash&gt;destroy&lt;/on_crash&gt;
786
787 &lt;devices&gt;
788 &lt;emulator&gt;/usr/bin/qemu-system-aarch64&lt;/emulator&gt;
789 &lt;disk type='file' device='disk'&gt;
790 &lt;driver name='qemu' type='raw' cache='none'/&gt;
791 &lt;source file='enea-nfv-access-guest-qemuarm64.ext4'/&gt;
792 &lt;target dev='vda' bus='virtio'/&gt;
793 &lt;/disk&gt;
794
795 &lt;serial type='pty'&gt;
796 &lt;target port='0'/&gt;
797 &lt;/serial&gt;
798
799 &lt;console type='pty'&gt;
800 &lt;target type='serial' port='0'/&gt;
801 &lt;/console&gt;
802 &lt;/devices&gt;
803
804 &lt;qemu:commandline&gt;
805 &lt;qemu:arg value='-chardev'/&gt;
806 &lt;qemu:arg value='socket,id=charnet0,path=/var/run/openvswitch/vhost-user1'/&gt;
807
808 &lt;qemu:arg value='-netdev'/&gt;
809 &lt;qemu:arg value='type=vhost-user,id=hostnet0,chardev=charnet0'/&gt;
810
811 &lt;qemu:arg value='-device'/&gt;
812 &lt;qemu:arg value='virtio-net-pci,netdev=hostnet0,id=net0,mac=00:00:00:00:00:01,
813 bus=pcie.0,addr=0x2'/&gt;
814 &lt;/qemu:commandline&gt;
815&lt;/domain&gt;</programlisting></para>
816
817 <para>Start the virtual machine by running:</para>
818
819 <para><programlisting>virsh create /home/root/guest.xml</programlisting></para>
820
821 <para>Connect to the virtual machine console:</para>
822
823 <para><programlisting>virsh console nfv-ovs-vm</programlisting></para>
824
825 <para>Inside the VM, configure the DPDK: <programlisting>ifconfig enp0s2 down
826echo 1 &gt; /sys/module/vfio/parameters/enable_unsafe_noiommu_mode
827modprobe vfio-pci
828dpdk-devbind -b vfio-pci 0000:00:02.0</programlisting>Inside the VM, start
829 testpmd: <programlisting>testpmd -v -c 0x3 -n 4 -d /usr/lib/librte_pmd_virtio.so.1.1 \
830-w 0000:00:02.0 -- -i --disable-hw-vlan-filter --no-flush-rx \
831--port-topology=chained</programlisting>For the <emphasis
832 role="bold">Forwarding test</emphasis>, run:<programlisting>set fwd io
833start</programlisting>For the <emphasis role="bold">Termination
834 test</emphasis>, set testpmd to only receive, then start
835 it:<programlisting>set fwd rxonly
836start</programlisting>On target 1, you may start pktgen traffic
837 now:<programlisting>start 0</programlisting>On target 2, use this
838 command to refresh the testpmd display traffic
839 statistics:<programlisting>show port stats 0</programlisting>To stop
840 generating traffic in order to choose a different frame size,
841 run:<programlisting>stop 0</programlisting>To clear numbers in
842 testpmd:<programlisting>clear port stats
843show port stats 0</programlisting><table>
844 <title>Results in forwarding mode</title>
845
846 <tgroup cols="8">
847 <tbody>
848 <row>
849 <entry align="center"><emphasis
850 role="bold">Bytes</emphasis></entry>
851
852 <entry align="center"><emphasis role="bold">pktgen pps
853 RX</emphasis></entry>
854
855 <entry align="center"><emphasis role="bold">pktgen pps
856 TX</emphasis></entry>
857
858 <entry align="center"><emphasis role="bold">testpmd pps
859 RX</emphasis></entry>
860
861 <entry align="center"><emphasis role="bold">testpmd pps
862 TX</emphasis></entry>
863
864 <entry align="center"><emphasis role="bold">pktgen MBits/s
865 RX</emphasis></entry>
866
867 <entry align="center"><emphasis role="bold">pktgen MBits/s
868 TX</emphasis></entry>
869
870 <entry align="center"><emphasis role="bold">throughput
871 (%)</emphasis></entry>
872 </row>
873
874 <row>
875 <entry role="bold"><emphasis
876 role="bold">64</emphasis></entry>
877
878 <entry>1555163</entry>
879
880 <entry>14686542</entry>
881
882 <entry>1978791</entry>
883
884 <entry>1554707</entry>
885
886 <entry>1044</entry>
887
888 <entry>9867</entry>
889
890 <entry>13.47%</entry>
891 </row>
892
893 <row>
894 <entry><emphasis role="bold">128</emphasis></entry>
895
896 <entry>1504275</entry>
897
898 <entry>8447999</entry>
899
900 <entry>1901468</entry>
901
902 <entry>1504266</entry>
903
904 <entry>1781</entry>
905
906 <entry>10000</entry>
907
908 <entry>22.51%</entry>
909 </row>
910
911 <row>
912 <entry role="bold"><emphasis
913 role="bold">256</emphasis></entry>
914
915 <entry>1423564</entry>
916
917 <entry>4529012</entry>
918
919 <entry>1718299</entry>
920
921 <entry>1423553</entry>
922
923 <entry>3142</entry>
924
925 <entry>10000</entry>
926
927 <entry>37.94%</entry>
928 </row>
929
930 <row>
931 <entry><emphasis role="bold">512</emphasis></entry>
932
933 <entry>1360379</entry>
934
935 <entry>2349636</entry>
936
937 <entry>1554844</entry>
938
939 <entry>1360456</entry>
940
941 <entry>5789</entry>
942
943 <entry>10000</entry>
944
945 <entry>66.17%</entry>
946 </row>
947
948 <row>
949 <entry><emphasis role="bold">1024</emphasis></entry>
950
951 <entry>1197327</entry>
952
953 <entry>1197329</entry>
954
955 <entry>1197319</entry>
956
957 <entry>1197329</entry>
958
959 <entry>9999</entry>
960
961 <entry>10000</entry>
962
963 <entry>100.00%</entry>
964 </row>
965 </tbody>
966 </tgroup>
967 </table><table>
968 <title>Results in termination mode</title>
969
970 <tgroup cols="5">
971 <tbody>
972 <row>
973 <entry align="center"><emphasis
974 role="bold">Bytes</emphasis></entry>
975
976 <entry align="center"><emphasis role="bold">pktgen pps
977 TX</emphasis></entry>
978
979 <entry align="center"><emphasis role="bold">testpmd pps
980 RX</emphasis></entry>
981
982 <entry align="center"><emphasis role="bold">pktgen MBits/s
983 TX</emphasis></entry>
984
985 <entry align="center"><emphasis role="bold">throughput
986 (%)</emphasis></entry>
987 </row>
988
989 <row>
990 <entry role="bold"><emphasis
991 role="bold">64</emphasis></entry>
992
993 <entry>14695621</entry>
994
995 <entry>1983227</entry>
996
997 <entry>9875</entry>
998
999 <entry>13.50%</entry>
1000 </row>
1001
1002 <row>
1003 <entry><emphasis role="bold">128</emphasis></entry>
1004
1005 <entry>8446022</entry>
1006
1007 <entry>1897546</entry>
1008
1009 <entry>10000</entry>
1010
1011 <entry>22.47%</entry>
1012 </row>
1013
1014 <row>
1015 <entry><emphasis role="bold">256</emphasis></entry>
1016
1017 <entry>4529011</entry>
1018
1019 <entry>1724323</entry>
1020
1021 <entry>10000</entry>
1022
1023 <entry>38.07%</entry>
1024 </row>
1025
1026 <row>
1027 <entry><emphasis role="bold">512</emphasis></entry>
1028
1029 <entry>2349638</entry>
1030
1031 <entry>1562212</entry>
1032
1033 <entry>10000</entry>
1034
1035 <entry>66.49%</entry>
1036 </row>
1037
1038 <row>
1039 <entry role="bold"><emphasis
1040 role="bold">1024</emphasis></entry>
1041
1042 <entry>1197323</entry>
1043
1044 <entry>1197324</entry>
1045
1046 <entry>10000</entry>
1047
1048 <entry>100.00%</entry>
1049 </row>
1050 </tbody>
1051 </tgroup>
1052 </table></para>
1053 </section>
1054 </section>
1055
1056 <section id="usecase-six">
1057 <title>Forward traffic between two VMs</title>
1058
1059 <para>Benchmark a combo test using two virtual machines, the first
1060 with traffic forwarding to the second, which terminates it.</para>
1061
1062 <para>Measurements are made in:</para>
1063
1064 <itemizedlist>
1065 <listitem>
1066 <para>pktgen TX in pps and MBps</para>
1067 </listitem>
1068
1069 <listitem>
1070 <para>testpmd TX and RX pps in VM1</para>
1071 </listitem>
1072
1073 <listitem>
1074 <para>testpmd RX pps in VM2</para>
1075 </listitem>
1076
1077 <listitem>
1078 <para>divide<emphasis role="bold"> VM2 testpmd RX pps</emphasis>
1079 by <emphasis role="bold">pktgen TX pps </emphasis>to obtain the
1080 throughput in percentages (%)</para>
1081 </listitem>
1082 </itemizedlist>
1083
1084 <section id="targetone-usecase-five">
1085 <title>Test Setup for Target 1</title>
1086
1087 <para>Start by doing the following:</para>
1088
1089 <para>Boot the NFV Access Linux using the following kernel
1090 parameters in U-Boot: <programlisting>setenv bootargs 'nohz_full=1-23 isolcpus=1-23 \
1091rcu-nocbs=1-23 rcu_nocb_poll clocksource=tsc tsc=reliable nohpet \
1092nosoftlockup audit=0'</programlisting>Configure hugepages and set up the
1093 DPDK:<programlisting>echo 4 &gt; /proc/sys/vm/nr_hugepages
1094modprobe vfio-pci
1095ifconfig enP1p1s0f1 down
1096dpdk-devbind -b vfio-pci 0001:01:00.1</programlisting>Run
1097 pktgen:<programlisting>cd /usr/share/apps/pktgen/
1098./pktgen -v -c 0x7 -n 4 --proc-type auto -d /usr/lib/librte_pmd_thunderx_nicvf.so.1.1 \
1099-w 0001:01:00.1 -- -P -m "[1:2].0"</programlisting>Choose one of the values
1100 from [64, 128, 256, 512] to change the packet size:<programlisting>set 0 size &lt;number&gt;</programlisting></para>
1101 </section>
1102
1103 <section id="targettwo-usecase-six">
1104 <title>Test Setup for Target 2</title>
1105
1106 <para>Start by doing the following:</para>
1107
1108 <para>Boot the NFV Access Linux using the following kernel
1109 parameters in U-Boot: <programlisting>setenv bootargs 'nohz_full=1-23 isolcpus=1-23 \
1110rcu-nocbs=1-23 rcu_nocb_poll clocksource=tsc tsc=reliable nohpet \
1111nosoftlockup audit=0'</programlisting>Kill Services:<programlisting>killall ovsdb-server ovs-vswitchd
1112rm -rf /etc/openvswitch/*
1113mkdir -p /var/run/openvswitch</programlisting>Configure hugepages, set up the
1114 DPDK:<programlisting>echo 20 &gt; /proc/sys/vm/nr_hugepages
1115modprobe vfio-pci
1116dpdk-devbind --bind=vfio-pci 0001:01:00.1</programlisting>Configure the
1117 OVS:<programlisting>export DB_SOCK=/var/run/openvswitch/db.sock
1118ovsdb-tool create /etc/openvswitch/conf.db /usr/share/openvswitch/vswitch.ovsschema
1119ovsdb-server --remote=punix:$DB_SOCK \
1120 --remote=db:Open_vSwitch,Open_vSwitch,manager_options --pidfile --detach
1121ovs-vsctl --no-wait init
1122ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-lcore-mask=0x10
1123ovs-vsctl --no-wait set Open_vSwitch . other_config:pmd-cpu-mask=0xc
1124ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-socket-mem=2048
1125ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true
1126ovs-vswitchd unix:$DB_SOCK --pidfile --detach \
1127 --log-file=/var/log/openvswitch/ovs-vswitchd.log
1128
1129ovs-vsctl add-br ovsbr0 -- set bridge ovsbr0 datapath_type=netdev
1130ovs-vsctl add-port ovsbr0 dpdk0 -- set Interface dpdk0 type=dpdk \
1131 options:dpdk-devargs=0001:01:00.1 -- set Interface dpdk0 ofport_request=1
1132ovs-vsctl add-port ovsbr0 vhost-user1 -- set Interface vhost-user1 type=dpdkvhostuser \
1133 -- set Interface vhost-user1 ofport_request=2
1134ovs-vsctl add-port ovsbr0 vhost-user2 -- set Interface vhost-user2 type=dpdkvhostuser \
1135 -- set Interface vhost-user2 ofport_request=3
1136
1137ovs-ofctl del-flows ovsbr0
1138ovs-ofctl add-flow ovsbr0 in_port=1,action=output:2
1139ovs-ofctl add-flow ovsbr0 in_port=2,action=output:3</programlisting>Create an
1140 XML with the content below and then run <command>virsh create
1141 &lt;XML_FILE&gt;</command><programlisting>&lt;domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'&gt;
1142 &lt;name&gt;nfv-ovs-vm1&lt;/name&gt;
1143 &lt;uuid&gt;ed204646-1ad5-11e7-93ae-92361f002671&lt;/uuid&gt;
1144 &lt;memory unit='KiB'&gt;4194304&lt;/memory&gt;
1145 &lt;currentMemory unit='KiB'&gt;4194304&lt;/currentMemory&gt;
1146
1147 &lt;memoryBacking&gt;
1148 &lt;hugepages&gt;
1149 &lt;page size='512' unit='M' nodeset='0'/&gt;
1150 &lt;/hugepages&gt;
1151 &lt;/memoryBacking&gt;
1152
1153 &lt;os&gt;
1154 &lt;type arch='aarch64' machine='virt,gic_version=3'&gt;hvm&lt;/type&gt;
1155 &lt;kernel&gt;Image&lt;/kernel&gt;
1156 &lt;cmdline&gt;root=/dev/vda console=ttyAMA0,115200n8 maxcpus=24 coherent_pool=16M \
1157 debug hugepagesz=512M hugepages=3 audit=0 isolcpus=1 nohz_full=1 rcu_nocbs=1 \
1158 irqaffinity=0&lt;/cmdline&gt;
1159 &lt;boot dev='hd'/&gt;
1160 &lt;/os&gt;
1161
1162 &lt;features&gt;
1163 &lt;acpi/&gt;
1164 &lt;apic/&gt;
1165 &lt;/features&gt;
1166
1167 &lt;vcpu placement='static'&gt;2&lt;/vcpu&gt;
1168
1169 &lt;cpu mode='host-model'&gt;
1170 &lt;model fallback='allow'/&gt;
1171 &lt;topology sockets='1' cores='2' threads='1'/&gt;
1172 &lt;numa&gt;
1173 &lt;cell id='0' cpus='0' memory='4194304' unit='KiB' memAccess='shared'/&gt;
1174 &lt;/numa&gt;
1175 &lt;/cpu&gt;
1176
1177 &lt;cputune&gt;
1178 &lt;vcpupin vcpu="0" cpuset="4"/&gt;
1179 &lt;vcpupin vcpu="1" cpuset="5"/&gt;
1180 &lt;/cputune&gt;
1181
1182 &lt;on_poweroff&gt;destroy&lt;/on_poweroff&gt;
1183 &lt;on_reboot&gt;restart&lt;/on_reboot&gt;
1184 &lt;on_crash&gt;destroy&lt;/on_crash&gt;
1185
1186 &lt;devices&gt;
1187 &lt;emulator&gt;/usr/bin/qemu-system-aarch64&lt;/emulator&gt;
1188 &lt;disk type='file' device='disk'&gt;
1189 &lt;driver name='qemu' type='raw' cache='none'/&gt;
1190 &lt;source file='enea-nfv-access-guest-qemuarm64.ext4'/&gt;
1191 &lt;target dev='vda' bus='virtio'/&gt;
1192 &lt;/disk&gt;
1193
1194 &lt;serial type='pty'&gt;
1195 &lt;target port='0'/&gt;
1196 &lt;/serial&gt;
1197
1198 &lt;console type='pty'&gt;
1199 &lt;target type='serial' port='0'/&gt;
1200 &lt;/console&gt;
1201 &lt;/devices&gt;
1202
1203 &lt;qemu:commandline&gt;
1204 &lt;qemu:arg value='-chardev'/&gt;
1205 &lt;qemu:arg value='socket,id=charnet0,path=/var/run/openvswitch/vhost-user1'/&gt;
1206
1207 &lt;qemu:arg value='-netdev'/&gt;
1208 &lt;qemu:arg value='type=vhost-user,id=hostnet0,chardev=charnet0'/&gt;
1209
1210 &lt;qemu:arg value='-device'/&gt;
1211 &lt;qemu:arg value='virtio-net-pci,netdev=hostnet0,id=net0,mac=00:00:00:00:00:01,/
1212 bus=pcie.0,addr=0x2'/&gt;
1213 &lt;/qemu:commandline&gt;
1214&lt;/domain&gt;</programlisting></para>
1215
1216 <para>The first virtual machine shall be called VM1. Connect to the
1217 first virtual machine console, by running:</para>
1218
1219 <para><programlisting>virsh console nfv-ovs-vm1</programlisting></para>
1220
1221 <para>Connect to Target 2 through a new <literal>SSH</literal>
1222 session, and launch a second VM by creating another XML file and
1223 running <command>virsh create
1224 &lt;XML_FILE2&gt;:</command><programlisting>&lt;domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'&gt;
1225 &lt;name&gt;nfv-ovs-vm2&lt;/name&gt;
1226 &lt;uuid&gt;ed204646-1ad5-11e7-93ae-92361f002623&lt;/uuid&gt;
1227 &lt;memory unit='KiB'&gt;4194304&lt;/memory&gt;
1228 &lt;currentMemory unit='KiB'&gt;4194304&lt;/currentMemory&gt;
1229
1230 &lt;memoryBacking&gt;
1231 &lt;hugepages&gt;
1232 &lt;page size='512' unit='M' nodeset='0'/&gt;
1233 &lt;/hugepages&gt;
1234 &lt;/memoryBacking&gt;
1235
1236 &lt;os&gt;
1237 &lt;type arch='aarch64' machine='virt,gic_version=3'&gt;hvm&lt;/type&gt;
1238 &lt;kernel&gt;Image&lt;/kernel&gt;
1239 &lt;cmdline&gt;root=/dev/vda console=ttyAMA0,115200n8 maxcpus=24 coherent_pool=16M \
1240 debug hugepagesz=512M hugepages=3 audit=0 isolcpus=1 nohz_full=1 rcu_nocbs=1 \
1241 irqaffinity=0&lt;/cmdline&gt;
1242 &lt;boot dev='hd'/&gt;
1243 &lt;/os&gt;
1244
1245 &lt;features&gt;
1246 &lt;acpi/&gt;
1247 &lt;apic/&gt;
1248 &lt;/features&gt;
1249
1250 &lt;vcpu placement='static'&gt;2&lt;/vcpu&gt;
1251
1252 &lt;cpu mode='host-model'&gt;
1253 &lt;model fallback='allow'/&gt;
1254 &lt;topology sockets='1' cores='2' threads='1'/&gt;
1255 &lt;numa&gt;
1256 &lt;cell id='0' cpus='0' memory='4194304' unit='KiB' memAccess='shared'/&gt;
1257 &lt;/numa&gt;
1258 &lt;/cpu&gt;
1259
1260 &lt;cputune&gt;
1261 &lt;vcpupin vcpu="0" cpuset="6"/&gt;
1262 &lt;vcpupin vcpu="1" cpuset="7"/&gt;
1263 &lt;/cputune&gt;
1264
1265 &lt;on_poweroff&gt;destroy&lt;/on_poweroff&gt;
1266 &lt;on_reboot&gt;restart&lt;/on_reboot&gt;
1267 &lt;on_crash&gt;destroy&lt;/on_crash&gt;
1268
1269 &lt;devices&gt;
1270 &lt;emulator&gt;/usr/bin/qemu-system-aarch64&lt;/emulator&gt;
1271 &lt;disk type='file' device='disk'&gt;
1272 &lt;driver name='qemu' type='raw' cache='none'/&gt;
1273 &lt;source file='enea-nfv-access-guest-qemuarm64.ext4'/&gt;
1274 &lt;target dev='vda' bus='virtio'/&gt;
1275 &lt;/disk&gt;
1276
1277 &lt;serial type='pty'&gt;
1278 &lt;target port='0'/&gt;
1279 &lt;/serial&gt;
1280
1281 &lt;console type='pty'&gt;
1282 &lt;target type='serial' port='0'/&gt;
1283 &lt;/console&gt;
1284 &lt;/devices&gt;
1285
1286 &lt;qemu:commandline&gt;
1287 &lt;qemu:arg value='-chardev'/&gt;
1288 &lt;qemu:arg value='socket,id=charnet1,path=/var/run/openvswitch/vhost-user2'/&gt;
1289
1290 &lt;qemu:arg value='-netdev'/&gt;
1291 &lt;qemu:arg value='type=vhost-user,id=hostnet0,chardev=charnet1'/&gt;
1292
1293 &lt;qemu:arg value='-device'/&gt;
1294 &lt;qemu:arg value='virtio-net-pci,netdev=hostnet0,id=net0,mac=00:00:00:00:00:02,/
1295 bus=pcie.0,addr=0x2'/&gt;
1296 &lt;/qemu:commandline&gt;
1297&lt;/domain&gt;</programlisting></para>
1298
1299 <para>The second virtual machine shall be called VM2. Connect to the
1300 second virtual machine console, by running:</para>
1301
1302 <para><programlisting>virsh console nfv-ovs-vm2</programlisting></para>
1303
1304 <para>Configure the DPDK inside VM1:<programlisting>ifconfig enp0s2 down
1305echo 1 &gt; /sys/module/vfio/parameters/enable_unsafe_noiommu_mode
1306modprobe vfio-pci
1307dpdk-devbind -b vfio-pci 0000:00:02.0</programlisting>Run testpmd inside
1308 VM1:<programlisting>testpmd -v -c 0x3 -n 4 -d /usr/lib/librte_pmd_virtio.so.1.1 \
1309 -w 0000:00:02.0 -- -i --disable-hw-vlan-filter \
1310 --no-flush-rx --port-topology=chained</programlisting>Start testpmd inside
1311 VM1:<programlisting>start</programlisting>Configure the DPDK inside
1312 VM2:<programlisting>ifconfig enp0s2 down
1313echo 1 &gt; /sys/module/vfio/parameters/enable_unsafe_noiommu_mode
1314modprobe vfio-pci
1315dpdk-devbind -b vfio-pci 0000:00:02.0</programlisting>Run testpmd inside
1316 VM2:<programlisting>testpmd -v -c 0x3 -n 4 -d /usr/lib/librte_pmd_virtio.so.1.1 \
1317 -w 0000:00:02.0 -- -i --disable-hw-vlan-filter \
1318 --no-flush-rx --port-topology=chained</programlisting>Set VM2 for
1319 termination and start testpmd:<programlisting>set fwd rxonly
1320start</programlisting>On target 1, start pktgen traffic:<programlisting>start 0</programlisting>Use
1321 this command to refresh the testpmd display in VM1 and VM2 and note
1322 the highest values:<programlisting>show port stats 0</programlisting>To
1323 stop traffic from pktgen, in order to choose a different frame
1324 size:<programlisting>stop 0</programlisting>To clear numbers in
1325 testpmd:<programlisting>clear port stats
1326show port stats 0</programlisting>For VM1, we record the stats relevant for
1327 <emphasis role="bold">forwarding</emphasis>:</para>
1328
1329 <itemizedlist>
1330 <listitem>
1331 <para>RX, TX in pps</para>
1332 </listitem>
1333 </itemizedlist>
1334
1335 <para>Only Rx-pps and Tx-pps numbers are important here, they change
1336 every time stats are displayed as long as there is traffic. Run the
1337 command a few times and pick the best (maximum) values
1338 observed.</para>
1339
1340 <para>For VM2, we record the stats relevant for <emphasis
1341 role="bold">termination</emphasis>:</para>
1342
1343 <itemizedlist>
1344 <listitem>
1345 <para>RX in pps (TX will be 0)</para>
1346 </listitem>
1347 </itemizedlist>
1348
1349 <para>For pktgen, we record only the TX side, because flow is
1350 terminated, with no RX traffic reaching pktgen:</para>
1351
1352 <itemizedlist>
1353 <listitem>
1354 <para>TX in pps and Mbit/s</para>
1355 </listitem>
1356 </itemizedlist>
1357
1358 <table>
1359 <title>Results in forwarding mode</title>
1360
1361 <tgroup cols="7">
1362 <tbody>
1363 <row>
1364 <entry align="center"><emphasis
1365 role="bold">Bytes</emphasis></entry>
1366
1367 <entry align="center"><emphasis role="bold">pktgen pps
1368 TX</emphasis></entry>
1369
1370 <entry align="center"><emphasis role="bold">VM1 testpmd pps
1371 RX</emphasis></entry>
1372
1373 <entry align="center"><emphasis role="bold">VM1 testpmd pps
1374 TX</emphasis></entry>
1375
1376 <entry align="center"><emphasis role="bold">VM2 testpmd pps
1377 RX</emphasis></entry>
1378
1379 <entry align="center"><emphasis role="bold">pktgen MBits/s
1380 TX</emphasis></entry>
1381
1382 <entry align="center"><emphasis role="bold">throughput
1383 (%)</emphasis></entry>
1384 </row>
1385
1386 <row>
1387 <entry role="bold"><emphasis
1388 role="bold">64</emphasis></entry>
1389
1390 <entry>14692306</entry>
1391
1392 <entry>1986888</entry>
1393
1394 <entry>1278884</entry>
1395
1396 <entry>1278792</entry>
1397
1398 <entry>9870</entry>
1399
1400 <entry>8.70%</entry>
1401 </row>
1402
1403 <row>
1404 <entry><emphasis role="bold">128</emphasis></entry>
1405
1406 <entry>8445997</entry>
1407
1408 <entry>1910675</entry>
1409
1410 <entry>1205371</entry>
1411
1412 <entry>1205371</entry>
1413
1414 <entry>10000</entry>
1415
1416 <entry>14.27%</entry>
1417 </row>
1418
1419 <row>
1420 <entry role="bold"><emphasis
1421 role="bold">256</emphasis></entry>
1422
1423 <entry>4529126</entry>
1424
1425 <entry>1723468</entry>
1426
1427 <entry>1080976</entry>
1428
1429 <entry>1080977</entry>
1430
1431 <entry>10000</entry>
1432
1433 <entry>23.87%</entry>
1434 </row>
1435
1436 <row>
1437 <entry><emphasis role="bold">512</emphasis></entry>
1438
1439 <entry>2349638</entry>
1440
1441 <entry>1559367</entry>
1442
1443 <entry>972923</entry>
1444
1445 <entry>972921</entry>
1446
1447 <entry>10000</entry>
1448
1449 <entry>41.41%</entry>
1450 </row>
1451
1452 <row>
1453 <entry><emphasis role="bold">1024</emphasis></entry>
1454
1455 <entry>1197322</entry>
1456
1457 <entry>1197318</entry>
1458
1459 <entry>839508</entry>
1460
1461 <entry>839508</entry>
1462
1463 <entry>10000</entry>
1464
1465 <entry>70.12%</entry>
1466 </row>
1467 </tbody>
1468 </tgroup>
1469 </table>
1470 </section>
1471 </section>
1472 </section>
1473 </section>
1474</chapter> \ No newline at end of file
diff --git a/doc/book-enea-nfv-access-guide/doc/book.xml b/doc/book-enea-nfv-access-guide/doc/book.xml
deleted file mode 100644
index ca2f31c..0000000
--- a/doc/book-enea-nfv-access-guide/doc/book.xml
+++ /dev/null
@@ -1,30 +0,0 @@
1<?xml version="1.0" encoding="ISO-8859-1"?>
2<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
3"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
4<!ENTITY % local.common.attrib "xml:base CDATA #IMPLIED">
5]>
6<book id="book_enea_nfv_access_guide">
7 <title><trademark class="registered">Enea</trademark> NFV Access Guide</title>
8 <subtitle>Release Version
9 <xi:include href="eltf_params_updated.xml" xpointer="element(EneaLinux_REL_VER/1)"
10 xmlns:xi="http://www.w3.org/2001/XInclude" /></subtitle>
11 <!-- OLINKDBPATH_USED_BY_XMLMIND ../../s_docbuild/olinkdb -->
12 <xi:include href="../../s_docbuild/template/docsrc_common/bookinfo_userdoc.xml"
13 xmlns:xi="http://www.w3.org/2001/XInclude" />
14 <xi:include href="overview.xml"
15 xmlns:xi="http://www.w3.org/2001/XInclude" />
16 <xi:include href="getting_started.xml"
17 xmlns:xi="http://www.w3.org/2001/XInclude" />
18 <xi:include href="hypervisor_virtualization.xml"
19 xmlns:xi="http://www.w3.org/2001/XInclude" />
20 <xi:include href="container_virtualization.xml"
21 xmlns:xi="http://www.w3.org/2001/XInclude" />
22 <xi:include href="ovs.xml"
23 xmlns:xi="http://www.w3.org/2001/XInclude" />
24 <xi:include href="dpdk.xml"
25 xmlns:xi="http://www.w3.org/2001/XInclude" />
26 <xi:include href="benchmarks.xml"
27 xmlns:xi="http://www.w3.org/2001/XInclude" />
28 <xi:include href="using_nfv_access_sdks.xml"
29 xmlns:xi="http://www.w3.org/2001/XInclude" />
30</book>
diff --git a/doc/book-enea-nfv-access-guide/doc/container_virtualization.xml b/doc/book-enea-nfv-access-guide/doc/container_virtualization.xml
deleted file mode 100644
index 52716bd..0000000
--- a/doc/book-enea-nfv-access-guide/doc/container_virtualization.xml
+++ /dev/null
@@ -1,136 +0,0 @@
1<?xml version="1.0" encoding="ISO-8859-1"?>
2<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
3"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
4<chapter id="container-virtualization">
5 <title>Container Virtualization</title>
6
7 <section id="docker">
8 <title>Docker</title>
9
10 <para>Docker is an open-source project that automates the deployment of
11 applications inside software containers, by providing an additional layer
12 of abstraction and automation of operating-system-level virtualization on
13 Linux.</para>
14
15 <para>The software container mechanism uses resource isolation features
16 inside the Linux kernel, such as cgroups and kernel namespaces to allow
17 multiple containers to run within a single Linux instance, avoiding the
18 overhead of starting and maintaining virtual machines.</para>
19
20 <para>Containers are lightweight and include everything needed to run
21 themselves: code, runtime, system tools, system libraries and settings.
22 The main advantage provided by containers is that the encapsulated
23 software is isolated from its surroundings. For example, differences
24 between development and staging environments can be kept separate in order
25 to reduce conflicts between teams running different software on the same
26 infrastructure.</para>
27
28 <para>For a better understanding of what Docker is and how it works, the
29 official documentation provided on the Docker website should be consulted:
30 <ulink
31 url="https://docs.docker.com/">https://docs.docker.com/</ulink>.</para>
32
33 <section id="launch-docker-container">
34 <title>Launching a Docker container</title>
35
36 <para>Docker provides a hello-world container which checks whether your
37 system is running the daemon correctly. This container can be launched
38 by simply running:</para>
39
40 <programlisting>docker run hello-world</programlisting>
41
42 <para>If your installation is working correctly, the following message
43 should be outputted:<programlisting>Hello from Docker!</programlisting></para>
44 </section>
45
46 <section id="run-enfv-guest-image">
47 <title>Run an Enea NFV Access guest image</title>
48
49 <para>Enea NFV Access guest images can run inside Docker as any other
50 container can. Before starting an Enea NFV Access guest image, a root
51 filesystem has to be imported in Docker:</para>
52
53 <programlisting>docker import enea-nfv-access-guest-qemuarm64.tar.gz nfv_guest</programlisting>
54
55 <para>To check that the Docker image has been imported successfully,
56 run:</para>
57
58 <programlisting>docker images</programlisting>
59
60 <para>Finally, start an Enea NFV Access container with
61 <literal>bash</literal> running as the shell, by running:</para>
62
63 <programlisting>docker run -it nfv_guest /bin/bash</programlisting>
64 </section>
65
66 <section id="attach-ext-resources-docker-containers">
67 <title>Attach external resources to Docker containers</title>
68
69 <para>Any system resource present on the host machine can be attached or
70 accessed by a Docker container.</para>
71
72 <para>Typically, if a file or folder on the host machine needs to be
73 attached to a container, that container should be launched with the
74 <literal>-v</literal> parameter. For example, to attach the
75 <literal>roots</literal> home folder to a container, the command line
76 for Docker should have the following format:</para>
77
78 <programlisting>docker run -it -v /home/root:/home/host_root/ nfv_guest /bin/bash</programlisting>
79
80 <para>To check that folders have been properly passed from the host to
81 the container, create a file in the source folder on the host root
82 filesystem and check for its existence inside the containers destination
83 location.</para>
84
85 <section id="attach-vhost-descriptors">
86 <title>Attach vhost file descriptors</title>
87
88 <para>If OVS is running on the host and vhost file descriptors need to
89 be passed to the container, this can be done by either mapping the
90 folder where all the file descriptors are located or mapping the file
91 descriptor itself:</para>
92
93 <itemizedlist>
94 <listitem>
95 <para>Mapping the folder can be done as exemplified above:</para>
96
97 <programlisting>docker run -it --rm -v /var/run/openvswitch/:/var/run/openvswitch/ nfv_guest /bin/bash</programlisting>
98 </listitem>
99
100 <listitem>
101 <para>Mapping a file descriptor is done in a similar way, but the
102 <literal>-v</literal> flag needs to point directly to it:</para>
103
104 <programlisting>docker run -it --rm -v /var/run/openvswitch/vhost-user1 nfv_guest /bin/bash</programlisting>
105 </listitem>
106 </itemizedlist>
107 </section>
108
109 <section id="attach-hugepages-mount-folders">
110 <title>Attach hugepages mount folders</title>
111
112 <para>Hugepages mount folders can also be accessed by a container
113 similarly to how a plain folder is mapped, as shown in 1.3.</para>
114
115 <para>For example, if the host system has hugepages mounted in the
116 <literal>/mnt/huge</literal> location, a container can also access
117 hugepages by being launched with:</para>
118
119 <programlisting>docker run -it -v /mnt/huge nfv_guest /bin/bash</programlisting>
120 </section>
121
122 <section id="access-pci-bus">
123 <title>Access the PCI bus</title>
124
125 <para>If the host machine has multiple SRIOV instances created, a
126 container can access the instances by being given privileged access to
127 the host system. Unlike folders, PCI devices do not have to be mounted
128 explicitly in order to be accessed and will be available to the
129 container if the <literal>--privileged</literal> flag is passed to the
130 command line:</para>
131
132 <programlisting>docker run --privileged -it nfv_guest /bin/bash</programlisting>
133 </section>
134 </section>
135 </section>
136</chapter>
diff --git a/doc/book-enea-nfv-access-guide/doc/dpdk.xml b/doc/book-enea-nfv-access-guide/doc/dpdk.xml
deleted file mode 100644
index bc3f479..0000000
--- a/doc/book-enea-nfv-access-guide/doc/dpdk.xml
+++ /dev/null
@@ -1,125 +0,0 @@
1<?xml version="1.0" encoding="ISO-8859-1"?>
2<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
3"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
4<chapter id="dpdk">
5 <title>Data Plane Development Kit</title>
6
7 <para>The Intel Data Plane Development Kit (DPDK) is a set of user-space
8 libraries and drivers that provides a programming framework for high-speed
9 packet processing applications. The DPDK includes a number of Poll Mode
10 Drivers that enable direct packet transfer between the physical NIC and
11 user-space without using interrupts, bypassing the Linux kernel network
12 stack entirely.</para>
13
14 <para>In order to take advantage of DPDK, Linux <ulink
15 url="https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt">huge
16 pages</ulink> must be enabled in the system. The allocation of huge pages
17 should preferably be done at boot time by passing parameters on the kernel
18 command line. Add the following to the kernel boot parameters:</para>
19
20 <programlisting>default_hugepagesz=512MB hugepagesz=512MB hugepages=20</programlisting>
21
22 <para>For DPDK documentation, see <ulink
23 url="http://dpdk.org/doc/guides-17.08/index.html">http://dpdk.org/doc/guides-17.08/index.html</ulink></para>
24
25 <section id="pktgen">
26 <title>Pktgen</title>
27
28 <para>In addition to DPDK, Enea NFV Access includes Pktgen, a software
29 traffic generator that is powered by the DPDK packet processing framework.
30 Pktgen can act as a transmitter or receiver and is capable of generating
31 10Gbit wire rate traffic with 64 byte frames.</para>
32
33 <para>Pktgen is installed in <literal>/usr/share/apps/pktgen/</literal>
34 and needs to be executed from this directory.</para>
35
36 <para>For Pktgen documentation, see <ulink
37 url="http://pktgen-dpdk.readthedocs.io">http://pktgen-dpdk.readthedocs.io</ulink></para>
38 </section>
39
40 <section id="dpdk-setup">
41 <title>DPDK setup instructions</title>
42
43 <para>The following setup instructions apply to both host and
44 guest.</para>
45
46 <orderedlist>
47 <listitem>
48 <para>To make the hugepage memory available for DPDK, it must be
49 mounted:</para>
50
51 <programlisting>mkdir /mnt/huge
52mount -t hugetlbfs nodev /mnt/huge</programlisting>
53 </listitem>
54
55 <listitem>
56 <para>Load the DPDK vfio-pci kernel module:</para>
57
58 <programlisting>modprobe vfio-pci</programlisting>
59 </listitem>
60
61 <listitem>
62 <para>Bind the device to the vfio-pci driver:</para>
63
64 <para><programlisting>dpdk-devbind --bind=vfio-pci &lt;PCI device number&gt;</programlisting>The
65 DPDK provides the dpdk-devbind tool to help bind or unbind devices
66 from specific drivers. See <ulink
67 url="http://dpdk.org/doc/guides-17.08/tools/devbind.html">http://dpdk.org/doc/guides-17.08/tools/devbind.html</ulink>
68 for more information.</para>
69 </listitem>
70
71 <listitem>
72 <para>VFIO-NOMMU needs to be set if run on VM: <programlisting>echo 1 &gt; /sys/module/vfio/parameters/enable_unsafe_noiommu_mode</programlisting></para>
73 </listitem>
74 </orderedlist>
75
76 <para>To print the current status of all known network
77 interfaces:<programlisting>dpdk-devbind --status</programlisting></para>
78
79 <para>At this point the system is ready to run DPDK applications.</para>
80 </section>
81
82 <section id="dpdk-example-test-setup">
83 <title>DPDK example test setup</title>
84
85 <para>This is a simple DPDK test setup using two boards connected
86 back-to-back. One board generates traffic using the Pktgen application,
87 and the other board runs the DPDK testpmd example to forward packets back
88 on the same interface.</para>
89
90 <programlisting>Pktgen [DPDK] - Board 1 PHY &lt;--&gt; Board 2 PHY - [DPDK] testpmd</programlisting>
91
92 <orderedlist>
93 <listitem>
94 <para>Setup DPDK on both boards, following the instructions in <xref
95 linkend="dpdk-setup" />.</para>
96 </listitem>
97
98 <listitem>
99 <para>On board 1, start the Pktgen application:</para>
100
101 <programlisting>cd /usr/share/apps/pktgen/
102./pktgen -v -c 0x7 -n 4 --proc-type auto -d \
103/usr/lib/librte_pmd_thunderx_nicvf.so.1.1 -w &lt;PCI device number&gt; -- -P -m "[1:2].0"</programlisting>
104
105 <para>In the Pktgen console, run:</para>
106
107 <programlisting>start 0</programlisting>
108
109 <para>The Pktgen output will display the traffic configuration and
110 statistics.</para>
111 </listitem>
112
113 <listitem>
114 <para>On board 2, start the testpmd application:</para>
115
116 <programlisting>testpmd -v -c 0x3 -n 4 -d /usr/lib/librte_pmd_thunderx_nicvf.so.1.1 -w &lt;PCI device \
117number&gt; -- -i --disable-hw-vlan-filter --no-flush-rx --port-topology=chained</programlisting>
118
119 <para>For more information, refer to the testpmd application user
120 guide: <ulink
121 url="http://dpdk.org/doc/guides-17.08/testpmd_app_ug/index.html">http://dpdk.org/doc/guides-17.08/testpmd_app_ug/index.html</ulink>.</para>
122 </listitem>
123 </orderedlist>
124 </section>
125</chapter> \ No newline at end of file
diff --git a/doc/book-enea-nfv-access-guide/doc/eltf_params_template.xml b/doc/book-enea-nfv-access-guide/doc/eltf_params_template.xml
deleted file mode 100644
index eaa7ebd..0000000
--- a/doc/book-enea-nfv-access-guide/doc/eltf_params_template.xml
+++ /dev/null
@@ -1,151 +0,0 @@
1<?xml version="1.0" encoding="ISO-8859-1"?>
2<!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
3"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
4<section id="eltf_created_params">
5 <title>File with Parameters in the Book Auto-updated by ELFT</title>
6
7 <note>
8 <para>See the <emphasis
9 role="bold">eltf_params_updated_template_howto_use.txt</emphasis> text
10 file for description of how to create the final <emphasis
11 role="bold">eltf_params_updated.xml</emphasis> from this template and for
12 all <emphasis role="bold">REQUIREMENTS</emphasis>. Use the command
13 "<emphasis role="bold">make eltf</emphasis>" to extract a full list of all
14 ELTF variables, which always begins with ELTF_ and don't only rely on the
15 howto text file list! The plan is that ELTF will auto-update this when
16 needed.</para>
17 </note>
18
19 <section id="host_prereq">
20 <title>Common Parameters</title>
21
22 <bridgehead>A programlisting, ID
23 "eltf-prereq-apt-get-commands-host"</bridgehead>
24
25 <para id="eltf-prereq-apt-get-commands-host"><programlisting>ELTF_PL_HOST_PREREQ</programlisting></para>
26
27 <bridgehead>A programlisting, ID
28 "eltf-getting-repo-install-command"</bridgehead>
29
30 <para id="eltf-getting-repo-install-command"><programlisting>ELTF_PL_GET_REPO</programlisting></para>
31
32 <bridgehead>Several phrase elements, various IDs. Ensure EL_REL_VER is
33 correct also compared to the "previous" REL VER in pardoc-distro.xml
34 "prev_baseline".</bridgehead>
35
36 <para id="EneaLinux_REL_VER"><phrase>ELTF_EL_REL_VER</phrase></para>
37
38 <para id="Yocto_VER"><phrase>ELTF_YOCTO_VER</phrase></para>
39
40 <para id="Yocto_NAME"><phrase>ELTF_YOCTO_NAME</phrase></para>
41
42 <para id="ULINK_YOCTO_PROJECT_DOWNLOAD"><ulink
43 url="ELTF_YOCTO_PROJ_DOWNLOAD_URL">ELTF_YOCTO_PROJ_DOWNLOAD_TXTURL</ulink></para>
44
45 <para id="ULINK_ENEA_LINUX_URL"><ulink
46 url="ELTF_EL_DOWNLOAD_URL">ELTF_EL_DOWNLOAD_TXTURL</ulink></para>
47
48 <bridgehead>A programlisting, ID "eltf-repo-cloning-enea-linux". Use
49 $MACHINE/default.xml as parameter, where MACHINE is one of the target
50 directory names in the manifest.</bridgehead>
51
52 <para id="eltf-repo-cloning-enea-linux"><programlisting>ELTF_PL_CLONE_W_REPO</programlisting></para>
53
54 <bridgehead>A table with ONE row, only the row with ID
55 "eltf-eclipse-version-row" is included in the book. MANUALLY BOTH in the
56 template.xml and in the updated.xml, set condition hidden on the
57 &lt;row&gt;, if eclipse is not in the release.</bridgehead>
58
59 <informaltable>
60 <tgroup cols="1">
61 <tbody>
62 <row id="eltf-eclipse-version-row">
63 <entry>Eclipse version ELTF_ECLIPSE_VERSION plus command line
64 development tools are included in this Enea NFV Access release.</entry>
65 </row>
66 </tbody>
67 </tgroup>
68 </informaltable>
69
70 <bridgehead>Below is one big section with title "Supported Targets with
71 Parameters". The entire section is included completely in the book via ID
72 "eltf-target-tables-section" and shall be LAST in the template. The
73 template contains ONE target subsection. COPY/APPEND it, if multiple
74 targets exist in the release and optionally add rows with additional
75 target parameters in each target subsection table.</bridgehead>
76 </section>
77
78 <section id="eltf-target-tables-section">
79 <title>Supported Targets with Parameters</title>
80
81 <para>The tables below describes the target(s) supported in this Enea
82 NFV Access release.</para>
83
84 <section id="eltf-target-table-ELTF_T_MANIFEST_DIR">
85 <title>MACHINE ELTF_T_MANIFEST_DIR - Information</title>
86
87 <para><informaltable>
88 <tgroup cols="2">
89 <colspec colwidth="6*" />
90
91 <colspec colwidth="9*" />
92
93 <tbody>
94 <row>
95 <entry>Target official name</entry>
96
97 <entry>ELTF_T_NAME</entry>
98 </row>
99
100 <row>
101 <entry>Architecture and Description</entry>
102
103 <entry>ELTF_T_ARC_DESC</entry>
104 </row>
105
106 <row>
107 <entry>Link to target datasheet</entry>
108
109 <entry>See <ulink
110 url="ELTF_T_DS_URL">ELTF_T_DS_TXTURL</ulink></entry>
111 </row>
112
113 <row>
114 <entry>Poky version</entry>
115
116 <entry>ELTF_T_POKY_VER</entry>
117 </row>
118
119 <row>
120 <entry>GCC version</entry>
121
122 <entry>ELTF_T_GCC_VER</entry>
123 </row>
124
125 <row>
126 <entry>Linux Kernel Version</entry>
127
128 <entry>ELTF_T_KERN_VER</entry>
129 </row>
130
131 <row>
132 <entry>Supported Drivers</entry>
133
134 <entry>ELTF_T_DRIVERS</entry>
135 </row>
136
137 <row>
138 <entry>Enea rpm folder for downloading RPM packages for this
139 target</entry>
140
141 <entry><ulink
142 url="ELTF_T_EL_RPM_URL">ELTF_T_EL_RPM_TXTURL</ulink></entry>
143 </row>
144 </tbody>
145 </tgroup>
146 </informaltable></para>
147 </section>
148
149 <!-- ELTFADD_MORE_TARGET_SECTIONS_BELOW_IF_NEEDED -->
150 </section>
151</section> \ No newline at end of file
diff --git a/doc/book-enea-nfv-access-guide/doc/eltf_params_updated.xml b/doc/book-enea-nfv-access-guide/doc/eltf_params_updated.xml
deleted file mode 100644
index 608fa09..0000000
--- a/doc/book-enea-nfv-access-guide/doc/eltf_params_updated.xml
+++ /dev/null
@@ -1,165 +0,0 @@
1<?xml version="1.0" encoding="ISO-8859-1"?>
2<!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
3"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
4<section id="eltf_created_params">
5 <title>File with Parameters in the Book Auto-updated by ELFT</title>
6
7 <note>
8 <para>See the <emphasis
9 role="bold">eltf_params_updated_template_howto_use.txt</emphasis> text
10 file for description of how to create the final <emphasis
11 role="bold">eltf_params_updated.xml</emphasis> from this template and for
12 all <emphasis role="bold">REQUIREMENTS</emphasis>. Use the command
13 "<emphasis role="bold">make eltf</emphasis>" to extract a full list of all
14 ELTF variables, which always begins with ELTF_ and don't only rely on the
15 howto text file list! The plan is that ELTF will auto-update this when
16 needed.</para>
17 </note>
18
19 <section id="host_prereq">
20 <title>Common Parameters</title>
21
22 <bridgehead>A programlisting, ID
23 "eltf-prereq-apt-get-commands-host"</bridgehead>
24
25 <para id="eltf-prereq-apt-get-commands-host"><programlisting># Host Ubuntu 14.04.5 LTS 64bit
26sudo apt-get -y update
27sudo apt-get -y install sed wget subversion git-core coreutils unzip texi2html \
28 texinfo libsdl1.2-dev docbook-utils fop gawk python-pysqlite2 diffstat \
29 make gcc build-essential xsltproc g++ desktop-file-utils chrpath \
30 libgl1-mesa-dev libglu1-mesa-dev autoconf automake groff libtool xterm \
31 libxml-parser-perl</programlisting></para>
32
33 <bridgehead>A programlisting, ID
34 "eltf-getting-repo-install-command"</bridgehead>
35
36 <para id="eltf-getting-repo-install-command"><programlisting>mkdir -p ~/bin
37curl https://storage.googleapis.com/git-repo-downloads/repo &gt; ~/bin/repo
38chmod a+x ~/bin/repo
39export PATH=~/bin:$PATH</programlisting></para>
40
41 <bridgehead>Several phrase elements, various IDs. Ensure EL_REL_VER is
42 correct also compared to the "previous" REL VER in pardoc-distro.xml
43 "prev_baseline".</bridgehead>
44
45 <para id="EneaLinux_REL_VER"><phrase>2.0</phrase></para>
46
47 <para id="Yocto_VER"><phrase>2.1</phrase></para>
48
49 <para id="Yocto_NAME"><phrase>krogoth</phrase></para>
50
51 <para id="ULINK_YOCTO_PROJECT_DOWNLOAD"><ulink
52 url="http://www.yoctoproject.org/downloads/core/krogoth/21">http://www.yoctoproject.org/downloads/core/krogoth/21</ulink></para>
53
54 <para id="ULINK_ENEA_LINUX_URL"><ulink
55 url="https://linux.enea.com/6">https://linux.enea.com/6</ulink></para>
56
57 <bridgehead>A programlisting, ID "eltf-repo-cloning-enea-linux". Use
58 $MACHINE/default.xml as parameter, where MACHINE is one of the target
59 directory names in the manifest.</bridgehead>
60
61 <para id="eltf-repo-cloning-enea-linux"><programlisting>mkdir enea-linux
62cd enea-linux
63repo init -u git@git.enea.com:linux/manifests/el_manifests-virtualization.git \
64 -b refs/tags/EL6 -m $MACHINE/default.xml
65repo sync</programlisting></para>
66
67 <bridgehead>A table with ONE row, only the row with ID
68 "eltf-eclipse-version-row" is included in the book. MANUALLY in book, set
69 condition hidden if eclipse is not in the release. Do this both in
70 template.xml and updated.xml.</bridgehead>
71
72 <informaltable>
73 <tgroup cols="1">
74 <tbody>
75 <row condition="hidden" id="eltf-eclipse-version-row">
76 <entry>Eclipse version 4.3 (Mars) plus command line development
77 tools are included in this Enea NFV Access release.</entry>
78 </row>
79 </tbody>
80 </tgroup>
81 </informaltable>
82
83 <bridgehead>Below is one big section with title "Supported Targets with
84 Parameters". The entire section is included completely in the book via ID
85 "eltf-target-tables-section" and shall be LAST in the template. The
86 template contains ONE target subsection. COPY/APPEND it, if multiple
87 targets exist in the release and optionally add rows with additional
88 target parameters in each target subsection table.</bridgehead>
89 </section>
90
91 <section id="eltf-target-tables-section">
92 <title>Supported Reference Boards with Parameters</title>
93
94 <para>The tables below describes the target(s) supported in this Enea NFV
95 Access release.</para>
96
97 <section id="eltf-target-table-p2041rdb">
98 <title>MACHINE p2041rdb - Information</title>
99
100 <para><informaltable>
101 <tgroup cols="2">
102 <colspec colwidth="6*" />
103
104 <colspec colwidth="9*" />
105
106 <tbody>
107 <row>
108 <entry>Target official name</entry>
109
110 <entry>P2041RDB</entry>
111 </row>
112
113 <row>
114 <entry>Architecture and Description</entry>
115
116 <entry>Power, e500mc</entry>
117 </row>
118
119 <row>
120 <entry>Link to target datasheet</entry>
121
122 <entry>See <ulink
123 url="http://www.nxp.com/products/microcontrollers-and-processors/power-architecture-processors/qoriq-power-architecture-processors/p2041-qoriq-reference-design-board:RDP2041BOARD">link
124 to NXP's datasheet</ulink></entry>
125 </row>
126
127 <row>
128 <entry>Poky version</entry>
129
130 <entry>Git-commit-id:
131 75ca53211488a3e268037a44ee2a7ac5c7181bd2</entry>
132 </row>
133
134 <row>
135 <entry>GCC version</entry>
136
137 <entry>5.3</entry>
138 </row>
139
140 <row>
141 <entry>Linux Kernel Version</entry>
142
143 <entry>3.12</entry>
144 </row>
145
146 <row>
147 <entry>Supported Drivers</entry>
148
149 <entry>Ethernet, I2C, SPI, PCI Express, USB, Flash,
150 SD/SDHC/SDXC, RTC</entry>
151 </row>
152
153 <row>
154 <entry>Enea rpm folder for downloading RPM packages for this
155 target</entry>
156
157 <entry><ulink
158 url="https://linux.enea.com/6/p2041rgb/rpm">https://linux.enea.com/6/p2041rgb/rpm</ulink></entry>
159 </row>
160 </tbody>
161 </tgroup>
162 </informaltable></para>
163 </section>
164 </section>
165</section>
diff --git a/doc/book-enea-nfv-access-guide/doc/getting_started.xml b/doc/book-enea-nfv-access-guide/doc/getting_started.xml
deleted file mode 100644
index 4e2b3a3..0000000
--- a/doc/book-enea-nfv-access-guide/doc/getting_started.xml
+++ /dev/null
@@ -1,244 +0,0 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
3"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
4<chapter id="plat-release-content">
5 <title>Getting Started with Enea NFV Access</title>
6
7 <para>Using Enea NFV Access requires access to a Linux machine, which is
8 used for preparing a boot setup or for developing applications. System
9 requirements for the development host are detailed in the <xi:include
10 href="../../s_docbuild/olinkdb/pardoc-common.xml"
11 xmlns:xi="http://www.w3.org/2001/XInclude"
12 xpointer="element(book_enea_nfv_access_release_info/1)" /></para>
13
14 <section condition="hidden" id="release-content">
15 <title>NFV Access Release content</title>
16
17 <para>The NFV Access 1.1 Release contains along with other items,
18 documentation, pre-built kernels and images, a bootloader and a
19 SDK.</para>
20
21 <para>The directories structure is detailed below:</para>
22
23 <programlisting>-- documentation/
24 /* NFV Access documentation */
25-- inteld1521/
26 /* artifacts for the host side */
27 -- deb/
28 /* deb packages */
29 -- images/
30 -- enea-image-virtualization-host
31 /* precompiled artifacts for the Host release image */
32 -- various artifacts
33 -- enea-image-virtualization-host-sdk
34 /* precompiled artifacts for the Host SDK image.
35 The SDK image contains userspace tools and kernel
36 configurations necessary for developing, debugging
37 and profiling applications and kernel modules */
38 -- various artifacts
39 -- sdk
40 /* NFV Access SDK for the host */
41 -- enea-glibc-x86_64-enea-image-virtualization-host-sdk /
42 -corei7-64-toolchain-7.0.sh
43 /* self-extracting archive installing
44 cross-compilation toolchain for the host */
45-- qemux86-64
46 /* artifacts for the guest side */
47 -- deb/
48 /* deb packages */
49 -- images/
50 -- enea-image-virtualization-guest
51 /* precompiled artifacts for the Guest image */
52 -- various artifacts
53 -- sdk
54 /* NFV Access SDK for the guest */
55 -- enea-glibc-x86_64-enea-image-virtualization-guest-sdk /
56 -core2-64-toolchain-7.0.sh
57 /* self-extracting archive installing cross-compilation
58 toolchain for the guest (QEMU x86-64) */</programlisting>
59
60 <para>For each combination of image and target, the following set of
61 artifacts is available:</para>
62
63 <programlisting format="linespecific">-- bzImage
64 /* kernel image */
65-- bzImage-&lt;target&gt;.bin
66 /* kernel image, same as above */
67-- config-&lt;target&gt;.config
68 /* kernel configuration file */
69-- core-image-minimal-initramfs-&lt;target&gt;.cpio.gz
70 /* cpio archive of the initramfs */
71-- core-image-minimal-initramfs-&lt;target&gt;.qemuboot.conf
72 /* qemu config file for the initramfs image */
73-- &lt;image-name&gt;-&lt;target&gt;.ext4
74 /* EXT4 image of the rootfs */
75-- &lt;image-name&gt;-&lt;target&gt;.hddimg
76 /* msdos filesystem containing syslinux, kernel, initrd and rootfs image */
77-- &lt;image-name&gt;-&lt;target&gt;.iso
78 /* CD .iso image */
79-- &lt;image-name&gt;-&lt;target&gt;.qemuboot.conf
80 /* qemu config file for the image */
81-- &lt;image-name&gt;-&lt;target&gt;.tar.gz
82 /* tar archive of the image */
83-- &lt;image-name&gt;-&lt;target&gt;.wic
84 /* Wic image */
85-- microcode.cpio
86 /* kernel microcode data */
87-- modules-&lt;target&gt;.tgz
88 /* external kernel modules */
89-- ovmf.*.qcow2
90 /* ovmf firmware for uefi support in qemu */
91-- rmc.db
92 /* Central RMC Database */
93-- systemd-bootx64.efi
94 /* systemd-boot EFI file */
95-- grub-efi-bootx64.efi
96 /* GRUB EFI file */</programlisting>
97 </section>
98
99 <section id="prebuilt-artifacts">
100 <title>How to use the Prebuilt Artifacts</title>
101
102 <section id="sysshell_config">
103 <title>Booting NFV Access to RAM</title>
104
105 <para>Enea NFV Access can be booted on a target using the RAMDISK
106 images. How to set the environment, configure the bootloader (U-Boot),
107 load and boot on the target, is detailed below. Please check the <link
108 linkend="boot_prereq">Prerequisites</link> section before starting the
109 boot process.</para>
110
111 <para><emphasis role="bold">Setting up the environment and booting on
112 the target</emphasis></para>
113
114 <itemizedlist>
115 <listitem>
116 <para>Connect to the target over serial and stop the default boot
117 process in the U-Boot command line interface.</para>
118 </listitem>
119
120 <listitem>
121 <para>Set up the U-Boot network configuration for the ethernet port,
122 which connects the target to the network.</para>
123 </listitem>
124
125 <listitem>
126 <para>If the target is not connected on a specific network, Enea
127 provides DHCP and TFTP servers that can be used to setup a local
128 network. Please see <link linkend="boot_docker">Docker
129 Installer</link> section, on how to install these two servers on a
130 development host.</para>
131
132 <programlisting>&gt; setenv ethact &lt;vnic0/vnic1&gt;
133&gt; setenv gatewayip &lt;GatewayIP&gt;
134&gt; setenv serverip &lt;TFTPserverIP&gt;
135&gt; setenv netmask &lt;netmask&gt;
136&gt; setenv ipaddr &lt;target IP&gt;</programlisting>
137 </listitem>
138
139 <listitem>
140 <para>Boot the Enea NFV Access images:</para>
141
142 <programlisting>&gt; tftpboot $kernel_addr Image
143&gt; setenv rootfs_addr 0x60000000
144&gt; tftpboot $rootfs_addr enea-nfv-access-cn8304.ext4.gz.u-boot
145&gt; booti $kernel_addr $rootfs_addr $fdtcontroladdr
146&gt; setenv bootargs root=/dev/ram0 rw ramdisk_size=1000000 console=ttyAMA0,115200n8 \
147 earlycon=pl011,0x87e028000000 coherent_pool=16M</programlisting>
148 </listitem>
149 </itemizedlist>
150
151 <section id="boot_prereq">
152 <title>Prerequisites</title>
153
154 <para>The following requirements are needed in order to successfully
155 boot Enea NFV Access to RAM:</para>
156
157 <itemizedlist>
158 <listitem>
159 <para>Enea NFV Acccess images - see the <xi:include
160 href="../../s_docbuild/olinkdb/pardoc-common.xml"
161 xmlns:xi="http://www.w3.org/2001/XInclude"
162 xpointer="element(book_enea_nfv_access_release_info/1)" />, under
163 section <emphasis role="bold">Release Content</emphasis>, for
164 details on the images provided.</para>
165 </listitem>
166 </itemizedlist>
167
168 <itemizedlist>
169 <listitem>
170 <para>DHCP server - If the board is not connected to a specific
171 network, Enea provides a Docker image with a DHCP server. Please
172 see the <link linkend="boot_docker">Docker Installer</link>
173 section for further details.</para>
174 </listitem>
175 </itemizedlist>
176
177 <itemizedlist>
178 <listitem>
179 <para>TFTP server - If the board is not connected to a specific
180 network, Enea provides a Docker image with a TFTP server. Please
181 see the <link linkend="boot_docker">Docker Installer</link>
182 section for further details.</para>
183 </listitem>
184 </itemizedlist>
185
186 <itemizedlist>
187 <listitem>
188 <para>The reference board, with U-Boot connected to a development
189 host over serial and ethernet.</para>
190 </listitem>
191 </itemizedlist>
192 </section>
193
194 <section id="boot_docker">
195 <title>Docker Installer</title>
196
197 <para>A suite of tools are provided in order to create a complete boot
198 process setup. System requirements for the development host are
199 detailed in the <xi:include
200 href="../../s_docbuild/olinkdb/pardoc-common.xml"
201 xmlns:xi="http://www.w3.org/2001/XInclude"
202 xpointer="element(book_enea_nfv_access_release_info/1)" /> included
203 with this release.</para>
204
205 <para>All required tools are leveraged by the Docker image, which must
206 be built and run on a development host. DHCP and TFTP servers will be
207 installed and configured in order to facilitate a RAMDISK boot process
208 on the target.</para>
209
210 <para>The example procedure below details how to build and run a
211 provided Docker image. In this case, the host is directly connected to
212 a target on <literal>eth1</literal>. For more details about the Docker
213 installer, please see <filename>README</filename> file from the Docker
214 installer folder.</para>
215
216 <para>Prior to using this example setup, on the target side, U-Boot
217 needs to be configured with these values, before booting Linux. Note
218 that the first eth port (<literal>vnic0</literal>) is connected to a
219 network in this example:</para>
220
221 <programlisting>&gt; setenv ethact vnic0
222&gt; setenv gatewayip 192.168.1.1
223&gt; setenv serverip 192.168.1.1
224&gt; setenv netmask 255.255.255.0
225&gt; setenv ipaddr 192.168.1.150</programlisting>
226
227 <para><emphasis role="bold">How to build and run a provided Docker
228 image</emphasis></para>
229
230 <programlisting>&gt; cd nfv-access-tools/nfv-installer/docker-pxe-ramboot/
231&gt; mkdir -p ./images
232&gt; cp &lt;NFVAccessReleasePath&gt;/Image $(pwd)/images/Image
233&gt; cp &lt;NFVAccessReleasePath&gt;/enea-nfv-access-cn8304.ext4.gz.u-boot \
234 $(pwd)/images/enea-nfv-access-cn8304.ext4.gz.u-boot
235&gt; docker build . -t el_installer
236&gt; docker run -it --net=host --privileged \
237-v $(pwd)/dhcpd.conf:/etc/dhcp/dhcpd.conf \
238-v $(pwd)/images/Image:/var/lib/tftpboot/Image \
239-v $(pwd)/images/eenea-nfv-access-cn8304.ext4.gz.u-boot:/var/lib/tftpboot/ \
240enea-nfv-access-cn8304.ext4.gz.u-boot el_installer eth1</programlisting>
241 </section>
242 </section>
243 </section>
244</chapter> \ No newline at end of file
diff --git a/doc/book-enea-nfv-access-guide/doc/hypervisor_virtualization.xml b/doc/book-enea-nfv-access-guide/doc/hypervisor_virtualization.xml
deleted file mode 100644
index 3f14719..0000000
--- a/doc/book-enea-nfv-access-guide/doc/hypervisor_virtualization.xml
+++ /dev/null
@@ -1,774 +0,0 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
3"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
4<chapter id="hypervisor_virt">
5 <title>Hypervisor Virtualization</title>
6
7 <para>The Kernel-based Virtual Machine (KVM), is a virtualization
8 infrastructure for the Linux kernel, which turns it into a hypervisor. KVM
9 requires a processor with a hardware virtualization extension.</para>
10
11 <para>KVM uses QEMU, an open source machine emulator and virtualizer, to
12 virtualize a complete system. With KVM it is possible to run multiple guests
13 of a variety of operating systems, each with a complete set of virtualized
14 hardware.</para>
15
16 <section id="launch_virt_machine">
17 <title>Launching a Virtual Machine</title>
18
19 <para>QEMU can make use of KVM when running a target architecture that is
20 the same as the host architecture. For instance, when running
21 <filename>qemu-system-aarch64</filename> on an <literal>aarch64</literal>
22 compatible processor with Hardware Virtualization support enabled, you can
23 take advantage of the KVM acceleration, an added benefit for your host and
24 guest system.</para>
25
26 <para>Enea NFV Access includes an optimized version of QEMU with KVM-only
27 support. To use KVM pass <command>--enable-kvm</command> to QEMU.</para>
28
29 <para>The following is an example of starting a guest system:</para>
30
31 <programlisting>taskset -c 0,1 qemu-system-aarch64 \
32-cpu host -machine virt,gic_version=3 -smp cores=2,sockets=1 \
33-vcpu 0,affinity=0 -vcpu 1,affinity=1 \
34-enable-kvm -nographic \
35-kernel Image \
36-drive file=enea-nfv-access-guest-qemuarm64.ext4,if=virtio,format=raw \
37-append 'root=/dev/vda console=ttyAMA0,115200' \
38-m 4096 \
39-object memory-backend-file,id=mem,size=4096M,mem-path=/dev/hugepages,share=on \
40-numa node,memdev=mem -mem-prealloc</programlisting>
41 </section>
42
43 <section id="qemu_boot">
44 <title>Primary QEMU boot options</title>
45
46 <para>Below are detailed all the pertinent boot options for the QEMU
47 emulator:</para>
48
49 <itemizedlist>
50 <listitem>
51 <para>SMP - at least 2 cores should be enabled in order to isolate the
52 application(s) running in the virtual machine(s), on specific cores,
53 for better performance:</para>
54
55 <programlisting>-smp cores=2,threads=1,sockets=1 \</programlisting>
56 </listitem>
57
58 <listitem>
59 <para>CPU affinity - associate virtual CPUs with physical CPUs, and
60 optionally assign a default realtime priority to the virtual CPU
61 process in the host kernel. This option allows you to start QEMU vCPUs
62 on isolated physical CPUs:</para>
63
64 <programlisting>-vcpu 0,affinity=0 \</programlisting>
65 </listitem>
66
67 <listitem>
68 <para>Hugepages - KVM guests can be deployed with hugepage memory
69 support to reduce memory consumption and improve performance, by
70 reducing CPU cache usage. By using hugepages for a KVM guest, less
71 memory is used for page tables and TLB (Translation Lookaside Buffer)
72 misses are reduced, significantly increasing performance, especially
73 for memory-intensive situations.</para>
74
75 <programlisting>-object memory-backend-file,id=mem,size=4096M,mem-path=/dev/hugepages,share=on \</programlisting>
76 </listitem>
77
78 <listitem>
79 <para>Memory preallocation - preallocate hugepages at startup to
80 improve performance. This may affect QEMU boot time.</para>
81
82 <programlisting>-mem-prealloc \</programlisting>
83 </listitem>
84
85 <listitem>
86 <para>Enable realtime characteristics - run QEMU with realtime
87 features.</para>
88
89 <para>In this case, "realtime" is just an identifier for options that
90 are partially realtime. If you're running in a realtime or low latency
91 environment, and you don't want your pages to be swapped out, this can
92 be ensured by using <command>mlock=on</command>. If you want VM
93 density, then you may want swappable VMs, this can be done with
94 <command>mlock=off</command>.</para>
95
96 <programlisting>-realtime mlock=on \</programlisting>
97 </listitem>
98 </itemizedlist>
99
100 <para>If the hardware does not have an IOMMU, it will not be possible to
101 assign devices in KVM.</para>
102 </section>
103
104 <section id="net_in_guest">
105 <title>Networking in guest</title>
106
107 <section id="vhost-user-support">
108 <title>Using vhost-user support</title>
109
110 <para>The goal of <literal>vhost-user</literal> is to implement a Virtio
111 transport, staying as close as possible to the <literal>vhost</literal>
112 paradigm of using: shared memory, <literal>ioeventfds</literal> and
113 <literal>irqfds</literal>. A UNIX domain socket based mechanism, allows
114 for the set up of resources used by various <literal>Vrings</literal>
115 shared between two userspace processes, and will be placed in shared
116 memory.</para>
117
118 <para>To run QEMU with the <literal>vhost-user</literal> backend, you
119 have to provide the named UNIX domain socket, which needs to already be
120 opened by the backend:</para>
121
122 <programlisting>-object memory-backend-file,id=mem,size=4096M,mem-path=/dev/hugepages,share=on \
123-chardev socket,id=char0,path=/var/run/openvswitch/vhost-user1 \
124-netdev type=vhost-user,id=mynet1,chardev=char0,vhostforce \
125-device virtio-net-pci,netdev=mynet1,mac=52:54:00:00:00:01 \</programlisting>
126
127 <para>The vHost User standard uses a client-server model. The server
128 creates and manages the vHost User sockets and the client connects to
129 the sockets created by the server. It is recommended to use QEMU as the
130 server, so that the <literal>vhost-user</literal> client can be
131 restarted without affecting the server, otherwise if the server side
132 dies, all clients need to be restarted.</para>
133
134 <para>Using <literal>vhost-user</literal> in QEMU will offer the
135 flexibility to stop and start the virtual machine with no impact on the
136 virtual switch from the host
137 (<literal>vhost-user-client</literal>).</para>
138
139 <programlisting>-chardev socket,id=char0,path=/var/run/openvswitch/vhost-user1,server \</programlisting>
140 </section>
141
142 <section id="tap-interface">
143 <title>Using TAP Interfaces</title>
144
145 <para>QEMU can use TAP interfaces to provide full networking capability
146 for the guest OS:</para>
147
148 <programlisting>-netdev tap,id=net0,ifname=tap0,script=no,downscript=no \
149-device virtio-net-pci,netdev=net0,mac=22:EA:FB:A8:25:AE \</programlisting>
150 </section>
151
152 <section id="vfio-passthrough">
153 <title>VFIO passthrough VF (SR-IOV) to guest</title>
154
155 <para>KVM hypervisor support for attaching PCI devices on the host
156 system to guests. PCI passthrough allows guests to have exclusive access
157 to PCI devices for a range of tasks. PCI passthrough allows PCI devices
158 to appear and behave as if they were physically attached to the guest
159 operating system.</para>
160
161 <para>Create guest with direct passthrough via VFIO framework like
162 so:</para>
163
164 <programlisting>-device vfio-pci,host=0001:01:00.1 \</programlisting>
165
166 <para>On the host, there are Virtual Functions for each physical
167 Ethernet port. The primary VF has to be used for a guest network to
168 access, before starting QEMU:</para>
169
170 <programlisting>$ modprobe vfio_pci
171$ dpdk-devbind.py --bind=vfio-pci 0001:01:00.1</programlisting>
172
173 <para>For more details related to Virtual Functions, see: <ulink
174 url="http://dpdk.org/doc/guides/nics/thunderx.html">http://dpdk.org/doc/guides/nics/thunderx.html</ulink>.</para>
175 </section>
176
177 <section>
178 <title>Enable VFIO-NOIOMMU mode</title>
179
180 <para>In order to run a DPDK application in VM, the VFIO-NOIOMMU needs
181 to be set: <programlisting>echo 1 &gt; /sys/module/vfio/parameters/enable_unsafe_noiommu_mode</programlisting></para>
182 </section>
183
184 <section id="multiqueue">
185 <title>Multi-queue</title>
186
187 <para>In order to ensure that network performance scales as the number
188 of vCPUs increases, multi-queue support can be used in QEMU.</para>
189
190 <section id="qemu-multiqueue-support">
191 <title>QEMU multi-queue support configuration</title>
192
193 <para>Below is an example of how to set up the QEMU multi-queue
194 support configuration:</para>
195
196 <programlisting>-chardev socket,id=char0,path=/var/run/openvswitch/vhost-user1 \
197-netdev type=vhost-user,id=net0,chardev=char0,queues=2 \
198-device virtio-net-pci,netdev=net0,mac=22:EA:FB:A8:25:AE,mq=on,vectors=6
199where vectors is calculated as: 2 + 2 * queues number.</programlisting>
200 </section>
201
202 <section id="inside-guest">
203 <title>Inside guest</title>
204
205 <para>The Linux kernel <filename>virtio-net</filename> driver, where
206 one queue is enabled by default:</para>
207
208 <programlisting>$ ethtool -L combined 2 eth0
209DPDK Virtio PMD
210$ testpmd -c 0x7 -- -i --rxq=2 --txq=2 --nb-cores=2 ...</programlisting>
211
212 <para>For QEMU documentation, see: <ulink
213 url="https://qemu.weilnetz.de/doc/qemu-doc.html">QEMU User
214 Documentation</ulink>.</para>
215 </section>
216 </section>
217 </section>
218
219 <section id="libvirt">
220 <title>Libvirt</title>
221
222 <para>One way to manage guests in Enea NFV Access is by using
223 <literal>libvirt</literal>. Libvirt is used in conjunction with a daemon
224 (<literal>libvirtd</literal>) and a command line utility
225 (<literal>virsh</literal>) to manage virtualized environments.</para>
226
227 <para>The <literal>libvirt</literal> library is a hypervisor-independent
228 virtualization API and toolkit that is able to interact with the
229 virtualization capabilities of a range of operating systems.
230 <literal>Libvirt</literal> provides a common, generic and stable layer to
231 securely manage domains on a node. As nodes may be remotely located, it
232 provides all methods required to provision, create, modify, monitor,
233 control, migrate and stop the domains, within the limits of hypervisor
234 support for these operations.</para>
235
236 <para>The <literal>libvirt</literal> daemon runs on the Enea NFV Access
237 host. All tools built upon the libvirt API, connect to the daemon to
238 request the desired operation, and to collect information about the
239 configuration and resources of the host system and guests.
240 <literal>virsh</literal> is a command line interface tool for managing
241 guests and the hypervisor. The <literal>virsh</literal> tool is built upon
242 the libvirt management API.</para>
243
244 <para><emphasis role="bold">Major functionality provided by
245 libvirt</emphasis></para>
246
247 <para>The following is a summary from the libvirt <ulink
248 url="http://wiki.libvirt.org/page/FAQ#What_is_libvirt.3F">home
249 page</ulink> describing the major libvirt features:</para>
250
251 <itemizedlist>
252 <listitem>
253 <para><emphasis role="bold">VM management:</emphasis> Various domain
254 lifecycle operations such as start, stop, pause, save, restore, and
255 migrate. Hotplug operations for many device types including disk and
256 network interfaces, memory, and CPUs.</para>
257 </listitem>
258
259 <listitem>
260 <para><emphasis role="bold">Remote machine support:</emphasis> All
261 libvirt functionality is accessible on any machine running the libvirt
262 daemon, including remote machines. A variety of network transports are
263 supported for connecting remotely, with the simplest being
264 <literal>SSH</literal>, which requires no extra explicit
265 configuration. For more information, see: <ulink
266 url="http://libvirt.org/remote.html">http://libvirt.org/remote.html</ulink>.</para>
267 </listitem>
268
269 <listitem>
270 <para><emphasis role="bold">Network interface management:</emphasis>
271 Any host running the libvirt daemon can be used to manage physical and
272 logical network interfaces. Enumerate existing interfaces, as well as
273 configure (and create) interfaces, bridges, vlans, and bond devices.
274 For more details see: <ulink
275 url="https://fedorahosted.org/netcf/">https://fedorahosted.org/netcf/</ulink>.</para>
276 </listitem>
277
278 <listitem>
279 <para><emphasis role="bold">Virtual NAT and Route based
280 networking:</emphasis> Any host running the libvirt daemon can manage
281 and create virtual networks. Libvirt virtual networks use firewall
282 rules to act as a router, providing VMs transparent access to the host
283 machines network. For more information, see: <ulink
284 url="http://libvirt.org/archnetwork.html">http://libvirt.org/archnetwork.html</ulink>.</para>
285 </listitem>
286
287 <listitem>
288 <para><emphasis role="bold">Storage management:</emphasis> Any host
289 running the libvirt daemon can be used to manage various types of
290 storage: create file images of various formats (raw, qcow2, etc.),
291 mount NFS shares, enumerate existing LVM volume groups, create new LVM
292 volume groups and logical volumes, partition raw disk devices, mount
293 iSCSI shares, and much more. For more details, see: <ulink
294 url="http://libvirt.org/storage.html">http://libvirt.org/storage.html</ulink>.</para>
295 </listitem>
296
297 <listitem>
298 <para><emphasis role="bold">Libvirt Configuration:</emphasis> A
299 properly running libvirt requires that the following elements be in
300 place:</para>
301
302 <itemizedlist>
303 <listitem>
304 <para>Configuration files, located in the directory
305 <literal>/etc/libvirt</literal>. They include the daemon's
306 configuration file <literal>libvirtd.conf</literal>, and
307 hypervisor-specific configuration files, like
308 <literal>qemu.conf</literal> for the QEMU.</para>
309 </listitem>
310
311 <listitem>
312 <para>A running libvirtd daemon. The daemon is started
313 automatically in Enea NFV Access host.</para>
314 </listitem>
315
316 <listitem>
317 <para>Configuration files for the libvirt domains, or guests, to
318 be managed by the KVM host. The specifics for guest domains shall
319 be defined in an XML file of a format specified at <ulink
320 url="http://libvirt.org/formatdomain.html">http://libvirt.org/formatdomain.html</ulink>.
321 XML formats for other structures are specified at <ulink type=""
322 url="http://libvirt.org/format.html">http://libvirt.org/format.html</ulink>.</para>
323 </listitem>
324 </itemizedlist>
325 </listitem>
326 </itemizedlist>
327
328 <section id="boot-kvm-guest">
329 <title>Booting a KVM Guest</title>
330
331 <para>There are several ways to boot a KVM guest. Here we describe how
332 to boot using a raw image. A direct kernel boot can be performed by
333 transferring the guest kernel and the file system files to the host and
334 specifying a <literal>&lt;kernel&gt;</literal> and an
335 <literal>&lt;initrd&gt;</literal> element inside the
336 <literal>&lt;os&gt;</literal> element of the guest XML file, as in the
337 following example:</para>
338
339 <programlisting>&lt;os&gt;
340 &lt;kernel&gt;Image&lt;/kernel&gt;
341&lt;/os&gt;
342&lt;devices&gt;
343 &lt;disk type='file' device='disk'&gt;
344 &lt;driver name='qemu' type='raw' cache='none'/&gt;
345 &lt;source file='enea-nfv-access-guest-qemuarm64.ext4'/&gt;
346 &lt;target dev='vda' bus='virtio'/&gt;
347 &lt;/disk&gt;
348&lt;/devices&gt;</programlisting>
349 </section>
350
351 <section id="start-guest">
352 <title>Starting a Guest</title>
353
354 <para>Command <command>virsh create</command> starts a guest:</para>
355
356 <programlisting>virsh create example-guest-arm.xml</programlisting>
357
358 <para>If further configurations are needed before the guest is reachable
359 through <literal>ssh</literal>, a console can be started using command
360 <command>virsh console</command>. The example below shows how to start a
361 console where kvm-example-guest is the name of the guest defined in the
362 guest XML file:</para>
363
364 <programlisting>virsh console kvm-example-guest</programlisting>
365
366 <para>This requires that the guest domain has a console configured in
367 the guest XML file:</para>
368
369 <programlisting>&lt;os&gt;
370 &lt;cmdline&gt;console=ttyAMA0,115200&lt;/cmdline&gt;
371&lt;/os&gt;
372&lt;devices&gt;
373 &lt;console type='pty'&gt;
374 &lt;target type='serial' port='0'/&gt;
375 &lt;/console&gt;
376&lt;/devices&gt;</programlisting>
377 </section>
378
379 <section id="isolation">
380 <title>Isolation</title>
381
382 <para>It may be desirable to isolate execution in a guest, to a specific
383 guest core. It might also be desirable to run a guest on a specific host
384 core.</para>
385
386 <para>To pin the virtual CPUs of the guest to specific cores, configure
387 the <literal>&lt;cputune&gt;</literal> contents as follows:</para>
388
389 <orderedlist>
390 <listitem>
391 <para>First explicitly state on which host core each guest core
392 shall run, by mapping <literal>vcpu</literal> to
393 <literal>cpuset</literal> in the <literal>&lt;vcpupin&gt;</literal>
394 tag.</para>
395 </listitem>
396
397 <listitem>
398 <para>In the <literal>&lt;cputune&gt;</literal> tag it is further
399 possible to specify on which CPU the emulator shall run by adding
400 the <literal>cpuset</literal> to the
401 <literal>&lt;emulatorpin&gt;</literal> tag.</para>
402
403 <programlisting>&lt;vcpu placement='static'&gt;2&lt;/vcpu&gt;
404&lt;cputune&gt;
405 &lt;vcpupin vcpu='0' cpuset='2'/&gt;
406 &lt;vcpupin vcpu='1' cpuset='3'/&gt;
407 &lt;emulatorpin cpuset="2"/&gt;
408&lt;/cputune&gt;</programlisting>
409
410 <para><literal>libvirt</literal> will group all threads belonging to
411 a QEMU instance into cgroups that will be created for that purpose.
412 It is possible to supply a base name for those cgroups using the
413 <literal>&lt;resource&gt;</literal> tag:</para>
414
415 <programlisting>&lt;resource&gt;
416 &lt;partition&gt;/rt&lt;/partition&gt;
417&lt;/resource&gt;</programlisting>
418 </listitem>
419 </orderedlist>
420 </section>
421
422 <section id="network-libvirt">
423 <title>Networking using libvirt</title>
424
425 <para>Command <command>virsh net-create</command> starts a network. If
426 any networks are listed in the guest XML file, those networks must be
427 started before the guest is started. As an example, if the network is
428 defined in a file named <filename>example-net.xml</filename>, it will be
429 started as such:</para>
430
431 <programlisting>virsh net-create example-net.xml
432&lt;network&gt;
433 &lt;name&gt;sriov&lt;/name&gt;
434 &lt;forward mode='hostdev' managed='yes'&gt;
435 &lt;pf dev='eno3'/&gt;
436 &lt;/forward&gt;
437&lt;/network&gt;</programlisting>
438
439 <para><literal>libvirt</literal> is a virtualization API that supports
440 virtual network creation. These networks can be connected to guests and
441 containers by referencing the network in the guest XML file. It is
442 possible to have a virtual network persistently running on the host by
443 starting the network with command <command>virsh net-define</command>
444 instead of the previously mentioned <command>virsh
445 net-create</command>.</para>
446
447 <para>An example for the sample network defined in
448 <literal>meta-vt/recipes-example/virt-example/files/example-net.xml</literal>:</para>
449
450 <programlisting>virsh net-define example-net.xml</programlisting>
451
452 <para>Command <command>virsh net-autostart</command> enables a
453 persistent network to start automatically when the libvirt daemon
454 starts:</para>
455
456 <programlisting>virsh net-autostart example-net</programlisting>
457
458 <para>The guest configuration file (xml) must be updated to access the
459 newly created network like so:</para>
460
461 <programlisting> &lt;interface type='network'&gt;
462 &lt;source network='sriov'/&gt;
463 &lt;/interface&gt;</programlisting>
464
465 <para>The following are a few ways of network access from a guest while
466 using <command>virsh</command>:</para>
467
468 <itemizedlist>
469 <listitem>
470 <para><emphasis role="bold">vhost-user interface</emphasis></para>
471
472 <para>See the Open vSwitch chapter on how to create a
473 <literal>vhost-user</literal> interface using Open vSwitch(OVS).
474 Currently there is no Open vSwitch(OVS) support for networks that
475 are managed by <literal>libvirt </literal>(e.g. NAT). Until further
476 notice, only bridged networks are supported (those where the user
477 has to manually create the bridge). In order to pass Open vSwitch
478 configuration the &lt;qemu:commandline&gt; is used.</para>
479
480 <programlisting> &lt;qemu:commandline&gt;
481 &lt;qemu:arg value='-chardev'/&gt;
482 &lt;qemu:arg value='socket,id=charnet0,path=/var/run/openvswitch/vhost-user1'/&gt;
483 &lt;qemu:arg value='-netdev'/&gt;
484 &lt;qemu:arg value='type=vhost-user,id=hostnet0,chardev=charnet0'/&gt;
485 &lt;qemu:arg value='-device'/&gt;
486 &lt;qemu:arg value='virtio-net-pci,netdev=hostnet0,id=net0,mac=00:00:00:00:00:01,/
487 bus=pcie.0,addr=0x2'/&gt;
488 &lt;/qemu:commandline&gt;</programlisting>
489 </listitem>
490
491 <listitem>
492 <para><emphasis role="bold">PCI passthrough
493 (SR-IOV)</emphasis></para>
494
495 <para>KVM hypervisor support for attaching PCI devices on the host
496 system to guests. PCI passthrough allows guests to have exclusive
497 access to PCI devices for a range of tasks. PCI passthrough allows
498 PCI devices to appear and behave as if they were physically attached
499 to the guest operating system.</para>
500
501 <para>Preparing a system for PCI passthrough is done like so:</para>
502
503 <itemizedlist>
504 <listitem>
505 <para>Change the owner of the
506 <literal>/dev/vfio/&lt;group&gt;</literal> to QEMU and edit
507 <literal>/etc/libvirt/qemu.conf</literal> to explicitly allow
508 permission to it:</para>
509
510 <para><programlisting>$ chown qemu:qemu /dev/vfio/66
511$ ls -l /dev/vfio/66
512crw------- 1 qemu qemu 244, 0 Dec 4 08:24 /dev/vfio/66
513
514$ cat /etc/libvirt/qemu.conf
515...
516cgroup_device_acl = [
517 "/dev/null", "/dev/full", "/dev/zero",
518 "/dev/random", "/dev/urandom",
519 "/dev/ptmx", "/dev/kvm", "/dev/kqemu",
520 "/dev/rtc","/dev/hpet", "/dev/vfio/vfio",
521 <command>"/dev/vfio/66"</command>,
522]
523...</programlisting></para>
524 </listitem>
525
526 <listitem>
527 <para>Increase the locked memory limits within the libvirtd
528 service file:</para>
529
530 <para><programlisting>$ cat /lib/systemd/system/libvirtd.service
531...
532[Service]
533Type=forking
534PIDFile=/var/run/libvirtd.pid
535EnvironmentFile=-/etc/sysconfig/libvirtd
536<command>LimitMEMLOCK=infinity</command>
537ExecStart=/usr/sbin/libvirtd $LIBVIRTD_ARGS
538ExecReload=/bin/kill -HUP $MAINPID
539KillMode=process
540Restart=on-failure
541# Override the maximum number of opened files
542#LimitNOFILE=2048
543...</programlisting></para>
544 </listitem>
545
546 <listitem>
547 <para>VFs must be created on the host before starting the
548 guest:</para>
549
550 <programlisting>$ modprobe vfio_pci
551$ dpdk-devbind.py --bind=vfio-pci 0001:01:00.1
552 &lt;qemu:commandline&gt;
553 &lt;qemu:arg value='-device'/&gt;
554 &lt;qemu:arg value='vfio-pci,host=0001:01:00.1'/&gt;
555 &lt;/qemu:commandline&gt;</programlisting>
556 </listitem>
557 </itemizedlist>
558 </listitem>
559
560 <listitem>
561 <para><emphasis role="bold">Bridge interface</emphasis></para>
562
563 <para>In case an OVS bridge exists on host, it can be used to
564 connect the guest:</para>
565
566 <programlisting> &lt;interface type='bridge'&gt;
567 &lt;mac address='52:54:00:71:b1:b6'/&gt;
568 &lt;source bridge='ovsbr0'/&gt;
569 &lt;model type='rtl8139'/&gt;
570 &lt;virtualport type='openvswitch'/&gt;
571 &lt;/interface&gt;</programlisting>
572
573 <para>For further details on the network XML format, see <ulink
574 url="http://libvirt.org/formatnetwork.html">http://libvirt.org/formatnetwork.html</ulink>.</para>
575 </listitem>
576 </itemizedlist>
577 </section>
578
579 <section id="libvirt-guest-config-ex">
580 <title>Libvirt guest configuration examples</title>
581
582 <note>
583 <para>Currently used Libvirt version has some limitations for aarch64
584 which are bypassed using the qemu:commandline option.</para>
585 </note>
586
587 <example>
588 <title>Guest configuration with vhost-user interface</title>
589
590 <programlisting>&lt;domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'&gt;
591 &lt;name&gt;vm_vhost&lt;/name&gt;
592 &lt;uuid&gt;ed204646-1ad5-11e7-93ae-92361f002671&lt;/uuid&gt;
593 &lt;memory unit='KiB'&gt;4194304&lt;/memory&gt;
594 &lt;currentMemory unit='KiB'&gt;4194304&lt;/currentMemory&gt;
595 &lt;memoryBacking&gt;
596 &lt;hugepages&gt;
597 &lt;page size='512' unit='M' nodeset='0'/&gt;
598 &lt;/hugepages&gt;
599 &lt;/memoryBacking&gt;
600 &lt;os&gt;
601 &lt;type arch='aarch64' machine='virt,gic_version=3'&gt;hvm&lt;/type&gt;
602 &lt;kernel&gt;/mnt/qemu/Image&lt;/kernel&gt;
603 &lt;cmdline&gt;root=/dev/vda console=ttyAMA0,115200n8&lt;/cmdline&gt;
604 &lt;boot dev='hd'/&gt;
605 &lt;/os&gt;
606 &lt;features&gt;
607 &lt;acpi/&gt;
608 &lt;apic/&gt;
609 &lt;/features&gt;
610 &lt;vcpu placement='static'&gt;2&lt;/vcpu&gt;
611 &lt;cpu mode='host-model'&gt;
612 &lt;model fallback='allow'/&gt;
613 &lt;topology sockets='1' cores='2' threads='1'/&gt;
614 &lt;numa&gt;
615 &lt;cell id='0' cpus='0' memory='4194304' unit='KiB' memAccess='shared'/&gt;
616 &lt;/numa&gt;
617 &lt;/cpu&gt;
618 &lt;cputune&gt;
619 &lt;vcpupin vcpu="0" cpuset="4"/&gt;
620 &lt;vcpupin vcpu="1" cpuset="5"/&gt;
621 &lt;/cputune&gt;
622 &lt;on_poweroff&gt;destroy&lt;/on_poweroff&gt;
623 &lt;on_reboot&gt;restart&lt;/on_reboot&gt;
624 &lt;on_crash&gt;destroy&lt;/on_crash&gt;
625 &lt;devices&gt;
626 &lt;emulator&gt;/usr/bin/qemu-system-aarch64&lt;/emulator&gt;
627 &lt;disk type='file' device='disk'&gt;
628 &lt;driver name='qemu' type='raw' cache='none'/&gt;
629 &lt;source file='/mnt/qemu/enea-nfv-access-guest-qemuarm64.ext4'/&gt;
630 &lt;target dev='vda' bus='virtio'/&gt;
631 &lt;/disk&gt;
632 &lt;serial type='pty'&gt;
633 &lt;target port='0'/&gt;
634 &lt;/serial&gt;
635 &lt;console type='pty'&gt;
636 &lt;target type='serial' port='0'/&gt;
637 &lt;/console&gt;
638 &lt;/devices&gt;
639 &lt;qemu:commandline&gt;
640 &lt;qemu:arg value='-chardev'/&gt;
641 &lt;qemu:arg value='socket,id=charnet0,path=/var/run/openvswitch/vhost-user1'/&gt;
642 &lt;qemu:arg value='-netdev'/&gt;
643 &lt;qemu:arg value='type=vhost-user,id=hostnet0,chardev=charnet0'/&gt;
644 &lt;qemu:arg value='-device'/&gt;
645 &lt;qemu:arg value='virtio-net-pci,netdev=hostnet0,id=net0,mac=00:00:00:00:00:01,/
646 bus=pcie.0,addr=0x2'/&gt;
647 &lt;/qemu:commandline&gt;
648&lt;/domain&gt;</programlisting>
649 </example>
650
651 <example>
652 <title>Guest configuration with PCI passthrough</title>
653
654 <programlisting>&lt;domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'&gt;
655 &lt;name&gt;vm_sriov&lt;/name&gt;
656 &lt;uuid&gt;ed204646-1ad5-11e7-93ae-92361f002671&lt;/uuid&gt;
657 &lt;memory unit='KiB'&gt;4194304&lt;/memory&gt;
658 &lt;currentMemory unit='KiB'&gt;4194304&lt;/currentMemory&gt;
659 &lt;memoryBacking&gt;
660 &lt;hugepages&gt;
661 &lt;page size='512' unit='M' nodeset='0'/&gt;
662 &lt;/hugepages&gt;
663 &lt;/memoryBacking&gt;
664 &lt;os&gt;
665 &lt;type arch='aarch64' machine='virt,gic_version=3'&gt;hvm&lt;/type&gt;
666 &lt;kernel&gt;/mnt/qemu/Image&lt;/kernel&gt;
667 &lt;cmdline&gt;root=/dev/vda console=ttyAMA0,115200n8&lt;/cmdline&gt;
668 &lt;boot dev='hd'/&gt;
669 &lt;/os&gt;
670 &lt;features&gt;
671 &lt;acpi/&gt;
672 &lt;apic/&gt;
673 &lt;/features&gt;
674 &lt;vcpu placement='static'&gt;2&lt;/vcpu&gt;
675 &lt;cpu mode='host-model'&gt;
676 &lt;model fallback='allow'/&gt;
677 &lt;topology sockets='1' cores='2' threads='1'/&gt;
678 &lt;numa&gt;
679 &lt;cell id='0' cpus='0' memory='4194304' unit='KiB' memAccess='shared'/&gt;
680 &lt;/numa&gt;
681 &lt;/cpu&gt;
682 &lt;cputune&gt;
683 &lt;vcpupin vcpu="0" cpuset="4"/&gt;
684 &lt;vcpupin vcpu="1" cpuset="5"/&gt;
685 &lt;/cputune&gt;
686 &lt;on_poweroff&gt;destroy&lt;/on_poweroff&gt;
687 &lt;on_reboot&gt;restart&lt;/on_reboot&gt;
688 &lt;on_crash&gt;destroy&lt;/on_crash&gt;
689 &lt;devices&gt;
690 &lt;emulator&gt;/usr/bin/qemu-system-aarch64&lt;/emulator&gt;
691 &lt;disk type='file' device='disk'&gt;
692 &lt;driver name='qemu' type='raw' cache='none'/&gt;
693 &lt;source file='/mnt/qemu/enea-nfv-access-guest-qemuarm64.ext4'/&gt;
694 &lt;target dev='vda' bus='virtio'/&gt;
695 &lt;/disk&gt;
696 &lt;serial type='pty'&gt;
697 &lt;target port='0'/&gt;
698 &lt;/serial&gt;
699 &lt;console type='pty'&gt;
700 &lt;target type='serial' port='0'/&gt;
701 &lt;/console&gt;
702 &lt;/devices&gt;
703 &lt;qemu:commandline&gt;
704 &lt;qemu:arg value='-device'/&gt;
705 &lt;qemu:arg value='vfio-pci,host=0001:01:00.1'/&gt;
706 &lt;/qemu:commandline&gt;
707&lt;/domain&gt;</programlisting>
708 </example>
709
710 <example>
711 <title>Guest configuration with bridge interface</title>
712
713 <programlisting>&lt;domain type='kvm'&gt;
714 &lt;name&gt;vm_bridge&lt;/name&gt;
715 &lt;uuid&gt;4a9b3f53-fa2a-47f3-a757-dd87720d9d1d&lt;/uuid&gt;
716 &lt;memory unit='KiB'&gt;4194304&lt;/memory&gt;
717 &lt;currentMemory unit='KiB'&gt;4194304&lt;/currentMemory&gt;
718 &lt;memoryBacking&gt;
719 &lt;hugepages&gt;
720 &lt;page size='1' unit='G' nodeset='0'/&gt;
721 &lt;/hugepages&gt;
722 &lt;/memoryBacking&gt;
723 &lt;vcpu placement='static'&gt;2&lt;/vcpu&gt;
724 &lt;cputune&gt;
725 &lt;shares&gt;4096&lt;/shares&gt;
726 &lt;vcpupin vcpu='0' cpuset='4'/&gt;
727 &lt;vcpupin vcpu='1' cpuset='5'/&gt;
728 &lt;emulatorpin cpuset='4,5'/&gt;
729 &lt;/cputune&gt;
730 &lt;os&gt;
731 &lt;type arch='x86_64' machine='q35'&gt;hvm&lt;/type&gt;
732 &lt;kernel&gt;/mnt/qemu/bzImage&lt;/kernel&gt;
733 &lt;cmdline&gt;root=/dev/vda console=ttyS0,115200&lt;/cmdline&gt;
734 &lt;boot dev='hd'/&gt;
735 &lt;/os&gt;
736 &lt;features&gt;
737 &lt;acpi/&gt;
738 &lt;apic/&gt;
739 &lt;/features&gt;
740 &lt;cpu mode='host-model'&gt;
741 &lt;model fallback='allow'/&gt;
742 &lt;topology sockets='2' cores='1' threads='1'/&gt;
743 &lt;numa&gt;
744 &lt;cell id='0' cpus='0-1' memory='4194304' unit='KiB' memAccess='shared'/&gt;
745 &lt;/numa&gt;
746 &lt;/cpu&gt;
747 &lt;on_poweroff&gt;destroy&lt;/on_poweroff&gt;
748 &lt;on_reboot&gt;restart&lt;/on_reboot&gt;
749 &lt;on_crash&gt;destroy&lt;/on_crash&gt;
750 &lt;devices&gt;
751 &lt;emulator&gt;/usr/bin/qemu-system-x86_64&lt;/emulator&gt;
752 &lt;disk type='file' device='disk'&gt;
753 &lt;driver name='qemu' type='raw' cache='none'/&gt;
754 &lt;source file='/mnt/qemu/enea-nfv-access-guest-qemux86-64.ext4'/&gt;
755 &lt;target dev='vda' bus='virtio'/&gt;
756 &lt;/disk&gt;vi
757 &lt;interface type='bridge'&gt;
758 &lt;mac address='52:54:00:71:b1:b6'/&gt;
759 &lt;source bridge='ovsbr0'/&gt;
760 &lt;model type='rtl8139'/&gt;
761 &lt;virtualport type='openvswitch'/&gt;
762 &lt;/interface&gt;
763 &lt;serial type='pty'&gt;
764 &lt;target port='0'/&gt;
765 &lt;/serial&gt;
766 &lt;console type='pty'&gt;
767 &lt;target type='serial' port='0'/&gt;
768 &lt;/console&gt;
769 &lt;/devices&gt;
770&lt;/domain&gt;</programlisting>
771 </example>
772 </section>
773 </section>
774</chapter> \ No newline at end of file
diff --git a/doc/book-enea-nfv-access-guide/doc/images/select-linux-kernel-in-grub2-boot-loader-on-ubuntu-14.04.png b/doc/book-enea-nfv-access-guide/doc/images/select-linux-kernel-in-grub2-boot-loader-on-ubuntu-14.04.png
deleted file mode 100644
index c28d643..0000000
--- a/doc/book-enea-nfv-access-guide/doc/images/select-linux-kernel-in-grub2-boot-loader-on-ubuntu-14.04.png
+++ /dev/null
Binary files differ
diff --git a/doc/book-enea-nfv-access-guide/doc/images/select-linux-kernel-in-grub2-boot-loader-on-ubuntu-14.04.svg b/doc/book-enea-nfv-access-guide/doc/images/select-linux-kernel-in-grub2-boot-loader-on-ubuntu-14.04.svg
deleted file mode 100644
index 319bf7e..0000000
--- a/doc/book-enea-nfv-access-guide/doc/images/select-linux-kernel-in-grub2-boot-loader-on-ubuntu-14.04.svg
+++ /dev/null
@@ -1,3 +0,0 @@
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid meet" viewBox="0 0 640 640" width="640" height="640"><defs><path d="M0 93L640 93L640 547L0 547L0 93Z" id="b4lgbdl3I5"></path><clipPath id="clipbKzvApRlV"><use xlink:href="#b4lgbdl3I5" opacity="1"></use></clipPath></defs><g><g><g><g clip-path="url(#clipbKzvApRlV)" opacity="1"><image xlink:href="data:image/png;base64,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" x="0" y="0" width="640" height="454" transform="matrix(1 0 0 1 1.1368683772161603e-13 93.00000000000006)"></image></g></g></g></g></svg> \ No newline at end of file
diff --git a/doc/book-enea-nfv-access-guide/doc/images/virtual_network_functions.png b/doc/book-enea-nfv-access-guide/doc/images/virtual_network_functions.png
deleted file mode 100755
index 4c926e5..0000000
--- a/doc/book-enea-nfv-access-guide/doc/images/virtual_network_functions.png
+++ /dev/null
Binary files differ
diff --git a/doc/book-enea-nfv-access-guide/doc/images/virtual_network_functions.svg b/doc/book-enea-nfv-access-guide/doc/images/virtual_network_functions.svg
deleted file mode 100755
index f888174..0000000
--- a/doc/book-enea-nfv-access-guide/doc/images/virtual_network_functions.svg
+++ /dev/null
@@ -1,1569 +0,0 @@
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2<!-- Created with Inkscape (http://www.inkscape.org/) -->
3
4<svg
5 xmlns:dc="http://purl.org/dc/elements/1.1/"
6 xmlns:cc="http://creativecommons.org/ns#"
7 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8 xmlns:svg="http://www.w3.org/2000/svg"
9 xmlns="http://www.w3.org/2000/svg"
10 xmlns:xlink="http://www.w3.org/1999/xlink"
11 xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
12 xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
13 id="svg2985"
14 version="1.1"
15 inkscape:version="0.48.4 r9939"
16 width="559"
17 height="501"
18 sodipodi:docname="virtual_network_functions.png">
19 <metadata
20 id="metadata2991">
21 <rdf:RDF>
22 <cc:Work
23 rdf:about="">
24 <dc:format>image/svg+xml</dc:format>
25 <dc:type
26 rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
27 <dc:title></dc:title>
28 </cc:Work>
29 </rdf:RDF>
30 </metadata>
31 <defs
32 id="defs2989" />
33 <sodipodi:namedview
34 pagecolor="#ffffff"
35 bordercolor="#666666"
36 borderopacity="1"
37 objecttolerance="10"
38 gridtolerance="10"
39 guidetolerance="10"
40 inkscape:pageopacity="0"
41 inkscape:pageshadow="2"
42 inkscape:window-width="640"
43 inkscape:window-height="480"
44 id="namedview2987"
45 showgrid="false"
46 showborder="false"
47 inkscape:showpageshadow="false"
48 fit-margin-top="0"
49 fit-margin-left="0"
50 fit-margin-right="0"
51 fit-margin-bottom="0"
52 inkscape:zoom="0.47105788"
53 inkscape:cx="279.5"
54 inkscape:cy="250.5"
55 inkscape:window-x="0"
56 inkscape:window-y="0"
57 inkscape:window-maximized="0"
58 inkscape:current-layer="svg2985" />
59 <image
60 width="559"
61 height="501"
62 xlink:href="data:image/png;base64,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
1266xbU8dD+LF94dJBIQBEyFY72R7C+eHEn18xP8ciBHE8dyvONp4a5bccE3796TvWcHS+4GArqpwWa
127S+f44eUPezNsGC4wXnS5sjcF+AXPnvZHid51RjN335Lh608O42iqdUWu1lhK8b/PbWNWIugXglsG
128rbEAQUNxw/JGbtoyzq3bJpiTCnLD8kbeVinATgQMgoZirCBPyRZC/Pk4qfAStgyunpfiq08M8dUn
129hih7mqvnHft3IrkemAb85+V+EeaH7j3AoaxNKmQec/kjmQrqIybrh/L0Tdp0p4JMllyG8g5NEYuA
130obivP8f2sRLjJZeP3XMAKoWyd++e5K9XNRMyFVpTDT9/SsHRLG6K8K7Tm/jUQ4cIGopVlaktXSlc
131ff/qlhM+hiMtbQzzsy0T7J0o86blDYQtg2XNYX6yZZw7dqZZ2hQmGTKZkwoSDxrcuGGMi7oSNEX9
132j2njcIFbt00wty5EZyJAyfWIBky+f3UXIdPgA/ccYDBr0xjxl9dAzna5fG6CL186i7GCwz17J/mH
133hw9y7qwYvfWho9pYdjVzkkHedYwC57qQSdnVrB8qcGG3PyrUN1lCa01gWh8XHI/VHTFevaiebz87
134Uh1lCJkGixvD/LEvy/rBPCtb/b59fCDHvz0zwusX1/PSuSf2O7amwtKypjBF2+N7G8ZY0hSpjuj8
135fs8k9/VleEl3gkTQxPH86cmWqMXHzm7jNbfvwXY1i5vCxCzFVx4f5Jfb03z3yi4+vLYVgJ9uGeNt
136v+nj9h0TLGlqq/bp1MjPlJWtUdZ2RLljRxrTgJWtEU5vmxpd9BtadPy7qt56WiNfenyQkGlUp6M8
137/HPrzcsbqyM6033jpbP5q1VN3L49zcMHcnz6oYMYCj64phVlnExEF0KIF4eTrvB7xYIUN24c5aED
138OS6cHa/WdByLAtpiAU5rifDvV3Txilt285d39XHb9b0nFAAW1If49voR3nLnPla1RelLl9kyUuTD
139a1oAuGvXJAETvnJJJ82VC/wj/Tm+v3GUJw7muGBWnGjA4PGBPB+8px+oXEq05rVL6qsFllO8yoXm
140tUvq+eGmcbaMFKrvGcr/hv7+PxygPnw4HHha867Tm1jY+KdHk05v9adLJooOqyoX7hWtUWIBxd50
141mTdXRkPm1Yd449IGPv/oINfdups1nTG01vx29yRbR0t86/JZhCsjDobya0zmNYT518tnc+0tu3nP
1427/bzs+t6CJoK14PZCb8epiFi8f7VLbzzN338wyMH+Y8ruo8Kdgp/qsbx9IxaD/CnvuJBky89PsSe
143dBkD+OWONLOTQRY1him7/uiHW5n+e8tpDfxyxwRDOQevkjbeeloj9+7L8prb9nJlbxJTwd17Mmwa
144KbC6PcpL/2QvUu37gq05oz3G1fNS/PszI+ybLLOoMUzR8bh9R5psyeN1SxswKiNUWkPB9ThvdpyL
145uhLcsm0crf16nGVNET75wEH+4pd7eGlPEsuAR/tzaA29dYcDRSJo4HiQLh4e6UmFTK5dWMfH/ziA
14668Fnz2+sniNT3Mrxv3FZAz99bpzdE6WjjiddOnr0ZP1ggX9/ZoTXLK7jY2e38ce+DI8N5ChUpiSz
147ZY+i6492CSHEn4uTDi9z60KsaImw5WCeS7oTBKfVehQcj0zZReN/g58sudX6j7l1Id69qol3/aaP
148f3zkEJ+7sONwwaT2/xE+cuj/1Yvr2TRS5JatE9y3e5JA0ODK3iRvWdHIUM7h9u1pVrT4tzJPObM9
149yo82jfHTLeMsawrjac0zg3meOZT3F6jMcSxtjlTDiz9C4VXDS2sswFtOa+A9v9tfnbpxPM1E0eV7
150G8YOf+330wtXzE3MCC+u1mTKLuWp2piK7lSQsKnwNCyqTMX01AVpjlpsGSmxuLINy1B87Ow2DAU/
1512jTGQ49mwFAsb4nw1Us7edsKvzC16HhMll3ylX5b2RrlrSsa+dT9A3yrK85rFzeQs73KVJPv+kX1
152/Py5CW58ZpQLZid4y2mN1fem+sHVx/4uv6AhxMfObuWfHh/k648PATC/KcRH1rbSHLUYyNhkyi6F
153yme+tDnCaxbV8/mHD1Y/20vnJPjGZbP44mOH+NoTQ+BpuhpCfPb8dt66oumofRYcj2zZm1H/VHI1
154mZJLyfUIW4ovXNxJLGjwi21p7tw2gWEZrOmI8t6LOriiMpJTrJybdqUr3nV6E7/ZNcl40SVna67o
155TfL5izr4xlPDfOWxQQBm1wX50JoWrptWjzOvPkRjxGI478xo5wWz48QCJrbrVe8Om+rTbNkjHFDV
156c+CNyxr423v7q+fW1PG4xyjy6ogHcDyPN/96H+CXW13ek6xOG40VXCIBVb3DTggh/hyo++67T69Y
157sYL6+uM/T+JIB7I220aLrO6IkZhWeLkrXWYk77CmPcpIwWXrWJEz2qJEKt/uXfxvswFDsWbaw9EA
158nhrMUxe26D3Gw7aeHiqQKblELINVbREspSh6msf7c8xJBelOBo9a3vU0p7dG2TxSIF1yq/UFAGhY
1592hymftroz7PD/ijLiubDxcQP9+doilosrA8xWnTZPFI8qthVazijPUJ0WoizNaw7mGNufYjWyMx8
160uGG4QM72OHvaqM/28RIHszZrOmYWcgL0ZWz2pEtYSrGwMUzTtFqL/Rmb/Zkyq9tjTNUWF1zNEwM5
1616sImK5ojPHEoT2PYorfucB8N5Gw2jxSZkwoyv27mNMX64QKmUix/nrqk/RmbPekyAHPrgsyKH655
162euJQnlTIZGFl+sPR8PCB7FGfU8b22DBUwPY0Xckgc4/zkLXd6TJjRYczWw+fLwM5mz0TZc5qj86o
163v9lW6cewZbC8OUzMOvyZ7J0s05+xOXdaYe+zwwVKrmZ12+Ft78/621bArGSAnuTR7bri5p20xwJ8
16476ruGa8/NZjH9WD1Eef204MFgqZi2bQ+ffBAlvZ4kHl1QQbzDjvGSqzumHk80z07XGAw5xALGJzT
165GatOFX324UPctXuS+14/b0bRuBBCvBiNj4+zYcOGkw8vzx3M43maaMAgZ3vVqQLwb+8MGIrJkkfQ
166VEQsg6ztVm95tiq3C7uVkZapu5MM/NtYHa3J2zNHXyxDEbUMDMN/wm7B1pQ9D1MpEkGTsufNWMdQ
167/j40/m2v0YBRKbqd/q1WkXcOt11V9g9URyn8tprYniZnu4RMo/IE1SO/HStytjvjTimzcltu0dGU
168pvXP1H4MNXWHlb9OLGASMBW58sztGEoRsRQBw99vydUUHV3tt4hlEKwUwE59aw+aBtGA/4C8guP5
169/erN7NeI5d8yXHRmjnZNtW9qtODoY/WXiQQUQcPvr7LnUbD9NhmV43Y9v9YG/MLreNA8al9+fypQ
170Ctv126ePsb9owMBS/jFOjYyFLYOwqcjaXvXcMpUiEvDrSLTWR/V91DIImKra7wpFIugXjGSnvTb9
1712OxKobk3bUREobhjZ5r9k2XesbKxOno4deyKmZ/t1H48IHvEuTV17oZN//OY/ndlOlMp/zyuHFve
1729qrnyY83jeNqzQ2nNc5opxBC1ArHha6GEG0n8KTwqfBy0tNG920bZ/94ufp0WyH+3MSCBosiJr/Z
173MPZCN4W2oH+L/G3PjLzQTRFCiP+WXNnlquWNtKaCJ3wDwkmHl3DAIBo0TvgOHiFebKZuf46cAkWy
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
133586RSKa664jKCwaDaWlK8Y/C2jXzk5+XRd/wEr+59nWuuvBxdEwT8/rQw7wkPR5pbeH3/ARzHZcO6
1336tSxpauD5F7fTPzCApmk88viT1NfWMjg8QnVVBZs2rKe5pZXXD7zB+jWrWb50CTtfepmx8XGuftfl
1337aJpg955XaO/sRBMa9XW1bN64gUDAz9GODva+to8Vy5cyMT6JRFJeVpbVuOiawZ5X9tLWfpRlS5ey
1338fu3qrECl6zq93T0MDA6xfs0qunv76OrppbqqylvM6DrH+wd4+dXXGBsbIxwOc/W7LqOoqIjmllb2
1339HXiDWCxORUU5V11+GS4uu156mY7OTnLCOVx80YVUV1XOKkfDMOjt7WPXnpeZmJikoaGOLZs3IYDn
1340X9xOMplkSVMjh4+0sGH9GnRd9zRCKYtIbg6XX3oJPtNk63PPE0/EcUddfvnAQ2zasJ7xiQkCPn/6
13413TWOtnew9/X9JJNJ8vIiXHzhZsrLyxifmOCZ519E1zSKi713CQYCXHThZkpLS5QAo1DbRmeClJJI
1342bg7hcIhjXd08+fSztLd3khMOkxfJZXR0lIcefYKBwUHqamtoa+/ghe070TTBa6/v58mtzyKlpLKi
1343HF3XiccTdB47Rm9fXzb9rp5eOo91IaUkFovTeayLV/e+zo5dL3Gif4CRsVH2v3GQgcEhCvLzCQYD
1344CAEFBXmUlZQwNDzC/oMHSSQSxOIxDh9pRghBMBBQe86KdxyO41BaUsySpiZe33+AjmPdmMa0gaih
13456xw8fIQntz5LOByioCCfZ194kaPtHRQXF+HzedqHwsJC8vPz6O3r42h7B47j0NbewZEjLfT0HSdl
1346WRw6fAQrlUIIweNPPsMre1+jpLiY/Pw8du95medf3IYQgmg0RkfnMfa88ho797xMf/9ANj8+0+RY
1347Vzcv7thJLJ6gqb4eIcR03xSCto5OdE1j3bo15OVF6Ow8RjKZxDAM+gcHeejRx+np7aW8vIycnDCu
1348K2lpbeORx58iGotTVVmO3+cjmUry/IvbeW3ffqqrKkkkEzzx1FbGxyfQtWlNyMDAIA899jjRaJTq
13496kr2HzjE7j0vI4Sgf2CQIy2tvLBtB4eamxmfmORE/wAF+fnU19dyon+Arc89T9JKUVhYiK7r+EyT
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
13806erq4dEnnuKKSy+hsqKcYDBI57Eurr36SsrLStF0jWMd3Vx68RZMw6CyopxlS5dw4OBhr587Dr29
1381faxfu4aSokJ6e/tm9VuY1nDous6FmzfSd7yfp555jnAoRGNDPRIYHR2jpaWVUDDIrTd728uO4/DQ
1382o4+z78AbdPf0sXr1StraO3j2hW0cbe/AlZJLL9rCxvXreOLpZ3jksScoLSnBH/Bz8YWbWNrUxJHm
1383Vp7ftp1AIABIrrrichzbIZGI49gOTY0N7D94kL2v72doeCS9TVRJUVEhKcsikdGiSEk4HCYnHOZo
1384RyfJVIq+EydIWTaO42R92HR2HuPRx59m2bIl2LZNMpHE5/ezfu1qntr6LA8/+gSFhQV0dfdQVlrK
1385iqVLsB2HZCqFrk/btqRSVla7pFDoH//4x79WXu510LfCP782xMCkBboAV7A04nJ9iU3SPf/UeZmj
1386icPDIySTSWzbobiokBuuuZri4kKCwQB1tbVEo3GisSiO67C0qZGCgnwqy8uJ5OYSjUVJJlNUVpRT
1387V1tDSXExlm1jWSlWLFtCUVEhkUiEutoaXNfFtm2qqyspKS4CIUikO3N9bQ1FhYUUFhQgNA3LsijI
1388z6eqsgKBZyhXUlzMxvVrEEI7rweAgA77JnR2Dhkwn0sLKbixzKYx5JI6D9v1YiRzfDeR8LYiqqsq
1389EUIQCoXIyclB0wQ1VV6/qayoID8/z1v1x+LkhHNYtrQJ0+ejsKAge2y6pLiIstISkpaFz2eycsVy
1390CgsKSCaThMM5rFy5nEgkgqZp1NfWoOs6Y+PjgODCzRvZvHEDmhDEEwkkktrqaooKCwCwUha2Y1NR
1391Xk5TQwMF+Z6ti+04VJSXYRgGY2PjxONxli9bQk11FY7jIKXEl7aJy8uLsLSxgcrKcpLJFLF4nFAo
1392xJLGBqqrqigqKCAai5FIemXS2FBHY309ABOTk8TjCaorK6mpriIaixPw+6mvq6GyspLKigomJiaz
1393214rli0lFAoRjcXIi0Soq63FMA1C4SC5OTmMjo9TWFBAfV0toVCQurpaIpFc8vIi2LaFRFJRVoam
1394a5QUF1NdVUlZWQnFRUWMT0yQSCSprani2quvpCA/n1QqRSKRoKiwkJrqKnRNJxqLEsnNpb6uFr/f
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
1565"
1566 id="image2993"
1567 x="0"
1568 y="0" />
1569</svg>
diff --git a/doc/book-enea-nfv-access-guide/doc/images/virtual_network_functions_old.png b/doc/book-enea-nfv-access-guide/doc/images/virtual_network_functions_old.png
deleted file mode 100644
index 4011de8..0000000
--- a/doc/book-enea-nfv-access-guide/doc/images/virtual_network_functions_old.png
+++ /dev/null
Binary files differ
diff --git a/doc/book-enea-nfv-access-guide/doc/overview.xml b/doc/book-enea-nfv-access-guide/doc/overview.xml
deleted file mode 100644
index c173e82..0000000
--- a/doc/book-enea-nfv-access-guide/doc/overview.xml
+++ /dev/null
@@ -1,147 +0,0 @@
1<?xml version="1.0" encoding="ISO-8859-1"?>
2<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
3"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
4<chapter id="overview">
5 <title>Overview</title>
6
7 <para>The Enea NFV Access Guide available with this release seeks to provide
8 further information that will help all intended users make the most out of
9 the virtualization features.</para>
10
11 <section id="description">
12 <title>Enea NFV Access Description</title>
13
14 <para>Enea NFV Access is a lightweight virtualization software designed
15 for deployment on edge devices at customer premises. It has been
16 streamlined for high networking performance and low footprints for both
17 host platforms and VNFs, enabling high compute density. This software also
18 provides a foundation for vCPE agility and innovation, reducing cost and
19 complexity for computing at the network edge.</para>
20
21 <para>Enea NFV Access supports multiple architectures and scales from
22 small white box edge devices up to high-end network servers. It can also
23 be deployed on systems as small as single 2-core ARM devices. It scales up
24 to clustered 24 core OCTEON TX&trade; ARM Micro-servers and beyond,
25 allowing multiple VNFs on the same machine, and eliminating the need to
26 use different virtualization software for different hardware platforms,
27 saving costs through single source provisioning.</para>
28
29 <para>Optimized virtual networking performance provides low virtualized
30 networking latency, high virtualized networking throughput (10 Gb wire
31 speed), and low processing overhead. It allows high compute density on
32 white box hardware, maintaining performance when moving functionality from
33 application specific appliances, to software on standard hardware. The
34 optimized boot speed minimizes the time from reboot to active services,
35 improving availability.</para>
36
37 <para>Enea NFV Access provides virtualization using both containers and
38 virtual machines. Containers provide lightweight virtualization for a
39 smaller VNF footprint and a very short time interval from start to enabled
40 network services. VMs provide virtualization with secure VNF sandboxing
41 and are the preferred virtualization method for OPNFV compliance. Enea NFV
42 Access allows combinations of containers and VMs for the highest possible
43 user adaptability.</para>
44
45 <para>Flexible interfaces for VNF lifecycle management and service
46 function chaining, are important to allow for a smooth transition from
47 traditional network appliances to virtualized network functions in
48 existing networks. Enea NFV Access supports VNF lifecycle management and
49 service function chaining through NETCONF, REST, CLI and Docker. It
50 integrates a powerful device management framework that enables full FCAPS
51 functionality for powerful management of the platform.</para>
52
53 <para>Building on open source, Enea NFV Access prevents vendor lock-in
54 thanks to its completely open standards and interfaces. It includes
55 optimized components with open interfaces to allow full portability and
56 interoperability.</para>
57 </section>
58
59 <section id="components">
60 <title>Components</title>
61
62 <para>Enea NFV Access is built on highly optimized open source components
63 that provide standard interfaces with boosted performance.</para>
64
65 <mediaobject>
66 <imageobject role="fo">
67 <imagedata align="center" contentwidth="600"
68 fileref="images/virtual_network_functions.svg" />
69 </imageobject>
70
71 <imageobject role="html">
72 <imagedata align="center"
73 fileref="images/virtual_network_functions.png" />
74 </imageobject>
75 </mediaobject>
76
77 <para>The Access Platform includes the following key components:</para>
78
79 <itemizedlist>
80 <listitem>
81 <para>Linux Kernel - Optimized Linux kernel with the focus on vCPE
82 systems characteristics.</para>
83 </listitem>
84
85 <listitem>
86 <para>KVM - Virtualization with virtual machines. KVM is the standard
87 virtualization engine for Linux based systems.</para>
88 </listitem>
89
90 <listitem>
91 <para>Docker - Provides a lightweight configuration using containers.
92 Docker is the standard platform for container virtualization.</para>
93 </listitem>
94
95 <listitem>
96 <para>Virtual switching - Optimized OVS-DPDK provides high throughput
97 and low latency.</para>
98 </listitem>
99
100 <listitem>
101 <para>Edge Link - Provides interfaces to orchestration for centralized
102 VNF lifecycle management and service function chaining:</para>
103
104 <orderedlist>
105 <listitem>
106 <para>NETCONF</para>
107 </listitem>
108
109 <listitem>
110 <para>Docker</para>
111 </listitem>
112
113 <listitem>
114 <para>REST</para>
115 </listitem>
116
117 <listitem>
118 <para>CLI</para>
119 </listitem>
120 </orderedlist>
121 </listitem>
122
123 <listitem>
124 <para>APT packet management - Feature rich repository of prebuilt open
125 source packages for extending and adapting the platform using APT
126 Package Management.</para>
127 </listitem>
128
129 <listitem>
130 <para>CLI based VNF management - CLI access over
131 <literal><filename>virsh</filename></literal> and
132 <filename>libvirt</filename>.</para>
133 </listitem>
134
135 <listitem>
136 <para>FCAPS framework - Device management framework for managing the
137 platform, capable of providing full FCAPS functionality to
138 orchestration or network management systems.</para>
139 </listitem>
140
141 <listitem>
142 <para>Data plane - High performance data plane that includes the DPDK
143 optimized data plane driver.</para>
144 </listitem>
145 </itemizedlist>
146 </section>
147</chapter> \ No newline at end of file
diff --git a/doc/book-enea-nfv-access-guide/doc/ovs.xml b/doc/book-enea-nfv-access-guide/doc/ovs.xml
deleted file mode 100644
index de14f76..0000000
--- a/doc/book-enea-nfv-access-guide/doc/ovs.xml
+++ /dev/null
@@ -1,162 +0,0 @@
1<?xml version="1.0" encoding="ISO-8859-1"?>
2<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
3"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
4<chapter id="ovs">
5 <title>Open Virtual Switch</title>
6
7 <para>Open vSwitch (OVS) is an open-source multilayer virtual switch
8 designed to be used in virtualized environments to forward traffic between
9 different VMs on the same host, and also between VMs and the physical
10 network.</para>
11
12 <para>Native OVS forwarding is handled by two major components: a user-space
13 daemon called <literal>ovs-vswitchd</literal> and a
14 <literal>fastpath</literal> kernel module used to accelerate the data path.
15 The fastpath kernel module will handle packets received on the NIC by simply
16 consulting a flow table with corresponding action rules (e.g to forward the
17 packet or modify its headers). If no matching entry is found in the flow
18 table, the packet is copied to the user-space and sent to the ovs-vswitchd
19 deamon which determines how it should be handled ("slowpath").</para>
20
21 <para>The packet is then passed back to the kernel module together with the
22 desired action and the flow table is updated, so that subsequent packets in
23 the same flow can be handled in fastpath without any user-space interaction.
24 In this way, OVS eliminates a lot of the context switching between
25 kernel-space and user-space, but the throughput is still limited by the
26 capacity of the Linux kernel stack.</para>
27
28 <section id="ovs-dpdk">
29 <title>OVS-DPDK</title>
30
31 <para>To improve performance, OVS supports integration with Intel DPDK
32 libraries to operate entirely in user-space (OVS-DPDK). DPDK Poll Mode
33 Drivers (PMDs) enable direct transfers of packets between the physical NIC
34 and user-space, thereby eliminating the overhead of interrupt handling and
35 Linux kernel network stack processing. OVS-DPDK provides DPDK-backed
36 vhost-user ports as the primary way to connect guests to this datapath.
37 The vhost-user interfaces are transparent to the guest.</para>
38 </section>
39
40 <section id="ovs-commands">
41 <title>OVS commands</title>
42
43 <para>OVS provides a rich set of command line management tools, most
44 importantly:</para>
45
46 <itemizedlist>
47 <listitem>
48 <para>ovs-vsctl: Used to manage and inspect switch configurations,
49 e.g. to create bridges and to add/remove ports.</para>
50 </listitem>
51
52 <listitem>
53 <para>ovs-ofctl: Used to configure and monitor flows.</para>
54 </listitem>
55 </itemizedlist>
56
57 <para>For more information about Open vSwitch, see <ulink
58 url="http://openvswitch.org">http://openvswitch.org</ulink>.</para>
59 </section>
60
61 <section id="config-ovs-dpdk">
62 <title>Configuring OVS-DPDK for improved performance</title>
63
64 <section id="dpdk-lcore-mask">
65 <title>dpdk-lcore-mask</title>
66
67 <para>Specifies the CPU core affinity for DPDK lcore threads. The lcore
68 threads are used for DPDK library tasks. For performance it is best to
69 set this to a single core on the system, and it should not overlap the
70 pmd-cpu-mask, as seen in the example below.</para>
71
72 <para>Example: To use core 1:</para>
73
74 <programlisting>ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-lcore-mask=0x1</programlisting>
75 </section>
76
77 <section id="pmd-cpu-mask">
78 <title>pmd-cpu-mask</title>
79
80 <para>The DPDK PMD threads polling for incoming packets are CPU bound
81 and should be pinned to isolated cores for optimal performance.</para>
82
83 <para>If OVS-DPDK receives traffic on multiple ports, for example when
84 DPDK and vhost-user ports are used for bi-directional traffic, the
85 performance can be significantly improved by creating multiple PMD
86 threads and affinitizing them to separate cores in order to share the
87 workload, by each being responsible for an individual port. The cores
88 should not be hyperthreads on the same CPU.</para>
89
90 <para>The PMD core affinity is specified by setting an appropriate core
91 mask. Example: using cores 2 and 3:</para>
92
93 <programlisting>ovs-vsctl --no-wait set Open_vSwitch . other_config:pmd-cpu-mask=0xc</programlisting>
94 </section>
95 </section>
96
97 <section id="setup-ovs-dpdk">
98 <title>How to set up OVS-DPDK</title>
99
100 <para>The DPDK must be configured prior to setting up OVS-DPDK. See <xref
101 linkend="dpdk-setup" /> for DPDK setup instructions, then follow these
102 steps:</para>
103
104 <orderedlist>
105 <listitem>
106 <para>Clean up the environment:</para>
107
108 <programlisting>killall ovsdb-server ovs-vswitchd
109rm -f /var/run/openvswitch/vhost-user*
110rm -f /etc/openvswitch/conf.db</programlisting>
111 </listitem>
112
113 <listitem>
114 <para>Start the ovsdb-server:</para>
115
116 <programlisting>export DB_SOCK=/var/run/openvswitch/db.sock
117ovsdb-tool create /etc/openvswitch/conf.db /usr/share/openvswitch/vswitch.ovsschema
118ovsdb-server --remote=punix:$DB_SOCK \
119--remote=db:Open_vSwitch,Open_vSwitch,manager_options --pidfile --detach</programlisting>
120 </listitem>
121
122 <listitem>
123 <para>Start ovs-vswitchd with DPDK support enabled:</para>
124
125 <programlisting>ovs-vsctl --no-wait init
126ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-lcore-mask=0x1
127ovs-vsctl --no-wait set Open_vSwitch . other_config:pmd-cpu-mask=0xc
128ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true
129ovs-vswitchd unix:$DB_SOCK --pidfile --detach \
130--log-file=/var/log/openvswitch/ovs-vswitchd.log</programlisting>
131 </listitem>
132
133 <listitem>
134 <para>Create the OVS bridge and attach ports:</para>
135
136 <programlisting>ovs-vsctl add-br ovsbr0 -- set bridge ovsbr0 datapath_type=netdev
137ovs-vsctl add-port ovsbr0 dpdk0 -- set Interface dpdk0 type=dpdk \
138:dpdk-devargs=&lt;PCI device&gt;</programlisting>
139 </listitem>
140
141 <listitem>
142 <para>Add DPDK vhost-user ports:</para>
143
144 <programlisting>ovs-vsctl add-port ovsbr0 vhost-user1 -- set Interface vhost-user1 type=dpdkvhostuser</programlisting>
145
146 <para>This command creates a socket at
147 <literal>/var/run/openvswitch/vhost-user1</literal>, which can be
148 provided to the VM on the QEMU command line. See <xref
149 linkend="net_in_guest" /> for details.</para>
150 </listitem>
151
152 <listitem>
153 <para>Define flows:</para>
154
155 <programlisting>ovs-ofctl del-flows ovsbr0
156ovs-ofctl show ovsbr0
157ovs-ofctl add-flow ovsbr0 in_port=1,action=output:2
158ovs-ofctl add-flow ovsbr0 in_port=2,action=output:1</programlisting>
159 </listitem>
160 </orderedlist>
161 </section>
162</chapter> \ No newline at end of file
diff --git a/doc/book-enea-nfv-access-guide/doc/using_nfv_access_sdks.xml b/doc/book-enea-nfv-access-guide/doc/using_nfv_access_sdks.xml
deleted file mode 100644
index df5df43..0000000
--- a/doc/book-enea-nfv-access-guide/doc/using_nfv_access_sdks.xml
+++ /dev/null
@@ -1,473 +0,0 @@
1<?xml version="1.0" encoding="ISO-8859-1"?>
2<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
3"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
4<chapter id="workflow">
5 <title>Using Enea NFV Access SDKs</title>
6
7 <para>Enea NFV Access comes with a standard SDK which can be used to develop
8 user-applications and kernel modules for both host and guest images.</para>
9
10 <para>The standard SDK consists of:</para>
11
12 <itemizedlist>
13 <listitem>
14 <para>Cross-Development Toolchain: cross-compiler and
15 cross-debugger</para>
16 </listitem>
17
18 <listitem>
19 <para>Libraries, Headers and Symbols that are specific to the
20 image</para>
21 </listitem>
22
23 <listitem>
24 <para>Environment Setup Script which defines the environment
25 variables</para>
26 </listitem>
27 </itemizedlist>
28
29 <para>To install the SDK on your host development machine, there is an
30 installation script available under the Download section on <ulink
31 url="https://portal.enea.com/">portal.enea.com</ulink>:</para>
32
33 <itemizedlist>
34 <listitem>
35 <para>aarch/install/install-sdk.sh</para>
36 </listitem>
37 </itemizedlist>
38
39 <para>After installing the SDK, a developer will be able to compile and
40 generate executables for the preferred target machine. Cross-gdb
41 (<filename>enea-linux-gdb</filename>) is created by the Cross-Development
42 toolchain. It can be used to debug applications on the target platform from
43 the development workstation. For kernel debugging, <command>ftrace</command>
44 and <command>kgdb</command> are enabled on the host sdk image.</para>
45
46 <para>Various user-space tools helpful in the development process, are also
47 provided. The tools include <emphasis role="bold">LatencyTop</emphasis>,
48 <emphasis role="bold">Perf</emphasis>, <emphasis
49 role="bold">CrossTap</emphasis>, <emphasis role="bold">OProfile</emphasis>,
50 <emphasis role="bold">Lttng-ust</emphasis> and <emphasis
51 role="bold">GDBserver</emphasis>.</para>
52
53 <section id="install-crosscomp">
54 <title>Installing the Cross-Compilation Toolchain</title>
55
56 <para>Before cross-compiling applications for your target, you need to
57 install the corresponding toolchain on your workstation. To do that,
58 simply run the installer and follow the steps included with it:</para>
59
60 <orderedlist>
61 <listitem>
62 <para><programlisting>$ ./install-sdk.sh</programlisting>When
63 prompted, select to install the toolchain in the desired directory,
64 referred to as <literal>sdkdir</literal>.</para>
65
66 <para>A default path where the toolchain will be installed will be
67 shown in the prompt. The installer unpacks the environment setup
68 script in <literal>sdkdir</literal> and the toolchain under
69 <literal>sdkdir/sysroots</literal>.</para>
70
71 <note>
72 <para>Choose a unique directory for each toolchain. Installing a
73 second toolchain of any type in the same directory as a previously
74 installed one will break the <literal>$PATH</literal> variable of
75 the first one.</para>
76 </note>
77 </listitem>
78
79 <listitem>
80 <para>Setup the toolchain environment for your target by sourcing the
81 environment-setup script. Example: <programlisting>$ source sdkdir/environment-setup-aarch64-enea-linux</programlisting></para>
82 </listitem>
83 </orderedlist>
84 </section>
85
86 <section id="crosscomp-apps">
87 <title>Cross-Compiling Applications from Command Line</title>
88
89 <para>Once the environment-setup script is sourced, you can make your
90 applications as per usual and get them compiled for your target. Below you
91 see how to cross-compile from command line.</para>
92
93 <orderedlist>
94 <listitem>
95 <para>Create a Makefile for your application. Example: a simple
96 Makefile and application:</para>
97
98 <programlisting>helloworld:helloworld.o
99 $(CC) -o helloworld helloworld.o
100clean:
101 rm -f *.o helloworld
102#include &lt;stdio.h&gt;
103int main(void) {
104 printf("Hello World\n");
105 return 0;
106}</programlisting>
107 </listitem>
108
109 <listitem>
110 <para>Run <command>make</command> to cross-compile your application
111 according to the environment set up:</para>
112
113 <programlisting>$ make</programlisting>
114 </listitem>
115
116 <listitem>
117 <para>Deploy the helloworld program to your target and run it:</para>
118
119 <programlisting># ./helloworld
120hello world</programlisting>
121 </listitem>
122 </orderedlist>
123 </section>
124
125 <section id="crosscomp-kern-mod">
126 <title>Cross-Compiling Kernel Modules</title>
127
128 <para>Before cross-compiling kernle modules, you need to make sure the
129 installed toolchain includes the kernel source tree, which should be
130 available at:
131 <literal>sdkdir/sysroots/targetarch-enea-linux/usr/src/kernel</literal>.</para>
132
133 <para>Once the environment-setup script is sourced, you can make your
134 kernel modules as usual and get them compiled for your target. Below you
135 see how to cross-compile a kernel module.</para>
136
137 <orderedlist>
138 <listitem>
139 <para>Create a Makefile for the kernel module. Example: a simple
140 Makefile and kernel module:</para>
141
142 <programlisting>obj-m := hello.o
143PWD := $(shell pwd)
144
145KERNEL_SRC := full path to kernel source tree
146
147all: scripts
148 $(MAKE) -C $(KERNEL_SRC) M=$(PWD) LDFLAGS="" modules
149scripts:
150 $(MAKE) -C $(KERNEL_SRC) scripts
151clean:
152 $(MAKE) -C $(KERNEL_SRC) M=$(PWD) LDFLAGS="" clean
153#include &lt;linux/module.h&gt; /* Needed by all modules */
154#include &lt;linux/kernel.h&gt; /* Needed for KERN_INFO */
155#include &lt;linux/init.h&gt; /* Needed for the macros */
156
157static int __init hello_start(void)
158{
159 printk(KERN_INFO "Loading hello module...\n");
160 printk(KERN_INFO "Hello, world\n");
161 return 0;
162}
163
164static void __exit hello_end(void)
165{
166 printk(KERN_INFO "Goodbye, world\n");
167}
168
169module_init(hello_start);
170module_exit(hello_end);
171
172MODULE_LICENSE("GPL");</programlisting>
173 </listitem>
174
175 <listitem>
176 <para>Run <command>make</command> to cross-compile your kernel module
177 according to the environment set up:</para>
178
179 <programlisting>$ make</programlisting>
180 </listitem>
181
182 <listitem>
183 <para>Deploy the kernel module <literal>hello.ko</literal> to your
184 target and install/remove it:</para>
185
186 <programlisting># insmod hello.ko
187# rmmod hello.ko</programlisting>
188 </listitem>
189 </orderedlist>
190
191 <para>If you build a module using the SDK for development image, and
192 insert to the release image you will get error when running
193 <literal>rmmod</literal>: <programlisting>root@cn8304:~# rmmod hello.ko &lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;
194rmmod: ERROR: could not remove module hello.ko: Device or resource busy</programlisting></para>
195 </section>
196
197 <section id="deploy-artifacts">
198 <title>Deploying your artifacts</title>
199
200 <section id="deploy_onhost">
201 <title>Deploying on host</title>
202
203 <para>You can use <literal>ssh</literal> to deploy your artifacts on the
204 host target. For this you will need a network connection to the target,
205 to use <literal>scp</literal> to copy to the desired location.</para>
206
207 <para><programlisting>$ scp helloworld root@&lt;target_ip_address&gt;:/tmp</programlisting></para>
208 </section>
209
210 <section id="deploy_onguest">
211 <title>Deploying on guest</title>
212
213 <para>You can deploy your artifacts onto the guest VM running on the
214 target, by using TAP Networking. You can use the
215 <filename>/etc/qemu-ifup</filename> script to create the tap interface
216 on the host and attach it to the existing virtual bridge
217 (<literal>virbr0</literal>). This bridge interface is created by the
218 <filename>libvirt</filename> library and can be used to connect to the
219 outside network. To be able to transfer files to the guest via
220 <literal>scp</literal>, port forwarding should be enabled on the host.
221 The script sets iptables rules to forward traffic from a host port to
222 the guest default SSH port (22).</para>
223
224 <para>Follow the steps below to create this setup:</para>
225
226 <orderedlist>
227 <listitem>
228 <para>On the host, run the <literal>qemu-ifup</literal> script
229 located in <literal>/etc</literal> directory:</para>
230
231 <para><programlisting># /etc/qemu-ifup -t tap0 -a 192.168.122.10 -p 1050 -g 22</programlisting></para>
232
233 <itemizedlist>
234 <listitem>
235 <para><emphasis role="bold">tap0</emphasis> - the tap interface
236 name which will be created and added to the virtual bridge
237 (virbr0).</para>
238 </listitem>
239
240 <listitem>
241 <para><emphasis role="bold">192.168.122.10</emphasis> - the IP
242 address of the guest virtual network device. It has to be in the
243 same network with the IP address of the virbr0 interface.</para>
244 </listitem>
245
246 <listitem>
247 <para><emphasis role="bold">1050</emphasis> - the host port
248 which is set to forward traffic from the host to the
249 guest.</para>
250 </listitem>
251
252 <listitem>
253 <para><emphasis role="bold">22</emphasis> - the default SSH
254 guest port used in port forwarding.</para>
255 </listitem>
256 </itemizedlist>
257 </listitem>
258
259 <listitem>
260 <para>Launch the virtual machine specifying the newly created tap
261 interface:</para>
262
263 <para><programlisting>-device e1000,netdev=net0 \
264-netdev tap,id=net0,ifname=tap0,script=no,downscript=no</programlisting></para>
265 </listitem>
266
267 <listitem>
268 <para>On the guest, after logging, configure the virtual network
269 device and set the default gateway as the <literal>virbr0</literal>
270 ip address:</para>
271
272 <para><programlisting># ip addr add 192.168.122.10/24 dev enp0s2
273# ip link set enp0s2 up
274# ip route add default via 192.168.122.1 dev enp0s2</programlisting></para>
275 </listitem>
276
277 <listitem>
278 <para>Now you can use <literal>scp</literal> from your development
279 machine to deploy your artifacts on the guest, by giving the host
280 port for forwarding as a command parameter: <programlisting>$ scp -P 1050 helloworld root@target_ip_address:/tmp</programlisting></para>
281 </listitem>
282
283 <listitem>
284 <para>On the host, after finishing the deployment session and
285 stopping the virtual machine, you can use the
286 <literal>qemu-ifdown</literal> script to clean up the configuration
287 on host. The following command will remove the tap interface and all
288 the iptables rules for the specific ip address: <programlisting># /etc/qemu-ifdown -t tap0 -a 192.168.122.10</programlisting>If
289 we need to remove only a particular port forwarding rule from
290 iptables, this should be run: <programlisting># /etc/qemu-ifdown -t tap0 -a 192.168.122.10 -p 1050 -g 22</programlisting></para>
291 </listitem>
292 </orderedlist>
293 </section>
294 </section>
295
296 <section id="crossdebugging">
297 <title>Cross-Debugging on Enea NFV Access</title>
298
299 <para>The cross-debugger (<literal>aarch64-enea-linux-gdb</literal>) is
300 created when installing the SDK on the development machine. It is helpful
301 for debugging both the kernel and user-applications. In order to perform
302 this task, we need the following tools to be available on the target
303 machine:</para>
304
305 <itemizedlist>
306 <listitem>
307 <para>Kgdb - for kernel cross-debugging</para>
308 </listitem>
309
310 <listitem>
311 <para>GDBServer - for application cross-debugging</para>
312 </listitem>
313 </itemizedlist>
314
315 <para>The Host Development image provides both of these tools and has to
316 be booted on the target machine for cross-debugging sessions.</para>
317
318 <section id="ua_debug_host">
319 <title>User-application Cross-Debugging on Host</title>
320
321 <para>To debug a user-application on host, a TCP connection has to be
322 established between the host and development machines. GDBserver is the
323 program which runs on the target machine and allows you to run GDB on
324 your workstation. Below you can find how a simple
325 <filename>helloworld</filename> application can be debugged using
326 GDBServer and cross-gdb.</para>
327
328 <para>On target, launch the GDBServer, specifying how to communicate
329 with GDB and the name of your program:<programlisting># gdbserver :&lt;port_no&gt; /tmp/helloworld</programlisting>The
330 target will now be listening on the port given as a parameter to the
331 gdbserver. On the development machine, from the
332 <literal>&lt;sdkdir&gt;</literal>, start the cross-gdb:<programlisting>$ aarch64-enea-linux-gdb &lt;path_to_the_program&gt;/helloworld</programlisting>Connect
333 the GDB to the target: <programlisting>(gdb) target remote &lt;target_ip_address&gt;:&lt;port_no&gt;</programlisting>Now
334 remote debugging is started and the GDB commands are available to debug
335 your program from the target machine.</para>
336 </section>
337
338 <section id="us_debug_guest">
339 <title>User-application Cross-Debugging on Guest</title>
340
341 <para>To debug a user-application on guest, a TCP connection has to be
342 established between the host and development machines. Similarly, as
343 when deploying artifacts on guest, for a cross-debugging session, TAP
344 Networking is required.</para>
345
346 <para>A tap interface should be added to the existing virtual bridge
347 (<literal>virbr0</literal>), along with port forwarding rules created in
348 iptables. In order to do this, the script
349 <filename>/etc/qemu-ifup</filename> can pe used:</para>
350
351 <orderedlist>
352 <listitem>
353 <para>On the host, run the script <literal>qemu-ifup</literal>
354 located in <literal>/etc</literal> directory: <programlisting># /etc/qemu-ifup -t tap0 -a 192.168.122.10 -p 1051 -g 1025</programlisting></para>
355
356 <itemizedlist>
357 <listitem>
358 <para><emphasis role="bold">tap0</emphasis> - the tap interface
359 name which will be created and added to virtual bridge
360 (virbr0).</para>
361 </listitem>
362
363 <listitem>
364 <para><emphasis role="bold">192.168.122.10</emphasis> - the IP
365 address of the guest virtual network device. It has to be in the
366 same network with the IP address of the virbr0 interface.</para>
367 </listitem>
368
369 <listitem>
370 <para><emphasis role="bold">1051</emphasis> - the host port
371 which is set to forward traffic from the host to the guest and
372 is used by gdb target remote command.</para>
373 </listitem>
374
375 <listitem>
376 <para><emphasis role="bold">1025</emphasis> - the port used by
377 GDBServer on guest for listening.</para>
378 </listitem>
379 </itemizedlist>
380 </listitem>
381
382 <listitem>
383 <para>Launch the virtual machine, specifying the newly created tap
384 interface:<programlisting>-device e1000,netdev=net0 \
385-netdev tap,id=net0,ifname=tap0,script=no,downscript=no</programlisting></para>
386 </listitem>
387
388 <listitem>
389 <para>On the guest, after logging, configure the virtual network
390 device and set the default gateway to virbr0 ip
391 address:<programlisting>ip addr add 192.168.122.10/24 dev enp0s2
392ip link set enp0s2 up
393ip route add default via 192.168.122.1 dev enp0s2</programlisting></para>
394 </listitem>
395
396 <listitem>
397 <para>GDBserver is the program which runs on the guest VM and allows
398 you to run GDB on your workstation. On the guest, launch GBDserver
399 specifying how to communicate with GDB and the name of your program:
400 <programlisting># gdbserver :1025 /tmp/helloworld</programlisting>The
401 guest is now listening on port 1025, given as a parameter to the
402 gdbserver.</para>
403 </listitem>
404
405 <listitem>
406 <para>On the development machine, from the<filename>
407 &lt;sdkdir&gt;</filename>, start the cross-gdb:<programlisting>$ aarch64-enea-linux-gdb &lt;path_to_the_program&gt;/helloworld</programlisting></para>
408 </listitem>
409
410 <listitem>
411 <para>Connect GDB to the target:<programlisting>(gdb) target remote &lt;target_ip_address&gt;:1051</programlisting>Now
412 remote debugging is started and the GDB commands are available to
413 debug your program from the guest VM.</para>
414 </listitem>
415
416 <listitem>
417 <para>On the host, after finishing the cross-debugging session and
418 stopping the virtual machine, you can use the
419 <filename>qemu-ifdown</filename> script to clean up the
420 configuration on host:<programlisting># /etc/qemu-ifdown -t tap0 -a 192.168.122.10</programlisting></para>
421 </listitem>
422 </orderedlist>
423 </section>
424
425 <section id="kernel_crossdebug">
426 <title>Kernel Cross-Debugging</title>
427
428 <para>In order to debug the kernel, a serial connection is required
429 between the development and target machines. Debugging commands will be
430 sent from your workstation to the target machine via a serial
431 port.</para>
432
433 <para>The KGDB kernel options are enabled in the Enea NFV Access Host
434 SDK image and the tool can be used in the following way:</para>
435
436 <itemizedlist>
437 <listitem>
438 <para>On target, once serial communication is established, configure
439 <literal>kgdboc</literal> after the kernel boots:<programlisting># echo ttyS0,115200 &gt; /sys/module/kgdboc/parameters/kgdboc</programlisting></para>
440 </listitem>
441
442 <listitem>
443 <para>In order to connect to gdb via kgdboc, the kernel must first
444 be stopped:<programlisting># echo g &gt; /proc/sysrq-trigger</programlisting></para>
445 </listitem>
446
447 <listitem>
448 <para>Close the console to the target, eg.: <command>Ctrl +
449 ]</command> for a telnet session.</para>
450 </listitem>
451
452 <listitem>
453 <para>On your development machine, start cross-gdb using the vmlinux
454 kernel image as a parameter. The image is located in
455 <filename>&lt;sdkdir&gt;/sysroots/aarch64-enea-linux/boot/</filename>
456 and should be the same as the image found in the
457 <literal>/boot</literal> directory from the target:<programlisting>$ aarch64-enea-linux-gdb \
458 ./sysroots/aarch64-enea-linux/boot/ \
459 vmlinux-4.9.0-octeontx.sdk.6.1.0.p3.build.22-cavium-tiny</programlisting></para>
460 </listitem>
461
462 <listitem>
463 <para>Connect GDB to the target machine using the target command and
464 the serial device:<programlisting>(gdb) set remotebaud 115200
465(gdb) target remote /dev/ttyS0</programlisting></para>
466 </listitem>
467 </itemizedlist>
468
469 <para>The kernel can now be debugged in a similar manner as an
470 application program.</para>
471 </section>
472 </section>
473</chapter> \ No newline at end of file