summaryrefslogtreecommitdiffstats
path: root/doc/guides/howto
diff options
context:
space:
mode:
authorChristian Ehrhardt <christian.ehrhardt@canonical.com>2017-05-16 14:51:32 +0200
committerChristian Ehrhardt <christian.ehrhardt@canonical.com>2017-05-16 16:20:45 +0200
commit7595afa4d30097c1177b69257118d8ad89a539be (patch)
tree4bfeadc905c977e45e54a90c42330553b8942e4e /doc/guides/howto
parentce3d555e43e3795b5d9507fcfc76b7a0a92fd0d6 (diff)
Imported Upstream version 17.05
Change-Id: Id1e419c5a214e4a18739663b91f0f9a549f1fdc6 Signed-off-by: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Diffstat (limited to 'doc/guides/howto')
-rw-r--r--doc/guides/howto/flow_bifurcation.rst4
-rw-r--r--doc/guides/howto/img/pvp_2nics.svg556
-rw-r--r--doc/guides/howto/img/use_models_for_running_dpdk_in_containers.svg398
-rw-r--r--doc/guides/howto/img/vf_daemon_overview.svg440
-rw-r--r--doc/guides/howto/img/virtio_user_as_exceptional_path.svg207
-rw-r--r--doc/guides/howto/img/virtio_user_for_container_networking.svg685
-rw-r--r--doc/guides/howto/index.rst4
-rw-r--r--doc/guides/howto/lm_bond_virtio_sriov.rst10
-rw-r--r--doc/guides/howto/lm_virtio_vhost_user.rst18
-rw-r--r--doc/guides/howto/pvp_reference_benchmark.rst398
-rw-r--r--doc/guides/howto/vfd.rst407
-rw-r--r--doc/guides/howto/virtio_user_as_exceptional_path.rst142
-rw-r--r--doc/guides/howto/virtio_user_for_container_networking.rst144
13 files changed, 3397 insertions, 16 deletions
diff --git a/doc/guides/howto/flow_bifurcation.rst b/doc/guides/howto/flow_bifurcation.rst
index 0d7226ae..61016a4f 100644
--- a/doc/guides/howto/flow_bifurcation.rst
+++ b/doc/guides/howto/flow_bifurcation.rst
@@ -126,7 +126,7 @@ The typical procedure to achieve this is as follows:
.. code-block:: console
- testpmd -c 0xff -n 4 -- -i -w 01:10.0 -w 01:10.1 --forward-mode=mac
+ testpmd -l 0-7 -n 4 -- -i -w 01:10.0 -w 01:10.1 --forward-mode=mac
In this example, traffic matching the rules will go through the VF by matching
the filter rule. All other traffic, not matching the rules, will go through
@@ -286,7 +286,7 @@ The typical procedure to achieve this is as follows:
.. code-block:: console
- testpmd -c 0xff -n 4 -- -i -w 01:10.0 -w 01:10.1 --forward-mode=mac
+ testpmd -l 0-7 -n 4 -- -i -w 01:10.0 -w 01:10.1 --forward-mode=mac
.. note::
diff --git a/doc/guides/howto/img/pvp_2nics.svg b/doc/guides/howto/img/pvp_2nics.svg
new file mode 100644
index 00000000..517a8008
--- /dev/null
+++ b/doc/guides/howto/img/pvp_2nics.svg
@@ -0,0 +1,556 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="127.46428mm"
+ height="139.41411mm"
+ viewBox="0 0 451.64508 493.987"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.92pre2 r"
+ sodipodi:docname="pvp_2nics.svg"
+ inkscape:export-filename="/home/max/Pictures/dpdk/pvp/pvp.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker4760"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4762"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1.00000003pt;stroke-opacity:1"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker4642"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4644"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1.00000003pt;stroke-opacity:1"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker10370"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path10372"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1.00000003pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker10306"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Lend">
+ <path
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1.00000003pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path10308"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker9757"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Lend"
+ inkscape:collect="always">
+ <path
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1.00000003pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path9759"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4224"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4227"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-1"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4227-27"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lstart-9"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4224-3"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,10,0)" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker9757-0"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Lend">
+ <path
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1.00000003pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path9759-6"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lstart-6"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4224-0"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-62"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4227-6"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker10370-7"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path10372-9"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1.00000003pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,10,0)" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker9757-2"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Lend">
+ <path
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1.00000003pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path9759-0"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lstart-9-2"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4224-3-3"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-1-7"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4227-27-5"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.49497475"
+ inkscape:cx="206.7485"
+ inkscape:cy="227.93958"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:object-nodes="true"
+ inkscape:window-width="1916"
+ inkscape:window-height="1040"
+ inkscape:window-x="0"
+ inkscape:window-y="38"
+ inkscape:window-maximized="0"
+ inkscape:snap-grids="true"
+ inkscape:snap-to-guides="true"
+ inkscape:snap-others="false"
+ inkscape:snap-nodes="false"
+ inkscape:snap-global="false" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-5.3301459,-7.348317)">
+ <rect
+ style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.78969002;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4140"
+ width="434.38919"
+ height="75.295639"
+ x="21.691195"
+ y="404.59354" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="421.47873"
+ y="501.3353"
+ id="text4142"><tspan
+ sodipodi:role="line"
+ id="tspan4144"
+ x="421.47873"
+ y="501.3353"
+ style="font-size:25px;line-height:125%">TE</tspan></text>
+ <rect
+ style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.46599996;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4146"
+ width="92.934036"
+ height="32.324883"
+ x="182.57764"
+ y="372.03574" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="183.5878"
+ y="397.28958"
+ id="text4148"><tspan
+ sodipodi:role="line"
+ id="tspan4150"
+ x="183.5878"
+ y="397.28958"
+ style="font-size:25px">10G NIC</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="166.92024"
+ y="451.33276"
+ id="text4152"><tspan
+ sodipodi:role="line"
+ id="tspan4154"
+ x="166.92024"
+ y="451.33276">Moongen</tspan></text>
+ <rect
+ style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.39882457;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4156"
+ width="449.73071"
+ height="244.32167"
+ x="6.0295582"
+ y="29.046324" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="405.31628"
+ y="25.048317"
+ id="text4158"><tspan
+ sodipodi:role="line"
+ id="tspan4160"
+ x="405.31628"
+ y="25.048317"
+ style="font-size:25px">DUT</tspan></text>
+ <rect
+ style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.14168489;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4162"
+ width="418.69415"
+ height="107.50462"
+ x="19.038134"
+ y="41.044758" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="395.38812"
+ y="66.496857"
+ id="text4164"><tspan
+ sodipodi:role="line"
+ id="tspan4166"
+ x="395.38812"
+ y="66.496857"
+ style="font-size:25px">VM</tspan></text>
+ <rect
+ style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.46599996;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4146-3"
+ width="92.934036"
+ height="32.324883"
+ x="183.0827"
+ y="274.05093" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="184.09286"
+ y="299.30475"
+ id="text4148-6"><tspan
+ sodipodi:role="line"
+ id="tspan4150-7"
+ x="184.09286"
+ y="299.30475"
+ style="font-size:25px">10G NIC</tspan></text>
+ <rect
+ style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:2.4804399;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4189"
+ width="398.00476"
+ height="65.451302"
+ x="26.901583"
+ y="82.647781" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="30.683046"
+ y="108.31288"
+ id="text4191"><tspan
+ sodipodi:role="line"
+ id="tspan4193"
+ x="30.683046"
+ y="108.31288">TestPMD</tspan><tspan
+ sodipodi:role="line"
+ x="30.683046"
+ y="139.56288"
+ id="tspan10476">(macswap)</tspan></text>
+ <rect
+ style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:2.49124122;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4189-5"
+ width="397.22263"
+ height="66.152573"
+ x="29.743357"
+ y="207.6543" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="42.720772"
+ y="231.14902"
+ id="text4191-3"><tspan
+ sodipodi:role="line"
+ id="tspan4193-5"
+ x="42.720772"
+ y="231.14902">TestPMD </tspan><tspan
+ sodipodi:role="line"
+ x="42.720772"
+ y="262.39902"
+ id="tspan9747">(io)</tspan></text>
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.97838062px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+ d="M 202.56669,371.44487 V 308.37034"
+ id="path4218"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.97297633px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Lstart)"
+ d="M 252.03098,369.63533 V 307.25568"
+ id="path4218-9"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.92982113px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-1)"
+ d="M 198.63811,207.44389 V 150.47507"
+ id="path4218-0"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.95360273px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Lstart-9)"
+ d="M 255.56859,206.9303 V 147.01008"
+ id="path4218-9-6"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 1;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker9757)"
+ d="M 199.50513,271.00921 V 207.3696"
+ id="path9749"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 1;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#marker10370)"
+ d="M 255.56859,270.56991 V 206.9303"
+ id="path9749-2"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.46599996;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4146-36"
+ width="92.934036"
+ height="32.324883"
+ x="304.05591"
+ y="372.52954" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="305.06607"
+ y="397.78339"
+ id="text4148-7"><tspan
+ sodipodi:role="line"
+ id="tspan4150-5"
+ x="305.06607"
+ y="397.78339"
+ style="font-size:25px">10G NIC</tspan></text>
+ <rect
+ style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.46599996;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4146-3-3"
+ width="92.934036"
+ height="32.324883"
+ x="306.07623"
+ y="273.53461" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="307.0864"
+ y="298.78842"
+ id="text4148-6-5"><tspan
+ sodipodi:role="line"
+ id="tspan4150-7-6"
+ x="307.0864"
+ y="298.78842"
+ style="font-size:25px">10G NIC</tspan></text>
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.97838062px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-62)"
+ d="M 323.7504,370.24835 V 307.17382"
+ id="path4218-1"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.97297633px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Lstart-6)"
+ d="M 373.21469,368.43881 V 306.05916"
+ id="path4218-9-8"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.92982113px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-1-7)"
+ d="M 324.93036,207.24894 V 150.28012"
+ id="path4218-0-9"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.95360273px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Lstart-9-2)"
+ d="M 381.86084,206.73535 V 146.81513"
+ id="path4218-9-6-2"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 1;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker9757-2)"
+ d="M 325.79738,270.81426 V 207.17465"
+ id="path9749-28"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 1;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#marker10370-7)"
+ d="M 381.86084,270.37496 V 206.73535"
+ id="path9749-2-9"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2, 1;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker4642)"
+ d="M 198.57143,148.79077 V 95.93363 h 182.85714 v 50"
+ id="path3748"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:1.01005316;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.02010632, 1.01005316;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker4760)"
+ d="m 325.70774,148.78714 v -32.84999 h -70.7012 v 30.70761"
+ id="path4634"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/doc/guides/howto/img/use_models_for_running_dpdk_in_containers.svg b/doc/guides/howto/img/use_models_for_running_dpdk_in_containers.svg
new file mode 100644
index 00000000..662c2266
--- /dev/null
+++ b/doc/guides/howto/img/use_models_for_running_dpdk_in_containers.svg
@@ -0,0 +1,398 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by Microsoft Visio, SVG Export user_models_for_running_dpdk_in_containers.svg Page-1 -->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events"
+ xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="10.6194in" height="4.55593in"
+ viewBox="0 0 764.596 328.027" xml:space="preserve" color-interpolation-filters="sRGB" class="st19">
+ <v:documentProperties v:langID="1033" v:viewMarkup="false"/>
+
+ <style type="text/css">
+ <![CDATA[
+ .st1 {visibility:visible}
+ .st2 {fill:#5b9bd5;fill-opacity:0.22;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22}
+ .st3 {fill:#ffffff;stroke:#c7c8c8;stroke-width:0.25}
+ .st4 {fill:#000000;font-family:Calibri;font-size:0.833336em}
+ .st5 {fill:none;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22}
+ .st6 {fill:none;stroke:#c7c8c8;stroke-width:0.25}
+ .st7 {fill:#d8d8d8;stroke:#c7c8c8;stroke-width:0.25}
+ .st8 {fill:none;stroke:none;stroke-width:0.25}
+ .st9 {fill:#000000;font-family:Calibri;font-size:1.00001em;font-style:italic}
+ .st10 {fill:#ed7d31;stroke:#c7c8c8;stroke-width:0.25}
+ .st11 {fill:#feffff;font-family:Calibri;font-size:0.833336em}
+ .st12 {fill:#a5a5a5;stroke:#c7c8c8;stroke-width:0.25}
+ .st13 {marker-end:url(#mrkr4-61);marker-start:url(#mrkr4-59);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1}
+ .st14 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.28409090909091}
+ .st15 {font-size:1em}
+ .st16 {fill:none;filter:url(#filter_2);stroke:#5b9bd5;stroke-dasharray:7,5;stroke-opacity:0.22}
+ .st17 {fill:none;stroke:#ff0000;stroke-dasharray:7,5;stroke-width:1}
+ .st18 {stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1}
+ .st19 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3}
+ ]]>
+ </style>
+
+ <defs id="Markers">
+ <g id="lend4">
+ <path d="M 2 1 L 0 0 L 2 -1 L 2 1 " style="stroke:none"/>
+ </g>
+ <marker id="mrkr4-59" class="st14" v:arrowType="4" v:arrowSize="2" v:setback="6.68" refX="6.68" orient="auto"
+ markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend4" transform="scale(3.52) "/>
+ </marker>
+ <marker id="mrkr4-61" class="st14" v:arrowType="4" v:arrowSize="2" v:setback="7.04" refX="-7.04" orient="auto"
+ markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend4" transform="scale(-3.52,-3.52) "/>
+ </marker>
+ </defs>
+ <defs id="Filters">
+ <filter id="filter_2">
+ <feGaussianBlur stdDeviation="2"/>
+ </filter>
+ </defs>
+ <g v:mID="0" v:index="1" v:groupContext="foregroundPage">
+ <title>Page-1</title>
+ <v:pageProperties v:drawingScale="1" v:pageScale="1" v:drawingUnits="0" v:shadowOffsetX="9" v:shadowOffsetY="-9"/>
+ <v:layer v:name="Connector" v:index="0"/>
+ <g id="shape1-1" v:mID="1" v:groupContext="shape" transform="translate(146.2,-258.819)">
+ <title>Rectangle</title>
+ <desc>Container</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="34.05" cy="300.937" width="68.1" height="54.1807"/>
+ <g id="shadow1-2" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="273.847" width="68.1" height="54.1807" class="st2"/>
+ </g>
+ <rect x="0" y="273.847" width="68.1" height="54.1807" class="st3"/>
+ <text x="14.04" y="291.94" class="st4" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>Container<v:newlineChar/><v:newlineChar/></text> </g>
+ <g id="shape3-7" v:mID="3" v:groupContext="shape" transform="translate(18.25,-169.971)">
+ <title>Rectangle.3</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <g id="shadow3-8" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="270.699" width="306" height="57.3286" rx="13.5" ry="13.5" class="st5"/>
+ </g>
+ <rect x="0" y="270.699" width="306" height="57.3286" rx="13.5" ry="13.5" class="st6"/>
+ </g>
+ <g id="shape4-12" v:mID="4" v:groupContext="shape" transform="translate(18.25,-61)">
+ <title>Rectangle.4</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <g id="shadow4-13" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="256.027" width="306" height="72" rx="13.5" ry="13.5" class="st2"/>
+ </g>
+ <rect x="0" y="256.027" width="306" height="72" rx="13.5" ry="13.5" class="st7"/>
+ </g>
+ <g id="shape5-17" v:mID="5" v:groupContext="shape" transform="translate(17.65,-202.75)">
+ <title>Sheet.5</title>
+ <desc>Host kernel</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="34.05" cy="316.777" width="68.1" height="22.5"/>
+ <rect x="0" y="305.527" width="68.1" height="22.5" class="st8"/>
+ <text x="6.55" y="320.38" class="st9" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>Host kernel</text> </g>
+ <g id="shape6-20" v:mID="6" v:groupContext="shape" transform="translate(0.25,-110.5)">
+ <title>Sheet.6</title>
+ <desc>NIC</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="34.05" cy="316.777" width="68.1" height="22.5"/>
+ <rect x="0" y="305.527" width="68.1" height="22.5" class="st8"/>
+ <text x="25.54" y="320.38" class="st9" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>NIC</text> </g>
+ <g id="shape7-23" v:mID="7" v:groupContext="shape" transform="translate(67.75,-99.3)">
+ <title>Rectangle.7</title>
+ <desc>PF</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="14.625" cy="316.777" width="29.26" height="22.5"/>
+ <g id="shadow7-24" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="305.527" width="29.25" height="22.5" class="st2"/>
+ </g>
+ <rect x="0" y="305.527" width="29.25" height="22.5" class="st10"/>
+ <text x="9.74" y="319.78" class="st11" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>PF</text> </g>
+ <g id="shape8-29" v:mID="8" v:groupContext="shape" transform="translate(165.625,-99.3)">
+ <title>Rectangle.8</title>
+ <desc>VF</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="14.625" cy="316.777" width="29.26" height="22.5"/>
+ <g id="shadow8-30" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="305.527" width="29.25" height="22.5" class="st2"/>
+ </g>
+ <rect x="0" y="305.527" width="29.25" height="22.5" class="st10"/>
+ <text x="9.49" y="319.78" class="st11" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>VF</text> </g>
+ <g id="shape10-35" v:mID="10" v:groupContext="shape" transform="translate(67.75,-70)">
+ <title>Rectangle.10</title>
+ <desc>Hardware virtual switch</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="112.5" cy="316.777" width="225" height="22.5"/>
+ <g id="shadow10-36" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="305.527" width="225" height="22.5" class="st2"/>
+ </g>
+ <rect x="0" y="305.527" width="225" height="22.5" class="st12"/>
+ <text x="64.07" y="319.78" class="st11" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>Hardware virtual switch</text> </g>
+ <g id="shape14-41" v:mID="14" v:groupContext="shape" transform="translate(238.15,-258.7)">
+ <title>Rectangle.14</title>
+ <desc>Container</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="34.05" cy="300.937" width="68.1" height="54.1807"/>
+ <g id="shadow14-42" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="273.847" width="68.1" height="54.1807" class="st2"/>
+ </g>
+ <rect x="0" y="273.847" width="68.1" height="54.1807" class="st3"/>
+ <text x="14.04" y="291.94" class="st4" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>Container<v:newlineChar/><v:newlineChar/></text> </g>
+ <g id="shape15-47" v:mID="15" v:groupContext="shape" transform="translate(257.575,-99.2)">
+ <title>Rectangle.15</title>
+ <desc>VF</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="14.625" cy="316.777" width="29.26" height="22.5"/>
+ <g id="shadow15-48" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="305.527" width="29.25" height="22.5" class="st2"/>
+ </g>
+ <rect x="0" y="305.527" width="29.25" height="22.5" class="st10"/>
+ <text x="9.49" y="319.78" class="st11" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>VF</text> </g>
+ <g id="shape16-53" v:mID="16" v:groupContext="shape" v:layerMember="0" transform="translate(263.2,-258.7)">
+ <title>Dynamic connector.16</title>
+ <path d="M9 334.71 L9 335.07 L9 457.99" class="st13"/>
+ </g>
+ <g id="shape18-62" v:mID="18" v:groupContext="shape" transform="translate(54.25,-180.25)">
+ <title>Ellipse</title>
+ <desc>PF driver</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="28.125" cy="316.777" width="49.22" height="19.6875"/>
+ <g id="shadow18-63" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <path d="M0 316.78 A28.125 11.25 0 0 1 56.25 316.78 A28.125 11.25 0 1 1 0 316.78 Z" class="st2"/>
+ </g>
+ <path d="M0 316.78 A28.125 11.25 0 0 1 56.25 316.78 A28.125 11.25 0 1 1 0 316.78 Z" class="st10"/>
+ <text x="10.11" y="319.78" class="st11" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>PF driver</text> </g>
+ <g id="shape19-68" v:mID="19" v:groupContext="shape" v:layerMember="0" transform="translate(73.375,-180.25)">
+ <title>Dynamic connector.19</title>
+ <path d="M9 334.71 L9 335.07 L9 379.44" class="st13"/>
+ </g>
+ <g id="shape20-75" v:mID="20" v:groupContext="shape" transform="translate(152.125,-263.44)">
+ <title>Ellipse.20</title>
+ <desc>DPDK</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="28.125" cy="316.777" width="49.22" height="19.6875"/>
+ <g id="shadow20-76" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <path d="M0 316.78 A28.125 11.25 0 0 1 56.25 316.78 A28.125 11.25 0 1 1 0 316.78 Z" class="st2"/>
+ </g>
+ <path d="M0 316.78 A28.125 11.25 0 0 1 56.25 316.78 A28.125 11.25 0 1 1 0 316.78 Z" class="st10"/>
+ <text x="16.79" y="319.78" class="st11" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>DPDK</text> </g>
+ <g id="shape21-81" v:mID="21" v:groupContext="shape" v:layerMember="0" transform="translate(171.25,-258.819)">
+ <title>Dynamic connector.21</title>
+ <path d="M9 334.71 L9 335.07 L9 458.01" class="st13"/>
+ </g>
+ <g id="shape22-88" v:mID="22" v:groupContext="shape" transform="translate(243.25,-263.44)">
+ <title>Ellipse.22</title>
+ <desc>DPDK</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="28.125" cy="316.777" width="49.22" height="19.6875"/>
+ <g id="shadow22-89" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <path d="M0 316.78 A28.125 11.25 0 0 1 56.25 316.78 A28.125 11.25 0 1 1 0 316.78 Z" class="st2"/>
+ </g>
+ <path d="M0 316.78 A28.125 11.25 0 0 1 56.25 316.78 A28.125 11.25 0 1 1 0 316.78 Z" class="st10"/>
+ <text x="16.79" y="319.78" class="st11" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>DPDK</text> </g>
+ <g id="shape23-94" v:mID="23" v:groupContext="shape" transform="translate(395.65,-254.5)">
+ <title>Rectangle.23</title>
+ <desc>Virtual Appliance</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="34.05" cy="300.937" width="68.1" height="54.1807"/>
+ <g id="shadow23-95" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="273.847" width="68.1" height="54.1807" class="st2"/>
+ </g>
+ <rect x="0" y="273.847" width="68.1" height="54.1807" class="st3"/>
+ <text x="20.48" y="297.94" class="st4" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>Virtual <tspan
+ x="13.98" dy="1.2em" class="st15">Appliance</tspan></text> </g>
+ <g id="shape25-101" v:mID="25" v:groupContext="shape" transform="translate(476.65,-254.681)">
+ <title>Rectangle.25</title>
+ <desc>VM + Container</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="34.05" cy="300.937" width="68.1" height="54.1807"/>
+ <g id="shadow25-102" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="273.847" width="68.1" height="54.1807" class="st2"/>
+ </g>
+ <rect x="0" y="273.847" width="68.1" height="54.1807" class="st3"/>
+ <text x="23.32" y="297.94" class="st4" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>VM + <tspan x="14.04"
+ dy="1.2em" class="st15">Container</tspan></text> </g>
+ <g id="shape27-108" v:mID="27" v:groupContext="shape" transform="translate(566.65,-254.681)">
+ <title>Rectangle.27</title>
+ <desc>Container</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="34.05" cy="300.937" width="68.1" height="54.1807"/>
+ <g id="shadow27-109" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="273.847" width="68.1" height="54.1807" class="st2"/>
+ </g>
+ <rect x="0" y="273.847" width="68.1" height="54.1807" class="st3"/>
+ <text x="14.04" y="291.94" class="st4" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>Container<v:newlineChar/><v:newlineChar/></text> </g>
+ <g id="shape28-114" v:mID="28" v:groupContext="shape" transform="translate(570.625,-261.431)">
+ <title>Ellipse.28</title>
+ <desc>DPDK</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="28.125" cy="316.777" width="49.22" height="19.6875"/>
+ <g id="shadow28-115" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <path d="M0 316.78 A28.125 11.25 0 0 1 56.25 316.78 A28.125 11.25 0 1 1 0 316.78 Z" class="st2"/>
+ </g>
+ <path d="M0 316.78 A28.125 11.25 0 0 1 56.25 316.78 A28.125 11.25 0 1 1 0 316.78 Z" class="st10"/>
+ <text x="16.79" y="319.78" class="st11" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>DPDK</text> </g>
+ <g id="shape29-120" v:mID="29" v:groupContext="shape" transform="translate(405.25,-110.5)">
+ <title>Rectangle.29</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <g id="shadow29-121" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="270.699" width="346.5" height="57.3286" rx="13.5" ry="13.5" class="st5"/>
+ </g>
+ <rect x="0" y="270.699" width="346.5" height="57.3286" rx="13.5" ry="13.5" class="st6"/>
+ </g>
+ <g id="shape30-125" v:mID="30" v:groupContext="shape" transform="translate(405.25,-142)">
+ <title>Sheet.30</title>
+ <desc>Host kernel</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="34.05" cy="316.777" width="68.1" height="22.5"/>
+ <rect x="0" y="305.527" width="68.1" height="22.5" class="st8"/>
+ <text x="6.55" y="320.38" class="st9" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>Host kernel</text> </g>
+ <g id="shape31-128" v:mID="31" v:groupContext="shape" transform="translate(681.417,-205)">
+ <title>Rectangle.31</title>
+ <desc>vSwitch or vRouter</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="34.05" cy="276.277" width="68.1" height="103.5"/>
+ <g id="shadow31-129" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="224.527" width="68.1" height="103.5" class="st2"/>
+ </g>
+ <rect x="0" y="224.527" width="68.1" height="103.5" class="st3"/>
+ <text x="18.36" y="255.28" class="st4" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>vSwitch<v:newlineChar/><tspan
+ x="29.67" dy="1.2em" class="st15">or<v:newlineChar/></tspan><tspan x="17.91" dy="1.2em" class="st15">vRouter</tspan><v:newlineChar/><v:newlineChar/></text> </g>
+ <g id="shape32-136" v:mID="32" v:groupContext="shape" transform="translate(687.342,-214)">
+ <title>Ellipse.32</title>
+ <desc>DPDK</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="28.125" cy="316.777" width="49.22" height="19.6875"/>
+ <g id="shadow32-137" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <path d="M0 316.78 A28.125 11.25 0 0 1 56.25 316.78 A28.125 11.25 0 1 1 0 316.78 Z" class="st2"/>
+ </g>
+ <path d="M0 316.78 A28.125 11.25 0 0 1 56.25 316.78 A28.125 11.25 0 1 1 0 316.78 Z" class="st10"/>
+ <text x="16.79" y="319.78" class="st11" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>DPDK</text> </g>
+ <g id="shape34-142" v:mID="34" v:groupContext="shape" v:layerMember="0" transform="translate(429.7,-254.5)">
+ <title>Dynamic connector</title>
+ <path d="M0 334.71 L0 335.07 L0 364.03 L244.68 364.03" class="st13"/>
+ </g>
+ <g id="shape35-149" v:mID="35" v:groupContext="shape" v:layerMember="0" transform="translate(510.7,-254.681)">
+ <title>Dynamic connector.35</title>
+ <path d="M0 334.71 L0 335.07 L0 355.21 L163.68 355.21" class="st13"/>
+ </g>
+ <g id="shape36-156" v:mID="36" v:groupContext="shape" v:layerMember="0" transform="translate(600.7,-254.681)">
+ <title>Dynamic connector.36</title>
+ <path d="M0 334.71 L0 335.07 L0 346.21 L73.68 346.21" class="st13"/>
+ </g>
+ <g id="shape37-163" v:mID="37" v:groupContext="shape" transform="translate(557.933,-182.5)">
+ <title>Rectangle.37</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <g id="shadow37-164" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <path d="M0 328.03 L202.82 328.03 L202.82 184.03 L0 184.03 L0 328.03 Z" class="st16"/>
+ </g>
+ <path d="M0 328.03 L202.82 328.03 L202.82 184.03 L0 184.03 L0 328.03 Z" class="st17"/>
+ </g>
+ <g id="shape38-168" v:mID="38" v:groupContext="shape" transform="translate(676.9,-72.25)">
+ <title>Rectangle.38</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <g id="shadow38-169" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="305.527" width="74.85" height="22.5" rx="11.25" ry="11.25" class="st2"/>
+ </g>
+ <rect x="0" y="305.527" width="74.85" height="22.5" rx="11.25" ry="11.25" class="st7"/>
+ </g>
+ <g id="shape39-173" v:mID="39" v:groupContext="shape" transform="translate(686.2,-72.25)">
+ <title>Sheet.39</title>
+ <desc>NIC</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="28.125" cy="316.777" width="56.25" height="22.5"/>
+ <rect x="0" y="305.527" width="56.25" height="22.5" class="st8"/>
+ <text x="19.61" y="320.38" class="st9" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>NIC</text> </g>
+ <g id="shape41-176" v:mID="41" v:groupContext="shape" v:layerMember="0" transform="translate(723.896,-205)">
+ <title>Dynamic connector.41</title>
+ <path d="M-8.5 334.71 L-8.5 335.07 L-9.5 431.24" class="st13"/>
+ </g>
+ <g id="shape42-183" v:mID="42" v:groupContext="shape" v:layerMember="0" transform="translate(382.75,-317.5)">
+ <title>Dynamic connector.42</title>
+ <path d="M-9 328.03 L-9 589.03" class="st18"/>
+ </g>
+ <g id="shape43-186" v:mID="43" v:groupContext="shape" transform="translate(161.65,-0.25)">
+ <title>Sheet.43</title>
+ <desc>(1) Slicing</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="34.05" cy="316.777" width="68.1" height="22.5"/>
+ <rect x="0" y="305.527" width="68.1" height="22.5" class="st8"/>
+ <text x="10.5" y="320.38" class="st9" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>(1) Slicing</text> </g>
+ <g id="shape44-189" v:mID="44" v:groupContext="shape" transform="translate(553.75,-0.25)">
+ <title>Sheet.44</title>
+ <desc>(2) Aggregation</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="44.025" cy="316.777" width="88.05" height="22.5"/>
+ <rect x="0" y="305.527" width="88.05" height="22.5" class="st8"/>
+ <text x="5.7" y="320.38" class="st9" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>(2) Aggregation</text> </g>
+ </g>
+</svg>
diff --git a/doc/guides/howto/img/vf_daemon_overview.svg b/doc/guides/howto/img/vf_daemon_overview.svg
new file mode 100644
index 00000000..d4a47234
--- /dev/null
+++ b/doc/guides/howto/img/vf_daemon_overview.svg
@@ -0,0 +1,440 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+# BSD LICENSE
+#
+# Copyright(c) 2017 Intel Corporation. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# - Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# - Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+#
+# - Neither the name of Intel Corporation nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<!-- Generated by Microsoft Visio, SVG Export vf_daemon_overview.svg Page-1 -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="653.98083"
+ height="346.37814"
+ viewBox="0 0 523.18544 277.10257"
+ xml:space="preserve"
+ class="st16"
+ id="svg3406"
+ version="1.1"
+ inkscape:version="0.92.1 r15371"
+ sodipodi:docname="vf_daemon_overview.svg"
+ style="font-size:12px;overflow:visible;color-interpolation-filters:sRGB;fill:none;fill-rule:evenodd;stroke-linecap:square;stroke-miterlimit:3"><metadata
+ id="metadata3652"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1920"
+ inkscape:window-height="1003"
+ id="namedview3650"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:zoom="1.683916"
+ inkscape:cx="370.95135"
+ inkscape:cy="160.84375"
+ inkscape:window-x="-9"
+ inkscape:window-y="-9"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg3406" /><style
+ type="text/css"
+ id="style3408">
+ .st1 {visibility:visible}
+ .st2 {fill:#5b9bd5;fill-opacity:0.25;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.25}
+ .st3 {fill:#4f87bb;stroke:#40709c;stroke-width:0.75}
+ .st4 {fill:#feffff;font-family:Calibri;font-size:0.833336em}
+ .st5 {fill:url(#grad0-11);stroke:#4f87bb;stroke-width:0.75}
+ .st6 {fill:#4f87bb;font-family:Calibri;font-size:0.833336em}
+ .st7 {fill:#759fcc;fill-opacity:0.25;filter:url(#filter_2);stroke:#759fcc;stroke-opacity:0.25}
+ .st8 {fill:#668bb3;stroke:#547395;stroke-width:0.75}
+ .st9 {fill:#5b9bd5;fill-opacity:0.22;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22}
+ .st10 {fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25}
+ .st11 {fill:#759fcc;fill-opacity:0.22;filter:url(#filter_2);stroke:#759fcc;stroke-opacity:0.22}
+ .st12 {fill:#759fcc;stroke:#c7c8c8;stroke-width:0.25}
+ .st13 {fill:url(#grad0-40);stroke:#a6b6cd;stroke-width:0.75}
+ .st14 {fill:#70ad47;fill-opacity:0.25;filter:url(#filter_2);stroke:#70ad47;stroke-opacity:0.25}
+ .st15 {fill:#61973d;stroke:#507e31;stroke-width:0.75}
+ .st16 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3}
+ </style><defs
+ id="Patterns_And_Gradients"><linearGradient
+ id="grad0-11"
+ x1="-0.24584444"
+ y1="740.83429"
+ x2="167.49742"
+ y2="740.83429"
+ gradientTransform="scale(1.5253548,0.65558519)"
+ gradientUnits="userSpaceOnUse"><stop
+ offset="0"
+ stop-color="#e9eff7"
+ stop-opacity="1"
+ id="stop3412" /><stop
+ offset="0.24"
+ stop-color="#f4f7fb"
+ stop-opacity="1"
+ id="stop3414" /><stop
+ offset="0.54"
+ stop-color="#feffff"
+ stop-opacity="1"
+ id="stop3416" /></linearGradient><linearGradient
+ id="grad0-40"
+ x1="0"
+ y1="0"
+ x2="1"
+ y2="0"
+ gradientTransform="rotate(60,0.5,0.5)"><stop
+ offset="0"
+ stop-color="#f3f6fa"
+ stop-opacity="1"
+ id="stop3419" /><stop
+ offset="0.24"
+ stop-color="#f9fafc"
+ stop-opacity="1"
+ id="stop3421" /><stop
+ offset="0.54"
+ stop-color="#feffff"
+ stop-opacity="1"
+ id="stop3423" /></linearGradient><linearGradient
+ id="grad0-40-2"
+ x1="0"
+ y1="0"
+ x2="1"
+ y2="0"
+ gradientTransform="rotate(60,0.5,0.5)"><stop
+ offset="0"
+ stop-color="#f3f6fa"
+ stop-opacity="1"
+ id="stop3419-2" /><stop
+ offset="0.24"
+ stop-color="#f9fafc"
+ stop-opacity="1"
+ id="stop3421-8" /><stop
+ offset="0.54"
+ stop-color="#feffff"
+ stop-opacity="1"
+ id="stop3423-0" /></linearGradient><filter
+ style="color-interpolation-filters:sRGB"
+ id="filter_2-6"><feGaussianBlur
+ stdDeviation="2"
+ id="feGaussianBlur3427-3" /></filter><filter
+ style="color-interpolation-filters:sRGB"
+ id="filter4802"><feGaussianBlur
+ stdDeviation="2"
+ id="feGaussianBlur4800" /></filter><filter
+ style="color-interpolation-filters:sRGB"
+ id="filter4810"><feGaussianBlur
+ stdDeviation="2"
+ id="feGaussianBlur4808" /></filter><filter
+ style="color-interpolation-filters:sRGB"
+ id="filter_2-1"><feGaussianBlur
+ stdDeviation="2"
+ id="feGaussianBlur3427-8" /></filter><linearGradient
+ inkscape:collect="always"
+ xlink:href="#grad0-11"
+ id="linearGradient5846"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2751142,0,0,0.85239422,296.69995,-509.84788)"
+ x1="-0.24584444"
+ y1="740.83429"
+ x2="167.49742"
+ y2="740.83429" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#grad0-40"
+ id="linearGradient5848"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="scale(2.9084098,0.3438305)"
+ x1="-0.12893644"
+ y1="1717.1688"
+ x2="28.140806"
+ y2="1717.1688" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#grad0-40"
+ id="linearGradient5917"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="scale(2.9084098,0.3438305)"
+ x1="-0.12893644"
+ y1="1717.1688"
+ x2="28.140806"
+ y2="1717.1688" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#grad0-11"
+ id="linearGradient6028"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2751142,0,0,0.85239422,14.0251,-510.3054)"
+ x1="-0.24584444"
+ y1="740.83429"
+ x2="167.49742"
+ y2="740.83429" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#grad0-40"
+ id="linearGradient6030"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="scale(2.9084098,0.3438305)"
+ x1="-0.12893644"
+ y1="1717.1688"
+ x2="28.140806"
+ y2="1717.1688" /></defs><defs
+ id="Filters"><filter
+ id="filter_2"
+ style="color-interpolation-filters:sRGB"><feGaussianBlur
+ stdDeviation="2"
+ id="feGaussianBlur3427" /></filter></defs><flowRoot
+ xml:space="preserve"
+ id="flowRoot5059"
+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(83.77187,-3.3273299)"><flowRegion
+ id="flowRegion5061"><rect
+ id="rect5063"
+ width="319.13776"
+ height="378.76611"
+ x="246.91183"
+ y="-24.140537" /></flowRegion><flowPara
+ id="flowPara5065" /></flowRoot><rect
+ x="310.9368"
+ y="41.112034"
+ width="185.48367"
+ height="52.464527"
+ class="st3"
+ id="rect3441-6"
+ style="font-size:medium;color-interpolation-filters:sRGB;fill:#4f87bb;fill-rule:evenodd;stroke:#40709c;stroke-width:0.59376031;stroke-linecap:square;stroke-miterlimit:3" /><rect
+ style="font-size:medium;color-interpolation-filters:sRGB;fill:url(#linearGradient5846);fill-rule:evenodd;stroke:#4f87bb;stroke-width:0.78190857;stroke-linecap:square;stroke-miterlimit:3"
+ id="rect3453-5"
+ class="st5"
+ height="142.00824"
+ width="213.26486"
+ y="122.12257"
+ x="296.69995" /><rect
+ style="font-size:medium;color-interpolation-filters:sRGB;fill:#668bb3;fill-rule:evenodd;stroke:#547395;stroke-width:0.81434548;stroke-linecap:square;stroke-miterlimit:3"
+ id="rect3465-8"
+ class="st8"
+ height="107.19906"
+ width="191.24162"
+ y="148.73914"
+ x="303.27353" /><rect
+ style="font-size:medium;color-interpolation-filters:sRGB;fill:#5b9bd5;fill-rule:evenodd;stroke:#c7c8c8;stroke-width:0.30626383;stroke-linecap:square;stroke-miterlimit:3"
+ id="rect3477-1"
+ class="st10"
+ height="37.991375"
+ width="99.433281"
+ y="201.63286"
+ x="345.86914" /><g
+ style="font-size:medium;color-interpolation-filters:sRGB;fill:none;fill-rule:evenodd;stroke-linecap:square;stroke-miterlimit:3"
+ transform="matrix(0.00129134,-1.4946882,0.98914737,0.00195132,-182.90697,199.1254)"
+ id="shape8-37-9"><title
+ id="title3506-4">Simple Double Arrow.14</title><path
+ style="fill:url(#linearGradient5848);stroke:#a6b6cd;stroke-width:0.75"
+ inkscape:connector-curvature="0"
+ id="path3508-6"
+ class="st13"
+ d="m 0,595.28 11.34,-4.49 v 2.24 h 58.8 v -2.24 l 11.33,4.49 -11.33,4.48 v -2.24 h -58.8 v 2.24 z" /></g><rect
+ style="font-size:medium;opacity:0.347;color-interpolation-filters:sRGB;fill:none;fill-opacity:0.91387556;fill-rule:evenodd;stroke:#0044ea;stroke-width:0.6845746;stroke-linecap:square;stroke-miterlimit:3;stroke-opacity:1"
+ id="rect4923-1"
+ width="228.54221"
+ height="267.54898"
+ x="288.59995"
+ y="5.0613203" /><text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:19.20002937px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;color-interpolation-filters:sRGB;fill:#0026e8;fill-opacity:0.83732054;fill-rule:evenodd;stroke:none;stroke-width:0.8000012;stroke-linecap:square;stroke-miterlimit:3"
+ x="478.50806"
+ y="25.851391"
+ id="text4927-7"><tspan
+ sodipodi:role="line"
+ id="tspan4925-3"
+ x="478.50806"
+ y="25.851391"
+ style="font-size:19.20002937px;fill:#0026e8;fill-opacity:0.83732054;stroke-width:0.8000012">VM</tspan></text>
+<text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:17.06669235px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;color-interpolation-filters:sRGB;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.8000012;stroke-linecap:square;stroke-miterlimit:3"
+ x="343.81976"
+ y="68.998184"
+ id="text5156-5"><tspan
+ sodipodi:role="line"
+ id="tspan5154-8"
+ x="343.81976"
+ y="68.998184"
+ style="font-size:17.06669235px;fill:#ffffff;stroke-width:0.8000012">VF Application</tspan></text>
+<text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:17.06669235px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;color-interpolation-filters:sRGB;fill:#008080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.8000012;stroke-linecap:square;stroke-miterlimit:3"
+ x="457.61066"
+ y="138.71524"
+ id="text5715-9"><tspan
+ sodipodi:role="line"
+ id="tspan5713-1"
+ x="457.61066"
+ y="138.71524"
+ style="font-size:17.06669235px;fill:#008080;stroke-width:0.8000012">DPDK</tspan></text>
+<text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:14.93335533px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;color-interpolation-filters:sRGB;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.8000012;stroke-linecap:square;stroke-miterlimit:3"
+ x="309.18256"
+ y="170.07077"
+ id="text5723-9"><tspan
+ sodipodi:role="line"
+ id="tspan5721-0"
+ x="309.18256"
+ y="170.07077"
+ style="font-size:14.93335533px;fill:#ffffff;stroke-width:0.8000012">Virtual ethdev</tspan></text>
+<text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80001926px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;color-interpolation-filters:sRGB;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.8000012;stroke-linecap:square;stroke-miterlimit:3"
+ x="367.12158"
+ y="223.89334"
+ id="text5735-1"><tspan
+ sodipodi:role="line"
+ id="tspan5733-1"
+ x="367.12158"
+ y="223.89334"
+ style="font-size:12.80001926px;fill:#ffffff;stroke-width:0.8000012">VF driver</tspan></text>
+<g
+ style="font-size:medium;overflow:visible;color-interpolation-filters:sRGB;fill:none;fill-rule:evenodd;stroke-linecap:square;stroke-miterlimit:3"
+ transform="matrix(-1.1390578,0.0062451,-0.01163082,-1.009126,315.58916,668.0438)"
+ id="shape8-37-9-3"><title
+ id="title3506-4-4">Simple Double Arrow.14</title><path
+ style="fill:url(#linearGradient5917);stroke:#a6b6cd;stroke-width:0.75"
+ inkscape:connector-curvature="0"
+ id="path3508-6-2"
+ class="st13"
+ d="m 0,595.28 11.34,-4.49 v 2.24 h 58.8 v -2.24 l 11.33,4.49 -11.33,4.48 v -2.24 h -58.8 v 2.24 z" /></g><rect
+ x="28.261948"
+ y="40.65451"
+ width="185.48367"
+ height="52.464527"
+ class="st3"
+ id="rect3441-6-5"
+ style="font-size:medium;color-interpolation-filters:sRGB;fill:#4f87bb;fill-rule:evenodd;stroke:#40709c;stroke-width:0.59376031;stroke-linecap:square;stroke-miterlimit:3" /><rect
+ style="font-size:medium;color-interpolation-filters:sRGB;fill:url(#linearGradient6028);fill-rule:evenodd;stroke:#4f87bb;stroke-width:0.78190857;stroke-linecap:square;stroke-miterlimit:3"
+ id="rect3453-5-5"
+ class="st5"
+ height="142.00824"
+ width="213.26486"
+ y="121.66504"
+ x="14.025101" /><rect
+ style="font-size:medium;color-interpolation-filters:sRGB;fill:#668bb3;fill-rule:evenodd;stroke:#547395;stroke-width:0.81434548;stroke-linecap:square;stroke-miterlimit:3"
+ id="rect3465-8-0"
+ class="st8"
+ height="107.19906"
+ width="191.24162"
+ y="148.28162"
+ x="20.598679" /><rect
+ style="font-size:medium;color-interpolation-filters:sRGB;fill:#5b9bd5;fill-rule:evenodd;stroke:#c7c8c8;stroke-width:0.30626383;stroke-linecap:square;stroke-miterlimit:3"
+ id="rect3477-1-1"
+ class="st10"
+ height="37.991375"
+ width="99.433281"
+ y="201.17534"
+ x="63.19429" /><g
+ style="font-size:medium;color-interpolation-filters:sRGB;fill:none;fill-rule:evenodd;stroke-linecap:square;stroke-miterlimit:3"
+ transform="matrix(0.00129134,-1.4946882,0.98914737,0.00195132,-465.58182,198.66788)"
+ id="shape8-37-9-33"><title
+ id="title3506-4-3">Simple Double Arrow.14</title><path
+ style="fill:url(#linearGradient6030);stroke:#a6b6cd;stroke-width:0.75"
+ inkscape:connector-curvature="0"
+ id="path3508-6-1"
+ class="st13"
+ d="m 0,595.28 11.34,-4.49 v 2.24 h 58.8 v -2.24 l 11.33,4.49 -11.33,4.48 v -2.24 h -58.8 v 2.24 z" /></g><rect
+ style="font-size:medium;opacity:0.347;color-interpolation-filters:sRGB;fill:none;fill-opacity:0.91387556;fill-rule:evenodd;stroke:#0044ea;stroke-width:0.6845746;stroke-linecap:square;stroke-miterlimit:3;stroke-opacity:1"
+ id="rect4923-1-0"
+ width="228.54222"
+ height="267.54898"
+ x="5.9250998"
+ y="4.6037965" /><text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:19.20002937px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;color-interpolation-filters:sRGB;fill:#0026e8;fill-opacity:0.83732054;fill-rule:evenodd;stroke:none;stroke-width:0.8000012;stroke-linecap:square;stroke-miterlimit:3"
+ x="184.63316"
+ y="25.393867"
+ id="text4927-7-3"><tspan
+ sodipodi:role="line"
+ id="tspan4925-3-7"
+ x="184.63316"
+ y="25.393867"
+ style="font-size:19.20002937px;fill:#0026e8;fill-opacity:0.83732054;stroke-width:0.8000012">Host</tspan></text>
+<text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:17.06669235px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;color-interpolation-filters:sRGB;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.8000012;stroke-linecap:square;stroke-miterlimit:3"
+ x="61.144913"
+ y="68.540657"
+ id="text5156-5-7"><tspan
+ sodipodi:role="line"
+ id="tspan5154-8-6"
+ x="61.144913"
+ y="68.540657"
+ style="font-size:17.06669235px;fill:#ffffff;stroke-width:0.8000012">PF Application</tspan></text>
+<text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:17.06669235px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;color-interpolation-filters:sRGB;fill:#008080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.8000012;stroke-linecap:square;stroke-miterlimit:3"
+ x="174.93581"
+ y="138.25772"
+ id="text5715-9-7"><tspan
+ sodipodi:role="line"
+ id="tspan5713-1-4"
+ x="174.93581"
+ y="138.25772"
+ style="font-size:17.06669235px;fill:#008080;stroke-width:0.8000012">DPDK</tspan></text>
+<text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:14.93335533px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;color-interpolation-filters:sRGB;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.8000012;stroke-linecap:square;stroke-miterlimit:3"
+ x="26.507706"
+ y="169.61325"
+ id="text5723-9-4"><tspan
+ sodipodi:role="line"
+ id="tspan5721-0-5"
+ x="26.507706"
+ y="169.61325"
+ style="font-size:14.93335533px;fill:#ffffff;stroke-width:0.8000012">Ethdev</tspan></text>
+<text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:12.80001926px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;color-interpolation-filters:sRGB;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.8000012;stroke-linecap:square;stroke-miterlimit:3"
+ x="84.446732"
+ y="223.43582"
+ id="text5735-1-0"><tspan
+ sodipodi:role="line"
+ id="tspan5733-1-1"
+ x="84.446732"
+ y="223.43582"
+ style="font-size:12.80001926px;fill:#ffffff;stroke-width:0.8000012">PF driver</tspan></text>
+</svg>
diff --git a/doc/guides/howto/img/virtio_user_as_exceptional_path.svg b/doc/guides/howto/img/virtio_user_as_exceptional_path.svg
new file mode 100644
index 00000000..b231b709
--- /dev/null
+++ b/doc/guides/howto/img/virtio_user_as_exceptional_path.svg
@@ -0,0 +1,207 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by Microsoft Visio, SVG Export virtio_user_as_exceptional_pathvsdx.svg Page-1 -->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events"
+ xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="5.77778in" height="3.88851in"
+ viewBox="0 0 416 279.973" xml:space="preserve" color-interpolation-filters="sRGB" class="st13">
+ <v:documentProperties v:langID="1033" v:viewMarkup="false"/>
+
+ <style type="text/css">
+ <![CDATA[
+ .st1 {visibility:visible}
+ .st2 {fill:#5b9bd5;fill-opacity:0.22;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22}
+ .st3 {fill:#ffffff;stroke:#c7c8c8;stroke-width:0.25}
+ .st4 {stroke:#000000;stroke-dasharray:7,5;stroke-linecap:round;stroke-linejoin:round;stroke-width:1}
+ .st5 {fill:#000000;font-family:Calibri;font-size:0.833336em}
+ .st6 {fill:none;stroke:none;stroke-width:0.25}
+ .st7 {fill:#000000;font-family:Calibri;font-size:1.00001em;font-style:italic}
+ .st8 {fill:#70ad47;stroke:#c7c8c8;stroke-width:0.25}
+ .st9 {stroke:#5b9bd5;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.75}
+ .st10 {marker-end:url(#mrkr4-68);marker-start:url(#mrkr4-66);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1}
+ .st11 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.28409090909091}
+ .st12 {fill:#d8d8d8;stroke:#c7c8c8;stroke-width:0.25}
+ .st13 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3}
+ ]]>
+ </style>
+
+ <defs id="Markers">
+ <g id="lend4">
+ <path d="M 2 1 L 0 0 L 2 -1 L 2 1 " style="stroke:none"/>
+ </g>
+ <marker id="mrkr4-66" class="st11" v:arrowType="4" v:arrowSize="2" v:setback="6.68" refX="6.68" orient="auto"
+ markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend4" transform="scale(3.52) "/>
+ </marker>
+ <marker id="mrkr4-68" class="st11" v:arrowType="4" v:arrowSize="2" v:setback="7.04" refX="-7.04" orient="auto"
+ markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend4" transform="scale(-3.52,-3.52) "/>
+ </marker>
+ </defs>
+ <defs id="Filters">
+ <filter id="filter_2">
+ <feGaussianBlur stdDeviation="2"/>
+ </filter>
+ </defs>
+ <g v:mID="0" v:index="1" v:groupContext="foregroundPage">
+ <title>Page-1</title>
+ <v:pageProperties v:drawingScale="1" v:pageScale="1" v:drawingUnits="0" v:shadowOffsetX="9" v:shadowOffsetY="-9"/>
+ <v:layer v:name="Connector" v:index="0"/>
+ <g id="shape23-1" v:mID="23" v:groupContext="shape" transform="translate(195.804,-74.9728)">
+ <title>Rectangle.23</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <g id="shadow23-2" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="113.473" width="216.6" height="166.5" class="st2"/>
+ </g>
+ <rect x="0" y="113.473" width="216.6" height="166.5" class="st3"/>
+ </g>
+ <g id="shape42-6" v:mID="42" v:groupContext="shape" v:layerMember="0" transform="translate(146.904,-277.473)">
+ <title>Dynamic connector.42</title>
+ <path d="M-9 279.97 L-9 540.97" class="st4"/>
+ </g>
+ <g id="shape45-9" v:mID="45" v:groupContext="shape" transform="translate(2.9044,-142.292)">
+ <title>Rectangle.45</title>
+ <desc>tap</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="34.05" cy="264.132" width="68.1" height="31.6807"/>
+ <g id="shadow45-10" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="248.292" width="68.1" height="31.6807" class="st2"/>
+ </g>
+ <rect x="0" y="248.292" width="68.1" height="31.6807" class="st3"/>
+ <text x="27.35" y="267.13" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>tap</text> </g>
+ <g id="shape46-15" v:mID="46" v:groupContext="shape" transform="translate(2.9044,-43.2921)">
+ <title>Rectangle.46</title>
+ <desc>vhost ko</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="34.05" cy="264.132" width="68.1" height="31.6807"/>
+ <g id="shadow46-16" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="248.292" width="68.1" height="31.6807" class="st2"/>
+ </g>
+ <rect x="0" y="248.292" width="68.1" height="31.6807" class="st3"/>
+ <text x="16.86" y="267.13" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>vhost ko </text> </g>
+ <g id="shape47-21" v:mID="47" v:groupContext="shape" transform="translate(18.9544,-257.223)">
+ <title>Sheet.47</title>
+ <desc>Kernel space</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="44.025" cy="268.723" width="88.05" height="22.5"/>
+ <rect x="0" y="257.473" width="88.05" height="22.5" class="st6"/>
+ <text x="13.44" y="272.32" class="st7" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Kernel space</text> </g>
+ <g id="shape48-24" v:mID="48" v:groupContext="shape" transform="translate(148.854,-257.223)">
+ <title>Sheet.48</title>
+ <desc>User space</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="44.025" cy="268.723" width="88.05" height="22.5"/>
+ <rect x="0" y="257.473" width="88.05" height="22.5" class="st6"/>
+ <text x="17.7" y="272.32" class="st7" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>User space</text> </g>
+ <g id="shape49-27" v:mID="49" v:groupContext="shape" transform="translate(218.904,-182.792)">
+ <title>Rectangle.49</title>
+ <desc>ETHDEV</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="83.25" cy="264.132" width="166.5" height="31.6807"/>
+ <g id="shadow49-28" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="248.292" width="166.5" height="31.6807" class="st2"/>
+ </g>
+ <rect x="0" y="248.292" width="166.5" height="31.6807" class="st3"/>
+ <text x="66.9" y="267.13" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>ETHDEV</text> </g>
+ <g id="shape50-33" v:mID="50" v:groupContext="shape" transform="translate(218.904,-142.292)">
+ <title>Rectangle.50</title>
+ <desc>virtio PMD</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="38.7911" cy="264.132" width="77.59" height="31.6807"/>
+ <g id="shadow50-34" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="248.292" width="77.5823" height="31.6807" class="st2"/>
+ </g>
+ <rect x="0" y="248.292" width="77.5823" height="31.6807" class="st3"/>
+ <text x="17.12" y="267.13" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>virtio PMD</text> </g>
+ <g id="shape51-39" v:mID="51" v:groupContext="shape" transform="translate(308.904,-142.292)">
+ <title>Rectangle.51</title>
+ <desc>other PMDs</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="38.7911" cy="264.132" width="77.59" height="31.6807"/>
+ <g id="shadow51-40" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="248.292" width="77.5823" height="31.6807" class="st2"/>
+ </g>
+ <rect x="0" y="248.292" width="77.5823" height="31.6807" class="st3"/>
+ <text x="14.6" y="267.13" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>other PMDs</text> </g>
+ <g id="shape52-45" v:mID="52" v:groupContext="shape" transform="translate(218.904,-86.3131)">
+ <title>Rectangle.52</title>
+ <desc>virtio-user</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="38.7911" cy="256.393" width="77.59" height="47.1597"/>
+ <g id="shadow52-46" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="232.813" width="77.5823" height="47.1597" class="st2"/>
+ </g>
+ <rect x="0" y="232.813" width="77.5823" height="47.1597" class="st8"/>
+ <text x="17.84" y="247.39" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>virtio-user<v:newlineChar/><v:newlineChar/></text> </g>
+ <g id="shape53-51" v:mID="53" v:groupContext="shape" transform="translate(223.404,-90.1829)">
+ <title>Rectangle.53</title>
+ <desc>vhost adapter</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="34.05" cy="268.183" width="68.1" height="23.5798"/>
+ <g id="shadow53-52" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="256.393" width="68.1" height="23.5798" class="st2"/>
+ </g>
+ <rect x="0" y="256.393" width="68.1" height="23.5798" class="st3"/>
+ <text x="5.82" y="271.18" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>vhost adapter</text> </g>
+ <g id="shape54-57" v:mID="54" v:groupContext="shape" v:layerMember="0" transform="translate(71.0044,-59.1325)">
+ <title>Dynamic connector</title>
+ <path d="M0 279.97 L63.9 279.97 A3 3 0 1 1 69.9 279.97 L186.69 279.97 L186.69 252.79" class="st9"/>
+ </g>
+ <g id="shape55-60" v:mID="55" v:groupContext="shape" v:layerMember="0" transform="translate(71.0044,-149.132)">
+ <title>Dynamic connector.55</title>
+ <path d="M6.68 270.97 L7.04 270.97 L63.9 270.97 A3 3 0 0 1 69.9 270.97 L140.86 270.97" class="st10"/>
+ </g>
+ <g id="shape56-69" v:mID="56" v:groupContext="shape" transform="translate(308.904,-5.2228)">
+ <title>Rectangle.38</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <g id="shadow56-70" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="257.473" width="77.5823" height="22.5" rx="11.25" ry="11.25" class="st2"/>
+ </g>
+ <rect x="0" y="257.473" width="77.5823" height="22.5" rx="11.25" ry="11.25" class="st12"/>
+ </g>
+ <g id="shape57-74" v:mID="57" v:groupContext="shape" transform="translate(318.204,-5.2228)">
+ <title>Sheet.57</title>
+ <desc>NIC</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)"/>
+ <v:textRect cx="28.125" cy="268.723" width="56.25" height="22.5"/>
+ <rect x="0" y="257.473" width="56.25" height="22.5" class="st6"/>
+ <text x="19.61" y="272.32" class="st7" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>NIC</text> </g>
+ <g id="shape58-77" v:mID="58" v:groupContext="shape" v:layerMember="0" transform="translate(356.696,-142.292)">
+ <title>Dynamic connector.41</title>
+ <path d="M-9 286.65 L-9 287.01 L-9 387.5" class="st10"/>
+ </g>
+ </g>
+</svg>
diff --git a/doc/guides/howto/img/virtio_user_for_container_networking.svg b/doc/guides/howto/img/virtio_user_for_container_networking.svg
new file mode 100644
index 00000000..de808066
--- /dev/null
+++ b/doc/guides/howto/img/virtio_user_for_container_networking.svg
@@ -0,0 +1,685 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.1"
+ id="svg2"
+ class="st16"
+ color-interpolation-filters="sRGB"
+ xml:space="preserve"
+ viewBox="0 0 469.4 294.5"
+ height="4.09028in"
+ width="6.51944in"><metadata
+ id="metadata220"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><v:documentProperties
+ v:viewMarkup="false"
+ v:langID="1033" /><style
+ id="style4"
+ type="text/css"><![CDATA[
+ .st1 {visibility:visible}
+ .st2 {fill:#5b9bd5;fill-opacity:0.22;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22}
+ .st3 {fill:#ffffff;stroke:#c7c8c8;stroke-width:0.25}
+ .st4 {fill:#000000;font-family:Calibri;font-size:0.833336em}
+ .st5 {fill:#70ad47;stroke:#c7c8c8;stroke-width:0.25}
+ .st6 {font-size:1em}
+ .st7 {fill:#d8d8d8;stroke:#c7c8c8;stroke-width:0.25}
+ .st8 {fill:none;stroke:none;stroke-width:0.25}
+ .st9 {fill:#000000;font-family:Calibri;font-size:1.00001em;font-style:italic}
+ .st10 {fill:none;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22}
+ .st11 {fill:none;stroke:#c7c8c8;stroke-width:0.25}
+ .st12 {fill:#000000;font-family:Calibri;font-size:1.00001em}
+ .st13 {marker-end:url(#mrkr4-90);marker-start:url(#mrkr4-88);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1}
+ .st14 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.28409090909091}
+ .st15 {stroke:#5b9bd5;stroke-linecap:round;stroke-linejoin:round;stroke-width:1}
+ .st16 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3}
+ ]]></style><defs
+ id="Markers"><g
+ id="lend4"><path
+ id="path8"
+ style="stroke:none"
+ d="M 2 1 L 0 0 L 2 -1 L 2 1 " /></g><marker
+ overflow="visible"
+ markerUnits="strokeWidth"
+ orient="auto"
+ refX="6.68"
+ v:setback="6.68"
+ v:arrowSize="2"
+ v:arrowType="4"
+ class="st14"
+ id="mrkr4-88"><use
+ id="use11"
+ transform="scale(3.52) "
+ xlink:href="#lend4" /></marker><marker
+ overflow="visible"
+ markerUnits="strokeWidth"
+ orient="auto"
+ refX="-7.04"
+ v:setback="7.04"
+ v:arrowSize="2"
+ v:arrowType="4"
+ class="st14"
+ id="mrkr4-90"><use
+ id="use14"
+ transform="scale(-3.52,-3.52) "
+ xlink:href="#lend4" /></marker></defs><defs
+ id="Filters"><filter
+ id="filter_2"><feGaussianBlur
+ id="feGaussianBlur18"
+ stdDeviation="2" /></filter></defs><g
+ id="g20"
+ v:groupContext="foregroundPage"
+ v:index="1"
+ v:mID="0"><title
+ id="title22">Page-1</title><v:pageProperties
+ v:shadowOffsetY="-9"
+ v:shadowOffsetX="9"
+ v:drawingUnits="0"
+ v:pageScale="1"
+ v:drawingScale="1" /><v:layer
+ v:index="0"
+ v:name="Connector" /><g
+ transform="translate(20.9044,-72.7228)"
+ v:groupContext="shape"
+ v:mID="23"
+ id="shape23-1"><title
+ id="title25">Rectangle.23</title><v:userDefs><v:ud
+ v:val="VT0(15):26"
+ v:nameU="visVersion" /></v:userDefs><g
+ class="st1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)"
+ v:shadowType="1"
+ v:shadowOffsetY="-1.97279"
+ v:shadowOffsetX="0.345598"
+ v:groupContext="shadow"
+ id="shadow23-2"><rect
+ id="rect28"
+ class="st2"
+ height="184.5"
+ width="216.6"
+ y="110"
+ x="0" /></g><rect
+ id="rect30"
+ class="st3"
+ height="184.5"
+ width="216.6"
+ y="110"
+ x="0" /></g><g
+ transform="translate(44.0044,-198.542)"
+ v:groupContext="shape"
+ v:mID="49"
+ id="shape49-6"><title
+ id="title33">Rectangle.49</title><desc
+ id="desc35">ETHDEV</desc><v:userDefs><v:ud
+ v:val="VT0(15):26"
+ v:nameU="visVersion" /></v:userDefs><v:textBlock
+ v:margins="rect(4,4,4,4)" /><v:textRect
+ height="31.6807"
+ width="166.5"
+ cy="278.66"
+ cx="83.25" /><g
+ class="st1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)"
+ v:shadowType="1"
+ v:shadowOffsetY="-1.97279"
+ v:shadowOffsetX="0.345598"
+ v:groupContext="shadow"
+ id="shadow49-7"><rect
+ id="rect38"
+ class="st2"
+ height="31.6807"
+ width="166.5"
+ y="262.819"
+ x="0" /></g><rect
+ id="rect40"
+ class="st3"
+ height="31.6807"
+ width="166.5"
+ y="262.819"
+ x="0" /><text
+ style="font-size:10.00003242px;font-family:Calibri;fill:#000000"
+ id="text42"
+ v:langID="1033"
+ class="st4"
+ y="281.66"
+ x="66.900002">ethdev<v:paragraph
+ v:horizAlign="1" /><v:tabList /></text>
+</g><g
+ transform="translate(44.0044,-158.042)"
+ v:groupContext="shape"
+ v:mID="50"
+ id="shape50-12"><title
+ id="title45">Rectangle.50</title><desc
+ id="desc47">virtio PMD</desc><v:userDefs><v:ud
+ v:val="VT0(15):26"
+ v:nameU="visVersion" /></v:userDefs><v:textBlock
+ v:margins="rect(4,4,4,4)" /><v:textRect
+ height="31.6807"
+ width="166.5"
+ cy="278.66"
+ cx="83.25" /><g
+ class="st1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)"
+ v:shadowType="1"
+ v:shadowOffsetY="-1.97279"
+ v:shadowOffsetX="0.345598"
+ v:groupContext="shadow"
+ id="shadow50-13"><rect
+ id="rect50"
+ class="st2"
+ height="31.6807"
+ width="166.5"
+ y="262.819"
+ x="0" /></g><rect
+ id="rect52"
+ class="st3"
+ height="31.6807"
+ width="166.5"
+ y="262.819"
+ x="0" /><text
+ id="text54"
+ v:langID="1033"
+ class="st4"
+ y="281.66"
+ x="61.58"><v:paragraph
+ v:horizAlign="1" /><v:tabList />virtio PMD</text>
+</g><g
+ transform="translate(128.904,-86.2228)"
+ v:groupContext="shape"
+ v:mID="52"
+ id="shape52-18"><title
+ id="title57">Rectangle.52</title><desc
+ id="desc59">virtio-user (virtual device)</desc><v:userDefs><v:ud
+ v:val="VT0(15):26"
+ v:nameU="visVersion" /></v:userDefs><v:textBlock
+ v:margins="rect(4,4,4,4)" /><v:textRect
+ height="63"
+ width="81.61"
+ cy="263"
+ cx="40.8" /><g
+ class="st1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)"
+ v:shadowType="1"
+ v:shadowOffsetY="-1.97279"
+ v:shadowOffsetX="0.345598"
+ v:groupContext="shadow"
+ id="shadow52-19"><rect
+ id="rect62"
+ class="st2"
+ height="63"
+ width="81.6"
+ y="231.5"
+ x="0" /></g><rect
+ id="rect64"
+ class="st5"
+ height="63"
+ width="81.6"
+ y="231.5"
+ x="0" /><text
+ id="text66"
+ v:langID="1033"
+ class="st4"
+ y="248"
+ x="19.85"><v:paragraph
+ v:horizAlign="1" /><v:tabList />virtio-user<v:newlineChar /><tspan
+ id="tspan68"
+ class="st6"
+ dy="1.2em"
+ x="10.52">(</tspan>virtual device)<v:newlineChar /><v:newlineChar /></text>
+</g><g
+ transform="translate(129.44522,-83.349651)"
+ v:groupContext="shape"
+ v:mID="53"
+ id="shape53-25"><title
+ id="title71">Rectangle.53</title><desc
+ id="desc73">vhost-user adapter</desc><v:userDefs><v:ud
+ v:val="VT0(15):26"
+ v:nameU="visVersion" /></v:userDefs><v:textBlock
+ v:margins="rect(4,4,4,4)" /><v:textRect
+ height="23.5798"
+ width="68.1"
+ cy="282.71"
+ cx="34.05" /><g
+ style="visibility:visible"
+ class="st1"
+ transform="translate(0.345598,1.97279)"
+ v:shadowType="1"
+ v:shadowOffsetY="-1.97279"
+ v:shadowOffsetX="0.345598"
+ v:groupContext="shadow"
+ id="shadow53-26"><rect
+ style="fill:#5b9bd5;fill-opacity:0.22000002;stroke:#5b9bd5;stroke-opacity:0.22000002;filter:url(#filter_2)"
+ id="rect76"
+ class="st2"
+ height="23.5798"
+ width="68.099998"
+ y="270.92001"
+ x="0" /></g><rect
+ style="fill:#ffffff;stroke:#c7c8c8;stroke-width:0.25"
+ id="rect78"
+ class="st3"
+ height="23.5798"
+ width="68.099998"
+ y="265.79211"
+ x="6.99261" /></g><g
+ transform="translate(366.563,-5.2228)"
+ v:groupContext="shape"
+ v:mID="56"
+ id="shape56-32"><title
+ id="title85">Rectangle.38</title><v:userDefs><v:ud
+ v:val="VT0(15):26"
+ v:nameU="visVersion" /></v:userDefs><g
+ class="st1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)"
+ v:shadowType="1"
+ v:shadowOffsetY="-1.97279"
+ v:shadowOffsetX="0.345598"
+ v:groupContext="shadow"
+ id="shadow56-33"><rect
+ id="rect88"
+ class="st2"
+ ry="11.25"
+ rx="11.25"
+ height="22.5"
+ width="77.5823"
+ y="272"
+ x="0" /></g><rect
+ id="rect90"
+ class="st7"
+ ry="11.25"
+ rx="11.25"
+ height="22.5"
+ width="77.5823"
+ y="272"
+ x="0" /></g><g
+ transform="translate(380.904,-5.2228)"
+ v:groupContext="shape"
+ v:mID="57"
+ id="shape57-37"><title
+ id="title93">Sheet.57</title><desc
+ id="desc95">NIC</desc><v:textBlock
+ v:margins="rect(4,4,4,4)" /><v:textRect
+ height="22.5"
+ width="56.25"
+ cy="283.25"
+ cx="28.125" /><rect
+ id="rect97"
+ class="st8"
+ height="22.5"
+ width="56.25"
+ y="272"
+ x="0" /><text
+ id="text99"
+ v:langID="2052"
+ class="st9"
+ y="286.85"
+ x="19.61"><v:paragraph
+ v:horizAlign="1" /><v:tabList />NIC</text>
+</g><g
+ transform="translate(43.4044,-86.2228)"
+ v:groupContext="shape"
+ v:mID="59"
+ id="shape59-40"><title
+ id="title102">Rectangle.59</title><desc
+ id="desc104">virtio (PCI device)</desc><v:userDefs><v:ud
+ v:val="VT0(15):26"
+ v:nameU="visVersion" /></v:userDefs><v:textBlock
+ v:margins="rect(4,4,4,4)" /><v:textRect
+ height="63"
+ width="77.59"
+ cy="263"
+ cx="38.7911" /><g
+ class="st1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)"
+ v:shadowType="1"
+ v:shadowOffsetY="-1.97279"
+ v:shadowOffsetX="0.345598"
+ v:groupContext="shadow"
+ id="shadow59-41"><rect
+ id="rect107"
+ class="st2"
+ height="63"
+ width="77.5823"
+ y="231.5"
+ x="0" /></g><rect
+ id="rect109"
+ class="st3"
+ height="63"
+ width="77.5823"
+ y="231.5"
+ x="0" /><text
+ id="text111"
+ v:langID="1033"
+ class="st4"
+ y="260"
+ x="28.18"><v:paragraph
+ v:horizAlign="1" /><v:tabList />virtio<v:newlineChar /><tspan
+ id="tspan113"
+ class="st6"
+ dy="1.2em"
+ x="15">(</tspan>PCI device)</text>
+</g><g
+ transform="translate(344.904,-77.2228)"
+ v:groupContext="shape"
+ v:mID="60"
+ id="shape60-47"><title
+ id="title116">Rectangle.60</title><desc
+ id="desc118">vSwitch or vRouter</desc><v:userDefs><v:ud
+ v:val="VT0(15):26"
+ v:nameU="visVersion" /></v:userDefs><v:textBlock
+ v:margins="rect(4,4,4,4)" /><v:textRect
+ height="216"
+ width="120.9"
+ cy="186.5"
+ cx="60.45" /><g
+ class="st1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)"
+ v:shadowType="1"
+ v:shadowOffsetY="-1.97279"
+ v:shadowOffsetX="0.345598"
+ v:groupContext="shadow"
+ id="shadow60-48"><rect
+ id="rect121"
+ class="st2"
+ height="216"
+ width="120.9"
+ y="78.5"
+ x="0" /></g><rect
+ id="rect123"
+ class="st3"
+ height="216"
+ width="120.9"
+ y="78.5"
+ x="0" /><text
+ id="text125"
+ v:langID="1033"
+ class="st4"
+ y="177.5"
+ x="44.76"><v:paragraph
+ v:horizAlign="1" /><v:tabList />vSwitch<v:newlineChar /><tspan
+ id="tspan127"
+ class="st6"
+ dy="1.2em"
+ x="56.07">or<v:newlineChar /></tspan><tspan
+ id="tspan129"
+ class="st6"
+ dy="1.2em"
+ x="44.31">vRouter</tspan></text>
+</g><g
+ transform="translate(20.9044,-234.723)"
+ v:groupContext="shape"
+ v:mID="61"
+ id="shape61-55"><title
+ id="title132">Sheet.61</title><desc
+ id="desc134">DPDK</desc><v:textBlock
+ v:margins="rect(4,4,4,4)" /><v:textRect
+ height="22.5"
+ width="47.25"
+ cy="283.25"
+ cx="23.625" /><rect
+ id="rect136"
+ class="st8"
+ height="22.5"
+ width="47.25"
+ y="272"
+ x="0" /><text
+ id="text138"
+ v:langID="1033"
+ class="st9"
+ y="286.85"
+ x="4"><v:paragraph /><v:tabList />DPDK</text>
+</g><g
+ transform="translate(2.9044,-52.4728)"
+ v:groupContext="shape"
+ v:mID="62"
+ id="shape62-58"><title
+ id="title141">Rectangle.62</title><v:userDefs><v:ud
+ v:val="VT0(15):26"
+ v:nameU="visVersion" /></v:userDefs><g
+ class="st1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)"
+ v:shadowType="1"
+ v:shadowOffsetY="-1.97279"
+ v:shadowOffsetX="0.345598"
+ v:groupContext="shadow"
+ id="shadow62-59"><rect
+ id="rect144"
+ class="st10"
+ height="240.75"
+ width="252"
+ y="53.75"
+ x="0" /></g><rect
+ id="rect146"
+ class="st11"
+ height="240.75"
+ width="252"
+ y="53.75"
+ x="0" /></g><g
+ transform="translate(2.9044,-261.723)"
+ v:groupContext="shape"
+ v:mID="63"
+ id="shape63-63"><title
+ id="title149">Sheet.63</title><desc
+ id="desc151">Contanier/App</desc><v:textBlock
+ v:margins="rect(4,4,4,4)" /><v:textRect
+ height="22.5"
+ width="90"
+ cy="283.25"
+ cx="45" /><rect
+ id="rect153"
+ class="st8"
+ height="22.5"
+ width="90"
+ y="272"
+ x="0" /><text
+ style="font-style:italic;font-size:12.00012016px;font-family:Calibri;fill:#000000"
+ id="text155"
+ v:langID="1033"
+ class="st9"
+ y="286.85001"
+ x="4"><v:paragraph /><v:tabList />Container/App</text>
+</g><g
+ transform="translate(535.904,70.4861) rotate(90)"
+ v:groupContext="shape"
+ v:mID="64"
+ id="shape64-66"><title
+ id="title158">Rectangle.64</title><v:userDefs><v:ud
+ v:val="VT0(15):26"
+ v:nameU="visVersion" /></v:userDefs><g
+ class="st1"
+ transform="matrix(1,0,0,1,1.97279,-0.345598)"
+ v:shadowType="1"
+ v:shadowOffsetY="-1.97279"
+ v:shadowOffsetX="0.345598"
+ v:groupContext="shadow"
+ id="shadow64-67"><rect
+ id="rect161"
+ class="st2"
+ ry="13.5"
+ rx="13.5"
+ height="27"
+ width="77.5823"
+ y="267.5"
+ x="0" /></g><rect
+ id="rect163"
+ class="st7"
+ ry="13.5"
+ rx="13.5"
+ height="27"
+ width="77.5823"
+ y="267.5"
+ x="0" /></g><g
+ transform="translate(625.904,70.4861) rotate(90)"
+ v:groupContext="shape"
+ v:mID="65"
+ id="shape65-71"><title
+ id="title166">Rectangle.65</title><v:userDefs><v:ud
+ v:val="VT0(15):26"
+ v:nameU="visVersion" /></v:userDefs><g
+ class="st1"
+ transform="matrix(1,0,0,1,1.97279,-0.345598)"
+ v:shadowType="1"
+ v:shadowOffsetY="-1.97279"
+ v:shadowOffsetX="0.345598"
+ v:groupContext="shadow"
+ id="shadow65-72"><rect
+ id="rect169"
+ class="st2"
+ ry="13.5"
+ rx="13.5"
+ height="27"
+ width="77.5823"
+ y="267.5"
+ x="0" /></g><rect
+ id="rect171"
+ class="st7"
+ ry="13.5"
+ rx="13.5"
+ height="27"
+ width="77.5823"
+ y="267.5"
+ x="0" /></g><g
+ transform="translate(538.154,81.1522) rotate(90)"
+ v:groupContext="shape"
+ v:mID="66"
+ id="shape66-76"><title
+ id="title174">Sheet.66</title><desc
+ id="desc176">virtio</desc><v:textBlock
+ v:margins="rect(4,4,4,4)" /><v:textRect
+ height="22.5"
+ width="56.25"
+ cy="283.25"
+ cx="28.125" /><rect
+ id="rect178"
+ class="st8"
+ height="22.5"
+ width="56.25"
+ y="272"
+ x="0" /><text
+ id="text180"
+ v:langID="1033"
+ class="st12"
+ y="286.85"
+ x="15.4"><v:paragraph
+ v:horizAlign="1" /><v:tabList />virtio</text>
+</g><g
+ transform="translate(628.154,81.1522) rotate(90)"
+ v:groupContext="shape"
+ v:mID="67"
+ id="shape67-79"><title
+ id="title183">Sheet.67</title><desc
+ id="desc185">vhost</desc><v:textBlock
+ v:margins="rect(4,4,4,4)" /><v:textRect
+ height="22.5"
+ width="56.25"
+ cy="283.25"
+ cx="28.125" /><rect
+ id="rect187"
+ class="st8"
+ height="22.5"
+ width="56.25"
+ y="272"
+ x="0" /><text
+ id="text189"
+ v:langID="1033"
+ class="st12"
+ y="286.85"
+ x="14.74"><v:paragraph
+ v:horizAlign="1" /><v:tabList />vhost</text>
+</g><g
+ transform="translate(268.404,-176.223)"
+ v:layerMember="0"
+ v:groupContext="shape"
+ v:mID="69"
+ id="shape69-82"><title
+ id="title192">Dynamic connector</title><path
+ id="path194"
+ class="st13"
+ d="M6.68 285.5 L7.04 285.5 L55.96 285.5" /></g><g
+ transform="translate(396.354,-77.2228)"
+ v:layerMember="0"
+ v:groupContext="shape"
+ v:mID="70"
+ id="shape70-91"><title
+ id="title197">Dynamic connector.70</title><path
+ id="path199"
+ class="st13"
+ d="M9 301.18 L9 301.54 L9 336.96" /></g><g
+ transform="translate(205.004,-92.4329)"
+ v:layerMember="0"
+ v:groupContext="shape"
+ v:mID="72"
+ id="shape72-104"><title
+ id="title214">Dynamic connector.72</title><path
+ id="path216"
+ class="st15"
+ d="M0 285.5 L101.11 285.5" /></g><g
+ transform="matrix(1.1344321,0,0,0.98698119,292.92681,-86.402944)"
+ v:groupContext="shape"
+ v:mID="71"
+ id="shape71-98"><title
+ id="title202">Rectangle.71</title><desc
+ id="desc204">unix socket file</desc><v:userDefs><v:ud
+ v:val="VT0(15):26"
+ v:nameU="visVersion" /></v:userDefs><v:textBlock
+ v:margins="rect(4,4,4,4)" /><v:textRect
+ height="23.5798"
+ width="77.59"
+ cy="282.71"
+ cx="38.7911" /><g
+ style="visibility:visible"
+ class="st1"
+ transform="translate(0.345598,1.97279)"
+ v:shadowType="1"
+ v:shadowOffsetY="-1.97279"
+ v:shadowOffsetX="0.345598"
+ v:groupContext="shadow"
+ id="shadow71-99"><rect
+ style="fill:#5b9bd5;fill-opacity:0.22000002;stroke:#5b9bd5;stroke-opacity:0.22000002;filter:url(#filter_2)"
+ id="rect207"
+ class="st2"
+ height="23.5798"
+ width="77.582298"
+ y="270.92001"
+ x="0" /></g><rect
+ style="fill:#ffffff;stroke:#000000;stroke-width:0.25025026;stroke-opacity:1;stroke-miterlimit:3;stroke-dasharray:none"
+ id="rect209"
+ class="st3"
+ height="23.5798"
+ width="77.582298"
+ y="270.92001"
+ x="-0.41093162" /><text
+ transform="scale(0.86136004,1.1609547)"
+ style="font-size:10.19067955px;font-family:Calibri;fill:#000000"
+ id="text211"
+ v:langID="1033"
+ class="st4"
+ y="247.29736"
+ x="7.1378384"><v:paragraph
+ v:horizAlign="1" /><v:tabList />unix socket file</text>
+</g><text
+ id="text66-3"
+ v:langID="1033"
+ class="st4"
+ y="192.78035"
+ x="143.49364"
+ style="font-size:12px;line-height:125%;font-family:Calibri;fill:#000000"><v:paragraph
+ v:horizAlign="1" /><v:tabList /><tspan
+ id="tspan4385"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.00000572px;line-height:125%;font-family:Calibri;-inkscape-font-specification:'Calibri, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start">vhost-user</tspan><v:newlineChar /><v:newlineChar /><v:newlineChar /></text>
+<text
+ id="text66-3-9"
+ v:langID="1033"
+ class="st4"
+ y="201.73016"
+ x="149.81844"
+ style="font-size:12px;line-height:125%;font-family:Calibri;fill:#000000"><v:paragraph
+ v:horizAlign="1" /><v:tabList /><tspan
+ id="tspan4385-1"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.00000572px;line-height:125%;font-family:Calibri;-inkscape-font-specification:'Calibri, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start">adapter</tspan><v:newlineChar /><v:newlineChar /><v:newlineChar /></text>
+</g></svg> \ No newline at end of file
diff --git a/doc/guides/howto/index.rst b/doc/guides/howto/index.rst
index 5575b274..a483444d 100644
--- a/doc/guides/howto/index.rst
+++ b/doc/guides/howto/index.rst
@@ -38,3 +38,7 @@ HowTo Guides
lm_bond_virtio_sriov
lm_virtio_vhost_user
flow_bifurcation
+ pvp_reference_benchmark
+ vfd
+ virtio_user_for_container_networking
+ virtio_user_as_exceptional_path
diff --git a/doc/guides/howto/lm_bond_virtio_sriov.rst b/doc/guides/howto/lm_bond_virtio_sriov.rst
index fe9803e4..40dd2cb2 100644
--- a/doc/guides/howto/lm_bond_virtio_sriov.rst
+++ b/doc/guides/howto/lm_bond_virtio_sriov.rst
@@ -613,17 +613,17 @@ Set up DPDK in the Virtual Machine
cat /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
ifconfig -a
- /root/dpdk/tools/dpdk-devbind.py --status
+ /root/dpdk/usertools/dpdk-devbind.py --status
rmmod virtio-pci ixgbevf
modprobe uio
insmod /root/dpdk/x86_64-default-linuxapp-gcc/kmod/igb_uio.ko
- /root/dpdk/tools/dpdk-devbind.py -b igb_uio 0000:00:03.0
- /root/dpdk/tools/dpdk-devbind.py -b igb_uio 0000:00:04.0
+ /root/dpdk/usertools/dpdk-devbind.py -b igb_uio 0000:00:03.0
+ /root/dpdk/usertools/dpdk-devbind.py -b igb_uio 0000:00:04.0
- /root/dpdk/tools/dpdk-devbind.py --status
+ /root/dpdk/usertools/dpdk-devbind.py --status
run_testpmd_bonding_in_vm.sh
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -641,7 +641,7 @@ Run testpmd in the Virtual Machine.
# use for bonding of virtio and vf tests in VM
/root/dpdk/x86_64-default-linuxapp-gcc/app/testpmd \
- -c f -n 4 --socket-mem 350 -- --i --port-topology=chained
+ -l 0-3 -n 4 --socket-mem 350 -- --i --port-topology=chained
.. _lm_bond_virtio_sriov_switch_conf:
diff --git a/doc/guides/howto/lm_virtio_vhost_user.rst b/doc/guides/howto/lm_virtio_vhost_user.rst
index 49377818..9402ed8d 100644
--- a/doc/guides/howto/lm_virtio_vhost_user.rst
+++ b/doc/guides/howto/lm_virtio_vhost_user.rst
@@ -90,14 +90,14 @@ For Fortville NIC.
.. code-block:: console
- cd /root/dpdk/tools
+ cd /root/dpdk/usertools
./dpdk-devbind.py -b igb_uio 0000:02:00.0
For Niantic NIC.
.. code-block:: console
- cd /root/dpdk/tools
+ cd /root/dpdk/usertools
./dpdk-devbind.py -b igb_uio 0000:09:00.0
On host_server_1: Terminal 3
@@ -171,14 +171,14 @@ For Fortville NIC.
.. code-block:: console
- cd /root/dpdk/tools
+ cd /root/dpdk/usertools
./dpdk-devbind.py -b igb_uio 0000:03:00.0
For Niantic NIC.
.. code-block:: console
- cd /root/dpdk/tools
+ cd /root/dpdk/usertools
./dpdk-devbind.py -b igb_uio 0000:06:00.0
On host_server_2: Terminal 3
@@ -444,17 +444,17 @@ setup_dpdk_virtio_in_vm.sh
cat /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
ifconfig -a
- /root/dpdk/tools/dpdk-devbind.py --status
+ /root/dpdk/usertools/dpdk-devbind.py --status
rmmod virtio-pci
modprobe uio
insmod /root/dpdk/x86_64-default-linuxapp-gcc/kmod/igb_uio.ko
- /root/dpdk/tools/dpdk-devbind.py -b igb_uio 0000:00:03.0
- /root/dpdk/tools/dpdk-devbind.py -b igb_uio 0000:00:04.0
+ /root/dpdk/usertools/dpdk-devbind.py -b igb_uio 0000:00:03.0
+ /root/dpdk/usertools/dpdk-devbind.py -b igb_uio 0000:00:04.0
- /root/dpdk/tools/dpdk-devbind.py --status
+ /root/dpdk/usertools/dpdk-devbind.py --status
run_testpmd_in_vm.sh
~~~~~~~~~~~~~~~~~~~~
@@ -466,4 +466,4 @@ run_testpmd_in_vm.sh
# test system has 8 cpus (0-7), use cpus 2-7 for VM
/root/dpdk/x86_64-default-linuxapp-gcc/app/testpmd \
- -c 3f -n 4 --socket-mem 350 -- --burst=64 --i --disable-hw-vlan-filter
+ -l 0-5 -n 4 --socket-mem 350 -- --burst=64 --i --disable-hw-vlan-filter
diff --git a/doc/guides/howto/pvp_reference_benchmark.rst b/doc/guides/howto/pvp_reference_benchmark.rst
new file mode 100644
index 00000000..228b4a25
--- /dev/null
+++ b/doc/guides/howto/pvp_reference_benchmark.rst
@@ -0,0 +1,398 @@
+.. BSD LICENSE
+ Copyright(c) 2016 Red Hat, Inc. All rights reserved.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Intel Corporation nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+PVP reference benchmark setup using testpmd
+===========================================
+
+This guide lists the steps required to setup a PVP benchmark using testpmd as
+a simple forwarder between NICs and Vhost interfaces. The goal of this setup
+is to have a reference PVP benchmark without using external vSwitches (OVS,
+VPP, ...) to make it easier to obtain reproducible results and to facilitate
+continuous integration testing.
+
+The guide covers two ways of launching the VM, either by directly calling the
+QEMU command line, or by relying on libvirt. It has been tested with DPDK
+v16.11 using RHEL7 for both host and guest.
+
+
+Setup overview
+--------------
+
+.. _figure_pvp_2nics:
+
+.. figure:: img/pvp_2nics.*
+
+ PVP setup using 2 NICs
+
+In this diagram, each red arrow represents one logical core. This use-case
+requires 6 dedicated logical cores. A forwarding configuration with a single
+NIC is also possible, requiring 3 logical cores.
+
+
+Host setup
+----------
+
+In this setup, we isolate 6 cores (from CPU2 to CPU7) on the same NUMA
+node. Two cores are assigned to the VM vCPUs running testpmd and four are
+assigned to testpmd on the host.
+
+
+Host tuning
+~~~~~~~~~~~
+
+#. On BIOS, disable turbo-boost and hyper-threads.
+
+#. Append these options to Kernel command line:
+
+ .. code-block:: console
+
+ intel_pstate=disable mce=ignore_ce default_hugepagesz=1G hugepagesz=1G hugepages=6 isolcpus=2-7 rcu_nocbs=2-7 nohz_full=2-7 iommu=pt intel_iommu=on
+
+#. Disable hyper-threads at runtime if necessary or if BIOS is not accessible:
+
+ .. code-block:: console
+
+ cat /sys/devices/system/cpu/cpu*[0-9]/topology/thread_siblings_list \
+ | sort | uniq \
+ | awk -F, '{system("echo 0 > /sys/devices/system/cpu/cpu"$2"/online")}'
+
+#. Disable NMIs:
+
+ .. code-block:: console
+
+ echo 0 > /proc/sys/kernel/nmi_watchdog
+
+#. Exclude isolated CPUs from the writeback cpumask:
+
+ .. code-block:: console
+
+ echo ffffff03 > /sys/bus/workqueue/devices/writeback/cpumask
+
+#. Isolate CPUs from IRQs:
+
+ .. code-block:: console
+
+ clear_mask=0xfc #Isolate CPU2 to CPU7 from IRQs
+ for i in /proc/irq/*/smp_affinity
+ do
+ echo "obase=16;$(( 0x$(cat $i) & ~$clear_mask ))" | bc > $i
+ done
+
+
+Qemu build
+~~~~~~~~~~
+
+Build Qemu:
+
+ .. code-block:: console
+
+ git clone git://git.qemu.org/qemu.git
+ cd qemu
+ mkdir bin
+ cd bin
+ ../configure --target-list=x86_64-softmmu
+ make
+
+
+DPDK build
+~~~~~~~~~~
+
+Build DPDK:
+
+ .. code-block:: console
+
+ git clone git://dpdk.org/dpdk
+ cd dpdk
+ export RTE_SDK=$PWD
+ make install T=x86_64-native-linuxapp-gcc DESTDIR=install
+
+
+Testpmd launch
+~~~~~~~~~~~~~~
+
+#. Assign NICs to DPDK:
+
+ .. code-block:: console
+
+ modprobe vfio-pci
+ $RTE_SDK/install/sbin/dpdk-devbind -b vfio-pci 0000:11:00.0 0000:11:00.1
+
+ .. Note::
+
+ The Sandy Bridge family seems to have some IOMMU limitations giving poor
+ performance results. To achieve good performance on these machines
+ consider using UIO instead.
+
+#. Launch the testpmd application:
+
+ .. code-block:: console
+
+ $RTE_SDK/install/bin/testpmd -l 0,2,3,4,5 --socket-mem=1024 -n 4 \
+ --vdev 'net_vhost0,iface=/tmp/vhost-user1' \
+ --vdev 'net_vhost1,iface=/tmp/vhost-user2' -- \
+ --portmask=f --disable-hw-vlan -i --rxq=1 --txq=1 \
+ --nb-cores=4 --forward-mode=io
+
+ With this command, isolated CPUs 2 to 5 will be used as lcores for PMD threads.
+
+#. In testpmd interactive mode, set the portlist to obtain the correct port
+ chaining:
+
+ .. code-block:: console
+
+ set portlist 0,2,1,3
+ start
+
+
+VM launch
+~~~~~~~~~
+
+The VM may be launched either by calling QEMU directly, or by using libvirt.
+
+Qemu way
+^^^^^^^^
+
+Launch QEMU with two Virtio-net devices paired to the vhost-user sockets
+created by testpmd. Below example uses default Virtio-net options, but options
+may be specified, for example to disable mergeable buffers or indirect
+descriptors.
+
+ .. code-block:: console
+
+ <QEMU path>/bin/x86_64-softmmu/qemu-system-x86_64 \
+ -enable-kvm -cpu host -m 3072 -smp 3 \
+ -chardev socket,id=char0,path=/tmp/vhost-user1 \
+ -netdev type=vhost-user,id=mynet1,chardev=char0,vhostforce \
+ -device virtio-net-pci,netdev=mynet1,mac=52:54:00:02:d9:01,addr=0x10 \
+ -chardev socket,id=char1,path=/tmp/vhost-user2 \
+ -netdev type=vhost-user,id=mynet2,chardev=char1,vhostforce \
+ -device virtio-net-pci,netdev=mynet2,mac=52:54:00:02:d9:02,addr=0x11 \
+ -object memory-backend-file,id=mem,size=3072M,mem-path=/dev/hugepages,share=on \
+ -numa node,memdev=mem -mem-prealloc \
+ -net user,hostfwd=tcp::1002$1-:22 -net nic \
+ -qmp unix:/tmp/qmp.socket,server,nowait \
+ -monitor stdio <vm_image>.qcow2
+
+You can use this `qmp-vcpu-pin <https://patchwork.kernel.org/patch/9361617/>`_
+script to pin vCPUs.
+
+It can be used as follows, for example to pin 3 vCPUs to CPUs 1, 6 and 7,
+where isolated CPUs 6 and 7 will be used as lcores for Virtio PMDs:
+
+ .. code-block:: console
+
+ export PYTHONPATH=$PYTHONPATH:<QEMU path>/scripts/qmp
+ ./qmp-vcpu-pin -s /tmp/qmp.socket 1 6 7
+
+Libvirt way
+^^^^^^^^^^^
+
+Some initial steps are required for libvirt to be able to connect to testpmd's
+sockets.
+
+First, SELinux policy needs to be set to permissive, since testpmd is
+generally run as root (note, as reboot is required):
+
+ .. code-block:: console
+
+ cat /etc/selinux/config
+
+ # This file controls the state of SELinux on the system.
+ # SELINUX= can take one of these three values:
+ # enforcing - SELinux security policy is enforced.
+ # permissive - SELinux prints warnings instead of enforcing.
+ # disabled - No SELinux policy is loaded.
+ SELINUX=permissive
+
+ # SELINUXTYPE= can take one of three two values:
+ # targeted - Targeted processes are protected,
+ # minimum - Modification of targeted policy.
+ # Only selected processes are protected.
+ # mls - Multi Level Security protection.
+ SELINUXTYPE=targeted
+
+
+Also, Qemu needs to be run as root, which has to be specified in
+``/etc/libvirt/qemu.conf``:
+
+ .. code-block:: console
+
+ user = "root"
+
+Once the domain created, the following snippet is an extract of he most
+important information (hugepages, vCPU pinning, Virtio PCI devices):
+
+ .. code-block:: xml
+
+ <domain type='kvm'>
+ <memory unit='KiB'>3145728</memory>
+ <currentMemory unit='KiB'>3145728</currentMemory>
+ <memoryBacking>
+ <hugepages>
+ <page size='1048576' unit='KiB' nodeset='0'/>
+ </hugepages>
+ <locked/>
+ </memoryBacking>
+ <vcpu placement='static'>3</vcpu>
+ <cputune>
+ <vcpupin vcpu='0' cpuset='1'/>
+ <vcpupin vcpu='1' cpuset='6'/>
+ <vcpupin vcpu='2' cpuset='7'/>
+ <emulatorpin cpuset='0'/>
+ </cputune>
+ <numatune>
+ <memory mode='strict' nodeset='0'/>
+ </numatune>
+ <os>
+ <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <cpu mode='host-passthrough'>
+ <topology sockets='1' cores='3' threads='1'/>
+ <numa>
+ <cell id='0' cpus='0-2' memory='3145728' unit='KiB' memAccess='shared'/>
+ </numa>
+ </cpu>
+ <devices>
+ <interface type='vhostuser'>
+ <mac address='56:48:4f:53:54:01'/>
+ <source type='unix' path='/tmp/vhost-user1' mode='client'/>
+ <model type='virtio'/>
+ <driver name='vhost' rx_queue_size='256' />
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x10' function='0x0'/>
+ </interface>
+ <interface type='vhostuser'>
+ <mac address='56:48:4f:53:54:02'/>
+ <source type='unix' path='/tmp/vhost-user2' mode='client'/>
+ <model type='virtio'/>
+ <driver name='vhost' rx_queue_size='256' />
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x11' function='0x0'/>
+ </interface>
+ </devices>
+ </domain>
+
+
+Guest setup
+-----------
+
+
+Guest tuning
+~~~~~~~~~~~~
+
+#. Append these options to the Kernel command line:
+
+ .. code-block:: console
+
+ default_hugepagesz=1G hugepagesz=1G hugepages=1 intel_iommu=on iommu=pt isolcpus=1,2 rcu_nocbs=1,2 nohz_full=1,2
+
+#. Disable NMIs:
+
+ .. code-block:: console
+
+ echo 0 > /proc/sys/kernel/nmi_watchdog
+
+#. Exclude isolated CPU1 and CPU2 from the writeback cpumask:
+
+ .. code-block:: console
+
+ echo 1 > /sys/bus/workqueue/devices/writeback/cpumask
+
+#. Isolate CPUs from IRQs:
+
+ .. code-block:: console
+
+ clear_mask=0x6 #Isolate CPU1 and CPU2 from IRQs
+ for i in /proc/irq/*/smp_affinity
+ do
+ echo "obase=16;$(( 0x$(cat $i) & ~$clear_mask ))" | bc > $i
+ done
+
+
+DPDK build
+~~~~~~~~~~
+
+Build DPDK:
+
+ .. code-block:: console
+
+ git clone git://dpdk.org/dpdk
+ cd dpdk
+ export RTE_SDK=$PWD
+ make install T=x86_64-native-linuxapp-gcc DESTDIR=install
+
+
+Testpmd launch
+~~~~~~~~~~~~~~
+
+Probe vfio module without iommu:
+
+ .. code-block:: console
+
+ modprobe -r vfio_iommu_type1
+ modprobe -r vfio
+ modprobe vfio enable_unsafe_noiommu_mode=1
+ cat /sys/module/vfio/parameters/enable_unsafe_noiommu_mode
+ modprobe vfio-pci
+
+Bind the virtio-net devices to DPDK:
+
+ .. code-block:: console
+
+ $RTE_SDK/usertools/dpdk-devbind.py -b vfio-pci 0000:00:10.0 0000:00:11.0
+
+Start testpmd:
+
+ .. code-block:: console
+
+ $RTE_SDK/install/bin/testpmd -l 0,1,2 --socket-mem 1024 -n 4 \
+ --proc-type auto --file-prefix pg -- \
+ --portmask=3 --forward-mode=macswap --port-topology=chained \
+ --disable-hw-vlan --disable-rss -i --rxq=1 --txq=1 \
+ --rxd=256 --txd=256 --nb-cores=2 --auto-start
+
+Results template
+----------------
+
+Below template should be used when sharing results:
+
+ .. code-block:: none
+
+ Traffic Generator: <Test equipment (e.g. IXIA, Moongen, ...)>
+ Acceptable Loss: <n>%
+ Validation run time: <n>min
+ Host DPDK version/commit: <version, SHA-1>
+ Guest DPDK version/commit: <version, SHA-1>
+ Patches applied: <link to patchwork>
+ QEMU version/commit: <version>
+ Virtio features: <features (e.g. mrg_rxbuf='off', leave empty if default)>
+ CPU: <CPU model>, <CPU frequency>
+ NIC: <NIC model>
+ Result: <n> Mpps
diff --git a/doc/guides/howto/vfd.rst b/doc/guides/howto/vfd.rst
new file mode 100644
index 00000000..6f083b87
--- /dev/null
+++ b/doc/guides/howto/vfd.rst
@@ -0,0 +1,407 @@
+.. BSD LICENSE
+ Copyright(c) 2017 Intel Corporation. All rights reserved.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Intel Corporation nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+VF daemon (VFd)
+===============
+
+VFd (the VF daemon) is a mechanism which can be used to configure features on
+a VF (SR-IOV Virtual Function) without direct access to the PF (SR-IOV
+Physical Function). VFd is an *EXPERIMENTAL* feature which can only be used in
+the scenario of DPDK PF with a DPDK VF. If the PF port is driven by the Linux
+kernel driver then the VFd feature will not work. Currently VFd is only
+supported by the ixgbe and i40e drivers.
+
+In general VF features cannot be configured directly by an end user
+application since they are under the control of the PF. The normal approach to
+configuring a feature on a VF is that an application would call the APIs
+provided by the VF driver. If the required feature cannot be configured by the
+VF directly (the most common case) the VF sends a message to the PF through
+the mailbox on ixgbe and i40e. This means that the availability of the feature
+depends on whether the appropriate mailbox messages are defined.
+
+DPDK leverages the mailbox interface defined by the Linux kernel driver so
+that compatibility with the kernel driver can be guaranteed. The downside of
+this approach is that the availability of messages supported by the kernel
+become a limitation when the user wants to configure features on the VF.
+
+VFd is a new method of controlling the features on a VF. The VF driver doesn't
+talk directly to the PF driver when configuring a feature on the VF. When a VF
+application (i.e., an application using the VF ports) wants to enable a VF
+feature, it can send a message to the PF application (i.e., the application
+using the PF port, which can be the same as the VF application). The PF
+application will configure the feature for the VF. Obviously, the PF
+application can also configure the VF features without a request from the VF
+application.
+
+.. _VF_daemon_overview:
+
+.. figure:: img/vf_daemon_overview.*
+
+ VF daemon (VFd) Overview
+
+Compared with the traditional approach the VFd moves the negotiation between
+VF and PF from the driver level to application level. So the application
+should define how the negotiation between the VF and PF works, or even if the
+control should be limited to the PF.
+
+It is the application's responsibility to use VFd. Consider for example a KVM
+migration, the VF application may transfer from one VM to another. It is
+recommended in this case that the PF control the VF features without
+participation from the VF. Then the VF application has no capability to
+configure the features. So the user doesn't need to define the interface
+between the VF application and the PF application. The service provider should
+take the control of all the features.
+
+The following sections describe the VFd functionality.
+
+.. Note::
+
+ Although VFd is supported by both ixgbe and i40e, please be aware that
+ since the hardware capability is different, the functions supported by
+ ixgbe and i40e are not the same.
+
+
+Preparing
+---------
+
+VFd only can be used in the scenario of DPDK PF + DPDK VF. Users should bind
+the PF port to ``igb_uio``, then create the VFs based on the DPDK PF host.
+
+The typical procedure to achieve this is as follows:
+
+#. Boot the system without iommu, or with ``iommu=pt``.
+
+#. Bind the PF port to ``igb_uio``, for example::
+
+ dpdk-devbind.py -b igb_uio 01:00.0
+
+#. Create a Virtual Function::
+
+ echo 1 > /sys/bus/pci/devices/0000:01:00.0/max_vfs
+
+#. Start a VM with the new VF port bypassed to it.
+
+#. Run a DPDK application on the PF in the host::
+
+ testpmd -l 0-7 -n 4 -- -i --txqflags=0
+
+#. Bind the VF port to ``igb_uio`` in the VM::
+
+ dpdk-devbind.py -b igb_uio 03:00.0
+
+#. Run a DPDK application on the VF in the VM::
+
+ testpmd -l 0-7 -n 4 -- -i --txqflags=0
+
+
+Common functions of IXGBE and I40E
+----------------------------------
+
+The following sections show how to enable PF/VF functionality based on the
+above testpmd setup.
+
+
+TX loopback
+~~~~~~~~~~~
+
+Run a testpmd runtime command on the PF to set TX loopback::
+
+ set tx loopback 0 on|off
+
+This sets whether the PF port and all the VF ports that belong to it are
+allowed to send the packets to other virtual ports.
+
+Although it is a VFd function, it is the global setting for the whole
+physical port. When using this function, the PF and all the VFs TX loopback
+will be enabled/disabled.
+
+
+VF MAC address setting
+~~~~~~~~~~~~~~~~~~~~~~
+
+Run a testpmd runtime command on the PF to set the MAC address for a VF port::
+
+ set vf mac addr 0 0 A0:36:9F:7B:C3:51
+
+This testpmd runtime command will change the MAC address of the VF port to
+this new address. If any other addresses are set before, they will be
+overwritten.
+
+
+VF MAC anti-spoofing
+~~~~~~~~~~~~~~~~~~~~
+
+Run a testpmd runtime command on the PF to enable/disable the MAC
+anti-spoofing for a VF port::
+
+ set vf mac antispoof 0 0 on|off
+
+When enabling the MAC anti-spoofing, the port will not forward packets whose
+source MAC address is not the same as the port.
+
+
+VF VLAN anti-spoofing
+~~~~~~~~~~~~~~~~~~~~~
+
+Run a testpmd runtime command on the PF to enable/disable the VLAN
+anti-spoofing for a VF port::
+
+ set vf vlan antispoof 0 0 on|off
+
+When enabling the VLAN anti-spoofing, the port will not send packets whose
+VLAN ID does not belong to VLAN IDs that this port can receive.
+
+
+VF VLAN insertion
+~~~~~~~~~~~~~~~~~
+
+Run a testpmd runtime command on the PF to set the VLAN insertion for a VF
+port::
+
+ set vf vlan insert 0 0 1
+
+When using this testpmd runtime command, an assigned VLAN ID can be inserted
+to the transmitted packets by the hardware.
+
+The assigned VLAN ID can be 0. It means disabling the VLAN insertion.
+
+
+VF VLAN stripping
+~~~~~~~~~~~~~~~~~
+
+Run a testpmd runtime command on the PF to enable/disable the VLAN stripping
+for a VF port::
+
+ set vf vlan stripq 0 0 on|off
+
+This testpmd runtime command is used to enable/disable the RX VLAN stripping
+for a specific VF port.
+
+
+VF VLAN filtering
+~~~~~~~~~~~~~~~~~
+
+Run a testpmd runtime command on the PF to set the VLAN filtering for a VF
+port::
+
+ rx_vlan add 1 port 0 vf 1
+ rx_vlan rm 1 port 0 vf 1
+
+These two testpmd runtime commands can be used to add or remove the VLAN
+filter for several VF ports. When the VLAN filters are added only the packets
+that have the assigned VLAN IDs can be received. Other packets will be dropped
+by hardware.
+
+
+The IXGBE specific VFd functions
+--------------------------------
+
+The functions in this section are specific to the ixgbe driver.
+
+
+All queues drop
+~~~~~~~~~~~~~~~
+
+Run a testpmd runtime command on the PF to enable/disable the all queues
+drop::
+
+ set all queues drop on|off
+
+This is a global setting for the PF and all the VF ports of the physical port.
+
+Enabling the ``all queues drop`` feature means that when there is no available
+descriptor for the received packets they are dropped. The ``all queues drop``
+feature should be enabled in SR-IOV mode to avoid one queue blocking others.
+
+
+VF packet drop
+~~~~~~~~~~~~~~
+
+Run a testpmd runtime command on the PF to enable/disable the packet drop for
+a specific VF::
+
+ set vf split drop 0 0 on|off
+
+This is a similar function as ``all queues drop``. The difference is that this
+function is per VF setting and the previous function is a global setting.
+
+
+VF rate limit
+~~~~~~~~~~~~~
+
+Run a testpmd runtime command on the PF to all queues' rate limit for a
+specific VF::
+
+ set port 0 vf 0 rate 10 queue_mask 1
+
+This is a function to set the rate limit for all the queues in the
+``queue_mask`` bitmap. It is not used to set the summary of the rate
+limit. The rate limit of every queue will be set equally to the assigned rate
+limit.
+
+
+VF RX enabling
+~~~~~~~~~~~~~~
+
+Run a testpmd runtime command on the PF to enable/disable packet receiving for
+a specific VF::
+
+ set port 0 vf 0 rx on|off
+
+This function can be used to stop/start packet receiving on a VF.
+
+
+VF TX enabling
+~~~~~~~~~~~~~~
+
+Run a testpmd runtime command on the PF to enable/disable packet transmitting
+for a specific VF::
+
+ set port 0 vf 0 tx on|off
+
+This function can be used to stop/start packet transmitting on a VF.
+
+
+VF RX mode setting
+~~~~~~~~~~~~~~~~~~
+
+Run a testpmd runtime command on the PF to set the RX mode for a specific VF::
+
+ set port 0 vf 0 rxmode AUPE|ROPE|BAM|MPE on|off
+
+This function can be used to enable/disable some RX modes on the VF, including:
+
+* If it accept untagged packets.
+* If it accepts packets matching the MAC filters.
+* If it accept MAC broadcast packets,
+* If it enables MAC multicast promiscuous mode.
+
+
+The I40E specific VFd functions
+-------------------------------
+
+The functions in this section are specific to the i40e driver.
+
+
+VF statistics
+~~~~~~~~~~~~~
+
+This provides an API to get the a specific VF's statistic from PF.
+
+
+VF statistics resetting
+~~~~~~~~~~~~~~~~~~~~~~~
+
+This provides an API to rest the a specific VF's statistic from PF.
+
+
+VF link status change notification
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This provide an API to let a specific VF know if the physical link status
+changed.
+
+Normally if a VF received this notification, the driver should notify the
+application to reset the VF port.
+
+
+VF MAC broadcast setting
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+Run a testpmd runtime command on the PF to enable/disable MAC broadcast packet
+receiving for a specific VF::
+
+ set vf broadcast 0 0 on|off
+
+
+VF MAC multicast promiscuous mode
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Run a testpmd runtime command on the PF to enable/disable MAC multicast
+promiscuous mode for a specific VF::
+
+ set vf allmulti 0 0 on|off
+
+
+VF MAC unicast promiscuous mode
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Run a testpmd runtime command on the PF to enable/disable MAC unicast
+promiscuous mode for a specific VF::
+
+ set vf promisc 0 0 on|off
+
+
+VF max bandwidth
+~~~~~~~~~~~~~~~~
+
+Run a testpmd runtime command on the PF to set the TX maximum bandwidth for a
+specific VF::
+
+ set vf tx max-bandwidth 0 0 2000
+
+The maximum bandwidth is an absolute value in Mbps.
+
+
+VF TC bandwidth allocation
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Run a testpmd runtime command on the PF to set the TCs (traffic class) TX
+bandwidth allocation for a specific VF::
+
+ set vf tc tx min-bandwidth 0 0 (20,20,20,40)
+
+The allocated bandwidth should be set for all the TCs. The allocated bandwidth
+is a relative value as a percentage. The sum of all the bandwidth should
+be 100.
+
+
+VF TC max bandwidth
+~~~~~~~~~~~~~~~~~~~
+
+Run a testpmd runtime command on the PF to set the TCs TX maximum bandwidth
+for a specific VF::
+
+ set vf tc tx max-bandwidth 0 0 0 10000
+
+The maximum bandwidth is an absolute value in Mbps.
+
+
+TC strict priority scheduling
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Run a testpmd runtime command on the PF to enable/disable several TCs TX
+strict priority scheduling::
+
+ set tx strict-link-priority 0 0x3
+
+The 0 in the TC bitmap means disabling the strict priority scheduling for this
+TC. To enable use a value of 1.
diff --git a/doc/guides/howto/virtio_user_as_exceptional_path.rst b/doc/guides/howto/virtio_user_as_exceptional_path.rst
new file mode 100644
index 00000000..0bbcd3fd
--- /dev/null
+++ b/doc/guides/howto/virtio_user_as_exceptional_path.rst
@@ -0,0 +1,142 @@
+.. BSD LICENSE
+ Copyright(c) 2016 Intel Corporation. All rights reserved.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Intel Corporation nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+.. _virtio_user_as_excpetional_path:
+
+Virtio_user as Exceptional Path
+===============================
+
+The virtual device, virtio-user, was originally introduced with vhost-user
+backend, as a high performance solution for IPC (Inter-Process Communication)
+and user space container networking.
+
+Virtio_user with vhost-kernel backend is a solution for exceptional path,
+such as KNI which exchanges packets with kernel networking stack. This
+solution is very promising in:
+
+* Maintenance
+
+ All kernel modules needed by this solution, vhost and vhost-net (kernel),
+ are upstreamed and extensively used kernel module.
+
+* Features
+
+ vhost-net is born to be a networking solution, which has lots of networking
+ related featuers, like multi queue, tso, multi-seg mbuf, etc.
+
+* Performance
+
+ similar to KNI, this solution would use one or more kthreads to
+ send/receive packets from user space DPDK applications, which has little
+ impact on user space polling thread (except that it might enter into kernel
+ space to wake up those kthreads if necessary).
+
+The overview of an application using virtio-user as exceptional path is shown
+in :numref:`figure_virtio_user_as_exceptional_path`.
+
+.. _figure_virtio_user_as_exceptional_path:
+
+.. figure:: img/virtio_user_as_exceptional_path.*
+
+ Overview of a DPDK app using virtio-user as excpetional path
+
+
+Sample Usage
+------------
+
+As a prerequisite, the vhost/vhost-net kernel CONFIG should be chosen before
+compiling the kernel and those kernel modules should be inserted.
+
+#. Compile DPDK and bind a physical NIC to igb_uio/uio_pci_generic/vfio-pci.
+
+ This physical NIC is for communicating with outside.
+
+#. Run testpmd.
+
+ .. code-block:: console
+
+ $(testpmd) -l 2-3 -n 4 \
+ --vdev=virtio_user0,path=/dev/vhost-net,queue_size=1024 \
+ -- -i --txqflags=0x0 --disable-hw-vlan --enable-lro \
+ --enable-rx-cksum --rxd=1024 --txd=1024
+
+ This command runs testpmd with two ports, one physical NIC to communicate
+ with outside, and one virtio-user to communicate with kernel.
+
+* ``--enable-lro``
+
+ This is used to negotiate VIRTIO_NET_F_GUEST_TSO4 and
+ VIRTIO_NET_F_GUEST_TSO6 feature so that large packets from kernel can be
+ transmitted DPDK application and further TSOed by physical NIC.
+
+* ``--enable-rx-cksum``
+
+ This is used to negotiate VIRTIO_NET_F_GUEST_CSUM so that packets from
+ kernel can be deemed as valid Rx checksumed.
+
+* ``queue_size``
+
+ 256 by default. To avoid shortage of descriptors, we can increase it to 1024.
+
+* ``queues``
+
+ Number of multi-queues. Each qeueue will be served by a kthread. For example:
+
+ .. code-block:: console
+
+ $(testpmd) -l 2-3 -n 4 \
+ --vdev=virtio_user0,path=/dev/vhost-net,queues=2,queue_size=1024 \
+ -- -i --txqflags=0x0 --disable-hw-vlan --enable-lro \
+ --enable-rx-cksum --txq=2 --rxq=2 --rxd=1024 \
+ --txd=1024
+
+#. Start testpmd:
+
+ .. code-block:: console
+
+ (testpmd) start
+
+#. Configure IP address and start tap:
+
+ .. code-block:: console
+
+ ifconfig tap0 1.1.1.1/24 up
+
+.. note::
+
+ The tap device will be named tap0, tap1, etc, by kernel.
+
+Then, all traffic from physical NIC can be forwarded into kernel stack, and all
+traffic on the tap0 can be sent out from physical NIC.
+
+Limitations
+-----------
+
+This solution is only available on Linux systems.
diff --git a/doc/guides/howto/virtio_user_for_container_networking.rst b/doc/guides/howto/virtio_user_for_container_networking.rst
new file mode 100644
index 00000000..f71d0718
--- /dev/null
+++ b/doc/guides/howto/virtio_user_for_container_networking.rst
@@ -0,0 +1,144 @@
+.. BSD LICENSE
+ Copyright(c) 2016 Intel Corporation. All rights reserved.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Intel Corporation nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+.. _virtio_user_for_container_networking:
+
+Virtio_user for Container Networking
+====================================
+
+Container becomes more and more popular for strengths, like low overhead, fast
+boot-up time, and easy to deploy, etc. How to use DPDK to accelerate container
+networking becomes a common question for users. There are two use models of
+running DPDK inside containers, as shown in
+:numref:`figure_use_models_for_running_dpdk_in_containers`.
+
+.. _figure_use_models_for_running_dpdk_in_containers:
+
+.. figure:: img/use_models_for_running_dpdk_in_containers.*
+
+ Use models of running DPDK inside container
+
+This page will only cover aggregation model.
+
+Overview
+--------
+
+The virtual device, virtio-user, with unmodified vhost-user backend, is designed
+for high performance user space container networking or inter-process
+communication (IPC).
+
+The overview of accelerating container networking by virtio-user is shown
+in :numref:`figure_virtio_user_for_container_networking`.
+
+.. _figure_virtio_user_for_container_networking:
+
+.. figure:: img/virtio_user_for_container_networking.*
+
+ Overview of accelerating container networking by virtio-user
+
+Different virtio PCI devices we usually use as a para-virtualization I/O in the
+context of QEMU/VM, the basic idea here is to present a kind of virtual devices,
+which can be attached and initialized by DPDK. The device emulation layer by
+QEMU in VM's context is saved by just registering a new kind of virtual device
+in DPDK's ether layer. And to minimize the change, we reuse already-existing
+virtio PMD code (driver/net/virtio/).
+
+Virtio, in essence, is a shm-based solution to transmit/receive packets. How is
+memory shared? In VM's case, qemu always shares the whole physical layout of VM
+to vhost backend. But it's not feasible for a container, as a process, to share
+all virtual memory regions to backend. So only those virtual memory regions
+(aka, hugepages initialized in DPDK) are sent to backend. It restricts that only
+addresses in these areas can be used to transmit or receive packets.
+
+Sample Usage
+------------
+
+Here we use Docker as container engine. It also applies to LXC, Rocket with
+some minor changes.
+
+#. Compile DPDK.
+
+ .. code-block:: console
+
+ make install RTE_SDK=`pwd` T=x86_64-native-linuxapp-gcc
+
+#. Write a Dockerfile like below.
+
+ .. code-block:: console
+
+ cat <<EOT >> Dockerfile
+ FROM ubuntu:latest
+ WORKDIR /usr/src/dpdk
+ COPY . /usr/src/dpdk
+ ENV PATH "$PATH:/usr/src/dpdk/x86_64-native-linuxapp-gcc/app/"
+ EOT
+
+#. Build a Docker image.
+
+ .. code-block:: console
+
+ docker build -t dpdk-app-testpmd .
+
+#. Start a testpmd on the host with a vhost-user port.
+
+ .. code-block:: console
+
+ $(testpmd) -l 0-1 -n 4 --socket-mem 1024,1024 \
+ --vdev 'eth_vhost0,iface=/tmp/sock0' \
+ --file-prefix=host --no-pci -- -i
+
+#. Start a container instance with a virtio-user port.
+
+ .. code-block:: console
+
+ docker run -i -t -v /tmp/sock0:/var/run/usvhost \
+ -v /dev/hugepages:/dev/hugepages \
+ dpdk-app-testpmd testpmd -l 6-7 -n 4 -m 1024 --no-pci \
+ --vdev=virtio_user0,path=/var/run/usvhost \
+ --file-prefix=container \
+ -- -i --txqflags=0xf00 --disable-hw-vlan
+
+Note: If we run all above setup on the host, it's a shm-based IPC.
+
+Limitations
+-----------
+
+We have below limitations in this solution:
+ * Cannot work with --huge-unlink option. As we need to reopen the hugepage
+ file to share with vhost backend.
+ * Cannot work with --no-huge option. Currently, DPDK uses anonymous mapping
+ under this option which cannot be reopened to share with vhost backend.
+ * Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8) hugepages.
+ In another word, do not use 2MB hugepage so far.
+ * Applications should not use file name like HUGEFILE_FMT ("%smap_%d"). That
+ will bring confusion when sharing hugepage files with backend by name.
+ * Root privilege is a must. DPDK resolves physical addresses of hugepages
+ which seems not necessary, and some discussions are going on to remove this
+ restriction.