aboutsummaryrefslogtreecommitdiffstats
path: root/doc/guides/sample_app_ug
diff options
context:
space:
mode:
Diffstat (limited to 'doc/guides/sample_app_ug')
-rw-r--r--doc/guides/sample_app_ug/img/l2_fwd_vm2vm.svg311
-rw-r--r--doc/guides/sample_app_ug/img/qemu_virtio_net.pngbin31557 -> 0 bytes
-rw-r--r--doc/guides/sample_app_ug/img/tx_dpdk_testpmd.pngbin76019 -> 0 bytes
-rw-r--r--doc/guides/sample_app_ug/img/vhost_net_arch.pngbin154920 -> 0 bytes
-rw-r--r--doc/guides/sample_app_ug/img/vhost_net_sample_app.pngbin23800 -> 0 bytes
-rw-r--r--doc/guides/sample_app_ug/img/virtio_linux_vhost.pngbin30290 -> 0 bytes
-rw-r--r--doc/guides/sample_app_ug/index.rst16
-rw-r--r--doc/guides/sample_app_ug/ipsec_secgw.rst852
-rw-r--r--doc/guides/sample_app_ug/l2_forward_real_virtual.rst31
-rw-r--r--doc/guides/sample_app_ug/l3_forward.rst2
-rw-r--r--doc/guides/sample_app_ug/pdump.rst144
-rw-r--r--doc/guides/sample_app_ug/proc_info.rst71
-rw-r--r--doc/guides/sample_app_ug/tep_termination.rst54
-rw-r--r--doc/guides/sample_app_ug/vhost.rst880
14 files changed, 827 insertions, 1534 deletions
diff --git a/doc/guides/sample_app_ug/img/l2_fwd_vm2vm.svg b/doc/guides/sample_app_ug/img/l2_fwd_vm2vm.svg
new file mode 100644
index 00000000..b84dcb27
--- /dev/null
+++ b/doc/guides/sample_app_ug/img/l2_fwd_vm2vm.svg
@@ -0,0 +1,311 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+ 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="554.46204"
+ height="443.63278"
+ viewBox="0 0 554.46204 443.63279"
+ id="svg3917"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="l2_fwd_vm2vm.svg">
+ <defs
+ id="defs3919">
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker8020"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Lend">
+ <path
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
+ id="path8022"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker7177"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Lend">
+ <path
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
+ id="path7179"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker6025"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Lend">
+ <path
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
+ id="path6027"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend"
+ style="overflow:visible"
+ inkscape:isstock="true"
+ inkscape:collect="always">
+ <path
+ id="path5351"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ 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="path5348"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <inkscape:path-effect
+ effect="powerstroke"
+ id="path-effect4780"
+ is_visible="true"
+ offset_points="0,0.5"
+ sort_points="true"
+ interpolator_type="Linear"
+ interpolator_beta="0.2"
+ start_linecap_type="zerowidth"
+ linejoin_type="round"
+ miter_limit="4"
+ end_linecap_type="zerowidth"
+ cusp_linecap_type="round" />
+ <linearGradient
+ id="linearGradient4729"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop4731" />
+ </linearGradient>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-5"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5351-3"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;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-6"
+ style="overflow:visible"
+ inkscape:isstock="true"
+ inkscape:collect="always">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5351-2"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;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-6-1"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5351-2-2"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;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="1"
+ inkscape:cx="323.29803"
+ inkscape:cy="27.634604"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:snap-nodes="false"
+ inkscape:snap-bbox="true"
+ inkscape:window-width="1276"
+ inkscape:window-height="1400"
+ inkscape:window-x="1280"
+ inkscape:window-y="38"
+ inkscape:window-maximized="0"
+ units="px"
+ fit-margin-top="5"
+ fit-margin-left="5"
+ fit-margin-right="5"
+ fit-margin-bottom="5" />
+ <metadata
+ id="metadata3922">
+ <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(-0.56091356,-0.34416246)">
+ <rect
+ style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:2.10537624;stroke-opacity:1"
+ id="rect4727"
+ width="542.35669"
+ height="431.5274"
+ x="6.6136017"
+ y="6.3968506" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:30.53249741px;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="237.30467"
+ y="33.252548"
+ id="text4735"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4737"
+ x="237.30467"
+ y="33.252548">Host</tspan></text>
+ <rect
+ style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1"
+ id="rect4739"
+ width="207.08128"
+ height="202.03053"
+ x="38.385803"
+ y="45.240112" />
+ <rect
+ style="fill:none;fill-opacity:1;stroke:#000000;stroke-opacity:1"
+ id="rect4739-3"
+ width="207.08128"
+ height="202.03053"
+ x="301.53052"
+ y="44.22995" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:19.96650314px;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="101.13004"
+ y="63.706543"
+ id="text4756"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4758"
+ x="101.13004"
+ y="63.706543">Guest1</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:19.96650314px;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="369.73492"
+ y="63.619873"
+ id="text4756-6"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4758-7"
+ x="369.73492"
+ y="63.619873">Guest2</tspan></text>
+ <rect
+ style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect5336"
+ width="477.80215"
+ height="85.862968"
+ x="39.39595"
+ y="316.97116" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:23.81648636px;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="237.96404"
+ y="398.79352"
+ id="text5338"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5340"
+ x="237.96404"
+ y="398.79352">L2FWD</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.9760201px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+ d="m 120.20815,247.27063 0,68.32236"
+ id="path5342"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.9760201px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-5)"
+ d="m 382.84782,246.56645 0,68.32236"
+ id="path5342-5"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.9760201px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-6)"
+ d="m 162.63455,316.66519 0,-68.32236"
+ id="path5342-9"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.9760201px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-6-1)"
+ d="m 423.25391,315.65504 0,-68.32236"
+ id="path5342-9-7"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.60951841;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4.82855511, 1.60951837;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 119.48645,319.66266 0,47.47156 303.479,0 0,-51.26929"
+ id="path10412"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.1137104;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.3411313, 1.11371043;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 162.67537,318.28501 0,31.19206 221.14177,0 0,-33.68743"
+ id="path10412-0"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/doc/guides/sample_app_ug/img/qemu_virtio_net.png b/doc/guides/sample_app_ug/img/qemu_virtio_net.png
deleted file mode 100644
index a852c166..00000000
--- a/doc/guides/sample_app_ug/img/qemu_virtio_net.png
+++ /dev/null
Binary files differ
diff --git a/doc/guides/sample_app_ug/img/tx_dpdk_testpmd.png b/doc/guides/sample_app_ug/img/tx_dpdk_testpmd.png
deleted file mode 100644
index 656e17b8..00000000
--- a/doc/guides/sample_app_ug/img/tx_dpdk_testpmd.png
+++ /dev/null
Binary files differ
diff --git a/doc/guides/sample_app_ug/img/vhost_net_arch.png b/doc/guides/sample_app_ug/img/vhost_net_arch.png
deleted file mode 100644
index 3008feef..00000000
--- a/doc/guides/sample_app_ug/img/vhost_net_arch.png
+++ /dev/null
Binary files differ
diff --git a/doc/guides/sample_app_ug/img/vhost_net_sample_app.png b/doc/guides/sample_app_ug/img/vhost_net_sample_app.png
deleted file mode 100644
index c7a181b2..00000000
--- a/doc/guides/sample_app_ug/img/vhost_net_sample_app.png
+++ /dev/null
Binary files differ
diff --git a/doc/guides/sample_app_ug/img/virtio_linux_vhost.png b/doc/guides/sample_app_ug/img/virtio_linux_vhost.png
deleted file mode 100644
index 06142699..00000000
--- a/doc/guides/sample_app_ug/img/virtio_linux_vhost.png
+++ /dev/null
Binary files differ
diff --git a/doc/guides/sample_app_ug/index.rst b/doc/guides/sample_app_ug/index.rst
index 96bb3179..775e2f70 100644
--- a/doc/guides/sample_app_ug/index.rst
+++ b/doc/guides/sample_app_ug/index.rst
@@ -28,8 +28,8 @@
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-Sample Applications User Guide
-==============================
+Sample Applications User Guides
+===============================
.. toctree::
:maxdepth: 2
@@ -72,11 +72,9 @@ Sample Applications User Guide
dist_app
vm_power_management
tep_termination
- proc_info
ptpclient
performance_thread
ipsec_secgw
- pdump
**Figures**
@@ -120,16 +118,6 @@ Sample Applications User Guide
:numref:`figure_vmdq_dcb_example` :ref:`figure_vmdq_dcb_example`
-:numref:`figure_qemu_virtio_net` :ref:`figure_qemu_virtio_net`
-
-:numref:`figure_virtio_linux_vhost` :ref:`figure_virtio_linux_vhost`
-
-:numref:`figure_vhost_net_arch` :ref:`figure_vhost_net_arch`
-
-:numref:`figure_vhost_net_sample_app` :ref:`figure_vhost_net_sample_app`
-
-:numref:`figure_tx_dpdk_testpmd` :ref:`figure_tx_dpdk_testpmd`
-
:numref:`figure_test_pipeline_app` :ref:`figure_test_pipeline_app`
:numref:`figure_dist_perf` :ref:`figure_dist_perf`
diff --git a/doc/guides/sample_app_ug/ipsec_secgw.rst b/doc/guides/sample_app_ug/ipsec_secgw.rst
index fcb33c26..885c77e3 100644
--- a/doc/guides/sample_app_ug/ipsec_secgw.rst
+++ b/doc/guides/sample_app_ug/ipsec_secgw.rst
@@ -79,7 +79,7 @@ Constraints
* No IPv6 options headers.
* No AH mode.
-* Currently only EAS-CBC, HMAC-SHA1 and NULL.
+* Supported algorithms: AES-CBC, AES-CTR, AES-GCM, HMAC-SHA1 and NULL.
* Each SA must be handle by a unique lcore (*1 RX queue per port*).
* No chained mbufs.
@@ -122,7 +122,7 @@ The application has a number of command line options::
-p PORTMASK -P -u PORTMASK
--config (port,queue,lcore)[,(port,queue,lcore]
--single-sa SAIDX
- --ep0|--ep1
+ -f CONFIG_FILE_PATH
Where:
@@ -142,14 +142,11 @@ Where:
on both Inbound and Outbound. This option is meant for debugging/performance
purposes.
-* ``--ep0``: configure the app as Endpoint 0.
+* ``-f CONFIG_FILE_PATH``: the full path of text-based file containing all
+ configuration items for running the application (See Configuration file
+ syntax section below). ``-f CONFIG_FILE_PATH`` **must** be specified.
+ **ONLY** the UNIX format configuration file is accepted.
-* ``--ep1``: configure the app as Endpoint 1.
-
-Either one of ``--ep0`` or ``--ep1`` **must** be specified.
-The main purpose of these options is to easily configure two systems
-back-to-back that would forward traffic through an IPsec tunnel (see
-:ref:`figure_ipsec_endpoints`).
The mapping of lcores to port/queues is similar to other l3fwd applications.
@@ -157,7 +154,8 @@ For example, given the following command line::
./build/ipsec-secgw -l 20,21 -n 4 --socket-mem 0,2048 \
--vdev "cryptodev_null_pmd" -- -p 0xf -P -u 0x3 \
- --config="(0,0,20),(1,0,20),(2,0,21),(3,0,21)" --ep0 \
+ --config="(0,0,20),(1,0,20),(2,0,21),(3,0,21)" \
+ -f /path/to/config_file \
where each options means:
@@ -194,8 +192,12 @@ where each options means:
| | | | |
+----------+-----------+-----------+---------------------------------------+
-* The ``--ep0`` options configures the app with a given set of SP, SA and Routing
- entries as explained below in more detail.
+* The ``-f /path/to/config_file`` option enables the application read and
+ parse the configuration file specified, and configures the application
+ with a given set of SP, SA and Routing entries accordingly. The syntax of
+ the configuration file will be explained below in more detail. Please
+ **note** the parser only accepts UNIX format text file. Other formats
+ such as DOS/MAC format will cause a parse error.
Refer to the *DPDK Getting Started Guide* for general information on running
applications and the Environment Abstraction Layer (EAL) options.
@@ -219,496 +221,362 @@ For example, something like the following command line:
--vdev "cryptodev_aesni_mb_pmd" --vdev "cryptodev_null_pmd" \
-- \
-p 0xf -P -u 0x3 --config="(0,0,20),(1,0,20),(2,0,21),(3,0,21)" \
- --ep0
+ -f sample.cfg
Configurations
--------------
-The following sections provide some details on the default values used to
-initialize the SP, SA and Routing tables.
-Currently all configuration information is hard coded into the application.
+The following sections provide the syntax of configurations to initialize
+your SP, SA and Routing tables.
+Configurations shall be specified in the configuration file to be passed to
+the application. The file is then parsed by the application. The successful
+parsing will result in the appropriate rules being applied to the tables
+accordingly.
-The following image illustrate a few of the concepts regarding IPSec, such
-as protected/unprotected and inbound/outbound traffic, from the point of
-view of two back-to-back endpoints:
-.. _figure_ipsec_endpoints:
+Configuration File Syntax
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-.. figure:: img/ipsec_endpoints.*
+As mention in the overview, the Security Policies are ACL rules.
+The application parsers the rules specified in the configuration file and
+passes them to the ACL table, and replicates them per socket in use.
- IPSec Inbound/Outbound traffic
+Following are the configuration file syntax.
-Note that the above image only displays unidirectional traffic per port
-for illustration purposes.
-The application supports bidirectional traffic on all ports,
+General rule syntax
+^^^^^^^^^^^^^^^^^^^
+The parse treats one line in the configuration file as one configuration
+item (unless the line concatenation symbol exists). Every configuration
+item shall follow the syntax of either SP, SA, or Routing rules specified
+below.
-Security Policy Initialization
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+The configuration parser supports the following special symbols:
-As mention in the overview, the Security Policies are ACL rules.
-The application defines two ACLs, one each of Inbound and Outbound, and
-it replicates them per socket in use.
-
-Following are the default rules which show only the relevant information,
-assuming ANY value is valid for the fields not mentioned (src ip, proto,
-src/dst ports).
-
-.. _table_ipsec_endpoint_outbound_sp:
-
-.. table:: Endpoint 0 Outbound Security Policies
-
- +-----------------------------------+------------+
- | **Dst** | **SA idx** |
- | | |
- +-----------------------------------+------------+
- | 192.168.105.0/24 | 5 |
- | | |
- +-----------------------------------+------------+
- | 192.168.106.0/24 | 6 |
- | | |
- +-----------------------------------+------------+
- | 192.168.175.0/24 | 10 |
- | | |
- +-----------------------------------+------------+
- | 192.168.176.0/24 | 11 |
- | | |
- +-----------------------------------+------------+
- | 192.168.200.0/24 | 15 |
- | | |
- +-----------------------------------+------------+
- | 192.168.201.0/24 | 16 |
- | | |
- +-----------------------------------+------------+
- | 192.168.55.0/24 | 25 |
- | | |
- +-----------------------------------+------------+
- | 192.168.56.0/24 | 26 |
- | | |
- +-----------------------------------+------------+
- | 192.168.240.0/24 | BYPASS |
- | | |
- +-----------------------------------+------------+
- | 192.168.241.0/24 | BYPASS |
- | | |
- +-----------------------------------+------------+
- | 0:0:0:0:5555:5555:0:0/96 | 5 |
- | | |
- +-----------------------------------+------------+
- | 0:0:0:0:6666:6666:0:0/96 | 6 |
- | | |
- +-----------------------------------+------------+
- | 0:0:1111:1111:0:0:0:0/96 | 10 |
- | | |
- +-----------------------------------+------------+
- | 0:0:1111:1111:1111:1111:0:0/96 | 11 |
- | | |
- +-----------------------------------+------------+
- | 0:0:0:0:aaaa:aaaa:0:0/96 | 25 |
- | | |
- +-----------------------------------+------------+
- | 0:0:0:0:bbbb:bbbb:0:0/96 | 26 |
- | | |
- +-----------------------------------+------------+
-
-.. _table_ipsec_endpoint_inbound_sp:
-
-.. table:: Endpoint 0 Inbound Security Policies
-
- +-----------------------------------+------------+
- | **Dst** | **SA idx** |
- | | |
- +-----------------------------------+------------+
- | 192.168.115.0/24 | 105 |
- | | |
- +-----------------------------------+------------+
- | 192.168.116.0/24 | 106 |
- | | |
- +-----------------------------------+------------+
- | 192.168.185.0/24 | 110 |
- | | |
- +-----------------------------------+------------+
- | 192.168.186.0/24 | 111 |
- | | |
- +-----------------------------------+------------+
- | 192.168.210.0/24 | 115 |
- | | |
- +-----------------------------------+------------+
- | 192.168.211.0/24 | 116 |
- | | |
- +-----------------------------------+------------+
- | 192.168.65.0/24 | 125 |
- | | |
- +-----------------------------------+------------+
- | 192.168.66.0/24 | 126 |
- | | |
- +-----------------------------------+------------+
- | 192.168.245.0/24 | BYPASS |
- | | |
- +-----------------------------------+------------+
- | 192.168.246.0/24 | BYPASS |
- | | |
- +-----------------------------------+------------+
- | ffff:0:0:0:5555:5555:0:0/96 | 105 |
- | | |
- +-----------------------------------+------------+
- | ffff:0:0:0:6666:6666:0:0/96 | 106 |
- | | |
- +-----------------------------------+------------+
- | ffff:0:1111:1111:0:0:0:0/96 | 110 |
- | | |
- +-----------------------------------+------------+
- | ffff:0:1111:1111:1111:1111:0:0/96 | 111 |
- | | |
- +-----------------------------------+------------+
- | ffff:0:0:0:aaaa:aaaa:0:0/96 | 125 |
- | | |
- +-----------------------------------+------------+
- | ffff:0:0:0:bbbb:bbbb:0:0/96 | 126 |
- | | |
- +-----------------------------------+------------+
-
-For Endpoint 1, we use the same policies in reverse, meaning the Inbound SP
-entries are set as Outbound and vice versa.
-
-
-Security Association Initialization
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The SAs are kept in a array table.
-
-For Inbound, the SPI is used as index modulo the table size.
-This means that on a table for 100 SA, SPI 5 and 105 would use the same index
-and that is not currently supported.
-
-Notice that it is not an issue for Outbound traffic as we store the index and
-not the SPI in the Security Policy.
-
-All SAs configured with AES-CBC and HMAC-SHA1 share the same values for cipher
-block size and key, and authentication digest size and key.
-
-The following are the default values:
-
-.. _table_ipsec_endpoint_outbound_sa:
-
-.. table:: Endpoint 0 Outbound Security Associations
-
- +---------+----------+------------+-----------+----------------+----------------+
- | **SPI** | **Mode** | **Cipher** | **Auth** | **Tunnel src** | **Tunnel dst** |
- | | | | | | |
- +---------+----------+------------+-----------+----------------+----------------+
- | 5 | Tunnel | AES-CBC | HMAC-SHA1 | 172.16.1.5 | 172.16.2.5 |
- | | | | | | |
- +---------+----------+------------+-----------+----------------+----------------+
- | 6 | Tunnel | AES-CBC | HMAC-SHA1 | 172.16.1.6 | 172.16.2.6 |
- | | | | | | |
- +---------+----------+------------+-----------+----------------+----------------+
- | 10 | Trans | AES-CBC | HMAC-SHA1 | N/A | N/A |
- | | | | | | |
- +---------+----------+------------+-----------+----------------+----------------+
- | 11 | Trans | AES-CBC | HMAC-SHA1 | N/A | N/A |
- | | | | | | |
- +---------+----------+------------+-----------+----------------+----------------+
- | 15 | Tunnel | NULL | NULL | 172.16.1.5 | 172.16.2.5 |
- | | | | | | |
- +---------+----------+------------+-----------+----------------+----------------+
- | 16 | Tunnel | NULL | NULL | 172.16.1.6 | 172.16.2.6 |
- | | | | | | |
- +---------+----------+------------+-----------+----------------+----------------+
- | 25 | Tunnel | AES-CBC | HMAC-SHA1 | 1111:1111: | 2222:2222: |
- | | | | | 1111:1111: | 2222:2222: |
- | | | | | 1111:1111: | 2222:2222: |
- | | | | | 1111:5555 | 2222:5555 |
- | | | | | | |
- +---------+----------+------------+-----------+----------------+----------------+
- | 26 | Tunnel | AES-CBC | HMAC-SHA1 | 1111:1111: | 2222:2222: |
- | | | | | 1111:1111: | 2222:2222: |
- | | | | | 1111:1111: | 2222:2222: |
- | | | | | 1111:6666 | 2222:6666 |
- | | | | | | |
- +---------+----------+------------+-----------+----------------+----------------+
-
-.. _table_ipsec_endpoint_inbound_sa:
-
-.. table:: Endpoint 0 Inbound Security Associations
-
- +---------+----------+------------+-----------+----------------+----------------+
- | **SPI** | **Mode** | **Cipher** | **Auth** | **Tunnel src** | **Tunnel dst** |
- | | | | | | |
- +---------+----------+------------+-----------+----------------+----------------+
- | 105 | Tunnel | AES-CBC | HMAC-SHA1 | 172.16.2.5 | 172.16.1.5 |
- | | | | | | |
- +---------+----------+------------+-----------+----------------+----------------+
- | 106 | Tunnel | AES-CBC | HMAC-SHA1 | 172.16.2.6 | 172.16.1.6 |
- | | | | | | |
- +---------+----------+------------+-----------+----------------+----------------+
- | 110 | Trans | AES-CBC | HMAC-SHA1 | N/A | N/A |
- | | | | | | |
- +---------+----------+------------+-----------+----------------+----------------+
- | 111 | Trans | AES-CBC | HMAC-SHA1 | N/A | N/A |
- | | | | | | |
- +---------+----------+------------+-----------+----------------+----------------+
- | 115 | Tunnel | NULL | NULL | 172.16.2.5 | 172.16.1.5 |
- | | | | | | |
- +---------+----------+------------+-----------+----------------+----------------+
- | 116 | Tunnel | NULL | NULL | 172.16.2.6 | 172.16.1.6 |
- | | | | | | |
- +---------+----------+------------+-----------+----------------+----------------+
- | 125 | Tunnel | AES-CBC | HMAC-SHA1 | 2222:2222: | 1111:1111: |
- | | | | | 2222:2222: | 1111:1111: |
- | | | | | 2222:2222: | 1111:1111: |
- | | | | | 2222:5555 | 1111:5555 |
- | | | | | | |
- +---------+----------+------------+-----------+----------------+----------------+
- | 126 | Tunnel | AES-CBC | HMAC-SHA1 | 2222:2222: | 1111:1111: |
- | | | | | 2222:2222: | 1111:1111: |
- | | | | | 2222:2222: | 1111:1111: |
- | | | | | 2222:6666 | 1111:6666 |
- | | | | | | |
- +---------+----------+------------+-----------+----------------+----------------+
-
-For Endpoint 1, we use the same policies in reverse, meaning the Inbound SP
-entries are set as Outbound and vice versa.
-
-
-Routing Initialization
-~~~~~~~~~~~~~~~~~~~~~~
-
-The Routing is implemented using an LPM table.
-
-Following default values:
-
-.. _table_ipsec_endpoint_outbound_routing:
-
-.. table:: Endpoint 0 Routing Table
-
- +------------------+----------+
- | **Dst addr** | **Port** |
- | | |
- +------------------+----------+
- | 172.16.2.5/32 | 0 |
- | | |
- +------------------+----------+
- | 172.16.2.6/32 | 1 |
- | | |
- +------------------+----------+
- | 192.168.175.0/24 | 0 |
- | | |
- +------------------+----------+
- | 192.168.176.0/24 | 1 |
- | | |
- +------------------+----------+
- | 192.168.240.0/24 | 0 |
- | | |
- +------------------+----------+
- | 192.168.241.0/24 | 1 |
- | | |
- +------------------+----------+
- | 192.168.115.0/24 | 2 |
- | | |
- +------------------+----------+
- | 192.168.116.0/24 | 3 |
- | | |
- +------------------+----------+
- | 192.168.65.0/24 | 2 |
- | | |
- +------------------+----------+
- | 192.168.66.0/24 | 3 |
- | | |
- +------------------+----------+
- | 192.168.185.0/24 | 2 |
- | | |
- +------------------+----------+
- | 192.168.186.0/24 | 3 |
- | | |
- +------------------+----------+
- | 192.168.210.0/24 | 2 |
- | | |
- +------------------+----------+
- | 192.168.211.0/24 | 3 |
- | | |
- +------------------+----------+
- | 192.168.245.0/24 | 2 |
- | | |
- +------------------+----------+
- | 192.168.246.0/24 | 3 |
- | | |
- +------------------+----------+
- | 2222:2222: | 0 |
- | 2222:2222: | |
- | 2222:2222: | |
- | 2222:5555/116 | |
- | | |
- +------------------+----------+
- | 2222:2222: | 1 |
- | 2222:2222: | |
- | 2222:2222: | |
- | 2222:6666/116 | |
- | | |
- +------------------+----------+
- | 0000:0000: | 0 |
- | 1111:1111: | |
- | 0000:0000: | |
- | 0000:0000/116 | |
- | | |
- +------------------+----------+
- | 0000:0000: | 1 |
- | 1111:1111: | |
- | 1111:1111: | |
- | 0000:0000/116 | |
- | | |
- +------------------+----------+
- | ffff:0000: | 2 |
- | 0000:0000: | |
- | aaaa:aaaa: | |
- | 0000:0/116 | |
- | | |
- +------------------+----------+
- | ffff:0000: | 3 |
- | 0000:0000: | |
- | bbbb:bbbb: | |
- | 0000:0/116 | |
- | | |
- +------------------+----------+
- | ffff:0000: | 2 |
- | 0000:0000: | |
- | 5555:5555: | |
- | 0000:0/116 | |
- | | |
- +------------------+----------+
- | ffff:0000: | 3 |
- | 0000:0000: | |
- | 6666:6666: | |
- | 0000:0/116 | |
- | | |
- +------------------+----------+
- | ffff:0000: | 2 |
- | 1111:1111: | |
- | 0000:0000: | |
- | 0000:0000/116 | |
- | | |
- +------------------+----------+
- | ffff:0000: | 3 |
- | 1111:1111: | |
- | 1111:1111: | |
- | 0000:0000/116 | |
- | | |
- +------------------+----------+
-
-.. _table_ipsec_endpoint_inbound_routing:
-
-.. table:: Endpoint 1 Routing Table
-
- +------------------+----------+
- | **Dst addr** | **Port** |
- | | |
- +------------------+----------+
- | 172.16.1.5/32 | 0 |
- | | |
- +------------------+----------+
- | 172.16.1.6/32 | 1 |
- | | |
- +------------------+----------+
- | 192.168.185.0/24 | 0 |
- | | |
- +------------------+----------+
- | 192.168.186.0/24 | 1 |
- | | |
- +------------------+----------+
- | 192.168.245.0/24 | 0 |
- | | |
- +------------------+----------+
- | 192.168.246.0/24 | 1 |
- | | |
- +------------------+----------+
- | 192.168.105.0/24 | 2 |
- | | |
- +------------------+----------+
- | 192.168.106.0/24 | 3 |
- | | |
- +------------------+----------+
- | 192.168.55.0/24 | 2 |
- | | |
- +------------------+----------+
- | 192.168.56.0/24 | 3 |
- | | |
- +------------------+----------+
- | 192.168.175.0/24 | 2 |
- | | |
- +------------------+----------+
- | 192.168.176.0/24 | 3 |
- | | |
- +------------------+----------+
- | 192.168.200.0/24 | 2 |
- | | |
- +------------------+----------+
- | 192.168.201.0/24 | 3 |
- | | |
- +------------------+----------+
- | 192.168.240.0/24 | 2 |
- | | |
- +------------------+----------+
- | 192.168.241.0/24 | 3 |
- | | |
- +------------------+----------+
- | 1111:1111: | 0 |
- | 1111:1111: | |
- | 1111:1111: | |
- | 1111:5555/116 | |
- | | |
- +------------------+----------+
- | 1111:1111: | 1 |
- | 1111:1111: | |
- | 1111:1111: | |
- | 1111:6666/116 | |
- | | |
- +------------------+----------+
- | ffff:0000: | 0 |
- | 1111:1111: | |
- | 0000:0000: | |
- | 0000:0000/116 | |
- | | |
- +------------------+----------+
- | ffff:0000: | 1 |
- | 1111:1111: | |
- | 1111:1111: | |
- | 0000:0000/116 | |
- | | |
- +------------------+----------+
- | 0000:0000: | 2 |
- | 0000:0000: | |
- | aaaa:aaaa: | |
- | 0000:0/116 | |
- | | |
- +------------------+----------+
- | 0000:0000: | 3 |
- | 0000:0000: | |
- | bbbb:bbbb: | |
- | 0000:0/116 | |
- | | |
- +------------------+----------+
- | 0000:0000: | 2 |
- | 0000:0000: | |
- | 5555:5555: | |
- | 0000:0/116 | |
- | | |
- +------------------+----------+
- | 0000:0000: | 3 |
- | 0000:0000: | |
- | 6666:6666: | |
- | 0000:0/116 | |
- | | |
- +------------------+----------+
- | 0000:0000: | 2 |
- | 1111:1111: | |
- | 0000:0000: | |
- | 0000:0000/116 | |
- | | |
- +------------------+----------+
- | 0000:0000: | 3 |
- | 1111:1111: | |
- | 1111:1111: | |
- | 0000:0000/116 | |
- | | |
- +------------------+----------+
+ * Comment symbol **#**. Any character from this symbol to the end of
+ line is treated as comment and will not be parsed.
+
+ * Line concatenation symbol **\\**. This symbol shall be placed in the end
+ of the line to be concatenated to the line below. Multiple lines'
+ concatenation is supported.
+
+
+SP rule syntax
+^^^^^^^^^^^^^^
+
+The SP rule syntax is shown as follows:
+
+.. code-block:: console
+
+ sp <ip_ver> <dir> esp <action> <priority> <src_ip> <dst_ip>
+ <proto> <sport> <dport>
+
+
+where each options means:
+
+``<ip_ver>``
+
+ * IP protocol version
+
+ * Optional: No
+
+ * Available options:
+
+ * *ipv4*: IP protocol version 4
+ * *ipv6*: IP protocol version 6
+
+``<dir>``
+
+ * The traffic direction
+
+ * Optional: No
+
+ * Available options:
+
+ * *in*: inbound traffic
+ * *out*: outbound traffic
+
+``<action>``
+
+ * IPsec action
+
+ * Optional: No
+
+ * Available options:
+
+ * *protect <SA_idx>*: the specified traffic is protected by SA rule
+ with id SA_idx
+ * *bypass*: the specified traffic traffic is bypassed
+ * *discard*: the specified traffic is discarded
+
+``<priority>``
+
+ * Rule priority
+
+ * Optional: Yes, default priority 0 will be used
+
+ * Syntax: *pri <id>*
+
+``<src_ip>``
+
+ * The source IP address and mask
+
+ * Optional: Yes, default address 0.0.0.0 and mask of 0 will be used
+
+ * Syntax:
+
+ * *src X.X.X.X/Y* for IPv4
+ * *src XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX/Y* for IPv6
+
+``<dst_ip>``
+
+ * The destination IP address and mask
+
+ * Optional: Yes, default address 0.0.0.0 and mask of 0 will be used
+
+ * Syntax:
+
+ * *dst X.X.X.X/Y* for IPv4
+ * *dst XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX/Y* for IPv6
+
+``<proto>``
+
+ * The protocol start and end range
+
+ * Optional: yes, default range of 0 to 0 will be used
+
+ * Syntax: *proto X:Y*
+
+``<sport>``
+
+ * The source port start and end range
+
+ * Optional: yes, default range of 0 to 0 will be used
+
+ * Syntax: *sport X:Y*
+
+``<dport>``
+
+ * The destination port start and end range
+
+ * Optional: yes, default range of 0 to 0 will be used
+
+ * Syntax: *dport X:Y*
+
+Example SP rules:
+
+.. code-block:: console
+
+ sp ipv4 out esp protect 105 pri 1 dst 192.168.115.0/24 sport 0:65535 \
+ dport 0:65535
+
+ sp ipv6 in esp bypass pri 1 dst 0000:0000:0000:0000:5555:5555:\
+ 0000:0000/96 sport 0:65535 dport 0:65535
+
+
+SA rule syntax
+^^^^^^^^^^^^^^
+
+The successfully parsed SA rules will be stored in an array table.
+
+The SA rule syntax is shown as follows:
+
+.. code-block:: console
+
+ sa <dir> <spi> <cipher_algo> <cipher_key> <auth_algo> <auth_key>
+ <mode> <src_ip> <dst_ip>
+
+where each options means:
+
+``<dir>``
+
+ * The traffic direction
+
+ * Optional: No
+
+ * Available options:
+
+ * *in*: inbound traffic
+ * *out*: outbound traffic
+
+``<spi>``
+
+ * The SPI number
+
+ * Optional: No
+
+ * Syntax: unsigned integer number
+
+``<cipher_algo>``
+
+ * Cipher algorithm
+
+ * Optional: No
+
+ * Available options:
+
+ * *null*: NULL algorithm
+ * *aes-128-cbc*: AES-CBC 128-bit algorithm
+ * *aes-128-ctr*: AES-CTR 128-bit algorithm
+ * *aes-128-gcm*: AES-GCM 128-bit algorithm
+
+ * Syntax: *cipher_algo <your algorithm>*
+
+``<cipher_key>``
+
+ * Cipher key, NOT available when 'null' algorithm is used
+
+ * Optional: No, must followed by <cipher_algo> option
+
+ * Syntax: Hexadecimal bytes (0x0-0xFF) concatenate by colon symbol ':'.
+ The number of bytes should be as same as the specified cipher algorithm
+ key size.
+
+ For example: *cipher_key A1:B2:C3:D4:A1:B2:C3:D4:A1:B2:C3:D4:
+ A1:B2:C3:D4*
+
+``<auth_algo>``
+
+ * Authentication algorithm
+
+ * Optional: No
+
+ * Available options:
+
+ * *null*: NULL algorithm
+ * *sha1-hmac*: HMAC SHA1 algorithm
+ * *aes-128-gcm*: AES-GCM 128-bit algorithm
+
+``<auth_key>``
+
+ * Authentication key, NOT available when 'null' or 'aes-128-gcm' algorithm
+ is used.
+
+ * Optional: No, must followed by <auth_algo> option
+
+ * Syntax: Hexadecimal bytes (0x0-0xFF) concatenate by colon symbol ':'.
+ The number of bytes should be as same as the specified authentication
+ algorithm key size.
+
+ For example: *auth_key A1:B2:C3:D4:A1:B2:C3:D4:A1:B2:C3:D4:A1:B2:C3:D4:
+ A1:B2:C3:D4*
+
+``<mode>``
+
+ * The operation mode
+
+ * Optional: No
+
+ * Available options:
+
+ * *ipv4-tunnel*: Tunnel mode for IPv4 packets
+ * *ipv6-tunnel*: Tunnel mode for IPv6 packets
+ * *transport*: transport mode
+
+ * Syntax: mode XXX
+
+``<src_ip>``
+
+ * The source IP address. This option is not available when
+ transport mode is used
+
+ * Optional: Yes, default address 0.0.0.0 will be used
+
+ * Syntax:
+
+ * *src X.X.X.X* for IPv4
+ * *src XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX* for IPv6
+
+``<dst_ip>``
+
+ * The destination IP address. This option is not available when
+ transport mode is used
+
+ * Optional: Yes, default address 0.0.0.0 will be used
+
+ * Syntax:
+
+ * *dst X.X.X.X* for IPv4
+ * *dst XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX* for IPv6
+
+Example SA rules:
+
+.. code-block:: console
+
+ sa out 5 cipher_algo null auth_algo null mode ipv4-tunnel \
+ src 172.16.1.5 dst 172.16.2.5
+
+ sa out 25 cipher_algo aes-128-cbc \
+ cipher_key c3:c3:c3:c3:c3:c3:c3:c3:c3:c3:c3:c3:c3:c3:c3:c3 \
+ auth_algo sha1-hmac \
+ auth_key c3:c3:c3:c3:c3:c3:c3:c3:c3:c3:c3:c3:c3:c3:c3:c3:c3:c3:c3:c3 \
+ mode ipv6-tunnel \
+ src 1111:1111:1111:1111:1111:1111:1111:5555 \
+ dst 2222:2222:2222:2222:2222:2222:2222:5555
+
+ sa in 105 cipher_algo aes-128-gcm \
+ cipher_key de:ad:be:ef:de:ad:be:ef:de:ad:be:ef:de:ad:be:ef:de:ad:be:ef \
+ auth_algo aes-128-gcm \
+ mode ipv4-tunnel src 172.16.2.5 dst 172.16.1.5
+
+Routing rule syntax
+^^^^^^^^^^^^^^^^^^^
+
+The Routing rule syntax is shown as follows:
+
+.. code-block:: console
+
+ rt <ip_ver> <src_ip> <dst_ip> <port>
+
+
+where each options means:
+
+``<ip_ver>``
+
+ * IP protocol version
+
+ * Optional: No
+
+ * Available options:
+
+ * *ipv4*: IP protocol version 4
+ * *ipv6*: IP protocol version 6
+
+``<src_ip>``
+
+ * The source IP address and mask
+
+ * Optional: Yes, default address 0.0.0.0 and mask of 0 will be used
+
+ * Syntax:
+
+ * *src X.X.X.X/Y* for IPv4
+ * *src XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX/Y* for IPv6
+
+``<dst_ip>``
+
+ * The destination IP address and mask
+
+ * Optional: Yes, default address 0.0.0.0 and mask of 0 will be used
+
+ * Syntax:
+
+ * *dst X.X.X.X/Y* for IPv4
+ * *dst XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX/Y* for IPv6
+
+``<port>``
+
+ * The traffic output port id
+
+ * Optional: yes, default output port 0 will be used
+
+ * Syntax: *port X*
+
+Example SP rules:
+
+.. code-block:: console
+
+ rt ipv4 dst 172.16.1.5/32 port 0
+
+ rt ipv6 dst 1111:1111:1111:1111:1111:1111:1111:5555/116 port 0
diff --git a/doc/guides/sample_app_ug/l2_forward_real_virtual.rst b/doc/guides/sample_app_ug/l2_forward_real_virtual.rst
index a1c10c04..cf15d1c3 100644
--- a/doc/guides/sample_app_ug/l2_forward_real_virtual.rst
+++ b/doc/guides/sample_app_ug/l2_forward_real_virtual.rst
@@ -50,17 +50,14 @@ performs L2 forwarding for each packet that is received on an RX_PORT.
The destination port is the adjacent port from the enabled portmask, that is,
if the first four ports are enabled (portmask 0xf),
ports 1 and 2 forward into each other, and ports 3 and 4 forward into each other.
-Also, the MAC addresses are affected as follows:
+Also, if MAC addresses updating is enabled, the MAC addresses are affected as follows:
* The source MAC address is replaced by the TX_PORT MAC address
* The destination MAC address is replaced by 02:00:00:00:00:TX_PORT_ID
-This application can be used to benchmark performance using a traffic-generator, as shown in the :numref:`figure_l2_fwd_benchmark_setup`.
-
-The application can also be used in a virtualized environment as shown in :numref:`figure_l2_fwd_virtenv_benchmark_setup`.
-
-The L2 Forwarding application can also be used as a starting point for developing a new application based on the DPDK.
+This application can be used to benchmark performance using a traffic-generator, as shown in the :numref:`figure_l2_fwd_benchmark_setup`,
+or in a virtualized environment as shown in :numref:`figure_l2_fwd_virtenv_benchmark_setup`.
.. _figure_l2_fwd_benchmark_setup:
@@ -68,13 +65,23 @@ The L2 Forwarding application can also be used as a starting point for developin
Performance Benchmark Setup (Basic Environment)
-
.. _figure_l2_fwd_virtenv_benchmark_setup:
.. figure:: img/l2_fwd_virtenv_benchmark_setup.*
Performance Benchmark Setup (Virtualized Environment)
+This application may be used for basic VM to VM communication as shown in :numref:`figure_l2_fwd_vm2vm`,
+when MAC addresses updating is disabled.
+
+.. _figure_l2_fwd_vm2vm:
+
+.. figure:: img/l2_fwd_vm2vm.*
+
+ Virtual Machine to Virtual Machine communication.
+
+The L2 Forwarding application can also be used as a starting point for developing a new application based on the DPDK.
+
.. _l2_fwd_vf_setup:
Virtual Function Setup Instructions
@@ -128,7 +135,7 @@ The application requires a number of command line options:
.. code-block:: console
- ./build/l2fwd [EAL options] -- -p PORTMASK [-q NQ]
+ ./build/l2fwd [EAL options] -- -p PORTMASK [-q NQ] --[no-]mac-updating
where,
@@ -136,7 +143,10 @@ where,
* q NQ: A number of queues (=ports) per lcore (default is 1)
-To run the application in linuxapp environment with 4 lcores, 16 ports and 8 RX queues per lcore, issue the command:
+* --[no-]mac-updating: Enable or disable MAC addresses updating (enabled by default).
+
+To run the application in linuxapp environment with 4 lcores, 16 ports and 8 RX queues per lcore and MAC address
+updating enabled, issue the command:
.. code-block:: console
@@ -415,7 +425,8 @@ Packets are read in a burst of size MAX_PKT_BURST.
The rte_eth_rx_burst() function writes the mbuf pointers in a local table and returns the number of available mbufs in the table.
Then, each mbuf in the table is processed by the l2fwd_simple_forward() function.
-The processing is very simple: process the TX port from the RX port, then replace the source and destination MAC addresses.
+The processing is very simple: process the TX port from the RX port, then replace the source and destination MAC addresses if MAC
+addresses updating is enabled.
.. note::
diff --git a/doc/guides/sample_app_ug/l3_forward.rst b/doc/guides/sample_app_ug/l3_forward.rst
index e2e62236..ab916b97 100644
--- a/doc/guides/sample_app_ug/l3_forward.rst
+++ b/doc/guides/sample_app_ug/l3_forward.rst
@@ -42,7 +42,7 @@ The initialization and run-time paths are very similar to those of the :doc:`l2_
The main difference from the L2 Forwarding sample application is that the forwarding decision
is made based on information read from the input packet.
-The lookup method is either hash-based or LPM-based and is selected at compile time. When the selected lookup method is hash-based,
+The lookup method is either hash-based or LPM-based and is selected at run time. When the selected lookup method is hash-based,
a hash object is used to emulate the flow classification stage.
The hash object is used in correlation with a flow table to map each input packet to its flow at runtime.
diff --git a/doc/guides/sample_app_ug/pdump.rst b/doc/guides/sample_app_ug/pdump.rst
deleted file mode 100644
index ac0e7c96..00000000
--- a/doc/guides/sample_app_ug/pdump.rst
+++ /dev/null
@@ -1,144 +0,0 @@
-
-.. 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.
-
-
-dpdk-pdump Application
-======================
-
-The ``dpdk-pdump`` tool is a Data Plane Development Kit (DPDK) tool that runs as
-a DPDK secondary process and is capable of enabling packet capture on dpdk ports.
-
- .. Note::
-
- * The ``dpdk-pdump`` tool depends on libpcap based PMD which is disabled
- by default in the build configuration files,
- owing to an external dependency on the libpcap development files
- which must be installed on the board.
- Once the libpcap development files are installed, the libpcap based PMD
- can be enabled by setting CONFIG_RTE_LIBRTE_PMD_PCAP=y and recompiling the DPDK.
-
-
-Running the Application
------------------------
-
-The tool has a number of command line options:
-
-.. code-block:: console
-
- ./build/app/dpdk-pdump --
- --pdump '(port=<port id> | device_id=<pci id or vdev name>),
- (queue=<queue_id>),
- (rx-dev=<iface or pcap file> |
- tx-dev=<iface or pcap file>),
- [ring-size=<ring size>],
- [mbuf-size=<mbuf data size>],
- [total-num-mbufs=<number of mbufs>]'
- [--server-socket-path=<server socket dir>]
- [--client-socket-path=<client socket dir>]
-
-The ``--pdump`` command line option is mandatory and it takes various sub arguments which are described in
-below section.
-
- .. Note::
-
- * Parameters inside the parentheses represents mandatory parameters.
-
- * Parameters inside the square brackets represents optional parameters.
-
- * Multiple instances of ``--pdump`` can be passed to capture packets on different port and queue combinations.
-
-The ``--server-socket-path`` command line option is optional. This represents the server socket directory.
-If no value is passed default values are used i.e. ``/var/run/.dpdk/`` for root users and ``~/.dpdk/``
-for non root users.
-
-The ``--client-socket-path`` command line option is optional. This represents the client socket directory.
-If no value is passed default values are used i.e. ``/var/run/.dpdk/`` for root users and ``~/.dpdk/``
-for non root users.
-
-
-The ``--pdump`` parameters
-~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-``port``:
-Port id of the eth device on which packets should be captured.
-
-``device_id``:
-PCI address (or) name of the eth device on which packets should be captured.
-
- .. Note::
-
- * As of now the ``dpdk-pdump`` tool cannot capture the packets of virtual devices
- in the primary process due to a bug in the ethdev library. Due to this bug, in a multi process context,
- when the primary and secondary have different ports set, then the secondary process
- (here the ``dpdk-pdump`` tool) overwrites the ``rte_eth_devices[]`` entries of the primary process.
-
-``queue``:
-Queue id of the eth device on which packets should be captured. The user can pass a queue value of ``*`` to enable
-packet capture on all queues of the eth device.
-
-``rx-dev``:
-Can be either a pcap file name or any Linux iface.
-
-``tx-dev``:
-Can be either a pcap file name or any Linux iface.
-
- .. Note::
-
- * To receive ingress packets only, ``rx-dev`` should be passed.
-
- * To receive egress packets only, ``tx-dev`` should be passed.
-
- * To receive ingress and egress packets separately ``rx-dev`` and ``tx-dev``
- should both be passed with the different file names or the Linux iface names.
-
- * To receive ingress and egress packets separately ``rx-dev`` and ``tx-dev``
- should both be passed with the same file names or the the Linux iface names.
-
-``ring-size``:
-Size of the ring. This value is used internally for ring creation. The ring will be used to enqueue the packets from
-the primary application to the secondary. This is an optional parameter with default size 16384.
-
-``mbuf-size``:
-Size of the mbuf data. This is used internally for mempool creation. Ideally this value must be same as
-the primary application's mempool's mbuf data size which is used for packet RX. This is an optional parameter with
-default size 2176.
-
-``total-num-mbufs``:
-Total number mbufs in mempool. This is used internally for mempool creation. This is an optional parameter with default
-value 65535.
-
-
-Example
--------
-
-.. code-block:: console
-
- $ sudo ./build/app/dpdk-pdump -- --pdump 'port=0,queue=*,rx-dev=/tmp/rx.pcap'
diff --git a/doc/guides/sample_app_ug/proc_info.rst b/doc/guides/sample_app_ug/proc_info.rst
deleted file mode 100644
index 73f21958..00000000
--- a/doc/guides/sample_app_ug/proc_info.rst
+++ /dev/null
@@ -1,71 +0,0 @@
-
-.. BSD LICENSE
- Copyright(c) 2015 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.
-
-
-dpdk-procinfo Application
-=========================
-
-The dpdk-procinfo application is a Data Plane Development Kit (DPDK) application
-that runs as a DPDK secondary process and is capable of retrieving port
-statistics, resetting port statistics and printing DPDK memory information.
-This application extends the original functionality that was supported by
-dump_cfg.
-
-Running the Application
------------------------
-The application has a number of command line options:
-
-.. code-block:: console
-
- ./$(RTE_TARGET)/app/dpdk-procinfo -- -m | [-p PORTMASK] [--stats | --xstats |
- --stats-reset | --xstats-reset]
-
-Parameters
-~~~~~~~~~~
-**-p PORTMASK**: Hexadecimal bitmask of ports to configure.
-
-**--stats**
-The stats parameter controls the printing of generic port statistics. If no
-port mask is specified stats are printed for all DPDK ports.
-
-**--xstats**
-The stats parameter controls the printing of extended port statistics. If no
-port mask is specified xstats are printed for all DPDK ports.
-
-**--stats-reset**
-The stats-reset parameter controls the resetting of generic port statistics. If
-no port mask is specified, the generic stats are reset for all DPDK ports.
-
-**--xstats-reset**
-The xstats-reset parameter controls the resetting of extended port statistics.
-If no port mask is specified xstats are reset for all DPDK ports.
-
-**-m**: Print DPDK memory information.
diff --git a/doc/guides/sample_app_ug/tep_termination.rst b/doc/guides/sample_app_ug/tep_termination.rst
index c3d1e97c..88e08cf9 100644
--- a/doc/guides/sample_app_ug/tep_termination.rst
+++ b/doc/guides/sample_app_ug/tep_termination.rst
@@ -99,7 +99,8 @@ The sample will support the followings:
* TSO offload support for tunneling packet.
-The following figure shows the framework of the TEP termination sample application based on vhost-cuse.
+The following figure shows the framework of the TEP termination sample
+application based on DPDK vhost lib.
.. _figure_tep_termination_arch:
@@ -118,11 +119,6 @@ The example in this section have been validated with the following distributions
* Fedora* 20
-Prerequisites
--------------
-
-Refer to :ref:`vhost_app_prerequisites`.
-
Compiling the Sample Code
-------------------------
#. Compile vhost lib:
@@ -133,14 +129,6 @@ Compiling the Sample Code
CONFIG_RTE_LIBRTE_VHOST=y
- vhost user is turned on by default in the configure file config/common_linuxapp.
- To enable vhost cuse, disable vhost user.
-
- .. code-block:: console
-
- CONFIG_RTE_LIBRTE_VHOST_USER=n
-
- After vhost is enabled and the implementation is selected, build the vhost library.
#. Go to the examples directory:
@@ -167,40 +155,9 @@ Compiling the Sample Code
cd ${RTE_SDK}/examples/tep_termination
make
-#. Go to the eventfd_link directory(vhost cuse required):
-
- .. code-block:: console
-
- cd ${RTE_SDK}/lib/librte_vhost/eventfd_link
-
-#. Build the eventfd_link kernel module(vhost cuse required):
-
- .. code-block:: console
-
- make
-
Running the Sample Code
-----------------------
-#. Install the cuse kernel module(vhost cuse required):
-
- .. code-block:: console
-
- modprobe cuse
-
-#. Go to the eventfd_link directory(vhost cuse required):
-
- .. code-block:: console
-
- export RTE_SDK=/path/to/rte_sdk
- cd ${RTE_SDK}/lib/librte_vhost/eventfd_link
-
-#. Install the eventfd_link module(vhost cuse required):
-
- .. code-block:: console
-
- insmod ./eventfd_link.ko
-
#. Go to the examples directory:
.. code-block:: console
@@ -225,8 +182,7 @@ Parameters
**The same parameters with the vhost sample.**
-Refer to :ref:`vhost_app_parameters` for the meanings of 'Basename',
-'Stats', 'RX Retry', 'RX Retry Number' and 'RX Retry Delay Time'.
+Refer to :ref:`vhost_app_parameters` for detailed explanation.
**Number of Devices.**
@@ -303,12 +259,12 @@ The default value is 1.
Running the Virtual Machine (QEMU)
----------------------------------
-Refer to :ref:`vhost_app_running`.
+Refer to :ref:`vhost_app_run_vm`.
Running DPDK in the Virtual Machine
-----------------------------------
-Refer to :ref:`vhost_app_running_dpdk`.
+Refer to :ref:`vhost_app_run_dpdk_inside_guest`.
Passing Traffic to the Virtual Machine Device
---------------------------------------------
diff --git a/doc/guides/sample_app_ug/vhost.rst b/doc/guides/sample_app_ug/vhost.rst
index 2b7defc8..1f6d0d96 100644
--- a/doc/guides/sample_app_ug/vhost.rst
+++ b/doc/guides/sample_app_ug/vhost.rst
@@ -1,6 +1,6 @@
.. BSD LICENSE
- Copyright(c) 2010-2015 Intel Corporation. All rights reserved.
+ Copyright(c) 2010-2016 Intel Corporation. All rights reserved.
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -33,820 +33,194 @@
Vhost Sample Application
========================
-The vhost sample application demonstrates integration of the Data Plane Development Kit (DPDK)
-with the Linux* KVM hypervisor by implementing the vhost-net offload API.
-The sample application performs simple packet switching between virtual machines based on Media Access Control
-(MAC) address or Virtual Local Area Network (VLAN) tag.
-The splitting of Ethernet traffic from an external switch is performed in hardware by the Virtual Machine Device Queues
-(VMDQ) and Data Center Bridging (DCB) features of the IntelĀ® 82599 10 Gigabit Ethernet Controller.
+The vhost sample application demonstrates integration of the Data Plane
+Development Kit (DPDK) with the Linux* KVM hypervisor by implementing the
+vhost-net offload API. The sample application performs simple packet
+switching between virtual machines based on Media Access Control (MAC)
+address or Virtual Local Area Network (VLAN) tag. The splitting of Ethernet
+traffic from an external switch is performed in hardware by the Virtual
+Machine Device Queues (VMDQ) and Data Center Bridging (DCB) features of
+the IntelĀ® 82599 10 Gigabit Ethernet Controller.
-Background
-----------
-
-Virtio networking (virtio-net) was developed as the Linux* KVM para-virtualized method for communicating network packets
-between host and guest.
-It was found that virtio-net performance was poor due to context switching and packet copying between host, guest, and QEMU.
-The following figure shows the system architecture for a virtio-based networking (virtio-net).
-
-.. _figure_qemu_virtio_net:
-
-.. figure:: img/qemu_virtio_net.*
-
- System Architecture for Virtio-based Networking (virtio-net).
-
-
-The Linux* Kernel vhost-net module was developed as an offload mechanism for virtio-net.
-The vhost-net module enables KVM (QEMU) to offload the servicing of virtio-net devices to the vhost-net kernel module,
-reducing the context switching and packet copies in the virtual dataplane.
-
-This is achieved by QEMU sharing the following information with the vhost-net module through the vhost-net API:
-
-* The layout of the guest memory space, to enable the vhost-net module to translate addresses.
-
-* The locations of virtual queues in QEMU virtual address space,
- to enable the vhost module to read/write directly to and from the virtqueues.
-
-* An event file descriptor (eventfd) configured in KVM to send interrupts to the virtio- net device driver in the guest.
- This enables the vhost-net module to notify (call) the guest.
-
-* An eventfd configured in KVM to be triggered on writes to the virtio-net device's
- Peripheral Component Interconnect (PCI) config space.
- This enables the vhost-net module to receive notifications (kicks) from the guest.
-
-The following figure shows the system architecture for virtio-net networking with vhost-net offload.
-
-.. _figure_virtio_linux_vhost:
-
-.. figure:: img/virtio_linux_vhost.*
-
- Virtio with Linux
-
-
-Sample Code Overview
---------------------
-
-The DPDK vhost-net sample code demonstrates KVM (QEMU) offloading the servicing of a Virtual Machine's (VM's)
-virtio-net devices to a DPDK-based application in place of the kernel's vhost-net module.
-
-The DPDK vhost-net sample code is based on vhost library. Vhost library is developed for user space Ethernet switch to
-easily integrate with vhost functionality.
-
-The vhost library implements the following features:
-
-* Management of virtio-net device creation/destruction events.
-
-* Mapping of the VM's physical memory into the DPDK vhost-net's address space.
-
-* Triggering/receiving notifications to/from VMs via eventfds.
-
-* A virtio-net back-end implementation providing a subset of virtio-net features.
-
-There are two vhost implementations in vhost library, vhost cuse and vhost user. In vhost cuse, a character device driver is implemented to
-receive and process vhost requests through ioctl messages. In vhost user, a socket server is created to received vhost requests through
-socket messages. Most of the messages share the same handler routine.
-
-.. note::
- **Any vhost cuse specific requirement in the following sections will be emphasized**.
-
-Two implementations are turned on and off statically through configure file. Only one implementation could be turned on. They don't co-exist in current implementation.
-
-The vhost sample code application is a simple packet switching application with the following feature:
-
-* Packet switching between virtio-net devices and the network interface card,
- including using VMDQs to reduce the switching that needs to be performed in software.
-
-The following figure shows the architecture of the Vhost sample application based on vhost-cuse.
-
-.. _figure_vhost_net_arch:
-
-.. figure:: img/vhost_net_arch.*
-
- Vhost-net Architectural Overview
-
-
-The following figure shows the flow of packets through the vhost-net sample application.
-
-.. _figure_vhost_net_sample_app:
-
-.. figure:: img/vhost_net_sample_app.*
-
- Packet Flow Through the vhost-net Sample Application
-
-
-Supported Distributions
------------------------
-
-The example in this section have been validated with the following distributions:
-
-* Fedora* 18
-
-* Fedora* 19
-
-* Fedora* 20
-
-.. _vhost_app_prerequisites:
-
-Prerequisites
+Testing steps
-------------
-This section lists prerequisite packages that must be installed.
-
-Installing Packages on the Host(vhost cuse required)
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The vhost cuse code uses the following packages; fuse, fuse-devel, and kernel-modules-extra.
-The vhost user code don't rely on those modules as eventfds are already installed into vhost process through
-Unix domain socket.
-
-#. Install Fuse Development Libraries and headers:
-
- .. code-block:: console
-
- yum -y install fuse fuse-devel
-
-#. Install the Cuse Kernel Module:
-
- .. code-block:: console
-
- yum -y install kernel-modules-extra
-
-QEMU simulator
-~~~~~~~~~~~~~~
-
-For vhost user, qemu 2.2 is required.
-
-Setting up the Execution Environment
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The vhost sample code requires that QEMU allocates a VM's memory on the hugetlbfs file system.
-As the vhost sample code requires hugepages,
-the best practice is to partition the system into separate hugepage mount points for the VMs and the vhost sample code.
-
-.. note::
-
- This is best-practice only and is not mandatory.
- For systems that only support 2 MB page sizes,
- both QEMU and vhost sample code can use the same hugetlbfs mount point without issue.
-
-**QEMU**
-
-VMs with gigabytes of memory can benefit from having QEMU allocate their memory from 1 GB huge pages.
-1 GB huge pages must be allocated at boot time by passing kernel parameters through the grub boot loader.
-
-#. Calculate the maximum memory usage of all VMs to be run on the system.
- Then, round this value up to the nearest Gigabyte the execution environment will require.
-
-#. Edit the /etc/default/grub file, and add the following to the GRUB_CMDLINE_LINUX entry:
-
- .. code-block:: console
-
- GRUB_CMDLINE_LINUX="... hugepagesz=1G hugepages=<Number of hugepages required> default_hugepagesz=1G"
-
-#. Update the grub boot loader:
-
- .. code-block:: console
-
- grub2-mkconfig -o /boot/grub2/grub.cfg
-
-#. Reboot the system.
-
-#. The hugetlbfs mount point (/dev/hugepages) should now default to allocating gigabyte pages.
-
-.. note::
-
- Making the above modification will change the system default hugepage size to 1 GB for all applications.
-
-**Vhost Sample Code**
-
-In this section, we create a second hugetlbs mount point to allocate hugepages for the DPDK vhost sample code.
-
-#. Allocate sufficient 2 MB pages for the DPDK vhost sample code:
-
- .. code-block:: console
-
- echo 256 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
-
-#. Mount hugetlbs at a separate mount point for 2 MB pages:
-
- .. code-block:: console
-
- mount -t hugetlbfs nodev /mnt/huge -o pagesize=2M
-
-The above steps can be automated by doing the following:
-
-#. Edit /etc/fstab to add an entry to automatically mount the second hugetlbfs mount point:
-
- ::
-
- hugetlbfs <tab> /mnt/huge <tab> hugetlbfs defaults,pagesize=1G 0 0
-
-#. Edit the /etc/default/grub file, and add the following to the GRUB_CMDLINE_LINUX entry:
-
- ::
-
- GRUB_CMDLINE_LINUX="... hugepagesz=2M hugepages=256 ... default_hugepagesz=1G"
-
-#. Update the grub bootloader:
-
- .. code-block:: console
-
- grub2-mkconfig -o /boot/grub2/grub.cfg
-
-#. Reboot the system.
-
-.. note::
-
- Ensure that the default hugepage size after this setup is 1 GB.
-
-Setting up the Guest Execution Environment
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-It is recommended for testing purposes that the DPDK testpmd sample application is used in the guest to forward packets,
-the reasons for this are discussed in `Running the Virtual Machine (QEMU)`_.
-
-The testpmd application forwards packets between pairs of Ethernet devices,
-it requires an even number of Ethernet devices (virtio or otherwise) to execute.
-It is therefore recommended to create multiples of two virtio-net devices for each Virtual Machine either through libvirt or
-at the command line as follows.
-
-.. note::
-
- Observe that in the example, "-device" and "-netdev" are repeated for two virtio-net devices.
-
-For vhost cuse:
-
-.. code-block:: console
-
- qemu-system-x86_64 ... \
- -netdev tap,id=hostnet1,vhost=on,vhostfd=<open fd> \
- -device virtio-net-pci, netdev=hostnet1,id=net1 \
- -netdev tap,id=hostnet2,vhost=on,vhostfd=<open fd> \
- -device virtio-net-pci, netdev=hostnet2,id=net1
-
-For vhost user:
-
-.. code-block:: console
-
- qemu-system-x86_64 ... \
- -chardev socket,id=char1,path=<sock_path> \
- -netdev type=vhost-user,id=hostnet1,chardev=char1 \
- -device virtio-net-pci,netdev=hostnet1,id=net1 \
- -chardev socket,id=char2,path=<sock_path> \
- -netdev type=vhost-user,id=hostnet2,chardev=char2 \
- -device virtio-net-pci,netdev=hostnet2,id=net2
-
-sock_path is the path for the socket file created by vhost.
-
-Compiling the Sample Code
--------------------------
-#. Compile vhost lib:
-
- To enable vhost, turn on vhost library in the configure file config/common_linuxapp.
-
- .. code-block:: console
-
- CONFIG_RTE_LIBRTE_VHOST=n
-
- vhost user is turned on by default in the configure file config/common_linuxapp.
- To enable vhost cuse, disable vhost user.
-
- .. code-block:: console
-
- CONFIG_RTE_LIBRTE_VHOST_USER=y
-
- After vhost is enabled and the implementation is selected, build the vhost library.
-
-#. Go to the examples directory:
-
- .. code-block:: console
-
- export RTE_SDK=/path/to/rte_sdk
- cd ${RTE_SDK}/examples/vhost
-
-#. Set the target (a default target is used if not specified). For example:
-
- .. code-block:: console
-
- export RTE_TARGET=x86_64-native-linuxapp-gcc
-
- See the DPDK Getting Started Guide for possible RTE_TARGET values.
-
-#. Build the application:
-
- .. code-block:: console
-
- cd ${RTE_SDK}
- make config ${RTE_TARGET}
- make install ${RTE_TARGET}
- cd ${RTE_SDK}/examples/vhost
- make
-
-#. Go to the eventfd_link directory(vhost cuse required):
-
- .. code-block:: console
-
- cd ${RTE_SDK}/lib/librte_vhost/eventfd_link
-
-#. Build the eventfd_link kernel module(vhost cuse required):
-
- .. code-block:: console
-
- make
-
-Running the Sample Code
------------------------
-
-#. Install the cuse kernel module(vhost cuse required):
-
- .. code-block:: console
-
- modprobe cuse
-
-#. Go to the eventfd_link directory(vhost cuse required):
-
- .. code-block:: console
+This section shows the steps how to test a typical PVP case with this
+vhost-switch sample, whereas packets are received from the physical NIC
+port first and enqueued to the VM's Rx queue. Through the guest testpmd's
+default forwarding mode (io forward), those packets will be put into
+the Tx queue. The vhost-switch example, in turn, gets the packets and
+puts back to the same physical NIC port.
- export RTE_SDK=/path/to/rte_sdk
- cd ${RTE_SDK}/lib/librte_vhost/eventfd_link
+Build
+~~~~~
-#. Install the eventfd_link module(vhost cuse required):
+Follow the *Getting Started Guide for Linux* on generic info about
+environment setup and building DPDK from source.
- .. code-block:: console
-
- insmod ./eventfd_link.ko
-
-#. Go to the examples directory:
-
- .. code-block:: console
-
- export RTE_SDK=/path/to/rte_sdk
- cd ${RTE_SDK}/examples/vhost/build/app
-
-#. Run the vhost-switch sample code:
-
- vhost cuse:
-
- .. code-block:: console
-
- ./vhost-switch -c f -n 4 --socket-mem 1024 --huge-dir /mnt/huge \
- -- -p 0x1 --dev-basename usvhost
-
- vhost user: a socket file named usvhost will be created under current directory. Use its path as the socket path in guest's qemu commandline.
-
- .. code-block:: console
-
- ./vhost-switch -c f -n 4 --socket-mem 1024 --huge-dir /mnt/huge \
- -- -p 0x1 --dev-basename usvhost
-
-.. note::
-
- Please note the huge-dir parameter instructs the DPDK to allocate its memory from the 2 MB page hugetlbfs.
-
-.. note::
-
- The number used with the --socket-mem parameter may need to be more than 1024.
- The number required depends on the number of mbufs allocated by vhost-switch.
-
-.. _vhost_app_parameters:
-
-Parameters
-~~~~~~~~~~
-
-**Basename.**
-vhost cuse uses a Linux* character device to communicate with QEMU.
-The basename is used to generate the character devices name.
-
- /dev/<basename>
-
-For compatibility with the QEMU wrapper script, a base name of "usvhost" should be used:
-
-.. code-block:: console
-
- ./vhost-switch -c f -n 4 --socket-mem 1024 --huge-dir /mnt/huge \
- -- -p 0x1 --dev-basename usvhost
-
-**vm2vm.**
-The vm2vm parameter disable/set mode of packet switching between guests in the host.
-Value of "0" means disabling vm2vm implies that on virtual machine packet transmission will always go to the Ethernet port;
-Value of "1" means software mode packet forwarding between guests, it needs packets copy in vHOST,
-so valid only in one-copy implementation, and invalid for zero copy implementation;
-value of "2" means hardware mode packet forwarding between guests, it allows packets go to the Ethernet port,
-hardware L2 switch will determine which guest the packet should forward to or need send to external,
-which bases on the packet destination MAC address and VLAN tag.
-
-.. code-block:: console
-
- ./vhost-switch -c f -n 4 --socket-mem 1024 --huge-dir /mnt/huge \
- -- --vm2vm [0,1,2]
-
-**Mergeable Buffers.**
-The mergeable buffers parameter controls how virtio-net descriptors are used for virtio-net headers.
-In a disabled state, one virtio-net header is used per packet buffer;
-in an enabled state one virtio-net header is used for multiple packets.
-The default value is 0 or disabled since recent kernels virtio-net drivers show performance degradation with this feature is enabled.
-
-.. code-block:: console
-
- ./vhost-switch -c f -n 4 --socket-mem 1024 --huge-dir /mnt/huge \
- -- --mergeable [0,1]
-
-**Stats.**
-The stats parameter controls the printing of virtio-net device statistics.
-The parameter specifies an interval second to print statistics, with an interval of 0 seconds disabling statistics.
-
-.. code-block:: console
-
- ./vhost-switch -c f -n 4 --socket-mem 1024 --huge-dir /mnt/huge \
- -- --stats [0,n]
-
-**RX Retry.**
-The rx-retry option enables/disables enqueue retries when the guests RX queue is full.
-This feature resolves a packet loss that is observed at high data-rates,
-by allowing it to delay and retry in the receive path.
-This option is enabled by default.
-
-.. code-block:: console
-
- ./vhost-switch -c f -n 4 --socket-mem 1024 --huge-dir /mnt/huge \
- -- --rx-retry [0,1]
-
-**RX Retry Number.**
-The rx-retry-num option specifies the number of retries on an RX burst,
-it takes effect only when rx retry is enabled.
-The default value is 4.
+In this example, you need build DPDK both on the host and inside guest.
+Also, you need build this example.
.. code-block:: console
- ./vhost-switch -c f -n 4 --socket-mem 1024 --huge-dir /mnt/huge \
- -- --rx-retry 1 --rx-retry-num 5
+ export RTE_SDK=/path/to/dpdk_source
+ export RTE_TARGET=x86_64-native-linuxapp-gcc
-**RX Retry Delay Time.**
-The rx-retry-delay option specifies the timeout (in micro seconds) between retries on an RX burst,
-it takes effect only when rx retry is enabled.
-The default value is 15.
+ cd ${RTE_SDK}/examples/vhost
+ make
-.. code-block:: console
-
- ./vhost-switch -c f -n 4 --socket-mem 1024 --huge-dir /mnt/huge \
- -- --rx-retry 1 --rx-retry-delay 20
-
-**Zero copy.**
-Zero copy mode is removed, due to it has not been working for a while. And
-due to the large and complex code, it's better to redesign it than fixing
-it to make it work again. Hence, zero copy may be added back later.
-**VLAN strip.**
-The VLAN strip option enable/disable the VLAN strip on host, if disabled, the guest will receive the packets with VLAN tag.
-It is enabled by default.
+Start the vswitch example
+~~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: console
- ./vhost-switch -c f -n 4 --socket-mem 1024 --huge-dir /mnt/huge \
- -- --vlan-strip [0, 1]
-
-.. _vhost_app_running:
-
-Running the Virtual Machine (QEMU)
-----------------------------------
-
-QEMU must be executed with specific parameters to:
-
-* Ensure the guest is configured to use virtio-net network adapters.
-
- .. code-block:: console
-
- qemu-system-x86_64 ... -device virtio-net-pci,netdev=hostnet1, \
- id=net1 ...
-
-* Ensure the guest's virtio-net network adapter is configured with offloads disabled.
-
- .. code-block:: console
-
- qemu-system-x86_64 ... -device virtio-net-pci,netdev=hostnet1, \
- id=net1, csum=off,gso=off,guest_tso4=off,guest_tso6=off,guest_ecn=off
-
-* Redirect QEMU to communicate with the DPDK vhost-net sample code in place of the vhost-net kernel module(vhost cuse).
-
- .. code-block:: console
-
- qemu-system-x86_64 ... -netdev tap,id=hostnet1,vhost=on, \
- vhostfd=<open fd> ...
-
-* Enable the vhost-net sample code to map the VM's memory into its own process address space.
-
- .. code-block:: console
-
- qemu-system-x86_64 ... -mem-prealloc -mem-path /dev/hugepages ...
-
-.. note::
-
- The QEMU wrapper (qemu-wrap.py) is a Python script designed to automate the QEMU configuration described above.
- It also facilitates integration with libvirt, although the script may also be used standalone without libvirt.
-
-Redirecting QEMU to vhost-net Sample Code(vhost cuse)
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-To redirect QEMU to the vhost-net sample code implementation of the vhost-net API,
-an open file descriptor must be passed to QEMU running as a child process.
-
-.. code-block:: python
-
- #!/usr/bin/python
- fd = os.open("/dev/usvhost-1", os.O_RDWR)
- subprocess.call
- ("qemu-system-x86_64 ... -netdev tap,id=vhostnet0,vhost=on,vhostfd="
- + fd +"...", shell=True)
-
-.. note::
+ ./vhost-switch -c f -n 4 --socket-mem 1024 \
+ -- --socket-file /tmp/sock0 --client \
+ ...
- This process is automated in the `QEMU Wrapper Script`_.
+Check the `Parameters`_ section for the explanations on what do those
+parameters mean.
-Mapping the Virtual Machine's Memory
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.. _vhost_app_run_vm:
-For the DPDK vhost-net sample code to be run correctly, QEMU must allocate the VM's memory on hugetlbfs.
-This is done by specifying mem-prealloc and mem-path when executing QEMU.
-The vhost-net sample code accesses the virtio-net device's virtual rings and packet buffers
-by finding and mapping the VM's physical memory on hugetlbfs.
-In this case, the path passed to the guest should be that of the 1 GB page hugetlbfs:
+Start the VM
+~~~~~~~~~~~~
.. code-block:: console
- qemu-system-x86_64 ... -mem-prealloc -mem-path /dev/hugepages ...
+ qemu-system-x86_64 -machine accel=kvm -cpu host \
+ -m $mem -object memory-backend-file,id=mem,size=$mem,mem-path=/dev/hugepages,share=on \
+ -mem-prealloc -numa node,memdev=mem \
+ \
+ -chardev socket,id=char1,path=/tmp/sock0,server \
+ -netdev type=vhost-user,id=hostnet1,chardev=char1 \
+ -device virtio-net-pci,netdev=hostnet1,id=net1,mac=52:54:00:00:00:14 \
+ ...
.. note::
+ For basic vhost-user support, QEMU 2.2 (or above) is required. For
+ some specific features, a higher version might be need. Such as
+ QEMU 2.7 (or above) for the reconnect feature.
- This process is automated in the `QEMU Wrapper Script`_.
- The following two sections only applies to vhost cuse.
- For vhost-user, please make corresponding changes to qemu-wrapper script and guest XML file.
+.. _vhost_app_run_dpdk_inside_guest:
-QEMU Wrapper Script
-~~~~~~~~~~~~~~~~~~~
+Run testpmd inside guest
+~~~~~~~~~~~~~~~~~~~~~~~~
-The QEMU wrapper script automatically detects and calls QEMU with the necessary parameters required
-to integrate with the vhost sample code.
-It performs the following actions:
-
-* Automatically detects the location of the hugetlbfs and inserts this into the command line parameters.
-
-* Automatically open file descriptors for each virtio-net device and inserts this into the command line parameters.
-
-* Disables offloads on each virtio-net device.
-
-* Calls Qemu passing both the command line parameters passed to the script itself and those it has auto-detected.
-
-The QEMU wrapper script will automatically configure calls to QEMU:
+Make sure you have DPDK built inside the guest. Also make sure the
+corresponding virtio-net PCI device is bond to a uio driver, which
+could be done by:
.. code-block:: console
- qemu-wrap.py -machine pc-i440fx-1.4,accel=kvm,usb=off \
- -cpu SandyBridge -smp 4,sockets=4,cores=1,threads=1 \
- -netdev tap,id=hostnet1,vhost=on \
- -device virtio-net-pci,netdev=hostnet1,id=net1 \
- -hda <disk img> -m 4096
+ modprobe uio_pci_generic
+ $RTE_SDK/tools/dpdk-devbind.py -b=uio_pci_generic 0000:00:04.0
-which will become the following call to QEMU:
+Then start testpmd for packet forwarding testing.
.. code-block:: console
- qemu-system-x86_64 -machine pc-i440fx-1.4,accel=kvm,usb=off \
- -cpu SandyBridge -smp 4,sockets=4,cores=1,threads=1 \
- -netdev tap,id=hostnet1,vhost=on,vhostfd=<open fd> \
- -device virtio-net-pci,netdev=hostnet1,id=net1, \
- csum=off,gso=off,guest_tso4=off,guest_tso6=off,guest_ecn=off \
- -hda <disk img> -m 4096 -mem-path /dev/hugepages -mem-prealloc
-
-Libvirt Integration
-~~~~~~~~~~~~~~~~~~~
-
-The QEMU wrapper script (qemu-wrap.py) "wraps" libvirt calls to QEMU,
-such that QEMU is called with the correct parameters described above.
-To call the QEMU wrapper automatically from libvirt, the following configuration changes must be made:
-
-* Place the QEMU wrapper script in libvirt's binary search PATH ($PATH).
- A good location is in the directory that contains the QEMU binary.
-
-* Ensure that the script has the same owner/group and file permissions as the QEMU binary.
+ ./x86_64-native-gcc/app/testpmd -c 0x3 -- -i
+ > start tx_first
-* Update the VM xml file using virsh edit <vm name>:
+Inject packets
+--------------
- * Set the VM to use the launch script
+While a virtio-net is connected to vhost-switch, a VLAN tag starts with
+1000 is assigned to it. So make sure configure your packet generator
+with the right MAC and VLAN tag, you should be able to see following
+log from the vhost-switch console. It means you get it work::
- * Set the emulator path contained in the #<emulator><emulator/> tags For example,
- replace <emulator>/usr/bin/qemu-kvm<emulator/> with <emulator>/usr/bin/qemu-wrap.py<emulator/>
+ VHOST_DATA: (0) mac 52:54:00:00:00:14 and vlan 1000 registered
- * Set the VM's virtio-net device's to use vhost-net offload:
- .. code-block:: xml
-
- <interface type="network">
- <model type="virtio"/>
- <driver name="vhost"/>
- <interface/>
-
- * Enable libvirt to access the DPDK Vhost sample code's character device file by adding it
- to controllers cgroup for libvirtd using the following steps:
-
- .. code-block:: xml
-
- cgroup_controllers = [ ... "devices", ... ] clear_emulator_capabilities = 0
- user = "root" group = "root"
- cgroup_device_acl = [
- "/dev/null", "/dev/full", "/dev/zero",
- "/dev/random", "/dev/urandom",
- "/dev/ptmx", "/dev/kvm", "/dev/kqemu",
- "/dev/rtc", "/dev/hpet", "/dev/net/tun",
- "/dev/<devbase-name>-<index>",
- ]
-
-* Disable SELinux or set to permissive mode.
+.. _vhost_app_parameters:
+Parameters
+----------
-* Mount cgroup device controller:
+**--socket-file path**
+Specifies the vhost-user socket file path.
- .. code-block:: console
+**--client**
+DPDK vhost-user will act as the client mode when such option is given.
+In the client mode, QEMU will create the socket file. Otherwise, DPDK
+will create it. Put simply, it's the server to create the socket file.
- mkdir /dev/cgroup
- mount -t cgroup none /dev/cgroup -o devices
-* Restart the libvirtd system process
+**--vm2vm mode**
+The vm2vm parameter sets the mode of packet switching between guests in
+the host.
- For example, on Fedora* "systemctl restart libvirtd.service"
+- 0 disables vm2vm, impling that VM's packets will always go to the NIC port.
+- 1 means a normal mac lookup packet routing.
+- 2 means hardware mode packet forwarding between guests, it allows packets
+ go to the NIC port, hardware L2 switch will determine which guest the
+ packet should forward to or need send to external, which bases on the
+ packet destination MAC address and VLAN tag.
-* Edit the configuration parameters section of the script:
+**--mergeable 0|1**
+Set 0/1 to disable/enable the mergeable Rx feature. It's disabled by default.
- * Configure the "emul_path" variable to point to the QEMU emulator.
+**--stats interval**
+The stats parameter controls the printing of virtio-net device statistics.
+The parameter specifies an interval (in unit of seconds) to print statistics,
+with an interval of 0 seconds disabling statistics.
- .. code-block:: xml
+**--rx-retry 0|1**
+The rx-retry option enables/disables enqueue retries when the guests Rx queue
+is full. This feature resolves a packet loss that is observed at high data
+rates, by allowing it to delay and retry in the receive path. This option is
+enabled by default.
- emul_path = "/usr/local/bin/qemu-system-x86_64"
+**--rx-retry-num num**
+The rx-retry-num option specifies the number of retries on an Rx burst, it
+takes effect only when rx retry is enabled. The default value is 4.
- * Configure the "us_vhost_path" variable to point to the DPDK vhost-net sample code's character devices name.
- DPDK vhost-net sample code's character device will be in the format "/dev/<basename>".
+**--rx-retry-delay msec**
+The rx-retry-delay option specifies the timeout (in micro seconds) between
+retries on an RX burst, it takes effect only when rx retry is enabled. The
+default value is 15.
- .. code-block:: xml
+**--dequeue-zero-copy**
+Dequeue zero copy will be enabled when this option is given.
- us_vhost_path = "/dev/usvhost"
+**--vlan-strip 0|1**
+VLAN strip option is removed, because different NICs have different behaviors
+when disabling VLAN strip. Such feature, which heavily depends on hardware,
+should be removed from this example to reduce confusion. Now, VLAN strip is
+enabled and cannot be disabled.
Common Issues
-~~~~~~~~~~~~~
-
-* QEMU failing to allocate memory on hugetlbfs, with an error like the following::
-
- file_ram_alloc: can't mmap RAM pages: Cannot allocate memory
-
- When running QEMU the above error indicates that it has failed to allocate memory for the Virtual Machine on
- the hugetlbfs. This is typically due to insufficient hugepages being free to support the allocation request.
- The number of free hugepages can be checked as follows:
-
- .. code-block:: console
-
- cat /sys/kernel/mm/hugepages/hugepages-<pagesize>/nr_hugepages
-
- The command above indicates how many hugepages are free to support QEMU's allocation request.
-
-* User space VHOST when the guest has 2MB sized huge pages:
-
- The guest may have 2MB or 1GB sized huge pages. The user space VHOST should work properly in both cases.
-
-* User space VHOST will not work with QEMU without the ``-mem-prealloc`` option:
-
- The current implementation works properly only when the guest memory is pre-allocated, so it is required to
- use a QEMU version (e.g. 1.6) which supports ``-mem-prealloc``. The ``-mem-prealloc`` option must be
- specified explicitly in the QEMU command line.
-
-* User space VHOST will not work with a QEMU version without shared memory mapping:
-
- As shared memory mapping is mandatory for user space VHOST to work properly with the guest, user space VHOST
- needs access to the shared memory from the guest to receive and transmit packets. It is important to make sure
- the QEMU version supports shared memory mapping.
-
-* In an Ubuntu environment, QEMU fails to start a new guest normally with user space VHOST due to not being able
- to allocate huge pages for the new guest:
-
- The solution for this issue is to add ``-boot c`` into the QEMU command line to make sure the huge pages are
- allocated properly and then the guest should start normally.
-
- Use ``cat /proc/meminfo`` to check if there is any changes in the value of ``HugePages_Total`` and ``HugePages_Free``
- after the guest startup.
-
-* Log message: ``eventfd_link: module verification failed: signature and/or required key missing - tainting kernel``:
-
- This log message may be ignored. The message occurs due to the kernel module ``eventfd_link``, which is not a standard
- Linux module but which is necessary for the user space VHOST current implementation (CUSE-based) to communicate with
- the guest.
-
-.. _vhost_app_running_dpdk:
-
-Running DPDK in the Virtual Machine
------------------------------------
-
-For the DPDK vhost-net sample code to switch packets into the VM,
-the sample code must first learn the MAC address of the VM's virtio-net device.
-The sample code detects the address from packets being transmitted from the VM, similar to a learning switch.
-
-This behavior requires no special action or configuration with the Linux* virtio-net driver in the VM
-as the Linux* Kernel will automatically transmit packets during device initialization.
-However, DPDK-based applications must be modified to automatically transmit packets during initialization
-to facilitate the DPDK vhost- net sample code's MAC learning.
-
-The DPDK testpmd application can be configured to automatically transmit packets during initialization
-and to act as an L2 forwarding switch.
-
-Testpmd MAC Forwarding
-~~~~~~~~~~~~~~~~~~~~~~
-
-At high packet rates, a minor packet loss may be observed.
-To resolve this issue, a "wait and retry" mode is implemented in the testpmd and vhost sample code.
-In the "wait and retry" mode if the virtqueue is found to be full, then testpmd waits for a period of time before retrying to enqueue packets.
-
-The "wait and retry" algorithm is implemented in DPDK testpmd as a forwarding method call "mac_retry".
-The following sequence diagram describes the algorithm in detail.
-
-.. _figure_tx_dpdk_testpmd:
-
-.. figure:: img/tx_dpdk_testpmd.*
-
- Packet Flow on TX in DPDK-testpmd
-
-
-Running Testpmd
-~~~~~~~~~~~~~~~
-
-The testpmd application is automatically built when DPDK is installed.
-Run the testpmd application as follows:
-
-.. code-block:: console
-
- cd ${RTE_SDK}/x86_64-native-linuxapp-gcc/app
- ./testpmd -c 0x3 -n 4 --socket-mem 512 \
- -- --burst=64 --i --disable-hw-vlan-filter
-
-The destination MAC address for packets transmitted on each port can be set at the command line:
-
-.. code-block:: console
-
- ./testpmd -c 0x3 -n 4 --socket-mem 512 \
- -- --burst=64 --i --disable-hw-vlan-filter \
- --eth-peer=0,aa:bb:cc:dd:ee:ff --eth-peer=1,ff:ee:dd:cc:bb:aa
-
-* Packets received on port 1 will be forwarded on port 0 to MAC address
-
- aa:bb:cc:dd:ee:ff
-
-* Packets received on port 0 will be forwarded on port 1 to MAC address
-
- ff:ee:dd:cc:bb:aa
-
-The testpmd application can then be configured to act as an L2 forwarding application:
-
-.. code-block:: console
-
- testpmd> set fwd mac_retry
-
-The testpmd can then be configured to start processing packets,
-transmitting packets first so the DPDK vhost sample code on the host can learn the MAC address:
-
-.. code-block:: console
-
- testpmd> start tx_first
+-------------
-.. note::
+* QEMU fails to allocate memory on hugetlbfs, with an error like the
+ following::
- Please note "set fwd mac_retry" is used in place of "set fwd mac_fwd" to ensure the retry feature is activated.
+ file_ram_alloc: can't mmap RAM pages: Cannot allocate memory
-Passing Traffic to the Virtual Machine Device
----------------------------------------------
+ When running QEMU the above error indicates that it has failed to allocate
+ memory for the Virtual Machine on the hugetlbfs. This is typically due to
+ insufficient hugepages being free to support the allocation request. The
+ number of free hugepages can be checked as follows:
-For a virtio-net device to receive traffic,
-the traffic's Layer 2 header must include both the virtio-net device's MAC address and VLAN tag.
-The DPDK sample code behaves in a similar manner to a learning switch in that
-it learns the MAC address of the virtio-net devices from the first transmitted packet.
-On learning the MAC address,
-the DPDK vhost sample code prints a message with the MAC address and VLAN tag virtio-net device.
-For example:
+ .. code-block:: console
-.. code-block:: console
+ cat /sys/kernel/mm/hugepages/hugepages-<pagesize>/nr_hugepages
- DATA: (0) MAC_ADDRESS cc:bb:bb:bb:bb:bb and VLAN_TAG 1000 registered
+ The command above indicates how many hugepages are free to support QEMU's
+ allocation request.
-The above message indicates that device 0 has been registered with MAC address cc:bb:bb:bb:bb:bb and VLAN tag 1000.
-Any packets received on the NIC with these values is placed on the devices receive queue.
-When a virtio-net device transmits packets, the VLAN tag is added to the packet by the DPDK vhost sample code.
+* vhost-user will not work with QEMU without the ``-mem-prealloc`` option
-Running virtio_user with vhost-switch
--------------------------------------
+ The current implementation works properly only when the guest memory is
+ pre-allocated.
-We can also use virtio_user with vhost-switch now.
-Virtio_user is a virtual device that can be run in a application (container) parallelly with vhost in the same OS,
-aka, there is no need to start a VM. We just run it with a different --file-prefix to avoid startup failure.
+* vhost-user will not work with a QEMU version without shared memory mapping:
-.. code-block:: console
+ Make sure ``share=on`` QEMU option is given.
- cd ${RTE_SDK}/x86_64-native-linuxapp-gcc/app
- ./testpmd -c 0x3 -n 4 --socket-mem 1024 --no-pci --file-prefix=virtio_user-testpmd \
- --vdev=virtio_user0,mac=00:01:02:03:04:05,path=$path_vhost \
- -- -i --txqflags=0xf01 --disable-hw-vlan
+* Failed to build DPDK in VM
-There is no difference on the vhost side.
-Pleae note that there are some limitations (see release note for more information) in the usage of virtio_user.
+ Make sure "-cpu host" QEMU option is given.