Imported Upstream version 16.07-rc4 74/2074/1
authorRicardo Salveti <ricardo.salveti@linaro.org>
Mon, 25 Jul 2016 16:22:22 +0000 (13:22 -0300)
committerRicardo Salveti <ricardo.salveti@linaro.org>
Mon, 25 Jul 2016 16:23:50 +0000 (13:23 -0300)
Change-Id: Ic57f6a3726f2dbd1682223648d91310f45705327
Signed-off-by: Ricardo Salveti <ricardo.salveti@linaro.org>
98 files changed:
MAINTAINERS
app/pdump/Makefile
app/pdump/main.c
app/proc_info/Makefile
app/test/autotest_data.py
app/test/autotest_runner.py
app/test/test_mbuf.c
app/test/test_mempool.c
buildtools/pmdinfogen/Makefile
doc/guides/contributing/documentation.rst
doc/guides/faq/faq.rst
doc/guides/howto/flow_bifurcation.rst [new file with mode: 0644]
doc/guides/howto/img/flow_bifurcation_overview.svg [new file with mode: 0644]
doc/guides/howto/img/ixgbe_bifu_queue_idx.svg [new file with mode: 0644]
doc/guides/howto/img/lm_bond_virtio_sriov.svg [new file with mode: 0644]
doc/guides/howto/img/lm_vhost_user.svg [new file with mode: 0644]
doc/guides/howto/index.rst [new file with mode: 0644]
doc/guides/howto/lm_bond_virtio_sriov.rst [new file with mode: 0644]
doc/guides/howto/lm_virtio_vhost_user.rst [new file with mode: 0644]
doc/guides/index.rst
doc/guides/linux_gsg/build_dpdk.rst
doc/guides/linux_gsg/nic_perf_intel_platform.rst
doc/guides/linux_gsg/quick_start.rst
doc/guides/nics/bnx2x.rst
doc/guides/nics/cxgbe.rst
doc/guides/nics/ena.rst
doc/guides/nics/enic.rst
doc/guides/nics/i40e.rst
doc/guides/nics/intel_vf.rst
doc/guides/nics/nfp.rst
doc/guides/nics/overview.rst
doc/guides/nics/qede.rst
doc/guides/nics/thunderx.rst
doc/guides/nics/virtio.rst
doc/guides/prog_guide/dev_kit_build_system.rst
doc/guides/prog_guide/mempool_lib.rst
doc/guides/prog_guide/vhost_lib.rst
doc/guides/rel_notes/release_16_07.rst
doc/guides/sample_app_ug/ip_pipeline.rst
doc/guides/sample_app_ug/l2_forward_real_virtual.rst
doc/guides/sample_app_ug/l3_forward.rst
doc/guides/sample_app_ug/pdump.rst
doc/guides/sample_app_ug/proc_info.rst
doc/guides/sample_app_ug/tep_termination.rst
doc/guides/sample_app_ug/vhost.rst
doc/guides/sample_app_ug/vm_power_management.rst
doc/guides/testpmd_app_ug/testpmd_funcs.rst
doc/guides/xen/pkt_switch.rst
drivers/net/bnx2x/bnx2x.c
drivers/net/bnx2x/bnx2x_ethdev.c
drivers/net/ena/base/ena_com.c
drivers/net/enic/enic_ethdev.c
drivers/net/enic/enic_main.c
drivers/net/enic/enic_rxtx.c
drivers/net/fm10k/fm10k_ethdev.c
drivers/net/i40e/i40e_ethdev.c
drivers/net/i40e/i40e_rxtx_vec.c
drivers/net/ixgbe/base/ixgbe_osdep.h
drivers/net/virtio/virtio_ethdev.c
drivers/net/virtio/virtio_rxtx.c
drivers/net/virtio/virtio_rxtx_simple.c
drivers/net/virtio/virtio_user_ethdev.c
drivers/net/virtio/virtqueue.h
examples/ip_pipeline/config_parse.c
examples/ip_pipeline/pipeline/pipeline_flow_actions.c
examples/ip_pipeline/pipeline/pipeline_flow_classification_be.c
examples/ip_pipeline/pipeline/pipeline_passthrough_be.c
examples/ipsec-secgw/ipip.h
examples/ipsec-secgw/ipsec-secgw.c
examples/ipsec-secgw/ipsec.h
examples/ipsec-secgw/sa.c
examples/l2fwd-crypto/main.c
examples/l2fwd-ivshmem/host/host.c
examples/performance-thread/pthread_shim/pthread_shim.c
examples/vhost/main.c
lib/librte_cryptodev/rte_cryptodev.c
lib/librte_eal/common/eal_common_memzone.c
lib/librte_eal/common/eal_common_options.c
lib/librte_eal/common/include/arch/ppc_64/rte_atomic.h
lib/librte_eal/common/include/rte_tailq.h
lib/librte_eal/common/include/rte_version.h
lib/librte_eal/linuxapp/eal/eal_memory.c
lib/librte_ether/rte_ethdev.c
lib/librte_mempool/rte_mempool.h
lib/librte_mempool/rte_mempool_ops.c
lib/librte_ring/rte_ring.h
lib/librte_vhost/vhost_user/fd_man.c
lib/librte_vhost/vhost_user/fd_man.h
lib/librte_vhost/vhost_user/vhost-net-user.c
mk/internal/rte.compile-pre.mk
mk/rte.app.mk
mk/rte.sdkconfig.mk
mk/rte.sdkinstall.mk
mk/rte.sdktest.mk
scripts/validate-abi.sh
tools/dpdk-devbind.py [moved from tools/dpdk_nic_bind.py with 100% similarity]
tools/dpdk-pmdinfo.py [moved from tools/pmdinfo.py with 99% similarity]
tools/dpdk-setup.sh [moved from tools/setup.sh with 95% similarity]

index 9c76352..92ea5d7 100644 (file)
@@ -70,7 +70,7 @@ F: scripts/validate-abi.sh
 
 Driver information
 F: buildtools/pmdinfogen/
-F: tools/pmdinfo.py
+F: tools/dpdk-pmdinfo.py
 
 
 Environment Abstraction Layer
@@ -242,8 +242,8 @@ F: app/test/test_cryptodev*
 F: examples/l2fwd-crypto/
 
 
-Drivers
--------
+Networking Drivers
+------------------
 
 Link bonding
 M: Declan Doherty <declan.doherty@intel.com>
@@ -356,6 +356,7 @@ F: doc/guides/nics/qede.rst
 RedHat virtio
 M: Huawei Xie <huawei.xie@intel.com>
 M: Yuanhan Liu <yuanhan.liu@linux.intel.com>
+T: git://dpdk.org/next/dpdk-next-virtio
 F: drivers/net/virtio/
 F: doc/guides/nics/virtio.rst
 F: lib/librte_vhost/
@@ -371,6 +372,7 @@ F: doc/guides/nics/vmxnet3.rst
 Vhost PMD
 M: Tetsuya Mukawa <mukawa@igel.co.jp>
 M: Yuanhan Liu <yuanhan.liu@linux.intel.com>
+T: git://dpdk.org/next/dpdk-next-virtio
 F: drivers/net/vhost/
 
 PCAP PMD
@@ -386,10 +388,14 @@ F: doc/guides/nics/pcap_ring.rst
 F: app/test/test_pmd_ring.c
 F: app/test/test_pmd_ring_perf.c
 
-Null PMD
+Null Networking PMD
 M: Tetsuya Mukawa <mukawa@igel.co.jp>
 F: drivers/net/null/
 
+
+Crypto Drivers
+--------------
+
 Intel AES-NI GCM PMD
 M: Declan Doherty <declan.doherty@intel.com>
 F: drivers/crypto/aesni_gcm/
index d85bb08..536198f 100644 (file)
@@ -33,7 +33,7 @@ include $(RTE_SDK)/mk/rte.vars.mk
 
 ifeq ($(CONFIG_RTE_LIBRTE_PDUMP),y)
 
-APP = dpdk_pdump
+APP = dpdk-pdump
 
 CFLAGS += $(WERROR_FLAGS)
 
index e0ff8be..b76cfd0 100644 (file)
@@ -524,6 +524,26 @@ free_ring_data(struct rte_ring *ring, uint8_t vdev_id,
                pdump_rxtx(ring, vdev_id, stats);
 }
 
+static void
+cleanup_rings(void)
+{
+       int i;
+       struct pdump_tuples *pt;
+
+       for (i = 0; i < num_tuples; i++) {
+               pt = &pdump_t[i];
+
+               if (pt->device_id)
+                       free(pt->device_id);
+
+               /* free the rings */
+               if (pt->rx_ring)
+                       rte_ring_free(pt->rx_ring);
+               if (pt->tx_ring)
+                       rte_ring_free(pt->tx_ring);
+       }
+}
+
 static void
 cleanup_pdump_resources(void)
 {
@@ -545,16 +565,8 @@ cleanup_pdump_resources(void)
                        free_ring_data(pt->rx_ring, pt->rx_vdev_id, &pt->stats);
                if (pt->dir & RTE_PDUMP_FLAG_TX)
                        free_ring_data(pt->tx_ring, pt->tx_vdev_id, &pt->stats);
-
-               if (pt->device_id)
-                       free(pt->device_id);
-
-               /* free the rings */
-               if (pt->rx_ring)
-                       rte_ring_free(pt->rx_ring);
-               if (pt->tx_ring)
-                       rte_ring_free(pt->tx_ring);
        }
+       cleanup_rings();
 }
 
 static void
@@ -630,10 +642,12 @@ create_mp_ring_vdev(void)
                                        MBUF_POOL_CACHE_SIZE, 0,
                                        pt->mbuf_data_size,
                                        rte_socket_id());
-                       if (mbuf_pool == NULL)
+                       if (mbuf_pool == NULL) {
+                               cleanup_rings();
                                rte_exit(EXIT_FAILURE,
                                        "Mempool creation failed: %s\n",
                                        rte_strerror(rte_errno));
+                       }
                }
                pt->mp = mbuf_pool;
 
@@ -643,19 +657,23 @@ create_mp_ring_vdev(void)
                        snprintf(ring_name, SIZE, RX_RING, i);
                        pt->rx_ring = rte_ring_create(ring_name, pt->ring_size,
                                        rte_socket_id(), 0);
-                       if (pt->rx_ring == NULL)
+                       if (pt->rx_ring == NULL) {
+                               cleanup_rings();
                                rte_exit(EXIT_FAILURE, "%s:%s:%d\n",
                                                rte_strerror(rte_errno),
                                                __func__, __LINE__);
+                       }
 
                        /* create tx_ring */
                        snprintf(ring_name, SIZE, TX_RING, i);
                        pt->tx_ring = rte_ring_create(ring_name, pt->ring_size,
                                        rte_socket_id(), 0);
-                       if (pt->tx_ring == NULL)
+                       if (pt->tx_ring == NULL) {
+                               cleanup_rings();
                                rte_exit(EXIT_FAILURE, "%s:%s:%d\n",
                                                rte_strerror(rte_errno),
                                                __func__, __LINE__);
+                       }
 
                        /* create vdevs */
                        (pt->rx_vdev_stream_type == IFACE) ?
@@ -663,10 +681,12 @@ create_mp_ring_vdev(void)
                        pt->rx_dev) :
                        snprintf(vdev_args, SIZE, VDEV_PCAP, RX_STR, i,
                        pt->rx_dev);
-                       if (rte_eth_dev_attach(vdev_args, &portid) < 0)
+                       if (rte_eth_dev_attach(vdev_args, &portid) < 0) {
+                               cleanup_rings();
                                rte_exit(EXIT_FAILURE,
                                        "vdev creation failed:%s:%d\n",
                                        __func__, __LINE__);
+                       }
                        pt->rx_vdev_id = portid;
 
                        /* configure vdev */
@@ -680,10 +700,13 @@ create_mp_ring_vdev(void)
                                pt->tx_dev) :
                                snprintf(vdev_args, SIZE, VDEV_PCAP, TX_STR, i,
                                pt->tx_dev);
-                               if (rte_eth_dev_attach(vdev_args, &portid) < 0)
+                               if (rte_eth_dev_attach(vdev_args,
+                                                       &portid) < 0) {
+                                       cleanup_rings();
                                        rte_exit(EXIT_FAILURE,
                                                "vdev creation failed:"
                                                "%s:%d\n", __func__, __LINE__);
+                               }
                                pt->tx_vdev_id = portid;
 
                                /* configure vdev */
@@ -695,19 +718,23 @@ create_mp_ring_vdev(void)
                        snprintf(ring_name, SIZE, RX_RING, i);
                        pt->rx_ring = rte_ring_create(ring_name, pt->ring_size,
                                        rte_socket_id(), 0);
-                       if (pt->rx_ring == NULL)
+                       if (pt->rx_ring == NULL) {
+                               cleanup_rings();
                                rte_exit(EXIT_FAILURE, "%s\n",
                                        rte_strerror(rte_errno));
+                       }
 
                        (pt->rx_vdev_stream_type == IFACE) ?
                        snprintf(vdev_args, SIZE, VDEV_IFACE, RX_STR, i,
                                pt->rx_dev) :
                        snprintf(vdev_args, SIZE, VDEV_PCAP, RX_STR, i,
                                pt->rx_dev);
-                       if (rte_eth_dev_attach(vdev_args, &portid) < 0)
+                       if (rte_eth_dev_attach(vdev_args, &portid) < 0) {
+                               cleanup_rings();
                                rte_exit(EXIT_FAILURE,
                                        "vdev creation failed:%s:%d\n",
                                        __func__, __LINE__);
+                       }
                        pt->rx_vdev_id = portid;
                        /* configure vdev */
                        configure_vdev(pt->rx_vdev_id);
@@ -717,18 +744,22 @@ create_mp_ring_vdev(void)
                        snprintf(ring_name, SIZE, TX_RING, i);
                        pt->tx_ring = rte_ring_create(ring_name, pt->ring_size,
                                        rte_socket_id(), 0);
-                       if (pt->tx_ring == NULL)
+                       if (pt->tx_ring == NULL) {
+                               cleanup_rings();
                                rte_exit(EXIT_FAILURE, "%s\n",
                                        rte_strerror(rte_errno));
+                       }
 
                        (pt->tx_vdev_stream_type == IFACE) ?
                        snprintf(vdev_args, SIZE, VDEV_IFACE, TX_STR, i,
                                pt->tx_dev) :
                        snprintf(vdev_args, SIZE, VDEV_PCAP, TX_STR, i,
                                pt->tx_dev);
-                       if (rte_eth_dev_attach(vdev_args, &portid) < 0)
+                       if (rte_eth_dev_attach(vdev_args, &portid) < 0) {
+                               cleanup_rings();
                                rte_exit(EXIT_FAILURE,
                                        "vdev creation failed\n");
+                       }
                        pt->tx_vdev_id = portid;
 
                        /* configure vdev */
index 33e058e..e051e03 100644 (file)
@@ -31,7 +31,7 @@
 
 include $(RTE_SDK)/mk/rte.vars.mk
 
-APP = dpdk_proc_info
+APP = dpdk-procinfo
 
 CFLAGS += $(WERROR_FLAGS)
 
index c69705e..defd46e 100644 (file)
@@ -158,7 +158,7 @@ parallel_test_group_list = [
 },
 {
        "Prefix":       "group_3",
-       "Memory" :      per_sockets(390),
+       "Memory" :      per_sockets(512),
        "Tests" :
        [
                {
@@ -287,7 +287,7 @@ parallel_test_group_list = [
 },
 {
        "Prefix":       "group_6",
-       "Memory" :      per_sockets(128),
+       "Memory" :      per_sockets(512),
        "Tests" :
        [
                {
index bd99e19..21d3be2 100644 (file)
@@ -107,8 +107,10 @@ def run_test_group(cmdline, test_group):
 
        # parse the binary for available test commands
        binary = cmdline.split()[0]
-       symbols = subprocess.check_output(['nm', binary]).decode('utf-8')
-       avail_cmds = re.findall('test_register_(\w+)', symbols)
+       stripped = 'not stripped' not in subprocess.check_output(['file', binary])
+       if not stripped:
+               symbols = subprocess.check_output(['nm', binary]).decode('utf-8')
+               avail_cmds = re.findall('test_register_(\w+)', symbols)
 
        # run all tests in test group
        for test in test_group["Tests"]:
@@ -129,7 +131,7 @@ def run_test_group(cmdline, test_group):
                        print >>logfile, "\n%s %s\n" % ("-"*20, test["Name"])
 
                        # run test function associated with the test
-                       if test["Command"] in avail_cmds:
+                       if stripped or test["Command"] in avail_cmds:
                                result = test["Func"](child, test["Command"])
                        else:
                                result = (0, "Skipped [Not Available]")
index 684ad80..c0823ea 100644 (file)
@@ -809,7 +809,7 @@ test_refcnt_mbuf(void)
 
        if (refcnt_mbuf_ring == NULL &&
                        (refcnt_mbuf_ring = rte_ring_create("refcnt_mbuf_ring",
-                       REFCNT_RING_SIZE, SOCKET_ID_ANY,
+                       rte_align32pow2(REFCNT_RING_SIZE), SOCKET_ID_ANY,
                        RING_F_SP_ENQ)) == NULL) {
                printf("%s: cannot allocate " MAKE_STRING(refcnt_mbuf_ring)
                    "\n", __func__);
index 46ad670..3b21cf7 100644 (file)
@@ -506,7 +506,6 @@ test_mempool(void)
 {
        struct rte_mempool *mp_cache = NULL;
        struct rte_mempool *mp_nocache = NULL;
-       struct rte_mempool *mp_ext = NULL;
        struct rte_mempool *mp_stack = NULL;
 
        rte_atomic32_init(&synchro);
@@ -605,7 +604,7 @@ test_mempool(void)
 err:
        rte_mempool_free(mp_nocache);
        rte_mempool_free(mp_cache);
-       rte_mempool_free(mp_ext);
+       rte_mempool_free(mp_stack);
        return -1;
 }
 
index 3885d3b..bd8f900 100644 (file)
@@ -34,7 +34,7 @@ include $(RTE_SDK)/mk/rte.vars.mk
 #
 # library name
 #
-HOSTAPP = pmdinfogen
+HOSTAPP = dpdk-pmdinfogen
 
 #
 # all sources are stored in SRCS-y
index ba5c4de..b2cc903 100644 (file)
@@ -155,7 +155,7 @@ It can be installed as follows:
    sudo apt-get -y install doxygen
 
    # Red Hat/Fedora.
-   sudo yum     -y install doxygen
+   sudo dnf     -y install doxygen
 
 `Sphinx`_ is a Python documentation tool for converting RST files to Html or to PDF (via LaTeX).
 For full support with figure and table captioning the latest version of Sphinx can be installed as follows:
@@ -165,10 +165,12 @@ For full support with figure and table captioning the latest version of Sphinx c
    # Ubuntu/Debian.
    sudo apt-get -y install python-pip
    sudo pip install --upgrade sphinx
+   sudo pip install --upgrade sphinx_rtd_theme
 
    # Red Hat/Fedora.
-   sudo yum     -y install python-pip
+   sudo dnf     -y install python-pip
    sudo pip install --upgrade sphinx
+   sudo pip install --upgrade sphinx_rtd_theme
 
 For further information on getting started with Sphinx see the `Sphinx Tutorial <http://sphinx-doc.org/tutorial.html>`_.
 
@@ -186,7 +188,7 @@ It can be installed as follows:
    sudo apt-get -y install inkscape
 
    # Red Hat/Fedora.
-   sudo yum     -y install inkscape
+   sudo dnf     -y install inkscape
 
 `TexLive <http://www.tug.org/texlive/>`_ is an installation package for Tex/LaTeX.
 It is used to generate the PDF versions of the documentation.
@@ -198,7 +200,7 @@ The main required packages can be installed as follows:
    sudo apt-get -y install texlive-latex-extra
 
    # Red Hat/Fedora, selective install.
-   sudo yum     -y install texlive-collection-latexextra
+   sudo dnf     -y install texlive-collection-latexextra
 
 
 Build commands
index 3228b92..8d1ea6c 100644 (file)
@@ -50,7 +50,7 @@ When you stop and restart the test application, it looks to see if the pages are
 If you look in the directory, you will see ``n`` number of 2M pages files. If you specified 1024, you will see 1024 page files.
 These are then placed in memory segments to get contiguous memory.
 
-If you need to change the number of pages, it is easier to first remove the pages. The tools/setup.sh script provides an option to do this.
+If you need to change the number of pages, it is easier to first remove the pages. The tools/dpdk-setup.sh script provides an option to do this.
 See the "Quick Start Setup Script" section in the :ref:`DPDK Getting Started Guide <linux_gsg>` for more information.
 
 
diff --git a/doc/guides/howto/flow_bifurcation.rst b/doc/guides/howto/flow_bifurcation.rst
new file mode 100644 (file)
index 0000000..a1c6262
--- /dev/null
@@ -0,0 +1,299 @@
+..  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.
+
+
+Flow Bifurcation How-to Guide
+=============================
+
+Flow Bifurcation is a mechanism which uses hardware capable Ethernet devices
+to split traffic between Linux user space and kernel space. Since it is a
+hardware assisted feature this approach can provide line rate processing
+capability. Other than :ref:`KNI <kni>`, the software is just required to
+enable device configuration, there is no need to take care of the packet
+movement during the traffic split. This can yield better performance with
+less CPU overhead.
+
+The Flow Bifurcation splits the incoming data traffic to user space
+applications (such as DPDK applications) and/or kernel space programs (such as
+the Linux kernel stack). It can direct some traffic, for example data plane
+traffic, to DPDK, while directing some other traffic, for example control
+plane traffic, to the traditional Linux networking stack.
+
+There are a number of technical options to achieve this. A typical example is
+to combine the technology of SR-IOV and packet classification filtering.
+
+SR-IOV is a PCI standard that allows the same physical adapter to be split as
+multiple virtual functions. Each virtual function (VF) has separated queues
+with physical functions (PF). The network adapter will direct traffic to a
+virtual function with a matching destination MAC address. In a sense, SR-IOV
+has the capability for queue division.
+
+Packet classification filtering is a hardware capability available on most
+network adapters. Filters can be configured to direct specific flows to a
+given receive queue by hardware. Different NICs may have different filter
+types to direct flows to a Virtual Function or a queue that belong to it.
+
+In this way the Linux networking stack can receive specific traffic through
+the kernel driver while a DPDK application can receive specific traffic
+bypassing the Linux kernel by using drivers like VFIO or the DPDK ``igb_uio``
+module.
+
+.. _figure_flow_bifurcation_overview:
+
+.. figure:: img/flow_bifurcation_overview.*
+
+   Flow Bifurcation Overview
+
+
+Using Flow Bifurcation on IXGBE in Linux
+----------------------------------------
+
+On Intel 82599 10 Gigabit Ethernet Controller series NICs Flow Bifurcation can
+be achieved by SR-IOV and Intel Flow Director technologies. Traffic can be
+directed to queues by the Flow Director capability, typically by matching
+5-tuple of UDP/TCP packets.
+
+The typical procedure to achieve this is as follows:
+
+#. Boot the system without iommu, or with ``iommu=pt``.
+
+#. Create Virtual Functions:
+
+   .. code-block:: console
+
+       echo 2 > /sys/bus/pci/devices/0000:01:00.0/sriov_numvfs
+
+#. Enable and set flow filters:
+
+   .. code-block:: console
+
+       ethtool -K eth1 ntuple on
+       ethtool -N eth1 flow-type udp4 src-ip 192.0.2.2 dst-ip 198.51.100.2 \
+               action $queue_index_in_VF0
+       ethtool -N eth1 flow-type udp4 src-ip 198.51.100.2 dst-ip 192.0.2.2 \
+               action $queue_index_in_VF1
+
+   Where:
+
+   * ``$queue_index_in_VFn``: Bits 39:32 of the variable defines VF id + 1; the lower 32 bits indicates the queue index of the VF. Thus:
+
+     * ``$queue_index_in_VF0`` = ``(0x1 & 0xFF) << 32 + [queue index]``.
+
+     * ``$queue_index_in_VF1`` = ``(0x2 & 0xFF) << 32 + [queue index]``.
+
+   .. _figure_ixgbe_bifu_queue_idx:
+
+   .. figure:: img/ixgbe_bifu_queue_idx.*
+
+#. Compile the DPDK application and insert ``igb_uio`` or probe the ``vfio-pci`` kernel modules as normal.
+
+#. Bind the virtual functions:
+
+   .. code-block:: console
+
+       modprobe vfio-pci
+       dpdk_nic_bind.py -b vfio-pci 01:10.0
+       dpdk_nic_bind.py -b vfio-pci 01:10.1
+
+#. Run a DPDK application on the VFs:
+
+   .. code-block:: console
+
+       testpmd -c 0xff -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
+the default queue or scaling on queues in the PF. That is to say UDP packets
+with the specified IP source and destination addresses will go through the
+DPDK application. All other traffic, with different hosts or different
+protocols, will go through the Linux networking stack.
+
+.. note::
+
+    * The above steps work on the Linux kernel v4.2.
+
+    * The Flow Bifurcation is implemented in Linux kernel and ixgbe kernel driver using the following patches:
+
+        * `ethtool: Add helper routines to pass vf to rx_flow_spec <https://patchwork.ozlabs.org/patch/476511/>`_
+
+        * `ixgbe: Allow flow director to use entire queue space <https://patchwork.ozlabs.org/patch/476516/>`_
+
+    * The Ethtool version used in this example is 3.18.
+
+
+Using Flow Bifurcation on I40E in Linux
+---------------------------------------
+
+On Intel X710/XL710 series Ethernet Controllers Flow Bifurcation can be
+achieved by SR-IOV, Cloud Filter and L3 VEB switch. The traffic can be
+directed to queues by the Cloud Filter and L3 VEB switch's matching rule.
+
+* L3 VEB filters work for non-tunneled packets. It can direct a packet just by
+  the Destination IP address to a queue in a VF.
+
+* Cloud filters work for the following types of tunneled packets.
+
+    * Inner mac.
+
+    * Inner mac + VNI.
+
+    * Outer mac + Inner mac + VNI.
+
+    * Inner mac + Inner vlan + VNI.
+
+    * Inner mac + Inner vlan.
+
+The typical procedure to achieve this is as follows:
+
+#. Boot the system without iommu, or with ``iommu=pt``.
+
+#. Build and insert the ``i40e.ko`` module.
+
+#. Create Virtual Functions:
+
+   .. code-block:: console
+
+       echo 2 > /sys/bus/pci/devices/0000:01:00.0/sriov_numvfs
+
+#. Add udp port offload to the NIC if using cloud filter:
+
+   .. code-block:: console
+
+       ip li add vxlan0 type vxlan id 42 group 239.1.1.1 local 10.16.43.214 dev <name>
+       ifconfig vxlan0 up
+       ip -d li show vxlan0
+
+   .. note::
+
+       Output such as ``add vxlan port 8472, index 0 success`` should be
+       found in the system log.
+
+#. Examples of enabling and setting flow filters:
+
+   * L3 VEB filter, for a route whose destination IP is 192.168.50.108 to VF
+     0's queue 2.
+
+     .. code-block:: console
+
+       ethtool -N <dev_name> flow-type ip4 dst-ip 192.168.50.108 \
+               user-def 0xffffffff00000000 action 2 loc 8
+
+   * Inner mac, for a route whose inner destination mac is 0:0:0:0:9:0 to
+     PF's queue 6.
+
+     .. code-block:: console
+
+       ethtool -N <dev_name> flow-type ether dst 00:00:00:00:00:00 \
+               m ff:ff:ff:ff:ff:ff src 00:00:00:00:09:00 m 00:00:00:00:00:00 \
+               user-def 0xffffffff00000003 action 6 loc 1
+
+   * Inner mac + VNI, for a route whose inner destination mac is 0:0:0:0:9:0
+     and VNI is 8 to PF's queue 4.
+
+     .. code-block:: console
+
+       ethtool -N <dev_name> flow-type ether dst 00:00:00:00:00:00 \
+               m ff:ff:ff:ff:ff:ff src 00:00:00:00:09:00 m 00:00:00:00:00:00 \
+               user-def 0x800000003 action 4 loc 4
+
+   * Outer mac + Inner mac + VNI, for a route whose outer mac is
+     68:05:ca:24:03:8b, inner destination mac is c2:1a:e1:53:bc:57, and VNI
+     is 8 to PF's queue 2.
+
+     .. code-block:: console
+
+       ethtool -N <dev_name> flow-type ether dst 68:05:ca:24:03:8b \
+               m 00:00:00:00:00:00 src c2:1a:e1:53:bc:57 m 00:00:00:00:00:00 \
+               user-def 0x800000003 action 2 loc 2
+
+   * Inner mac + Inner vlan + VNI, for a route whose inner destination mac is
+     00:00:00:00:20:00, inner vlan is 10, and VNI is 8 to VF 0's queue 1.
+
+     .. code-block:: console
+
+       ethtool -N <dev_name> flow-type ether dst 00:00:00:00:01:00 \
+               m ff:ff:ff:ff:ff:ff src 00:00:00:00:20:00 m 00:00:00:00:00:00 \
+               vlan 10 user-def 0x800000000 action 1 loc 5
+
+   * Inner mac + Inner vlan, for a route whose inner destination mac is
+     00:00:00:00:20:00, and inner vlan is 10 to VF 0's queue 1.
+
+     .. code-block:: console
+
+       ethtool -N <dev_name> flow-type ether dst 00:00:00:00:01:00 \
+               m ff:ff:ff:ff:ff:ff src 00:00:00:00:20:00 m 00:00:00:00:00:00 \
+               vlan 10 user-def 0xffffffff00000000 action 1 loc 5
+
+   .. note::
+
+       * If the upper 32 bits of 'user-def' are ``0xffffffff``, then the
+         filter can be used for programming an L3 VEB filter, otherwise the
+         upper 32 bits of 'user-def' can carry the tenant ID/VNI if
+         specified/required.
+
+       * Cloud filters can be defined with inner mac, outer mac, inner ip,
+         inner vlan and VNI as part of the cloud tuple. It is always the
+         destination (not source) mac/ip that these filters use. For all
+         these examples dst and src mac address fields are overloaded dst ==
+         outer, src == inner.
+
+       * The filter will direct a packet matching the rule to a vf id
+         specified in the lower 32 bit of user-def to the queue specified by
+         'action'.
+
+       * If the vf id specified by the lower 32 bit of user-def is greater
+         than or equal to ``max_vfs``, then the filter is for the PF queues.
+
+#. Compile the DPDK application and insert ``igb_uio`` or probe the ``vfio-pci``
+   kernel modules as normal.
+
+#. Bind the virtual function:
+
+   .. code-block:: console
+
+       modprobe vfio-pci
+       dpdk_nic_bind.py -b vfio-pci 01:10.0
+       dpdk_nic_bind.py -b vfio-pci 01:10.1
+
+#. run DPDK application on VFs:
+
+   .. code-block:: console
+
+       testpmd -c 0xff -n 4 -- -i -w 01:10.0 -w 01:10.1 --forward-mode=mac
+
+.. note::
+
+   * The above steps work on the i40e Linux kernel driver v1.5.16.
+
+   * The Ethtool version used in this example is 3.18. The mask ``ff`` means
+     'not involved', while ``00`` or no mask means 'involved'.
+
+   * For more details of the configuration, refer to the
+     `cloud filter test plan <http://dpdk.org/browse/tools/dts/tree/test_plans/cloud_filter_test_plan.rst>`_
diff --git a/doc/guides/howto/img/flow_bifurcation_overview.svg b/doc/guides/howto/img/flow_bifurcation_overview.svg
new file mode 100644 (file)
index 0000000..4fa2764
--- /dev/null
@@ -0,0 +1,544 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generated by Microsoft Visio, SVG Export bifurcated_driver_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="6.71874in"
+   height="4.83839in"
+   viewBox="0 0 483.75 348.364"
+   xml:space="preserve"
+   color-interpolation-filters="sRGB"
+   class="st28"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="bifurcated_driver_overview.svg"><metadata
+     id="metadata240"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></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="1600"
+     inkscape:window-height="837"
+     id="namedview238"
+     showgrid="false"
+     inkscape:zoom="1.0517845"
+     inkscape:cx="215.35622"
+     inkscape:cy="200.74714"
+     inkscape:window-x="-8"
+     inkscape:window-y="-8"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="g44" /><style
+     type="text/css"
+     id="style4"><![CDATA[
+               .st1 {visibility:visible}
+               .st2 {fill:none;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22}
+               .st3 {fill:#5b9bd5;filter:url(#filter_2);font-family:Calibri;font-size:1.16666em;font-weight:bold;opacity:0.219608}
+               .st4 {fill:none;stroke:#c7c8c8;stroke-width:0.5}
+               .st5 {fill:#000000;font-family:Calibri;font-size:1.16666em;font-weight:bold}
+               .st6 {fill:#5b9bd5;filter:url(#filter_2);font-family:Calibri;font-size:1.5em;opacity:0.219608}
+               .st7 {fill:#000000;font-family:Calibri;font-size:1.5em}
+               .st8 {fill:#a8d08d;stroke:#4f87bb;stroke-width:0.75}
+               .st9 {fill:#000000;font-family:Calibri;font-size:0.833336em}
+               .st10 {fill:#5b9bd5;fill-opacity:0.22;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22}
+               .st11 {fill:#c00000;stroke:#c7c8c8;stroke-width:0.25}
+               .st12 {fill:#feffff;font-family:Calibri;font-size:0.833336em}
+               .st13 {font-size:1em}
+               .st14 {fill:#ff0000;font-size:1em;font-weight:bold}
+               .st15 {fill:#2e75b5;stroke:#c7c8c8;stroke-width:0.25}
+               .st16 {fill:url(#grad4-50);stroke:#c7c8c8;stroke-width:0.25}
+               .st17 {fill:#feffff;font-family:Calibri;font-size:0.666664em}
+               .st18 {fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25}
+               .st19 {fill:#000000;font-family:Calibri;font-size:1.16666em}
+               .st20 {marker-end:url(#mrkr13-84);marker-start:url(#mrkr13-82);stroke:#c00000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1}
+               .st21 {fill:#c00000;fill-opacity:1;stroke:#c00000;stroke-opacity:1;stroke-width:0.28409090909091}
+               .st22 {marker-end:url(#mrkr4-90);stroke:#c00000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1}
+               .st23 {marker-start:url(#mrkr13-106);stroke:#538135;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.75}
+               .st24 {fill:#538135;fill-opacity:1;stroke:#538135;stroke-opacity:1;stroke-width:0.40983606557377}
+               .st25 {marker-start:url(#mrkr13-112);stroke:#5b9bd5;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.75}
+               .st26 {fill:#5b9bd5;fill-opacity:1;stroke:#5b9bd5;stroke-opacity:1;stroke-width:0.40983606557377}
+               .st27 {fill:none;stroke:none;stroke-width:0.25}
+               .st28 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3}
+       ]]></style><defs
+     id="Patterns_And_Gradients"><radialGradient
+       id="grad4-50"
+       cx="0.5"
+       cy="0"
+       r="1.1"><stop
+         offset="0"
+         stop-color="#a8d08d"
+         stop-opacity="1"
+         id="stop8" /><stop
+         offset="0.24"
+         stop-color="#bedcaa"
+         stop-opacity="1"
+         id="stop10" /><stop
+         offset="0.59"
+         stop-color="#3374af"
+         stop-opacity="1"
+         id="stop12" /><stop
+         offset="0.75"
+         stop-color="#41719c"
+         stop-opacity="1"
+         id="stop14" /><stop
+         offset="1"
+         stop-color="#c5e0b3"
+         stop-opacity="1"
+         id="stop16" /></radialGradient></defs><defs
+     id="Markers"><g
+       id="lend13"><path
+         d="M 3 1 L 0 0 L 3 -1 L 3 1 "
+         style="stroke:none"
+         id="path20" /></g><marker
+       id="mrkr13-82"
+       class="st21"
+       refX="10.2"
+       orient="auto"
+       markerUnits="strokeWidth"
+       overflow="visible"><use
+         xlink:href="#lend13"
+         transform="scale(3.52) "
+         id="use23" /></marker><marker
+       id="mrkr13-84"
+       class="st21"
+       refX="-10.56"
+       orient="auto"
+       markerUnits="strokeWidth"
+       overflow="visible"><use
+         xlink:href="#lend13"
+         transform="scale(-3.52,-3.52) "
+         id="use26" /></marker><g
+       id="lend4"><path
+         d="M 2 1 L 0 0 L 2 -1 L 2 1 "
+         style="stroke:none"
+         id="path29" /></g><marker
+       id="mrkr4-90"
+       class="st21"
+       refX="-7.04"
+       orient="auto"
+       markerUnits="strokeWidth"
+       overflow="visible"><use
+         xlink:href="#lend4"
+         transform="scale(-3.52,-3.52) "
+         id="use32" /></marker><marker
+       id="mrkr13-106"
+       class="st24"
+       refX="7.1142857142857"
+       orient="auto"
+       markerUnits="strokeWidth"
+       overflow="visible"><use
+         xlink:href="#lend13"
+         transform="scale(2.44) "
+         id="use35" /></marker><marker
+       id="mrkr13-112"
+       class="st26"
+       refX="7.1142857142857"
+       orient="auto"
+       markerUnits="strokeWidth"
+       overflow="visible"><use
+         xlink:href="#lend13"
+         transform="scale(2.44) "
+         id="use38" /></marker></defs><defs
+     id="Filters"><filter
+       id="filter_2"><feGaussianBlur
+         stdDeviation="2"
+         id="feGaussianBlur42" /></filter></defs><g
+     id="g44"><title
+       id="title46">Page-1</title><g
+       id="shape85-1"
+       transform="translate(133.887,-26.1478)"><title
+         id="title49">Sheet.85</title><desc
+         id="desc51">NIC</desc><g
+         id="shadow85-2"
+         transform="matrix(1,0,0,1,0.345598,1.97279)"
+         class="st1"><rect
+           x="0"
+           y="255.497"
+           width="346.142"
+           height="92.8673"
+           class="st2"
+           id="rect54" /><text
+           x="162.89"
+           y="349.33"
+           class="st3"
+           id="text56">NIC</text>
+</g><rect
+         x="0"
+         y="255.497"
+         width="346.142"
+         height="92.8673"
+         class="st4"
+         id="rect58"
+         style="stroke-width:0.50000076;stroke-miterlimit:3;stroke-dasharray:none" /><text
+         x="162.89"
+         y="349.33"
+         class="st5"
+         id="text60">NIC</text>
+</g><g
+       id="shape20-9"
+       transform="translate(3.0289,-127.458)"><title
+         id="title63">Rounded Rectangle.20</title><desc
+         id="desc65">LINUX</desc><g
+         id="shadow20-10"
+         transform="matrix(1,0,0,1,0.345598,1.97279)"
+         class="st1"><path
+           d="M30.39 348.36 L273.54 348.36 A30.3924 30.3924 -180 0 0 303.93 317.97 L303.93 235.23 A30.3924 30.3924 -180         0 0 273.54 204.84 L30.39 204.84 A30.3924 30.3924 -180 0 0 0 235.23 L0 317.97 A30.3924 30.3924 -180 0         0 30.39 348.36 Z"
+           class="st2"
+           id="path68" /><text
+           x="255.32"
+           y="238.8"
+           class="st6"
+           id="text70">LINUX</text>
+</g><path
+         d="M30.39 348.36 L273.54 348.36 A30.3924 30.3924 -180 0 0 303.93 317.97 L303.93 235.23 A30.3924 30.3924 -180 0        0 273.54 204.84 L30.39 204.84 A30.3924 30.3924 -180 0 0 0 235.23 L0 317.97 A30.3924 30.3924 -180 0 0 30.39        348.36 Z"
+         class="st4"
+         id="path72" /><text
+         x="255.32"
+         y="238.8"
+         class="st7"
+         id="text74">LINUX</text>
+</g><g
+       id="shape8-17"
+       transform="translate(95.8962,-140.079)"><title
+         id="title77">Rounded Rectangle.8</title><desc
+         id="desc79">Kernel pf driver</desc><path
+         d="M18.57 348.36 L167.16 348.36 A18.5731 18.5731 -180 0 0 185.73 329.79 L185.73 303.58 A18.5731 18.5731 -180 0        0 167.16 285 L18.57 285 A18.5731 18.5731 -180 0 0 0 303.58 L0 329.79 A18.5731 18.5731 -180 0 0 18.57 348.36        Z"
+         class="st8"
+         id="path81" /><text
+         x="118.71"
+         y="319.68"
+         class="st9"
+         id="text83">Kernel pf driver  </text>
+</g><g
+       id="shape1-20"
+       transform="translate(103.263,-156.88)"><title
+         id="title86">Rounded Rectangle</title><desc
+         id="desc88">Filters support traffic steering to VF</desc><g
+         id="shadow1-21"
+         transform="matrix(1,0,0,1,0.345598,1.97279)"
+         class="st1"><path
+           d="M10.55 348.36 L94.98 348.36 A10.5529 10.5529 -180 0 0 105.53 337.81 L105.53 324.98 A10.5529 10.5529 -180         0 0 94.98 314.43 L10.55 314.43 A10.5529 10.5529 -180 0 0 0 324.98 L0 337.81 A10.5529 10.5529 -180 0         0 10.55 348.36 Z"
+           class="st10"
+           id="path91" /></g><path
+         d="M10.55 348.36 L94.98 348.36 A10.5529 10.5529 -180 0 0 105.53 337.81 L105.53 324.98 A10.5529 10.5529 -180 0 0        94.98 314.43 L10.55 314.43 A10.5529 10.5529 -180 0 0 0 324.98 L0 337.81 A10.5529 10.5529 -180 0 0 10.55        348.36 Z"
+         class="st11"
+         id="path93" /><text
+         x="10.03"
+         y="328.39"
+         class="st12"
+         id="text95"
+         style="-inkscape-font-specification:'Calibri, Normal';font-family:Calibri;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;font-size:10.00001526px;text-anchor:start;text-align:start;writing-mode:lr;line-height:125%;"
+         sodipodi:linespacing="125%"><tspan
+           sodipodi:role="line"
+           id="tspan4475">Filters support traffic</tspan></text>
+<text
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.00001526px;line-height:125%;font-family:Calibri;-inkscape-font-specification:'Calibri, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#feffff"
+         x="11.048484"
+         y="340.46152"
+         class="st12"
+         id="text95-1"
+         sodipodi:linespacing="125%"><tspan
+           sodipodi:role="line"
+           id="tspan4477"
+           x="11.048484"
+           y="340.46152">steering to VF</tspan></text>
+</g><g
+       id="shape3-27"
+       transform="translate(192.985,-73.088)"><title
+         id="title100">Rectangle.3</title><desc
+         id="desc102">Rx Queues (0-N) PF</desc><rect
+         x="0"
+         y="314.425"
+         width="75.9823"
+         height="33.9388"
+         class="st8"
+         id="rect104" /><text
+         x="16.43"
+         y="322.39"
+         class="st9"
+         id="text106"
+         style="-inkscape-font-specification:'Calibri, Normal';font-family:Calibri;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;font-size:10.00001526px;text-anchor:start;text-align:start;writing-mode:lr;line-height:125%;"
+         sodipodi:linespacing="125%"><tspan
+           sodipodi:role="line"
+           id="tspan4512">Rx Queues</tspan></text>
+<text
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.00001526px;line-height:125%;font-family:Calibri;-inkscape-font-specification:'Calibri, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000"
+         x="23.187859"
+         y="333.70471"
+         class="st9"
+         id="text106-2"
+         sodipodi:linespacing="125%"><tspan
+           sodipodi:role="line"
+           id="tspan4514"
+           x="23.187859"
+           y="333.70471">( 0-N )</tspan></text>
+<text
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.00001526px;line-height:125%;font-family:Calibri;-inkscape-font-specification:'Calibri, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1"
+         x="27.490538"
+         y="345.52356"
+         class="st9"
+         id="text106-9"
+         sodipodi:linespacing="125%"><tspan
+           sodipodi:role="line"
+           id="tspan4516"
+           x="27.490538"
+           y="345.52356"> PF</tspan></text>
+</g><g
+       id="shape4-32"
+       transform="translate(344.949,-73.088)"><title
+         id="title113">Rectangle.4</title><desc
+         id="desc115">Rx Queues (0-M) VF(vf 0)</desc><g
+         id="shadow4-33"
+         transform="matrix(1,0,0,1,0.345598,1.97279)"
+         class="st1"><rect
+           x="0"
+           y="314.425"
+           width="75.9823"
+           height="33.9388"
+           class="st10"
+           id="rect118" /></g><rect
+         x="0"
+         y="314.425"
+         width="75.9823"
+         height="33.9388"
+         class="st15"
+         id="rect120" /><text
+         x="16.43"
+         y="322.39"
+         class="st9"
+         id="text122"
+         style="-inkscape-font-specification:'Calibri, Normal';font-family:Calibri;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;font-size:10.00001526px;text-anchor:start;text-align:start;writing-mode:lr;line-height:125%;"
+         sodipodi:linespacing="125%"><tspan
+           sodipodi:role="line"
+           id="tspan4571">Rx Queues</tspan></text>
+<text
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.00001526px;line-height:125%;font-family:Calibri;-inkscape-font-specification:'Calibri, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000"
+         x="21.777092"
+         y="333.69595"
+         class="st9"
+         id="text122-8"
+         sodipodi:linespacing="125%"><tspan
+           sodipodi:role="line"
+           id="tspan4569"
+           x="21.777092"
+           y="333.69595">( 0-M )</tspan></text>
+<text
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.00001526px;line-height:125%;font-family:Calibri;-inkscape-font-specification:'Calibri, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1"
+         x="21.79059"
+         y="343.91479"
+         class="st9"
+         id="text122-0"
+         sodipodi:linespacing="125%"><tspan
+           sodipodi:role="line"
+           id="tspan4573"
+           x="21.79059"
+           y="343.91479">VF(vf0)</tspan></text>
+</g><g
+       id="shape5-44"
+       transform="translate(154.994,-43.0328)"><title
+         id="title137">Rectangle.5</title><desc
+         id="desc139">filters</desc><g
+         id="shadow5-45"
+         transform="matrix(1,0,0,1,0.345598,1.97279)"
+         class="st1"><rect
+           x="0"
+           y="331.479"
+           width="303.929"
+           height="16.885"
+           class="st10"
+           id="rect142" /></g><rect
+         x="0"
+         y="331.479"
+         width="303.929"
+         height="16.885"
+         class="st16"
+         id="rect144" /><text
+         x="140.28"
+         y="342.92"
+         class="st9"
+         id="text146">filters</text>
+</g><g
+       id="shape6-52"
+       transform="translate(95.8962,-224.377)"><title
+         id="title149">Rounded Rectangle.6</title><desc
+         id="desc151">Tools to program filters</desc><path
+         d="m 7.6,347.29783 60.78,0 a 7.59811,7.59811 0 0 0 7.6,-7.59 l 0,-18.58 a 7.59811,7.59811 0 0 0 -7.6,-7.6 l -60.78,0 a 7.59811,7.59811 0 0 0 -7.6,7.6 l 0,18.58 a 7.59811,7.59811 0 0 0 7.6,7.59 z"
+         class="st8"
+         id="path153"
+         inkscape:connector-curvature="0"
+         style="fill:#a8d08d;stroke:#4f87bb;stroke-width:0.75" /><text
+         x="21.74"
+         y="328.48001"
+         class="st9"
+         id="text155"
+         style="font-size:10.00003242px;font-family:Calibri;fill:#000000">Tools to <tspan
+   x="7.6900001"
+   class="st13"
+   id="tspan157"
+   style="font-size:10.00003242px" /></text>
+<text
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.00001526px;line-height:125%;font-family:Calibri;-inkscape-font-specification:'Calibri, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000"
+         x="23.40806"
+         y="340.79666"
+         class="st9"
+         id="text155-1"
+         sodipodi:linespacing="125%"><tspan
+           x="9.358057"
+           class="st13"
+           id="tspan157-9"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.00001526px;line-height:125%;font-family:Calibri;-inkscape-font-specification:'Calibri, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start">program filters</tspan></text>
+</g><g
+       id="shape22-56"
+       transform="translate(11.4714,-156.88)"><title
+         id="title160">2-D word balloon</title><desc
+         id="desc162">Director flows to queue index in specified VF</desc><text
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.0000124px;line-height:125%;font-family:Calibri;-inkscape-font-specification:'Calibri, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#feffff"
+         x="8.0559683"
+         y="346.97244"
+         class="st17"
+         id="text169-3-4"
+         sodipodi:linespacing="125%"><tspan
+           sodipodi:role="line"
+           id="tspan4471"
+           x="8.0559683"
+           y="346.97244">inspecified VF</tspan></text>
+<g
+         id="shadow22-57"
+         transform="matrix(1,0,0,1,0.345598,1.97279)"
+         class="st1"><path
+           d="M0 327.15 L0 314.43 L28.49 314.43 L37.99 314.43 L47.49 314.43 L75.98 314.43 L75.98 327.15 L91.79 331.39         L75.98 335.64 L75.98 348.36 L47.49 348.36 L37.99 348.36 L28.49 348.36 L0 348.36 L0 335.64 L0 331.39         L0 327.15 Z"
+           class="st10"
+           id="path165" /></g><path
+         d="m 0.53783484,327.68783 0,-12.72 28.49000016,0 9.5,0 9.5,0 28.49,0 0,12.72 15.81,4.24 -15.81,4.25 0,12.72 -28.49,0 -9.5,0 -9.5,0 -28.49000016,0 0,-12.72 0,-4.25 0,-4.24 z"
+         class="st11"
+         id="path167"
+         inkscape:connector-curvature="0"
+         style="fill:#c00000;stroke:#c7c8c8;stroke-width:0.25" /><text
+         x="7.5599966"
+         y="324.19"
+         class="st17"
+         id="text169"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.0000124px;line-height:125%;font-family:Calibri;-inkscape-font-specification:'Calibri, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#feffff"
+         sodipodi:linespacing="125%"><tspan
+           sodipodi:role="line"
+           id="tspan4446"
+           x="7.5599966"
+           y="324.19">Director flows</tspan></text>
+<text
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.0000124px;line-height:125%;font-family:Calibri;-inkscape-font-specification:'Calibri, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#feffff"
+         x="8.1099777"
+         y="334.57529"
+         class="st17"
+         id="text169-3"
+         sodipodi:linespacing="125%"><tspan
+           sodipodi:role="line"
+           id="tspan4469"
+           x="8.1099777"
+           y="334.57529">to queue index</tspan></text>
+<text
+         x="8.5350533"
+         y="345.4624"
+         class="st17"
+         id="text169-5"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.00001221px;line-height:125%;font-family:Calibri;-inkscape-font-specification:'Calibri, Normal';text-align:start;writing-mode:lr;text-anchor:start;fill:#feffff;"
+         sodipodi:linespacing="125%"><tspan
+           sodipodi:role="line"
+           id="tspan4479">in specified VF</tspan></text>
+</g><g
+       id="shape24-64"
+       transform="translate(323.843,-285.05)"><title
+         id="title176">Rounded Rectangle.24</title><desc
+         id="desc178">DPDK</desc><g
+         id="shadow24-65"
+         transform="matrix(1,0,0,1,0.345598,1.97279)"
+         class="st1"><path
+           d="M9.29 348.36 L83.58 348.36 A9.28657 9.28657 -180 0 0 92.87 339.08 L92.87 295.74 A9.28657 9.28657 -180 0         0 83.58 286.45 L9.29 286.45 A9.28657 9.28657 -180 0 0 0 295.74 L0 339.08 A9.28657 9.28657 -180 0 0 9.29         348.36 Z"
+           class="st10"
+           id="path181" /></g><path
+         d="M9.29 348.36 L83.58 348.36 A9.28657 9.28657 -180 0 0 92.87 339.08 L92.87 295.74 A9.28657 9.28657 -180 0 0 83.58        286.45 L9.29 286.45 A9.28657 9.28657 -180 0 0 0 295.74 L0 339.08 A9.28657 9.28657 -180 0 0 9.29 348.36 Z"
+         class="st18"
+         id="path183" /><text
+         x="30.57"
+         y="321.61"
+         class="st19"
+         id="text185">DPDK</text>
+</g><g
+       id="shape25-70"
+       transform="translate(192.985,-285.05)"><title
+         id="title188">Rounded Rectangle.25</title><desc
+         id="desc190">Socket</desc><path
+         d="M9.29 348.36 L83.58 348.36 A9.28657 9.28657 -180 0 0 92.87 339.08 L92.87 295.74 A9.28657 9.28657 -180 0 0 83.58        286.45 L9.29 286.45 A9.28657 9.28657 -180 0 0 0 295.74 L0 339.08 A9.28657 9.28657 -180 0 0 9.29 348.36 Z"
+         class="st8"
+         id="path192" /><text
+         x="27.56"
+         y="321.61"
+         class="st19"
+         id="text194">Socket</text>
+</g><g
+       id="shape44-73"
+       transform="translate(154.994,569.271) rotate(180)"><title
+         id="title197">Simple Arrow.44</title><g
+         id="shadow44-74"
+         transform="matrix(1,0,0,1,-0.345598,-1.97279)"
+         class="st1" /></g><g
+       id="shape52-75"
+       transform="translate(154.994,-127.458)"><title
+         id="title201">Single arrowhead</title></g><g
+       id="shape70-76"
+       transform="translate(221.976,-107.027)"><title
+         id="title204">Dynamic connector.70</title><path
+         d="M9 338.16 L9 337.8 L9 325.87"
+         class="st20"
+         id="path206" /></g><g
+       id="shape81-85"
+       transform="translate(124.887,-224.377)"><title
+         id="title209">Dynamic connector.81</title><path
+         d="M9 348.36 L9 362.26"
+         class="st22"
+         id="path211" /></g><g
+       id="shape83-91"
+       transform="translate(240.398,-57.5029)"><title
+         id="title214">Dynamic connector.83</title><path
+         d="M-8.58 345.95 L-8.97 339.8"
+         class="st22"
+         id="path216" /></g><g
+       id="shape84-96"
+       transform="translate(373.94,-57.5029)"><title
+         id="title219">Dynamic connector.84</title><path
+         d="M9 345.95 L9 339.82"
+         class="st22"
+         id="path221" /></g><g
+       id="shape98-101"
+       transform="translate(539.29,6.22333) rotate(79.2209)"><title
+         id="title224">Sheet.98</title><path
+         d="M11.39 310.28 L11.72 310.42 C54.22 328.18 100.77 337.63 149.11 345.35 C162.41 347.48 175.84 349.47 187.65 347.74        C201.36 345.74 212.87 338.71 218.42 327.59 C222.66 319.09 223.42 308.2 229.69 303.23 C239.2 295.7 261.37        301.76 275.96 305.26"
+         class="st23"
+         id="path226" /></g><g
+       id="shape109-107"
+       transform="translate(712.298,124.855) rotate(100.2)"><title
+         id="title229">Sheet.109</title><path
+         d="M12.03 344.31 L12.38 344.21 C55.98 332.05 99.42 314.86 144.33 309.38 C167.01 306.62 190.06 306.85 204.84 318.11        C212.98 324.32 218.61 333.88 226.49 339.83 C238.38 348.81 255.38 349.56 275.91 347.51"
+         class="st25"
+         id="path231" /></g><g
+       id="shape110-113"
+       transform="translate(108.779,-175.962)"><title
+         id="title234">Sheet.110</title><rect
+         x="0"
+         y="341.614"
+         width="94.5"
+         height="6.75"
+         class="st27"
+         id="rect236" /></g></g></svg>
\ No newline at end of file
diff --git a/doc/guides/howto/img/ixgbe_bifu_queue_idx.svg b/doc/guides/howto/img/ixgbe_bifu_queue_idx.svg
new file mode 100644 (file)
index 0000000..f7e2bd8
--- /dev/null
@@ -0,0 +1,101 @@
+<?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 ixgbe_bifu_queue_idx.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="4.59375in" height="0.535375in"
+               viewBox="0 0 330.75 38.547" xml:space="preserve" color-interpolation-filters="sRGB" class="st8">
+       <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:#c5e0b3;stroke:#c7c8c8;stroke-width:0.25}
+               .st6 {fill:#f4b183;stroke:#c7c8c8;stroke-width:0.25}
+               .st7 {fill:none;stroke:none;stroke-width:0.25}
+               .st8 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3}
+       ]]>
+       </style>
+
+       <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"/>
+               <g id="shape1-1" v:mID="1" v:groupContext="shape" transform="translate(3.0294,-5.34781)">
+                       <title>Rectangle</title>
+                       <desc>0x000000</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="52.1695" cy="30.3097" width="104.34" height="16.4746"/>
+                       <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="22.0724" width="104.339" height="16.4746" class="st2"/>
+                       </g>
+                       <rect x="0" y="22.0724" width="104.339" height="16.4746" class="st3"/>
+                       <text x="32.27" y="33.31" class="st4" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>0x000000</text>                </g>
+               <g id="shape2-7" v:mID="2" v:groupContext="shape" transform="translate(107.368,-5.34781)">
+                       <title>Rectangle.2</title>
+                       <desc>VF ID + 1</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="30.2034" cy="30.3097" width="60.41" height="16.4746"/>
+                       <g id="shadow2-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="22.0724" width="60.4068" height="16.4746" class="st2"/>
+                       </g>
+                       <rect x="0" y="22.0724" width="60.4068" height="16.4746" class="st5"/>
+                       <text x="12.32" y="33.31" class="st4" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>VF ID + 1</text>               </g>
+               <g id="shape3-13" v:mID="3" v:groupContext="shape" transform="translate(167.775,-5.34781)">
+                       <title>Rectangle.3</title>
+                       <desc>Queue Index</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="79.6271" cy="30.3097" width="159.26" height="16.4746"/>
+                       <g id="shadow3-14" 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="22.0724" width="159.254" height="16.4746" class="st2"/>
+                       </g>
+                       <rect x="0" y="22.0724" width="159.254" height="16.4746" class="st6"/>
+                       <text x="53.74" y="33.31" class="st4" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>Queue Index</text>             </g>
+               <g id="shape4-19" v:mID="4" v:groupContext="shape" transform="translate(305.063,-21.8224)">
+                       <title>Sheet.4</title>
+                       <desc>0</desc>
+                       <v:textBlock v:margins="rect(4,4,4,4)"/>
+                       <v:textRect cx="10.9831" cy="30.3097" width="21.97" height="16.4746"/>
+                       <rect x="0" y="22.0724" width="21.9661" height="16.4746" class="st7"/>
+                       <text x="8.45" y="33.31" class="st4" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>0</text>                </g>
+               <g id="shape6-22" v:mID="6" v:groupContext="shape" transform="translate(165.029,-21.8224)">
+                       <title>Sheet.6</title>
+                       <desc>31</desc>
+                       <v:textBlock v:margins="rect(4,4,4,4)"/>
+                       <v:textRect cx="10.9831" cy="30.3097" width="21.97" height="16.4746"/>
+                       <rect x="0" y="22.0724" width="21.9661" height="16.4746" class="st7"/>
+                       <text x="5.91" y="33.31" class="st4" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>31</text>               </g>
+               <g id="shape7-25" v:mID="7" v:groupContext="shape" transform="translate(104.623,-21.8224)">
+                       <title>Sheet.7</title>
+                       <desc>39</desc>
+                       <v:textBlock v:margins="rect(4,4,4,4)"/>
+                       <v:textRect cx="10.9831" cy="30.3097" width="21.97" height="16.4746"/>
+                       <rect x="0" y="22.0724" width="21.9661" height="16.4746" class="st7"/>
+                       <text x="5.91" y="33.31" class="st4" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>39</text>               </g>
+               <g id="shape8-28" v:mID="8" v:groupContext="shape" transform="translate(3.0294,-21.8224)">
+                       <title>Sheet.8</title>
+                       <desc>63</desc>
+                       <v:textBlock v:margins="rect(4,4,4,4)"/>
+                       <v:textRect cx="10.9831" cy="30.3097" width="21.97" height="16.4746"/>
+                       <rect x="0" y="22.0724" width="21.9661" height="16.4746" class="st7"/>
+                       <text x="5.91" y="33.31" class="st4" v:langID="2052"><v:paragraph v:horizAlign="1"/><v:tabList/>63</text>               </g>
+       </g>
+</svg>
diff --git a/doc/guides/howto/img/lm_bond_virtio_sriov.svg b/doc/guides/howto/img/lm_bond_virtio_sriov.svg
new file mode 100644 (file)
index 0000000..d913ae0
--- /dev/null
@@ -0,0 +1,666 @@
+<?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="1052.8693"
+   height="762.99158"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="lm_overview.svg">
+  <defs
+     id="defs4">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 372.04724 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1052.3622 : 372.04724 : 1"
+       inkscape:persp3d-origin="526.18109 : 248.03149 : 1"
+       id="perspective3886" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.70710678"
+     inkscape:cx="201.38434"
+     inkscape:cy="397.3839"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1432"
+     inkscape:window-height="1000"
+     inkscape:window-x="137"
+     inkscape:window-y="20"
+     inkscape:window-maximized="0"
+     inkscape:snap-page="false"
+     inkscape:snap-grids="false"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     fit-margin-top="0.1"
+     fit-margin-left="0.1"
+     fit-margin-right="0.1"
+     fit-margin-bottom="0.3">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3174"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true"
+       spacingx="0.5px"
+       spacingy="0.5px"
+       originx="1780.3521px"
+       originy="-176.4939px" />
+    <sodipodi:guide
+       position="1780.3521,-176.4939"
+       orientation="0,744.09448"
+       id="guide3176" />
+    <sodipodi:guide
+       position="2524.4467,-176.4939"
+       orientation="-1052.3622,0"
+       id="guide3178" />
+    <sodipodi:guide
+       position="3103.2093,1429.2206"
+       orientation="0,-744.09448"
+       id="guide3180" />
+    <sodipodi:guide
+       position="826.06645,1429.2206"
+       orientation="1052.3622,0"
+       id="guide3182" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="2524.4467,565.50611"
+       id="guide3079" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="2494.3521,579.00611"
+       id="guide3081" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="2437.3521,579.00611"
+       id="guide3083" />
+    <sodipodi:guide
+       position="-8.2192466,-76.99225"
+       orientation="0,4077.6428"
+       id="guide3649" />
+    <sodipodi:guide
+       position="4069.4236,-76.99225"
+       orientation="-1720.5,0"
+       id="guide3651" />
+    <sodipodi:guide
+       position="4069.4236,1643.5079"
+       orientation="0,-4077.6428"
+       id="guide3653" />
+    <sodipodi:guide
+       position="-8.2192466,1643.5079"
+       orientation="1720.5,0"
+       id="guide3655" />
+    <sodipodi:guide
+       position="-8.2192466,-76.99225"
+       orientation="0,4077.6428"
+       id="guide3657" />
+    <sodipodi:guide
+       position="4069.4236,-76.99225"
+       orientation="-1720.5,0"
+       id="guide3659" />
+    <sodipodi:guide
+       position="4069.4236,1643.5079"
+       orientation="0,-4077.6428"
+       id="guide3661" />
+    <sodipodi:guide
+       position="-8.2192466,1643.5079"
+       orientation="1720.5,0"
+       id="guide3663" />
+  </sodipodi:namedview>
+  <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 />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(1780.3522,-112.87834)">
+    <rect
+       style="fill:#0000ff;fill-rule:evenodd;stroke:#000000;stroke-width:0.36521944px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       id="rect2985"
+       width="349.80563"
+       height="212.77235"
+       x="-1780.0696"
+       y="115.28934"
+       ry="38.183765" />
+    <rect
+       style="fill:#0000ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.5459187px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       id="rect3755"
+       width="0"
+       height="0"
+       x="-629.48682"
+       y="1001.1993" />
+    <rect
+       style="fill:#0000ff;fill-opacity:1"
+       id="rect3191"
+       width="358.58792"
+       height="214.06038"
+       x="-1087.5042"
+       y="112.97834"
+       ry="38.183765" />
+    <rect
+       style="fill:#a000ff;fill-opacity:1"
+       id="rect3195"
+       width="350.58966"
+       height="174.45921"
+       x="-1779.1808"
+       y="349.60342"
+       ry="39.59798" />
+    <rect
+       style="fill:#a000ff;fill-opacity:1"
+       id="rect3197"
+       width="357.25491"
+       height="170.35497"
+       x="-1084.8379"
+       y="353.79617"
+       ry="38.183765" />
+    <rect
+       style="fill:#a000ff;fill-opacity:1"
+       id="rect3199"
+       width="687.849"
+       height="55.655697"
+       x="-1603.3909"
+       y="687.73035"
+       ry="24.04163" />
+    <rect
+       style="fill:#a000ff;fill-opacity:1"
+       id="rect3201"
+       width="447.90167"
+       height="50.114544"
+       x="-1488.6338"
+       y="825.45538"
+       ry="19.658308" />
+    <rect
+       style="opacity:0.60399996;fill:#0000ff;fill-opacity:1"
+       id="rect3046"
+       width="135.97015"
+       height="38.530865"
+       x="-1679.87"
+       y="524.00964" />
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-1565.7183"
+       y="170.28043"
+       id="text3052"
+       sodipodi:linespacing="125%"
+       inkscape:transform-center-x="-310.5984"
+       inkscape:transform-center-y="14.984243"
+       transform="scale(1.1160112,0.89604834)"><tspan
+         sodipodi:role="line"
+         id="tspan3054"
+         x="-1565.7183"
+         y="170.28043">VM 1 </tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-1268.2957"
+       y="803.349"
+       id="text3056"
+       sodipodi:linespacing="125%"
+       inkscape:transform-center-x="-645.19167"
+       inkscape:transform-center-y="8.043534"
+       transform="scale(1.1160112,0.89604834)"><tspan
+         sodipodi:role="line"
+         id="tspan3058"
+         x="-1268.2957"
+         y="803.349">Switch with 10Gb ports</tspan><tspan
+         sodipodi:role="line"
+         x="-1268.2957"
+         y="826.53778"
+         id="tspan3060" /></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-1573.7157"
+       y="433.78815"
+       id="text3062"
+       sodipodi:linespacing="125%"
+       transform="scale(1.1160112,0.89604835)"><tspan
+         sodipodi:role="line"
+         id="tspan3064"
+         x="-1573.7157"
+         y="433.78815">Server 1</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-947.12897"
+       y="434.55573"
+       id="text3066"
+       sodipodi:linespacing="125%"
+       transform="scale(1.1160112,0.89604835)"><tspan
+         sodipodi:role="line"
+         id="tspan3068"
+         x="-947.12897"
+         y="434.55573">Server 2</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-1251.1786"
+       y="957.94836"
+       id="text3070"
+       sodipodi:linespacing="125%"
+       transform="scale(1.1160112,0.89604835)"><tspan
+         sodipodi:role="line"
+         id="tspan3072"
+         x="-1251.1786"
+         y="957.94836">  10 Gb Traffic Generator</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20.1229248px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-1016.8596"
+       y="162.4848"
+       id="text3074"
+       sodipodi:linespacing="125%"
+       transform="scale(1.0288342,0.97197394)"
+       inkscape:transform-center-x="-374.58424"
+       inkscape:transform-center-y="19.26541"><tspan
+         sodipodi:role="line"
+         id="tspan3076"
+         x="-1016.8596"
+         y="162.4848">VM 2 </tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-1576.4685"
+       y="479.5618"
+       id="text3078"
+       sodipodi:linespacing="125%"
+       inkscape:transform-center-x="-405.24435"
+       transform="scale(1.1160112,0.89604835)"
+       inkscape:transform-center-y="-3.0408919e-05"><tspan
+         sodipodi:role="line"
+         id="tspan3080"
+         x="-1576.4685"
+         y="479.5618">Linux, KVM, QEMU </tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-947.05627"
+       y="476.78903"
+       id="text3082"
+       sodipodi:linespacing="125%"
+       transform="scale(1.1160112,0.89604835)"><tspan
+         sodipodi:role="line"
+         id="tspan3084"
+         x="-947.05627"
+         y="476.78903">Linux, KVM, QEMU </tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18.93562508px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-1574.15"
+       y="575.35333"
+       id="text3086"
+       sodipodi:linespacing="125%"
+       inkscape:transform-center-x="-152.77712"
+       inkscape:transform-center-y="6.9586675"
+       transform="scale(1.052991,0.94967575)"><tspan
+         sodipodi:role="line"
+         id="tspan3088"
+         x="-1574.15"
+         y="575.35333">10 Gb NIC</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-855.08612"
+       y="613.58636"
+       id="text3090"
+       sodipodi:linespacing="125%"
+       inkscape:transform-center-x="-174.62846"
+       transform="scale(1.1160112,0.89604834)"
+       inkscape:transform-center-y="2.3462468e-05"><tspan
+         sodipodi:role="line"
+         id="tspan3092"
+         x="-855.08612"
+         y="613.58636">10 Gb NIC</tspan></text>
+    <rect
+       style="opacity:0.60199998;fill:#0000ff;fill-opacity:1"
+       id="rect3094"
+       width="125.30582"
+       height="38.530865"
+       x="-1427.5106"
+       y="437.27979" />
+    <rect
+       style="opacity:0.60799997;fill:#0000ff;fill-opacity:1"
+       id="rect3096"
+       width="111.97541"
+       height="41.741772"
+       x="-1196.8135"
+       y="437.27979" />
+    <text
+       xml:space="preserve"
+       style="font-size:19.30730629px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-1322.4871"
+       y="491.82611"
+       id="text3098"
+       sodipodi:linespacing="125%"
+       transform="scale(1.0722964,0.93257795)"
+       inkscape:transform-center-x="-27.993731"
+       inkscape:transform-center-y="-6.9674825"><tspan
+         sodipodi:role="line"
+         id="tspan3100"
+         x="-1322.4871"
+         y="491.82611">10 Gb NIC</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-1071.2081"
+       y="513.09308"
+       id="text3102"
+       sodipodi:linespacing="125%"
+       inkscape:transform-center-x="-670.51946"
+       inkscape:transform-center-y="150.91262"
+       transform="scale(1.1160112,0.89604834)"><tspan
+         sodipodi:role="line"
+         id="tspan3104"
+         x="-1071.2081"
+         y="513.09308">10 Gb NIC</tspan></text>
+    <rect
+       style="fill:#7878ff;fill-opacity:1"
+       id="rect3106"
+       width="257.27686"
+       height="100.60838"
+       x="-1043.5138"
+       y="187.8994" />
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-912.34381"
+       y="232.86263"
+       id="text3108"
+       sodipodi:linespacing="125%"
+       transform="scale(1.1160112,0.89604835)"><tspan
+         sodipodi:role="line"
+         id="tspan3110"
+         x="-912.34381"
+         y="232.86263">DPDK Testpmd App.</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-912.34381"
+       y="274.9668"
+       id="text3880"
+       sodipodi:linespacing="125%"
+       transform="scale(1.1160112,0.89604835)"><tspan
+         sodipodi:role="line"
+         id="tspan3882"
+         x="-912.34381"
+         y="274.9668">bonded device with</tspan><tspan
+         sodipodi:role="line"
+         x="-912.34381"
+         y="298.15558"
+         id="tspan3884">virtio and VF slaves</tspan></text>
+    <rect
+       style="fill:#7878ff;fill-opacity:1"
+       id="rect3106-4"
+       width="257.27686"
+       height="100.60838"
+       x="-1748.0256"
+       y="184.68852" />
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-1541.4333"
+       y="233.58643"
+       id="text3108-9"
+       sodipodi:linespacing="125%"
+       transform="scale(1.1160112,0.89604835)"><tspan
+         sodipodi:role="line"
+         id="tspan3110-5"
+         x="-1541.4333"
+         y="233.58643">DPDK Testpmd App.</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-1541.4845"
+       y="274.63931"
+       id="text3880-7"
+       sodipodi:linespacing="125%"
+       transform="scale(1.1160112,0.89604835)"><tspan
+         sodipodi:role="line"
+         id="tspan3882-9"
+         x="-1541.4845"
+         y="274.63931">bonded device with</tspan><tspan
+         sodipodi:role="line"
+         x="-1541.4845"
+         y="297.82809"
+         id="tspan3884-8">virtio and VF slaves</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-1576.4685"
+       y="504.73169"
+       id="text3951"
+       sodipodi:linespacing="125%"
+       transform="scale(1.1160112,0.89604834)"><tspan
+         sodipodi:role="line"
+         id="tspan3953"
+         x="-1576.4685"
+         y="504.73169">Kernel PF driver</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-947.43506"
+       y="500.51361"
+       id="text3951-4"
+       sodipodi:linespacing="125%"
+       transform="scale(1.1160112,0.89604835)"><tspan
+         sodipodi:role="line"
+         id="tspan3953-0"
+         x="-947.43506"
+         y="500.51361">Kernel PF driver</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-1575.308"
+       y="548.3703"
+       id="text3976-9"
+       sodipodi:linespacing="125%"
+       transform="scale(1.1160112,0.89604835)"><tspan
+         sodipodi:role="line"
+         id="tspan3978-3"
+         x="-1575.308"
+         y="548.3703">SW bridge with Tap</tspan><tspan
+         sodipodi:role="line"
+         x="-1575.308"
+         y="571.55908"
+         id="tspan3075">and PF connected </tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-1203.7942"
+       y="195.3643"
+       id="text4007"
+       sodipodi:linespacing="125%"
+       transform="scale(1.1160112,0.89604834)"><tspan
+         sodipodi:role="line"
+         id="tspan4009"
+         x="-1203.7942"
+         y="195.3643">NFS Server</tspan><tspan
+         sodipodi:role="line"
+         x="-1203.7942"
+         y="218.55309"
+         id="tspan4011">VM disk image</tspan><tspan
+         sodipodi:role="line"
+         x="-1203.7942"
+         y="241.74187"
+         id="tspan4013" /></text>
+    <rect
+       style="opacity:0.45833333;fill:#a000ff;fill-opacity:1"
+       id="rect4015"
+       width="193.29091"
+       height="94.186569"
+       x="-1353.4641"
+       y="134.34897"
+       ry="22.627417" />
+    <rect
+       style="opacity:0.45833333;fill:#a000ff;fill-opacity:1"
+       id="rect3070"
+       width="17.329529"
+       height="11.773321"
+       x="-1278.1288"
+       y="744.45654" />
+    <rect
+       style="opacity:0.45833333;fill:#a000ff;fill-opacity:1"
+       id="rect3070-3"
+       width="19.995611"
+       height="11.773321"
+       x="-1280.1283"
+       y="813.47321" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:2.44584394px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -1270.1392,756.51119 0.5585,54.21449"
+       id="path3090"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="3" />
+    <rect
+       style="opacity:0.61458333;fill:#0000ff;fill-opacity:1"
+       id="rect3046-7"
+       width="135.97015"
+       height="38.530865"
+       x="-978.67279"
+       y="523.78949" />
+    <rect
+       style="opacity:0.59375;fill:#a000ff;fill-opacity:1"
+       id="rect3880"
+       width="14.663447"
+       height="11.773321"
+       x="-1622.0532"
+       y="563.57544" />
+    <rect
+       style="opacity:0.59375;fill:#a000ff;fill-opacity:1"
+       id="rect3880-8"
+       width="14.663447"
+       height="11.773321"
+       x="-914.96075"
+       y="564.21674" />
+    <rect
+       style="opacity:0.59375;fill:#a000ff;fill-opacity:1"
+       id="rect3880-6"
+       width="14.663447"
+       height="11.773321"
+       x="-1482.7505"
+       y="674.35162" />
+    <rect
+       style="opacity:0.59375;fill:#a000ff;fill-opacity:1"
+       id="rect3880-9"
+       width="14.663447"
+       height="11.773321"
+       x="-1198.8129"
+       y="720.37451" />
+    <rect
+       style="opacity:0.59375;fill:#a000ff;fill-opacity:1"
+       id="rect3880-99"
+       width="14.663447"
+       height="11.773321"
+       x="-1085.5045"
+       y="674.35175" />
+    <rect
+       style="opacity:0.59375;fill:#a000ff;fill-opacity:1"
+       id="rect3880-82"
+       width="14.663447"
+       height="11.773321"
+       x="-1301.4569"
+       y="452.79913" />
+    <rect
+       style="opacity:0.59375;fill:#a000ff;fill-opacity:1"
+       id="rect3880-0"
+       width="14.663447"
+       height="11.773321"
+       x="-1210.8103"
+       y="452.79922" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1.49161923px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -1612.063,574.09703 136.6956,98.10634"
+       id="path3946"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="3" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1.62650716px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -906.09206,573.4328 -171.08524,98.7457"
+       id="path3948"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="3" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1.54592061px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -1291.5381,459.322 88.4734,2e-5"
+       id="path3950"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="3" />
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-947.30841"
+       y="544.97314"
+       id="text3976-9-5"
+       sodipodi:linespacing="125%"
+       transform="scale(1.1160112,0.89604835)"><tspan
+         sodipodi:role="line"
+         id="tspan3978-3-7"
+         x="-947.30841"
+         y="544.97314">SW bridge with Tap</tspan><tspan
+         sodipodi:role="line"
+         x="-947.30841"
+         y="568.16193"
+         id="tspan3075-1">and PF connected </tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-1220.5167"
+       y="460.53635"
+       id="text3101"
+       sodipodi:linespacing="125%"
+       transform="scale(1.1160112,0.89604834)"><tspan
+         sodipodi:role="line"
+         id="tspan3103"
+         x="-1220.5167"
+         y="460.53635">10 Gb Migration Link</tspan></text>
+    <flowRoot
+       xml:space="preserve"
+       id="flowRoot3085"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       transform="matrix(1.7252629,0,0,1.3852181,-1778.0192,-314.07213)"><flowRegion
+         id="flowRegion3087"><rect
+           id="rect3089"
+           width="1"
+           height="41.5"
+           x="-1"
+           y="701.59448" /></flowRegion><flowPara
+         id="flowPara3091" /></flowRoot>    <flowRoot
+       xml:space="preserve"
+       id="flowRoot3093"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       transform="matrix(1.7252629,0,0,1.3852181,-1778.0192,-314.07213)"><flowRegion
+         id="flowRegion3095"><rect
+           id="rect3097"
+           width="1"
+           height="41"
+           x="-1.5"
+           y="700.59448" /></flowRegion><flowPara
+         id="flowPara3099" /></flowRoot>  </g>
+</svg>
diff --git a/doc/guides/howto/img/lm_vhost_user.svg b/doc/guides/howto/img/lm_vhost_user.svg
new file mode 100644 (file)
index 0000000..3601cf1
--- /dev/null
@@ -0,0 +1,644 @@
+<?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="1052.8693"
+   height="762.99158"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="lm_vhost_user.svg">
+  <defs
+     id="defs4">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 372.04724 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1052.3622 : 372.04724 : 1"
+       inkscape:persp3d-origin="526.18109 : 248.03149 : 1"
+       id="perspective3886" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.70710678"
+     inkscape:cx="201.38434"
+     inkscape:cy="401.97681"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1515"
+     inkscape:window-height="1092"
+     inkscape:window-x="141"
+     inkscape:window-y="0"
+     inkscape:window-maximized="0"
+     inkscape:snap-page="false"
+     inkscape:snap-grids="false"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     fit-margin-top="0.1"
+     fit-margin-left="0.1"
+     fit-margin-right="0.1"
+     fit-margin-bottom="0.3">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3174"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true"
+       spacingx="0.5px"
+       spacingy="0.5px"
+       originx="1780.3521px"
+       originy="-176.4939px" />
+    <sodipodi:guide
+       position="1780.3521,-176.4939"
+       orientation="0,744.09448"
+       id="guide3176" />
+    <sodipodi:guide
+       position="2524.4467,-176.4939"
+       orientation="-1052.3622,0"
+       id="guide3178" />
+    <sodipodi:guide
+       position="3103.2093,1429.2206"
+       orientation="0,-744.09448"
+       id="guide3180" />
+    <sodipodi:guide
+       position="826.06645,1429.2206"
+       orientation="1052.3622,0"
+       id="guide3182" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="2524.4467,565.50611"
+       id="guide3079" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="2494.3521,579.00611"
+       id="guide3081" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="2437.3521,579.00611"
+       id="guide3083" />
+    <sodipodi:guide
+       position="-8.2192466,-76.99225"
+       orientation="0,4077.6428"
+       id="guide3649" />
+    <sodipodi:guide
+       position="4069.4236,-76.99225"
+       orientation="-1720.5,0"
+       id="guide3651" />
+    <sodipodi:guide
+       position="4069.4236,1643.5079"
+       orientation="0,-4077.6428"
+       id="guide3653" />
+    <sodipodi:guide
+       position="-8.2192466,1643.5079"
+       orientation="1720.5,0"
+       id="guide3655" />
+    <sodipodi:guide
+       position="-8.2192466,-76.99225"
+       orientation="0,4077.6428"
+       id="guide3657" />
+    <sodipodi:guide
+       position="4069.4236,-76.99225"
+       orientation="-1720.5,0"
+       id="guide3659" />
+    <sodipodi:guide
+       position="4069.4236,1643.5079"
+       orientation="0,-4077.6428"
+       id="guide3661" />
+    <sodipodi:guide
+       position="-8.2192466,1643.5079"
+       orientation="1720.5,0"
+       id="guide3663" />
+  </sodipodi:namedview>
+  <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 />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(1780.3522,-112.87834)">
+    <rect
+       style="fill:#0000ff;fill-rule:evenodd;stroke:#000000;stroke-width:0.36521944px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       id="rect2985"
+       width="349.80563"
+       height="212.77235"
+       x="-1780.0696"
+       y="115.28934"
+       ry="38.183765" />
+    <rect
+       style="fill:#0000ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.5459187px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       id="rect3755"
+       width="0"
+       height="0"
+       x="-629.48682"
+       y="1001.1993" />
+    <rect
+       style="fill:#0000ff;fill-opacity:1"
+       id="rect3191"
+       width="358.58792"
+       height="214.06038"
+       x="-1087.5042"
+       y="112.97834"
+       ry="38.183765" />
+    <rect
+       style="fill:#a000ff;fill-opacity:1"
+       id="rect3195"
+       width="350.58966"
+       height="174.45921"
+       x="-1779.1808"
+       y="349.60342"
+       ry="39.59798" />
+    <rect
+       style="fill:#a000ff;fill-opacity:1"
+       id="rect3197"
+       width="357.25491"
+       height="170.35497"
+       x="-1084.8379"
+       y="353.79617"
+       ry="38.183765" />
+    <rect
+       style="fill:#a000ff;fill-opacity:1"
+       id="rect3199"
+       width="687.849"
+       height="55.655697"
+       x="-1603.3909"
+       y="687.73035"
+       ry="24.04163" />
+    <rect
+       style="fill:#a000ff;fill-opacity:1"
+       id="rect3201"
+       width="447.90167"
+       height="50.114544"
+       x="-1488.6338"
+       y="825.45538"
+       ry="19.658308" />
+    <rect
+       style="opacity:0.60399996;fill:#0000ff;fill-opacity:1"
+       id="rect3046"
+       width="135.97015"
+       height="38.530865"
+       x="-1679.87"
+       y="524.00964" />
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-1565.7183"
+       y="170.28043"
+       id="text3052"
+       sodipodi:linespacing="125%"
+       inkscape:transform-center-x="-310.5984"
+       inkscape:transform-center-y="14.984243"
+       transform="scale(1.1160112,0.89604834)"><tspan
+         sodipodi:role="line"
+         id="tspan3054"
+         x="-1565.7183"
+         y="170.28043">VM 1 </tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-1268.2957"
+       y="803.349"
+       id="text3056"
+       sodipodi:linespacing="125%"
+       inkscape:transform-center-x="-645.19167"
+       inkscape:transform-center-y="8.043534"
+       transform="scale(1.1160112,0.89604834)"><tspan
+         sodipodi:role="line"
+         id="tspan3058"
+         x="-1268.2957"
+         y="803.349">Switch with 10Gb ports</tspan><tspan
+         sodipodi:role="line"
+         x="-1268.2957"
+         y="826.53778"
+         id="tspan3060" /></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-1573.7157"
+       y="433.78815"
+       id="text3062"
+       sodipodi:linespacing="125%"
+       transform="scale(1.1160112,0.89604835)"><tspan
+         sodipodi:role="line"
+         id="tspan3064"
+         x="-1573.7157"
+         y="433.78815">Server 1</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-947.12897"
+       y="434.55573"
+       id="text3066"
+       sodipodi:linespacing="125%"
+       transform="scale(1.1160112,0.89604835)"><tspan
+         sodipodi:role="line"
+         id="tspan3068"
+         x="-947.12897"
+         y="434.55573">Server 2</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-1251.1786"
+       y="957.94836"
+       id="text3070"
+       sodipodi:linespacing="125%"
+       transform="scale(1.1160112,0.89604835)"><tspan
+         sodipodi:role="line"
+         id="tspan3072"
+         x="-1251.1786"
+         y="957.94836">  10 Gb Traffic Generator</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:20.1229248px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-1016.8596"
+       y="162.4848"
+       id="text3074"
+       sodipodi:linespacing="125%"
+       transform="scale(1.0288342,0.97197394)"
+       inkscape:transform-center-x="-374.58424"
+       inkscape:transform-center-y="19.26541"><tspan
+         sodipodi:role="line"
+         id="tspan3076"
+         x="-1016.8596"
+         y="162.4848">VM 2 </tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-1575.2013"
+       y="479.56177"
+       id="text3078"
+       sodipodi:linespacing="125%"
+       inkscape:transform-center-x="-405.24435"
+       transform="scale(1.1160112,0.89604835)"
+       inkscape:transform-center-y="-3.0408919e-05"><tspan
+         sodipodi:role="line"
+         id="tspan3080"
+         x="-1575.2013"
+         y="479.56177">Linux, KVM, QEMU 2.5 </tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18.93562508px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-906.26202"
+       y="579.8208"
+       id="text3086"
+       sodipodi:linespacing="125%"
+       inkscape:transform-center-x="-152.77712"
+       inkscape:transform-center-y="6.9586675"
+       transform="scale(1.052991,0.94967574)"><tspan
+         sodipodi:role="line"
+         id="tspan3088"
+         x="-906.26202"
+         y="579.8208">10 Gb NIC</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-1493.7568"
+       y="613.58636"
+       id="text3090"
+       sodipodi:linespacing="125%"
+       inkscape:transform-center-x="-174.62846"
+       transform="scale(1.1160112,0.89604835)"
+       inkscape:transform-center-y="2.3462468e-05"><tspan
+         sodipodi:role="line"
+         id="tspan3092"
+         x="-1493.7568"
+         y="613.58636">10 Gb NIC</tspan></text>
+    <rect
+       style="opacity:0.60199998;fill:#0000ff;fill-opacity:1"
+       id="rect3094"
+       width="125.30582"
+       height="38.530865"
+       x="-1427.5106"
+       y="437.27979" />
+    <rect
+       style="opacity:0.60799997;fill:#0000ff;fill-opacity:1"
+       id="rect3096"
+       width="111.97541"
+       height="41.741772"
+       x="-1196.8135"
+       y="437.27979" />
+    <text
+       xml:space="preserve"
+       style="font-size:19.30730629px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-1322.4871"
+       y="491.82611"
+       id="text3098"
+       sodipodi:linespacing="125%"
+       transform="scale(1.0722964,0.93257795)"
+       inkscape:transform-center-x="-27.993731"
+       inkscape:transform-center-y="-6.9674825"><tspan
+         sodipodi:role="line"
+         id="tspan3100"
+         x="-1322.4871"
+         y="491.82611">10 Gb NIC</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-1071.2081"
+       y="513.09308"
+       id="text3102"
+       sodipodi:linespacing="125%"
+       inkscape:transform-center-x="-670.51946"
+       inkscape:transform-center-y="150.91262"
+       transform="scale(1.1160112,0.89604834)"><tspan
+         sodipodi:role="line"
+         id="tspan3104"
+         x="-1071.2081"
+         y="513.09308">10 Gb NIC</tspan></text>
+    <rect
+       style="fill:#7878ff;fill-opacity:1"
+       id="rect3106"
+       width="277.07584"
+       height="86.466248"
+       x="-1043.5138"
+       y="187.8994" />
+    <rect
+       style="fill:#7878ff;fill-opacity:1"
+       id="rect3106-4"
+       width="268.59058"
+       height="85.052032"
+       x="-1748.0256"
+       y="184.68852" />
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-1557.907"
+       y="233.58643"
+       id="text3108-9"
+       sodipodi:linespacing="125%"
+       transform="scale(1.1160112,0.89604835)"><tspan
+         sodipodi:role="line"
+         id="tspan3110-5"
+         x="-1557.907"
+         y="233.58643">DPDK Testpmd App</tspan><tspan
+         sodipodi:role="line"
+         x="-1557.907"
+         y="256.77521"
+         id="tspan3347" /></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-1556.5636"
+       y="253.73872"
+       id="text3880-7"
+       sodipodi:linespacing="125%"
+       transform="scale(1.1160112,0.89604835)"><tspan
+         sodipodi:role="line"
+         id="tspan3882-9"
+         x="-1556.5636"
+         y="253.73872" /><tspan
+         sodipodi:role="line"
+         x="-1556.5636"
+         y="276.92749"
+         id="tspan3884-8">DPDK virtio PMD's </tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-1575.2013"
+       y="525.24933"
+       id="text3951"
+       sodipodi:linespacing="125%"
+       transform="scale(1.1160112,0.89604835)"><tspan
+         sodipodi:role="line"
+         id="tspan3953"
+         x="-1575.2013"
+         y="525.24933">DPDK PF PMD and vhost_user</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-948.70227"
+       y="524.18781"
+       id="text3951-4"
+       sodipodi:linespacing="125%"
+       transform="scale(1.1160112,0.89604835)"><tspan
+         sodipodi:role="line"
+         id="tspan3953-0"
+         x="-948.70227"
+         y="524.18781">DPDK PF PMD and vhost_user</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-1203.7942"
+       y="195.3643"
+       id="text4007"
+       sodipodi:linespacing="125%"
+       transform="scale(1.1160112,0.89604834)"><tspan
+         sodipodi:role="line"
+         id="tspan4009"
+         x="-1203.7942"
+         y="195.3643">NFS Server</tspan><tspan
+         sodipodi:role="line"
+         x="-1203.7942"
+         y="218.55309"
+         id="tspan4011">VM disk image</tspan><tspan
+         sodipodi:role="line"
+         x="-1203.7942"
+         y="241.74187"
+         id="tspan4013" /></text>
+    <rect
+       style="opacity:0.45833333;fill:#a000ff;fill-opacity:1"
+       id="rect4015"
+       width="193.29091"
+       height="94.186569"
+       x="-1353.4641"
+       y="134.34897"
+       ry="22.627417" />
+    <rect
+       style="opacity:0.45833333;fill:#a000ff;fill-opacity:1"
+       id="rect3070"
+       width="17.329529"
+       height="11.773321"
+       x="-1278.1288"
+       y="744.45654" />
+    <rect
+       style="opacity:0.45833333;fill:#a000ff;fill-opacity:1"
+       id="rect3070-3"
+       width="19.995611"
+       height="11.773321"
+       x="-1280.1283"
+       y="813.47321" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:2.44584394px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -1270.1392,756.51119 0.5585,54.21449"
+       id="path3090"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="3" />
+    <rect
+       style="opacity:0.59895833;fill:#0000ff;fill-opacity:1"
+       id="rect3046-7"
+       width="135.97015"
+       height="38.530865"
+       x="-981.50122"
+       y="523.78949" />
+    <rect
+       style="opacity:0.59375;fill:#a000ff;fill-opacity:1"
+       id="rect3880"
+       width="14.663447"
+       height="11.773321"
+       x="-1622.0532"
+       y="563.57544" />
+    <rect
+       style="opacity:0.59375;fill:#a000ff;fill-opacity:1"
+       id="rect3880-8"
+       width="14.663447"
+       height="11.773321"
+       x="-914.96075"
+       y="564.21674" />
+    <rect
+       style="opacity:0.59375;fill:#a000ff;fill-opacity:1"
+       id="rect3880-6"
+       width="14.663447"
+       height="11.773321"
+       x="-1482.7505"
+       y="674.35162" />
+    <rect
+       style="opacity:0.59375;fill:#a000ff;fill-opacity:1"
+       id="rect3880-9"
+       width="14.663447"
+       height="11.773321"
+       x="-1198.8129"
+       y="720.37451" />
+    <rect
+       style="opacity:0.59375;fill:#a000ff;fill-opacity:1"
+       id="rect3880-99"
+       width="14.663447"
+       height="11.773321"
+       x="-1085.5045"
+       y="674.35175" />
+    <rect
+       style="opacity:0.59375;fill:#a000ff;fill-opacity:1"
+       id="rect3880-82"
+       width="14.663447"
+       height="11.773321"
+       x="-1301.4569"
+       y="452.79913" />
+    <rect
+       style="opacity:0.59375;fill:#a000ff;fill-opacity:1"
+       id="rect3880-0"
+       width="14.663447"
+       height="11.773321"
+       x="-1210.8103"
+       y="452.79922" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1.49161923px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -1612.063,574.09703 136.6956,98.10634"
+       id="path3946"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="3" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1.62650716px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -906.09206,573.4328 -171.08524,98.7457"
+       id="path3948"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="3" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1.54592061px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -1291.5381,459.322 88.4734,2e-5"
+       id="path3950"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="3" />
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-1220.5167"
+       y="460.53635"
+       id="text3101"
+       sodipodi:linespacing="125%"
+       transform="scale(1.1160112,0.89604834)"><tspan
+         sodipodi:role="line"
+         id="tspan3103"
+         x="-1220.5167"
+         y="460.53635">10 Gb Migration Link</tspan></text>
+    <flowRoot
+       xml:space="preserve"
+       id="flowRoot3085"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       transform="matrix(1.7252629,0,0,1.3852181,-1778.0192,-314.07213)"><flowRegion
+         id="flowRegion3087"><rect
+           id="rect3089"
+           width="1"
+           height="41.5"
+           x="-1"
+           y="701.59448" /></flowRegion><flowPara
+         id="flowPara3091" /></flowRoot>    <flowRoot
+       xml:space="preserve"
+       id="flowRoot3093"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       transform="matrix(1.7252629,0,0,1.3852181,-1778.0192,-314.07213)"><flowRegion
+         id="flowRegion3095"><rect
+           id="rect3097"
+           width="1"
+           height="41"
+           x="-1.5"
+           y="700.59448" /></flowRegion><flowPara
+         id="flowPara3099" /></flowRoot>    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-927.84314"
+       y="233.94818"
+       id="text3108-9-3"
+       sodipodi:linespacing="125%"
+       transform="scale(1.1160112,0.89604835)"><tspan
+         sodipodi:role="line"
+         id="tspan3110-5-6"
+         x="-927.84314"
+         y="233.94818">DPDK Testpmd App</tspan><tspan
+         sodipodi:role="line"
+         x="-927.84314"
+         y="257.13696"
+         id="tspan3347-7" /></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-928.51379"
+       y="255.71736"
+       id="text3880-7-5"
+       sodipodi:linespacing="125%"
+       transform="scale(1.1160112,0.89604835)"><tspan
+         sodipodi:role="line"
+         id="tspan3882-9-3"
+         x="-928.51379"
+         y="255.71736" /><tspan
+         sodipodi:role="line"
+         x="-928.51379"
+         y="278.90616"
+         id="tspan3884-8-5">DPDK virtio PMD's  </tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:18.55102539px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-947.67664"
+       y="476.70486"
+       id="text3078-6"
+       sodipodi:linespacing="125%"
+       inkscape:transform-center-x="-405.24435"
+       transform="scale(1.1160112,0.89604835)"
+       inkscape:transform-center-y="-3.0408919e-05"><tspan
+         sodipodi:role="line"
+         id="tspan3080-2"
+         x="-947.67664"
+         y="476.70486">Linux, KVM, QEMU 2.5 </tspan></text>
+  </g>
+</svg>
diff --git a/doc/guides/howto/index.rst b/doc/guides/howto/index.rst
new file mode 100644 (file)
index 0000000..aa6d3e2
--- /dev/null
@@ -0,0 +1,40 @@
+..  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.
+
+How To User Guides
+==================
+
+.. toctree::
+    :maxdepth: 2
+    :numbered:
+
+    lm_bond_virtio_sriov
+    lm_virtio_vhost_user
+    flow_bifurcation
diff --git a/doc/guides/howto/lm_bond_virtio_sriov.rst b/doc/guides/howto/lm_bond_virtio_sriov.rst
new file mode 100644 (file)
index 0000000..49666f1
--- /dev/null
@@ -0,0 +1,713 @@
+..  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.
+
+Live Migration of VM with SR-IOV VF
+===================================
+
+Overview
+--------
+
+It is not possible to migrate a Virtual Machine which has an SR-IOV Virtual Function (VF).
+
+To get around this problem the bonding PMD is used.
+
+The following sections show an example of how to do this.
+
+Test Setup
+----------
+
+A bonded device is created in the VM.
+The virtio and VF PMD's are added as slaves to the bonded device.
+The VF is set as the primary slave of the bonded device.
+
+A bridge must be set up on the Host connecting the tap device, which is the
+backend of the Virtio device and the Physical Function (PF) device.
+
+To test the Live Migration two servers with identical operating systems installed are used.
+KVM and Qemu 2.3 is also required on the servers.
+
+In this example, the servers have Niantic and or Fortville NIC's installed.
+The NIC's on both servers are connected to a switch
+which is also connected to the traffic generator.
+
+The switch is configured to broadcast traffic on all the NIC ports.
+A :ref:`Sample switch configuration <lm_bond_virtio_sriov_switch_conf>`
+can be found in this section.
+
+The host is running the Kernel PF driver (ixgbe or i40e).
+
+The ip address of host_server_1 is 10.237.212.46
+
+The ip address of host_server_2 is 10.237.212.131
+
+.. _figure_lm_bond_virtio_sriov:
+
+.. figure:: img/lm_bond_virtio_sriov.*
+
+Live Migration steps
+--------------------
+
+The sample scripts mentioned in the steps below can be found in the
+:ref:`Sample host scripts <lm_bond_virtio_sriov_host_scripts>` and
+:ref:`Sample VM scripts <lm_bond_virtio_sriov_vm_scripts>` sections.
+
+On host_server_1: Terminal 1
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. code-block:: console
+
+   cd /root/dpdk/host_scripts
+   ./setup_vf_on_212_46.sh
+
+For Fortville NIC
+
+.. code-block:: console
+
+   ./vm_virtio_vf_i40e_212_46.sh
+
+For Niantic NIC
+
+.. code-block:: console
+
+   ./vm_virtio_vf_one_212_46.sh
+
+On host_server_1: Terminal 2
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. code-block:: console
+
+   cd /root/dpdk/host_scripts
+   ./setup_bridge_on_212_46.sh
+   ./connect_to_qemu_mon_on_host.sh
+   (qemu)
+
+On host_server_1: Terminal 1
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+**In VM on host_server_1:**
+
+.. code-block:: console
+
+   cd /root/dpdk/vm_scripts
+   ./setup_dpdk_in_vm.sh
+   ./run_testpmd_bonding_in_vm.sh
+
+   testpmd> show port info all
+
+The ``mac_addr`` command only works with kernel PF for Niantic
+
+.. code-block:: console
+
+   testpmd> mac_addr add port 1 vf 0 AA:BB:CC:DD:EE:FF
+
+The syntax of the ``testpmd`` command is:
+
+Create bonded device (mode) (socket).
+
+Mode 1 is active backup.
+
+Virtio is port 0 (P0).
+
+VF is port 1 (P1).
+
+Bonding is port 2 (P2).
+
+.. code-block:: console
+
+   testpmd> create bonded device 1 0
+   Created new bonded device eth_bond_testpmd_0 on (port 2).
+   testpmd> add bonding slave 0 2
+   testpmd> add bonding slave 1 2
+   testpmd> show bonding config 2
+
+The syntax of the ``testpmd`` command is:
+
+set bonding primary (slave id) (port id)
+
+Set primary to P1 before starting bonding port.
+
+.. code-block:: console
+
+   testpmd> set bonding primary 1 2
+   testpmd> show bonding config 2
+   testpmd> port start 2
+   Port 2: 02:09:C0:68:99:A5
+   Checking link statuses...
+   Port 0 Link Up - speed 10000 Mbps - full-duplex
+   Port 1 Link Up - speed 10000 Mbps - full-duplex
+   Port 2 Link Up - speed 10000 Mbps - full-duplex
+
+   testpmd> show bonding config 2
+
+Primary is now P1. There are 2 active slaves.
+
+Use P2 only for forwarding.
+
+.. code-block:: console
+
+   testpmd> set portlist 2
+   testpmd> show config fwd
+   testpmd> set fwd mac
+   testpmd> start
+   testpmd> show bonding config 2
+
+Primary is now P1. There are 2 active slaves.
+
+.. code-block:: console
+
+   testpmd> show port stats all
+
+VF traffic is seen at P1 and P2.
+
+.. code-block:: console
+
+   testpmd> clear port stats all
+   testpmd> set bonding primary 0 2
+   testpmd> remove bonding slave 1 2
+   testpmd> show bonding config 2
+
+Primary is now P0. There is 1 active slave.
+
+.. code-block:: console
+
+   testpmd> clear port stats all
+   testpmd> show port stats all
+
+No VF traffic is seen at P0 and P2, VF MAC address still present.
+
+.. code-block:: console
+
+   testpmd> port stop 1
+   testpmd> port close 1
+
+Port close should remove VF MAC address, it does not remove perm_addr.
+
+The ``mac_addr`` command only works with the kernel PF for Niantic.
+
+.. code-block:: console
+
+   testpmd> mac_addr remove 1 AA:BB:CC:DD:EE:FF
+   testpmd> port detach 1
+   Port '0000:00:04.0' is detached. Now total ports is 2
+   testpmd> show port stats all
+
+No VF traffic is seen at P0 and P2.
+
+On host_server_1: Terminal 2
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. code-block:: console
+
+   (qemu) device_del vf1
+
+
+On host_server_1: Terminal 1
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+**In VM on host_server_1:**
+
+.. code-block:: console
+
+   testpmd> show bonding config 2
+
+Primary is now P0. There is 1 active slave.
+
+.. code-block:: console
+
+   testpmd> show port info all
+   testpmd> show port stats all
+
+On host_server_2: Terminal 1
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. code-block:: console
+
+   cd /root/dpdk/host_scripts
+   ./setup_vf_on_212_131.sh
+   ./vm_virtio_one_migrate.sh
+
+On host_server_2: Terminal 2
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. code-block:: console
+
+   ./setup_bridge_on_212_131.sh
+   ./connect_to_qemu_mon_on_host.sh
+   (qemu) info status
+   VM status: paused (inmigrate)
+   (qemu)
+
+On host_server_1: Terminal 2
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Check that the switch is up before migrating.
+
+.. code-block:: console
+
+   (qemu) migrate tcp:10.237.212.131:5555
+   (qemu) info status
+   VM status: paused (postmigrate)
+
+For the Niantic NIC.
+
+.. code-block:: console
+
+   (qemu) info migrate
+   capabilities: xbzrle: off rdma-pin-all: off auto-converge: off zero-blocks: off
+   Migration status: completed
+   total time: 11834 milliseconds
+   downtime: 18 milliseconds
+   setup: 3 milliseconds
+   transferred ram: 389137 kbytes
+   throughput: 269.49 mbps
+   remaining ram: 0 kbytes
+   total ram: 1590088 kbytes
+   duplicate: 301620 pages
+   skipped: 0 pages
+   normal: 96433 pages
+   normal bytes: 385732 kbytes
+   dirty sync count: 2
+   (qemu) quit
+
+For the Fortville NIC.
+
+.. code-block:: console
+
+   (qemu) info migrate
+   capabilities: xbzrle: off rdma-pin-all: off auto-converge: off zero-blocks: off
+   Migration status: completed
+   total time: 11619 milliseconds
+   downtime: 5 milliseconds
+   setup: 7 milliseconds
+   transferred ram: 379699 kbytes
+   throughput: 267.82 mbps
+   remaining ram: 0 kbytes
+   total ram: 1590088 kbytes
+   duplicate: 303985 pages
+   skipped: 0 pages
+   normal: 94073 pages
+   normal bytes: 376292 kbytes
+   dirty sync count: 2
+   (qemu) quit
+
+On host_server_2: Terminal 1
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+**In VM on host_server_2:**
+
+   Hit Enter key. This brings the user to the testpmd prompt.
+
+.. code-block:: console
+
+   testpmd>
+
+On host_server_2: Terminal 2
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. code-block:: console
+
+   (qemu) info status
+   VM status: running
+
+For the Niantic NIC.
+
+.. code-block:: console
+
+   (qemu) device_add pci-assign,host=06:10.0,id=vf1
+
+For the Fortville NIC.
+
+.. code-block:: console
+
+   (qemu) device_add pci-assign,host=03:02.0,id=vf1
+
+On host_server_2: Terminal 1
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+**In VM on host_server_2:**
+
+.. code-block:: console
+
+   testomd> show port info all
+   testpmd> show port stats all
+   testpmd> show bonding config 2
+   testpmd> port attach 0000:00:04.0
+   Port 1 is attached.
+   Now total ports is 3
+   Done
+
+   testpmd> port start 1
+
+The ``mac_addr`` command only works with the Kernel PF for Niantic.
+
+.. code-block:: console
+
+   testpmd> mac_addr add port 1 vf 0 AA:BB:CC:DD:EE:FF
+   testpmd> show port stats all.
+   testpmd> show config fwd
+   testpmd> show bonding config 2
+   testpmd> add bonding slave 1 2
+   testpmd> set bonding primary 1 2
+   testpmd> show bonding config 2
+   testpmd> show port stats all
+
+VF traffic is seen at P1 (VF) and P2 (Bonded device).
+
+.. code-block:: console
+
+   testpmd> remove bonding slave 0 2
+   testpmd> show bonding config 2
+   testpmd> port stop 0
+   testpmd> port close 0
+   testpmd> port detach 0
+   Port '0000:00:03.0' is detached. Now total ports is 2
+
+   testpmd> show port info all
+   testpmd> show config fwd
+   testpmd> show port stats all
+
+VF traffic is seen at P1 (VF) and P2 (Bonded device).
+
+.. _lm_bond_virtio_sriov_host_scripts:
+
+Sample host scripts
+-------------------
+
+setup_vf_on_212_46.sh
+~~~~~~~~~~~~~~~~~~~~~
+Set up Virtual Functions on host_server_1
+
+.. code-block:: sh
+
+   #!/bin/sh
+   # This script is run on the host 10.237.212.46 to setup the VF
+
+   # set up Niantic VF
+   cat /sys/bus/pci/devices/0000\:09\:00.0/sriov_numvfs
+   echo 1 > /sys/bus/pci/devices/0000\:09\:00.0/sriov_numvfs
+   cat /sys/bus/pci/devices/0000\:09\:00.0/sriov_numvfs
+   rmmod ixgbevf
+
+   # set up Fortville VF
+   cat /sys/bus/pci/devices/0000\:02\:00.0/sriov_numvfs
+   echo 1 > /sys/bus/pci/devices/0000\:02\:00.0/sriov_numvfs
+   cat /sys/bus/pci/devices/0000\:02\:00.0/sriov_numvfs
+   rmmod i40evf
+
+vm_virtio_vf_one_212_46.sh
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Setup Virtual Machine on host_server_1
+
+.. code-block:: sh
+
+   #!/bin/sh
+
+   # Path to KVM tool
+   KVM_PATH="/usr/bin/qemu-system-x86_64"
+
+   # Guest Disk image
+   DISK_IMG="/home/username/disk_image/virt1_sml.disk"
+
+   # Number of guest cpus
+   VCPUS_NR="4"
+
+   # Memory
+   MEM=1536
+
+   taskset -c 1-5 $KVM_PATH \
+    -enable-kvm \
+    -m $MEM \
+    -smp $VCPUS_NR \
+    -cpu host \
+    -name VM1 \
+    -no-reboot \
+    -net none \
+    -vnc none -nographic \
+    -hda $DISK_IMG \
+    -netdev type=tap,id=net1,script=no,downscript=no,ifname=tap1 \
+    -device virtio-net-pci,netdev=net1,mac=CC:BB:BB:BB:BB:BB \
+    -device pci-assign,host=09:10.0,id=vf1 \
+    -monitor telnet::3333,server,nowait
+
+setup_bridge_on_212_46.sh
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Setup bridge on host_server_1
+
+.. code-block:: sh
+
+   #!/bin/sh
+   # This script is run on the host 10.237.212.46 to setup the bridge
+   # for the Tap device and the PF device.
+   # This enables traffic to go from the PF to the Tap to the Virtio PMD in the VM.
+
+   # ens3f0 is the Niantic NIC
+   # ens6f0 is the Fortville NIC
+
+   ifconfig ens3f0 down
+   ifconfig tap1 down
+   ifconfig ens6f0 down
+   ifconfig virbr0 down
+
+   brctl show virbr0
+   brctl addif virbr0 ens3f0
+   brctl addif virbr0 ens6f0
+   brctl addif virbr0 tap1
+   brctl show virbr0
+
+   ifconfig ens3f0 up
+   ifconfig tap1 up
+   ifconfig ens6f0 up
+   ifconfig virbr0 up
+
+connect_to_qemu_mon_on_host.sh
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. code-block:: sh
+
+   #!/bin/sh
+   # This script is run on both hosts when the VM is up,
+   # to connect to the Qemu Monitor.
+
+   telnet 0 3333
+
+setup_vf_on_212_131.sh
+~~~~~~~~~~~~~~~~~~~~~~
+
+Set up Virtual Functions on host_server_2
+
+.. code-block:: sh
+
+   #!/bin/sh
+   # This script is run on the host 10.237.212.131 to setup the VF
+
+   # set up Niantic VF
+   cat /sys/bus/pci/devices/0000\:06\:00.0/sriov_numvfs
+   echo 1 > /sys/bus/pci/devices/0000\:06\:00.0/sriov_numvfs
+   cat /sys/bus/pci/devices/0000\:06\:00.0/sriov_numvfs
+   rmmod ixgbevf
+
+   # set up Fortville VF
+   cat /sys/bus/pci/devices/0000\:03\:00.0/sriov_numvfs
+   echo 1 > /sys/bus/pci/devices/0000\:03\:00.0/sriov_numvfs
+   cat /sys/bus/pci/devices/0000\:03\:00.0/sriov_numvfs
+   rmmod i40evf
+
+vm_virtio_one_migrate.sh
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+Setup Virtual Machine on host_server_2
+
+.. code-block:: sh
+
+   #!/bin/sh
+   # Start the VM on host_server_2 with the same parameters except without the VF
+   # parameters, as the VM on host_server_1, in migration-listen mode
+   # (-incoming tcp:0:5555)
+
+   # Path to KVM tool
+   KVM_PATH="/usr/bin/qemu-system-x86_64"
+
+   # Guest Disk image
+   DISK_IMG="/home/username/disk_image/virt1_sml.disk"
+
+   # Number of guest cpus
+   VCPUS_NR="4"
+
+   # Memory
+   MEM=1536
+
+   taskset -c 1-5 $KVM_PATH \
+    -enable-kvm \
+    -m $MEM \
+    -smp $VCPUS_NR \
+    -cpu host \
+    -name VM1 \
+    -no-reboot \
+    -net none \
+    -vnc none -nographic \
+    -hda $DISK_IMG \
+    -netdev type=tap,id=net1,script=no,downscript=no,ifname=tap1 \
+    -device virtio-net-pci,netdev=net1,mac=CC:BB:BB:BB:BB:BB \
+    -incoming tcp:0:5555 \
+    -monitor telnet::3333,server,nowait
+
+setup_bridge_on_212_131.sh
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Setup bridge on host_server_2
+
+.. code-block:: sh
+
+   #!/bin/sh
+   # This script is run on the host to setup the bridge
+   # for the Tap device and the PF device.
+   # This enables traffic to go from the PF to the Tap to the Virtio PMD in the VM.
+
+   # ens4f0 is the Niantic NIC
+   # ens5f0 is the Fortville NIC
+
+   ifconfig ens4f0 down
+   ifconfig tap1 down
+   ifconfig ens5f0 down
+   ifconfig virbr0 down
+
+   brctl show virbr0
+   brctl addif virbr0 ens4f0
+   brctl addif virbr0 ens5f0
+   brctl addif virbr0 tap1
+   brctl show virbr0
+
+   ifconfig ens4f0 up
+   ifconfig tap1 up
+   ifconfig ens5f0 up
+   ifconfig virbr0 up
+
+.. _lm_bond_virtio_sriov_vm_scripts:
+
+Sample VM scripts
+-----------------
+
+setup_dpdk_in_vm.sh
+~~~~~~~~~~~~~~~~~~~
+
+Set up DPDK in the Virtual Machine
+
+.. code-block:: sh
+
+   #!/bin/sh
+   # this script matches the vm_virtio_vf_one script
+   # virtio port is 03
+   # vf port is 04
+
+   cat  /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
+   echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
+   cat  /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
+
+   ifconfig -a
+   /root/dpdk/tools/dpdk_nic_bind.py --status
+
+   rmmod virtio-pci ixgbevf
+
+   modprobe uio
+   insmod /root/dpdk/x86_64-default-linuxapp-gcc/kmod/igb_uio.ko
+
+   /root/dpdk/tools/dpdk_nic_bind.py -b igb_uio 0000:00:03.0
+   /root/dpdk/tools/dpdk_nic_bind.py -b igb_uio 0000:00:04.0
+
+   /root/dpdk/tools/dpdk_nic_bind.py --status
+
+run_testpmd_bonding_in_vm.sh
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Run testpmd in the Virtual Machine.
+
+.. code-block:: sh
+
+   #!/bin/sh
+   # Run testpmd in the VM
+
+   # The test system has 8 cpus (0-7), use cpus 2-7 for VM
+   # Use taskset -pc <core number> <thread_id>
+
+   # 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
+
+.. _lm_bond_virtio_sriov_switch_conf:
+
+Sample switch configuration
+---------------------------
+
+The Intel switch is used to connect the traffic generator to the
+NIC's on host_server_1 and host_server_2.
+
+In order to run the switch configuration two console windows are required.
+
+Log in as root in both windows.
+
+TestPointShared, run_switch.sh and load /root/switch_config must be executed
+in the sequence below.
+
+On Switch: Terminal 1
+~~~~~~~~~~~~~~~~~~~~~
+
+run TestPointShared
+
+.. code-block:: console
+
+   /usr/bin/TestPointShared
+
+On Switch: Terminal 2
+~~~~~~~~~~~~~~~~~~~~~
+
+execute run_switch.sh
+
+.. code-block:: console
+
+   /root/run_switch.sh
+
+On Switch: Terminal 1
+~~~~~~~~~~~~~~~~~~~~~
+
+load switch configuration
+
+.. code-block:: console
+
+   load /root/switch_config
+
+Sample switch configuration script
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The ``/root/switch_config`` script:
+
+.. code-block:: sh
+
+   # TestPoint History
+   show port 1,5,9,13,17,21,25
+   set port 1,5,9,13,17,21,25 up
+   show port 1,5,9,13,17,21,25
+   del acl 1
+   create acl 1
+   create acl-port-set
+   create acl-port-set
+   add port port-set 1 0
+   add port port-set 5,9,13,17,21,25 1
+   create acl-rule 1 1
+   add acl-rule condition 1 1 port-set 1
+   add acl-rule action 1 1 redirect 1
+   apply acl
+   create vlan 1000
+   add vlan port 1000 1,5,9,13,17,21,25
+   set vlan tagging 1000 1,5,9,13,17,21,25 tag
+   set switch config flood_ucast fwd
+   show port stats all 1,5,9,13,17,21,25
diff --git a/doc/guides/howto/lm_virtio_vhost_user.rst b/doc/guides/howto/lm_virtio_vhost_user.rst
new file mode 100644 (file)
index 0000000..fad1f2a
--- /dev/null
@@ -0,0 +1,469 @@
+..  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.
+
+
+Live Migration of VM with Virtio on host running vhost_user
+===========================================================
+
+Overview
+--------
+
+Live Migration of a VM with DPDK Virtio PMD on a host which is
+running the Vhost sample application (vhost-switch) and using the DPDK PMD (ixgbe or i40e).
+
+The Vhost sample application uses VMDQ so SRIOV must be disabled on the NIC's.
+
+The following sections show an example of how to do this migration.
+
+Test Setup
+----------
+
+To test the Live Migration two servers with identical operating systems installed are used.
+KVM and QEMU is also required on the servers.
+
+QEMU 2.5 is required for Live Migration of a VM with vhost_user running on the hosts.
+
+In this example, the servers have Niantic and or Fortville NIC's installed.
+The NIC's on both servers are connected to a switch
+which is also connected to the traffic generator.
+
+The switch is configured to broadcast traffic on all the NIC ports.
+
+The ip address of host_server_1 is 10.237.212.46
+
+The ip address of host_server_2 is 10.237.212.131
+
+.. _figure_lm_vhost_user:
+
+.. figure:: img/lm_vhost_user.*
+
+Live Migration steps
+--------------------
+
+The sample scripts mentioned in the steps below can be found in the
+:ref:`Sample host scripts <lm_virtio_vhost_user_host_scripts>` and
+:ref:`Sample VM scripts <lm_virtio_vhost_user_vm_scripts>` sections.
+
+On host_server_1: Terminal 1
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Setup DPDK on host_server_1
+
+.. code-block:: console
+
+   cd /root/dpdk/host_scripts
+   ./setup_dpdk_on_host.sh
+
+On host_server_1: Terminal 2
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Bind the Niantic or Fortville NIC to igb_uio on host_server_1.
+
+For Fortville NIC.
+
+.. code-block:: console
+
+   cd /root/dpdk/tools
+   ./dpdk_nic_bind.py -b igb_uio 0000:02:00.0
+
+For Niantic NIC.
+
+.. code-block:: console
+
+   cd /root/dpdk/tools
+   ./dpdk_nic_bind.py -b igb_uio 0000:09:00.0
+
+On host_server_1: Terminal 3
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+For Fortville and Niantic NIC's reset SRIOV and run the
+vhost_user sample application (vhost-switch) on host_server_1.
+
+.. code-block:: console
+
+   cd /root/dpdk/host_scripts
+   ./reset_vf_on_212_46.sh
+   ./run_vhost_switch_on_host.sh
+
+On host_server_1: Terminal 1
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Start the VM on host_server_1
+
+.. code-block:: console
+
+   ./vm_virtio_vhost_user.sh
+
+On host_server_1: Terminal 4
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Connect to the QEMU monitor on host_server_1.
+
+.. code-block:: console
+
+   cd /root/dpdk/host_scripts
+   ./connect_to_qemu_mon_on_host.sh
+   (qemu)
+
+On host_server_1: Terminal 1
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+**In VM on host_server_1:**
+
+Setup DPDK in the VM and run testpmd in the VM.
+
+.. code-block:: console
+
+   cd /root/dpdk/vm_scripts
+   ./setup_dpdk_in_vm.sh
+   ./run_testpmd_in_vm.sh
+
+   testpmd> show port info all
+   testpmd> set fwd mac retry
+   testpmd> start tx_first
+   testpmd> show port stats all
+
+Virtio traffic is seen at P1 and P2.
+
+On host_server_2: Terminal 1
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Set up DPDK on the host_server_2.
+
+.. code-block:: console
+
+   cd /root/dpdk/host_scripts
+   ./setup_dpdk_on_host.sh
+
+On host_server_2: Terminal 2
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Bind the Niantic or Fortville NIC to igb_uio on host_server_2.
+
+For Fortville NIC.
+
+.. code-block:: console
+
+   cd /root/dpdk/tools
+   ./dpdk_nic_bind.py -b igb_uio 0000:03:00.0
+
+For Niantic NIC.
+
+.. code-block:: console
+
+   cd /root/dpdk/tools
+   ./dpdk_nic_bind.py -b igb_uio 0000:06:00.0
+
+On host_server_2: Terminal 3
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+For Fortville and Niantic NIC's reset SRIOV, and run
+the vhost_user sample application on host_server_2.
+
+.. code-block:: console
+
+   cd /root/dpdk/host_scripts
+   ./reset_vf_on_212_131.sh
+   ./run_vhost_switch_on_host.sh
+
+On host_server_2: Terminal 1
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Start the VM on host_server_2.
+
+.. code-block:: console
+
+   ./vm_virtio_vhost_user_migrate.sh
+
+On host_server_2: Terminal 4
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Connect to the QEMU monitor on host_server_2.
+
+.. code-block:: console
+
+   cd /root/dpdk/host_scripts
+   ./connect_to_qemu_mon_on_host.sh
+   (qemu) info status
+   VM status: paused (inmigrate)
+   (qemu)
+
+On host_server_1: Terminal 4
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Check that switch is up before migrating the VM.
+
+.. code-block:: console
+
+   (qemu) migrate tcp:10.237.212.131:5555
+   (qemu) info status
+   VM status: paused (postmigrate)
+
+   (qemu) info migrate
+   capabilities: xbzrle: off rdma-pin-all: off auto-converge: off zero-blocks: off
+   Migration status: completed
+   total time: 11619 milliseconds
+   downtime: 5 milliseconds
+   setup: 7 milliseconds
+   transferred ram: 379699 kbytes
+   throughput: 267.82 mbps
+   remaining ram: 0 kbytes
+   total ram: 1590088 kbytes
+   duplicate: 303985 pages
+   skipped: 0 pages
+   normal: 94073 pages
+   normal bytes: 376292 kbytes
+   dirty sync count: 2
+   (qemu) quit
+
+On host_server_2: Terminal 1
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+**In VM on host_server_2:**
+
+   Hit Enter key. This brings the user to the testpmd prompt.
+
+.. code-block:: console
+
+   testpmd>
+
+On host_server_2: Terminal 4
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+**In QEMU monitor on host_server_2**
+
+.. code-block:: console
+
+   (qemu) info status
+   VM status: running
+
+On host_server_2: Terminal 1
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+**In VM on host_server_2:**
+
+.. code-block:: console
+
+   testomd> show port info all
+   testpmd> show port stats all
+
+Virtio traffic is seen at P0 and P1.
+
+
+.. _lm_virtio_vhost_user_host_scripts:
+
+Sample host scripts
+-------------------
+
+reset_vf_on_212_46.sh
+~~~~~~~~~~~~~~~~~~~~~
+
+.. code-block:: sh
+
+   #!/bin/sh
+   # This script is run on the host 10.237.212.46 to reset SRIOV
+
+   # BDF for Fortville NIC is 0000:02:00.0
+   cat /sys/bus/pci/devices/0000\:02\:00.0/max_vfs
+   echo 0 > /sys/bus/pci/devices/0000\:02\:00.0/max_vfs
+   cat /sys/bus/pci/devices/0000\:02\:00.0/max_vfs
+
+   # BDF for Niantic NIC is 0000:09:00.0
+   cat /sys/bus/pci/devices/0000\:09\:00.0/max_vfs
+   echo 0 > /sys/bus/pci/devices/0000\:09\:00.0/max_vfs
+   cat /sys/bus/pci/devices/0000\:09\:00.0/max_vfs
+
+vm_virtio_vhost_user.sh
+~~~~~~~~~~~~~~~~~~~~~~~
+
+.. code-block:: sh
+
+   #/bin/sh
+   # Script for use with vhost_user sample application
+   # The host system has 8 cpu's (0-7)
+
+   # Path to KVM tool
+   KVM_PATH="/usr/bin/qemu-system-x86_64"
+
+   # Guest Disk image
+   DISK_IMG="/home/user/disk_image/virt1_sml.disk"
+
+   # Number of guest cpus
+   VCPUS_NR="6"
+
+   # Memory
+   MEM=1024
+
+   VIRTIO_OPTIONS="csum=off,gso=off,guest_tso4=off,guest_tso6=off,guest_ecn=off"
+
+   # Socket Path
+   SOCKET_PATH="/root/dpdk/host_scripts/usvhost"
+
+   taskset -c 2-7 $KVM_PATH \
+    -enable-kvm \
+    -m $MEM \
+    -smp $VCPUS_NR \
+    -object memory-backend-file,id=mem,size=1024M,mem-path=/mnt/huge,share=on \
+    -numa node,memdev=mem,nodeid=0 \
+    -cpu host \
+    -name VM1 \
+    -no-reboot \
+    -net none \
+    -vnc none \
+    -nographic \
+    -hda $DISK_IMG \
+    -chardev socket,id=chr0,path=$SOCKET_PATH \
+    -netdev type=vhost-user,id=net1,chardev=chr0,vhostforce \
+    -device virtio-net-pci,netdev=net1,mac=CC:BB:BB:BB:BB:BB,$VIRTIO_OPTIONS \
+    -chardev socket,id=chr1,path=$SOCKET_PATH \
+    -netdev type=vhost-user,id=net2,chardev=chr1,vhostforce \
+    -device virtio-net-pci,netdev=net2,mac=DD:BB:BB:BB:BB:BB,$VIRTIO_OPTIONS \
+    -monitor telnet::3333,server,nowait
+
+connect_to_qemu_mon_on_host.sh
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. code-block:: sh
+
+   #!/bin/sh
+   # This script is run on both hosts when the VM is up,
+   # to connect to the Qemu Monitor.
+
+   telnet 0 3333
+
+reset_vf_on_212_131.sh
+~~~~~~~~~~~~~~~~~~~~~~
+
+.. code-block:: sh
+
+   #!/bin/sh
+   # This script is run on the host 10.237.212.131 to reset SRIOV
+
+   # BDF for Ninatic NIC is 0000:06:00.0
+   cat /sys/bus/pci/devices/0000\:06\:00.0/max_vfs
+   echo 0 > /sys/bus/pci/devices/0000\:06\:00.0/max_vfs
+   cat /sys/bus/pci/devices/0000\:06\:00.0/max_vfs
+
+   # BDF for Fortville NIC is 0000:03:00.0
+   cat /sys/bus/pci/devices/0000\:03\:00.0/max_vfs
+   echo 0 > /sys/bus/pci/devices/0000\:03\:00.0/max_vfs
+   cat /sys/bus/pci/devices/0000\:03\:00.0/max_vfs
+
+vm_virtio_vhost_user_migrate.sh
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. code-block:: sh
+
+   #/bin/sh
+   # Script for use with vhost user sample application
+   # The host system has 8 cpu's (0-7)
+
+   # Path to KVM tool
+   KVM_PATH="/usr/bin/qemu-system-x86_64"
+
+   # Guest Disk image
+   DISK_IMG="/home/user/disk_image/virt1_sml.disk"
+
+   # Number of guest cpus
+   VCPUS_NR="6"
+
+   # Memory
+   MEM=1024
+
+   VIRTIO_OPTIONS="csum=off,gso=off,guest_tso4=off,guest_tso6=off,guest_ecn=off"
+
+   # Socket Path
+   SOCKET_PATH="/root/dpdk/host_scripts/usvhost"
+
+   taskset -c 2-7 $KVM_PATH \
+    -enable-kvm \
+    -m $MEM \
+    -smp $VCPUS_NR \
+    -object memory-backend-file,id=mem,size=1024M,mem-path=/mnt/huge,share=on \
+    -numa node,memdev=mem,nodeid=0 \
+    -cpu host \
+    -name VM1 \
+    -no-reboot \
+    -net none \
+    -vnc none \
+    -nographic \
+    -hda $DISK_IMG \
+    -chardev socket,id=chr0,path=$SOCKET_PATH \
+    -netdev type=vhost-user,id=net1,chardev=chr0,vhostforce \
+    -device virtio-net-pci,netdev=net1,mac=CC:BB:BB:BB:BB:BB,$VIRTIO_OPTIONS \
+    -chardev socket,id=chr1,path=$SOCKET_PATH \
+    -netdev type=vhost-user,id=net2,chardev=chr1,vhostforce \
+    -device virtio-net-pci,netdev=net2,mac=DD:BB:BB:BB:BB:BB,$VIRTIO_OPTIONS \
+    -incoming tcp:0:5555 \
+    -monitor telnet::3333,server,nowait
+
+.. _lm_virtio_vhost_user_vm_scripts:
+
+Sample VM scripts
+-----------------
+
+setup_dpdk_virtio_in_vm.sh
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. code-block:: sh
+
+   #!/bin/sh
+   # this script matches the vm_virtio_vhost_user script
+   # virtio port is 03
+   # virtio port is 04
+
+   cat  /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
+   echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
+   cat  /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
+
+   ifconfig -a
+   /root/dpdk/tools/dpdk_nic_bind.py --status
+
+   rmmod virtio-pci
+
+   modprobe uio
+   insmod /root/dpdk/x86_64-default-linuxapp-gcc/kmod/igb_uio.ko
+
+   /root/dpdk/tools/dpdk_nic_bind.py -b igb_uio 0000:00:03.0
+   /root/dpdk/tools/dpdk_nic_bind.py -b igb_uio 0000:00:04.0
+
+   /root/dpdk/tools/dpdk_nic_bind.py --status
+
+run_testpmd_in_vm.sh
+~~~~~~~~~~~~~~~~~~~~
+
+.. code-block:: sh
+
+   #!/bin/sh
+   # Run testpmd for use with vhost_user sample app.
+   # 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
index 7aef7a3..0441859 100644 (file)
@@ -43,5 +43,6 @@ DPDK documentation
    sample_app_ug/index
    testpmd_app_ug/index
    faq/index
+   howto/index
    rel_notes/index
    contributing/index
index fb2c481..f8007b3 100644 (file)
@@ -198,7 +198,7 @@ however please consult your distributions documentation to make sure that is the
 Also, to use VFIO, both kernel and BIOS must support and be configured to use IO virtualization (such as Intel® VT-d).
 
 For proper operation of VFIO when running DPDK applications as a non-privileged user, correct permissions should also be set up.
-This can be done by using the DPDK setup script (called setup.sh and located in the tools directory).
+This can be done by using the DPDK setup script (called dpdk-setup.sh and located in the tools directory).
 
 .. _linux_gsg_binding_kernel:
 
@@ -224,7 +224,7 @@ and to bind and unbind those ports from the different kernel modules, including
 The following are some examples of how the script can be used.
 A full description of the script and its parameters can be obtained by calling the script with the ``--help`` or ``--usage`` options.
 Note that the uio or vfio kernel modules to be used, should be loaded into the kernel before
-running the ``dpdk_nic_bind.py`` script.
+running the ``dpdk-devbind.py`` script.
 
 .. warning::
 
@@ -238,14 +238,14 @@ running the ``dpdk_nic_bind.py`` script.
 
 .. warning::
 
-    While any user can run the dpdk_nic_bind.py script to view the status of the network ports,
+    While any user can run the dpdk-devbind.py script to view the status of the network ports,
     binding or unbinding network ports requires root privileges.
 
 To see the status of all network ports on the system:
 
 .. code-block:: console
 
-    ./tools/dpdk_nic_bind.py --status
+    ./tools/dpdk-devbind.py --status
 
     Network devices using DPDK-compatible driver
     ============================================
@@ -267,16 +267,16 @@ To bind device ``eth1``,``04:00.1``, to the ``uio_pci_generic`` driver:
 
 .. code-block:: console
 
-    ./tools/dpdk_nic_bind.py --bind=uio_pci_generic 04:00.1
+    ./tools/dpdk-devbind.py --bind=uio_pci_generic 04:00.1
 
 or, alternatively,
 
 .. code-block:: console
 
-    ./tools/dpdk_nic_bind.py --bind=uio_pci_generic eth1
+    ./tools/dpdk-devbind.py --bind=uio_pci_generic eth1
 
 To restore device ``82:00.0`` to its original kernel binding:
 
 .. code-block:: console
 
-    ./tools/dpdk_nic_bind.py --bind=ixgbe 82:00.0
+    ./tools/dpdk-devbind.py --bind=ixgbe 82:00.0
index b433732..d4a8362 100644 (file)
@@ -192,12 +192,12 @@ Configurations before running DPDK
 
 
       # Bind ports 82:00.0 and 85:00.0 to dpdk driver
-      ./dpdk_folder/tools/dpdk_nic_bind.py -b igb_uio 82:00.0 85:00.0
+      ./dpdk_folder/tools/dpdk-devbind.py -b igb_uio 82:00.0 85:00.0
 
       # Check the port driver status
-      ./dpdk_folder/tools/dpdk_nic_bind.py --status
+      ./dpdk_folder/tools/dpdk-devbind.py --status
 
-   See ``dpdk_nic_bind.py --help`` for more details.
+   See ``dpdk-devbind.py --help`` for more details.
 
 
 More details about DPDK setup and Linux kernel requirements see :ref:`linux_gsg_compiling_dpdk`.
index 1e0f8ff..8789b58 100644 (file)
@@ -33,7 +33,7 @@
 Quick Start Setup Script
 ========================
 
-The setup.sh script, found in the tools subdirectory, allows the user to perform the following tasks:
+The dpdk-setup.sh script, found in the tools subdirectory, allows the user to perform the following tasks:
 
 *   Build the DPDK libraries
 
@@ -63,7 +63,7 @@ the user may compile their own application that links in the EAL libraries to cr
 Script Organization
 -------------------
 
-The setup.sh script is logically organized into a series of steps that a user performs in sequence.
+The dpdk-setup.sh script is logically organized into a series of steps that a user performs in sequence.
 Each step provides a number of options that guide the user to completing the desired task.
 The following is a brief synopsis of each step.
 
@@ -98,17 +98,17 @@ The final step has options for restoring the system to its original state.
 Use Cases
 ---------
 
-The following are some example of how to use the setup.sh script.
+The following are some example of how to use the dpdk-setup.sh script.
 The script should be run using the source command.
 Some options in the script prompt the user for further data before proceeding.
 
 .. warning::
 
-    The setup.sh script should be run with root privileges.
+    The dpdk-setup.sh script should be run with root privileges.
 
 .. code-block:: console
 
-    source tools/setup.sh
+    source tools/dpdk-setup.sh
 
     ------------------------------------------------------------------------
 
@@ -269,7 +269,7 @@ The following selection demonstrates the launch of the test application to run o
 Applications
 ------------
 
-Once the user has run the setup.sh script, built one of the EAL targets and set up hugepages (if using one of the Linux EAL targets),
+Once the user has run the dpdk-setup.sh script, built one of the EAL targets and set up hugepages (if using one of the Linux EAL targets),
 the user can then move on to building and running their application or one of the examples provided.
 
 The examples in the /examples directory provide a good starting point to gain an understanding of the operation of the DPDK.
index df8fb47..6453168 100644 (file)
@@ -207,7 +207,7 @@ devices managed by ``librte_pmd_bnx2x`` in Linux operating system.
 #. Bind the QLogic adapters to ``igb_uio`` or ``vfio-pci`` loaded in the
    previous step::
 
-      ./tools/dpdk_nic_bind.py --bind igb_uio 0000:84:00.0 0000:84:00.1
+      ./tools/dpdk-devbind.py --bind igb_uio 0000:84:00.0 0000:84:00.1
 
    or
 
@@ -219,7 +219,7 @@ devices managed by ``librte_pmd_bnx2x`` in Linux operating system.
 
       sudo chmod 0666 /dev/vfio/*
 
-      ./tools/dpdk_nic_bind.py --bind vfio-pci 0000:84:00.0 0000:84:00.1
+      ./tools/dpdk-devbind.py --bind vfio-pci 0000:84:00.0 0000:84:00.1
 
 #. Start ``testpmd`` with basic parameters:
 
index d718f19..d8236b0 100644 (file)
@@ -285,7 +285,7 @@ devices managed by librte_pmd_cxgbe in Linux operating system.
 
    .. code-block:: console
 
-      ./tools/dpdk_nic_bind.py --bind igb_uio 0000:02:00.4
+      ./tools/dpdk-devbind.py --bind igb_uio 0000:02:00.4
 
    or
 
@@ -297,7 +297,7 @@ devices managed by librte_pmd_cxgbe in Linux operating system.
 
       sudo chmod 0666 /dev/vfio/*
 
-      ./tools/dpdk_nic_bind.py --bind vfio-pci 0000:02:00.4
+      ./tools/dpdk-devbind.py --bind vfio-pci 0000:02:00.4
 
    .. note::
 
index 9f93848..073b35a 100644 (file)
@@ -225,7 +225,7 @@ devices managed by librte_pmd_ena.
 
    .. code-block:: console
 
-      ./tools/dpdk_nic_bind.py --bind=igb_uio 0000:02:00.1
+      ./tools/dpdk-devbind.py --bind=igb_uio 0000:02:00.1
 
 #. Start testpmd with basic parameters:
 
index e67c3db..42e781e 100644 (file)
@@ -35,12 +35,6 @@ NICs. These adapters are also referred to as vNICs below. If you are running
 or would like to run DPDK software applications on Cisco UCS servers using
 Cisco VIC adapters the following documentation is relevant.
 
-Version Information
--------------------
-
-The version of the ENIC PMD driver is 1.0.0.6 and will be printed by ENIC PMD
-during the initialization.
-
 How to obtain ENIC PMD integrated DPDK
 --------------------------------------
 
@@ -156,6 +150,8 @@ Supported features
 - VLAN filtering (supported via UCSM/CIMC only)
 - Execution of application by unprivileged system users
 - IPV4, IPV6 and TCP RSS hashing
+- Scattered Rx
+- MTU update
 
 Known bugs and Unsupported features in this release
 ---------------------------------------------------
@@ -165,6 +161,7 @@ Known bugs and Unsupported features in this release
 - non-IPV4 flow direction
 - Setting of extended VLAN
 - UDP RSS hashing
+- MTU update only works if Scattered Rx mode is disabled
 
 Prerequisites
 -------------
@@ -177,13 +174,13 @@ Prerequisites
 - DPDK suite should be configured based on the user's decision to use VFIO or
   UIO framework
 - If the vNIC device(s) to be used is bound to the kernel mode Ethernet driver
-  (enic), use 'ifconfig' to bring the interface down. The dpdk_nic_bind.py tool
+  (enic), use 'ifconfig' to bring the interface down. The dpdk-devbind.py tool
   can then be used to unbind the device's bus id from the enic kernel mode
   driver.
 - Bind the intended vNIC to vfio-pci in case the user wants ENIC PMD to use
-  VFIO framework using dpdk_nic_bind.py.
+  VFIO framework using dpdk-devbind.py.
 - Bind the intended vNIC to igb_uio in case the user wants ENIC PMD to use
-  UIO framework using dpdk_nic_bind.py.
+  UIO framework using dpdk-devbind.py.
 
 At this point the system should be ready to run DPDK applications. Once the
 application runs to completion, the vNIC can be detached from vfio-pci or
index da695af..4d12b10 100644 (file)
@@ -164,13 +164,13 @@ devices managed by ``librte_pmd_i40e`` in the Linux operating system.
 
    .. code-block:: console
 
-      ./tools/dpdk_nic_bind.py --bind igb_uio 0000:83:00.0
+      ./tools/dpdk-devbind.py --bind igb_uio 0000:83:00.0
 
    Or setup VFIO permissions for regular users and then bind to ``vfio-pci``:
 
    .. code-block:: console
 
-      ./tools/dpdk_nic_bind.py --bind vfio-pci 0000:83:00.0
+      ./tools/dpdk-devbind.py --bind vfio-pci 0000:83:00.0
 
 #. Start ``testpmd`` with basic parameters:
 
index a68198f..95a79b5 100644 (file)
@@ -151,7 +151,7 @@ For example,
 
         modprobe uio
         insmod igb_uio
-        ./dpdk_nic_bind.py -b igb_uio bb:ss.f
+        ./dpdk-devbind.py -b igb_uio bb:ss.f
         echo 2 > /sys/bus/pci/devices/0000\:bb\:ss.f/max_vfs (To enable two VFs on a specific PCI device)
 
     Launch the DPDK testpmd/example or your own host daemon application using the DPDK PMD library.
@@ -236,7 +236,7 @@ For example,
 
         modprobe uio
         insmod igb_uio
-        ./dpdk_nic_bind.py -b igb_uio bb:ss.f
+        ./dpdk-devbind.py -b igb_uio bb:ss.f
         echo 2 > /sys/bus/pci/devices/0000\:bb\:ss.f/max_vfs (To enable two VFs on a specific PCI device)
 
     Launch the DPDK testpmd/example or your own host daemon application using the DPDK PMD library.
@@ -285,7 +285,7 @@ For example,
     .. code-block:: console
 
         insmod igb_uio
-        ./dpdk_nic_bind.py -b igb_uio bb:ss.f
+        ./dpdk-devbind.py -b igb_uio bb:ss.f
         echo 2 > /sys/bus/pci/devices/0000\:bb\:ss.f/max_vfs (To enable two VFs on a specific pci device)
 
     Launch DPDK testpmd/example or your own host daemon application using the DPDK PMD library.
@@ -406,7 +406,7 @@ The setup procedure is as follows:
 
         modprobe uio
         insmod igb_uio
-        ./dpdk_nic_bind.py -b igb_uio 02:00.0 02:00.1 0e:00.0 0e:00.1
+        ./dpdk-devbind.py -b igb_uio 02:00.0 02:00.1 0e:00.0 0e:00.1
         echo 2 > /sys/bus/pci/devices/0000\:02\:00.0/max_vfs
         echo 2 > /sys/bus/pci/devices/0000\:02\:00.1/max_vfs
         echo 2 > /sys/bus/pci/devices/0000\:0e\:00.0/max_vfs
index e4ebc71..4ef6e02 100644 (file)
@@ -242,9 +242,9 @@ Using the NFP PMD is not different to using other PMDs. Usual steps are:
    useful for installing the UIO modules and for binding the right device to those
    modules avoiding doing so manually:
 
-   * **setup.sh**
-   * **dpdk_nic_bind.py**
+   * **dpdk-setup.sh**
+   * **dpdk-devbind.py**
 
-   Configuration may be performed by running setup.sh which invokes
-   dpdk_nic_bind.py as needed. Executing setup.sh will display a menu of
+   Configuration may be performed by running dpdk-setup.sh which invokes
+   dpdk-devbind.py as needed. Executing dpdk-setup.sh will display a menu of
    configuration options.
index 572ced4..6abbae6 100644 (file)
@@ -92,7 +92,7 @@ Most of these differences are summarized below.
    Queue status event                                                                       Y
    Rx interrupt                     Y     Y Y Y Y Y Y Y Y Y Y Y Y Y Y
    Queue start/stop           Y   Y   Y Y Y Y Y Y     Y Y     Y Y Y Y Y Y               Y Y   Y Y
-   MTU update                     Y Y Y Y         Y   Y Y Y Y         Y Y         Y Y     Y
+   MTU update                     Y Y Y P         Y   Y Y Y Y         Y Y         Y Y     Y
    Jumbo frame                    Y Y Y Y Y Y Y Y Y   Y Y Y Y Y Y Y Y Y Y       Y Y Y     Y
    Scattered Rx                   Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y               Y Y   Y
    LRO                                                Y Y Y Y
index f7ca8eb..53d749c 100644 (file)
@@ -177,7 +177,7 @@ devices managed by ``librte_pmd_qede`` in Linux operating system.
 
    .. code-block:: console
 
-      ./tools/dpdk_nic_bind.py --bind igb_uio 0000:84:00.0 0000:84:00.1 \
+      ./tools/dpdk-devbind.py --bind igb_uio 0000:84:00.0 0000:84:00.1 \
                                               0000:84:00.2 0000:84:00.3
 
 #. Start ``testpmd`` with basic parameters:
index e38f260..248b1af 100644 (file)
@@ -146,7 +146,7 @@ managed by ``librte_pmd_thunderx_nicvf`` in the Linux operating system.
 
    .. code-block:: console
 
-      ./tools/dpdk_nic_bind.py --bind vfio-pci 0002:01:00.2
+      ./tools/dpdk-devbind.py --bind vfio-pci 0002:01:00.2
 
 #. Start ``testpmd`` with basic parameters:
 
@@ -246,11 +246,11 @@ This section provides instructions to configure SR-IOV with Linux OS.
 
       Unless ``thunder-nicvf`` driver is in use make sure your kernel config includes ``CONFIG_THUNDER_NIC_VF`` setting.
 
-#. Verify PF/VF bind using ``dpdk_nic_bind.py``:
+#. Verify PF/VF bind using ``dpdk-devbind.py``:
 
    .. code-block:: console
 
-      ./tools/dpdk_nic_bind.py --status
+      ./tools/dpdk-devbind.py --status
 
    Example output:
 
@@ -268,18 +268,18 @@ This section provides instructions to configure SR-IOV with Linux OS.
 
       modprobe vfio-pci
 
-#. Bind VF devices to ``vfio-pci`` using ``dpdk_nic_bind.py``:
+#. Bind VF devices to ``vfio-pci`` using ``dpdk-devbind.py``:
 
    .. code-block:: console
 
-      ./tools/dpdk_nic_bind.py --bind vfio-pci 0002:01:00.1
-      ./tools/dpdk_nic_bind.py --bind vfio-pci 0002:01:00.2
+      ./tools/dpdk-devbind.py --bind vfio-pci 0002:01:00.1
+      ./tools/dpdk-devbind.py --bind vfio-pci 0002:01:00.2
 
-#. Verify VF bind using ``dpdk_nic_bind.py``:
+#. Verify VF bind using ``dpdk-devbind.py``:
 
    .. code-block:: console
 
-      ./tools/dpdk_nic_bind.py --status
+      ./tools/dpdk-devbind.py --status
 
    Example output:
 
index c6335d4..5431015 100644 (file)
@@ -172,7 +172,7 @@ Host2VM communication example
         modprobe uio
         echo 512 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
         modprobe uio_pci_generic
-        python tools/dpdk_nic_bind.py -b uio_pci_generic 00:03.0
+        python tools/dpdk-devbind.py -b uio_pci_generic 00:03.0
 
     We use testpmd as the forwarding application in this example.
 
index 18a3010..fa2411f 100644 (file)
@@ -309,11 +309,11 @@ Misc
 Internally Generated Build Tools
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-``app/pmdinfogen``
+``app/dpdk-pmdinfogen``
 
 
-``pmdinfogen`` scans an object (.o) file for various well known symbol names.  These
-well known symbol names are defined by various macros and used to export
+``dpdk-pmdinfogen`` scans an object (.o) file for various well known symbol names.
+These well known symbol names are defined by various macros and used to export
 important information about hardware support and usage for pmd files.  For
 instance the macro:
 
@@ -328,10 +328,10 @@ Creates the following symbol:
    static char this_pmd_name0[] __attribute__((used)) = "<name>";
 
 
-Which pmdinfogen scans for.  Using this information other relevant bits of data
-can be exported from the object file and used to produce a hardware support
-description, that pmdinfogen then encodes into a json formatted string in the
-following format:
+Which ``dpdk-pmdinfogen`` scans for.  Using this information other relevant
+bits of data can be exported from the object file and used to produce a
+hardware support description, that ``dpdk-pmdinfogen`` then encodes into a
+json formatted string in the following format:
 
 .. code-block:: c
 
index 5946675..ffdc109 100644 (file)
@@ -141,7 +141,7 @@ management systems and software based memory allocators, to be used with DPDK.
 There are two aspects to a mempool handler.
 
 * Adding the code for your new mempool operations (ops). This is achieved by
-  adding a new mempool ops code, and using the ``REGISTER_MEMPOOL_OPS`` macro.
+  adding a new mempool ops code, and using the ``MEMPOOL_REGISTER_OPS`` macro.
 
 * Using the new API to call ``rte_mempool_create_empty()`` and
   ``rte_mempool_set_ops_byname()`` to create a new mempool and specifying which
index 14d5e67..6b0c6b2 100644 (file)
@@ -189,7 +189,12 @@ vhost-user implementation has two options:
   When the DPDK vhost-user application restarts, DPDK vhost-user will try to
   connect to the server again. This is how the "reconnect" feature works.
 
-  Note: the "reconnect" feature requires **QEMU v2.7** (or above).
+  .. Note::
+     * The "reconnect" feature requires **QEMU v2.7** (or above).
+
+     * The vhost supported features must be exactly the same before and
+       after the restart. For example, if TSO is disabled and then enabled,
+       nothing will work and issues undefined might happen.
 
 No matter which mode is used, once a connection is established, DPDK
 vhost-user will start receiving and processing vhost messages from QEMU.
index d3a144f..d00a6ed 100644 (file)
@@ -40,16 +40,16 @@ New Features
 
 * **Added mempool external cache for non-EAL thread.**
 
-   Added new functions to create, free or flush a user-owned mempool
-   cache for non-EAL threads. Previously, cache was always disabled
-   on these threads.
+  Added new functions to create, free or flush a user-owned mempool
+  cache for non-EAL threads. Previously the cache was always disabled
+  on these threads.
 
 * **Changed the memory allocation in mempool library.**
 
   * Added ability to allocate a large mempool in virtually fragmented memory.
   * Added new APIs to populate a mempool with memory.
   * Added an API to free a mempool.
-  * Modified the API of rte_mempool_obj_iter() function.
+  * Modified the API of the ``rte_mempool_obj_iter()`` function.
   * Dropped specific Xen Dom0 code.
   * Dropped specific anonymous mempool code in testpmd.
 
@@ -63,10 +63,10 @@ New Features
 
 * **Added mailbox interrupt support for ixgbe and igb VFs.**
 
-  When the physical NIC link comes down or up, the PF driver will send a
+  When the physical NIC link comes up or down, the PF driver will send a
   mailbox message to notify each VF. To handle this link up/down event,
-  add mailbox interrupts support to receive the message and allow the app to
-  register a callback for it.
+  support have been added for a mailbox interrupt to receive the message and
+  allow the application to register a callback for it.
 
 * **Updated the ixgbe base driver.**
 
@@ -74,51 +74,59 @@ New Features
   following:
 
   * Added sgmii link for X550.
-  * Added mac link setup for X550a SFP and SFP+.
+  * Added MAC link setup for X550a SFP and SFP+.
   * Added KR support for X550em_a.
-  * Added new phy definitions for M88E1500.
+  * Added new PHY definitions for M88E1500.
   * Added support for the VLVF to be bypassed when adding/removing a VFTA entry.
   * Added X550a flow control auto negotiation support.
 
 * **Updated the i40e base driver.**
 
-  Updated the i40e base driver, which includes support for new devices IDs.
+  Updated the i40e base driver including support for new devices IDs.
 
-* **Supported virtio on IBM POWER8.**
+* **Updated the enic driver.**
+
+  The enic driver was updated with changes including the following:
+
+  * Optimized the Tx function.
+  * Added Scattered Rx capability.
+  * Improved packet type identification.
+  * Added MTU update in non Scattered Rx mode and enabled MTU of up to 9208
+    with UCS Software release 2.2 on 1300 series VICs.
+
+* **Added support for virtio on IBM POWER8.**
 
   The ioports are mapped in memory when using Linux UIO.
 
-* **Virtio support for containers.**
+* **Added support for Virtio in containers.**
 
-  Add a new virtual device, named virtio-user, to support virtio for containers.
+  Add a new virtual device, named virtio_user, to support virtio for containers.
 
   Known limitations:
 
   * Control queue and multi-queue are not supported yet.
-  * Cannot work with --huge-unlink.
-  * Cannot work with --no-huge.
-  * Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8) hugepages.
-  * Root privilege is a must for sorting hugepages by physical address.
-  * Can only be used with vhost user backend.
+  * Doesn't work with ``--huge-unlink``.
+  * Doesn't work with ``--no-huge``.
+  * Doesn't work when there are more than ``VHOST_MEMORY_MAX_NREGIONS(8)`` hugepages.
+  * Root privilege is required for sorting hugepages by physical address.
+  * Can only be used with the vhost user backend.
 
 * **Added vhost-user client mode.**
 
-  DPDK vhost-user could be the server as well as the client. It supports
-  server mode only before, now it also supports client mode. Client mode
-  is enabled when ``RTE_VHOST_USER_CLIENT`` flag is set while calling
+  DPDK vhost-user now supports client mode as well as server mode. Client mode
+  is enabled when the ``RTE_VHOST_USER_CLIENT`` flag is set while calling
   ``rte_vhost_driver_register``.
 
-  When DPDK vhost-user restarts from normal or abnormal quit (say crash),
-  the client mode would allow DPDK to establish the connect again.  Note
-  that a brand new QEMU version (v2.7 or above) is needed, otherwise, the
-  reconnect won't work.
+  When DPDK vhost-user restarts from an normal or abnormal exit (such as a
+  crash), the client mode allows DPDK to establish the connection again. Note
+  that QEMU version v2.7 or above is required for this feature.
 
-  DPDK vhost-user will also try to reconnect by default when
+  DPDK vhost-user will also try to reconnect by default when:
 
-  * the first connect fails (when QEMU is not started yet)
-  * the connection is broken (when QEMU restarts)
+  * The first connect fails (when QEMU is not started yet).
+  * The connection is broken (when QEMU restarts).
 
-  It can be turned off if flag ``RTE_VHOST_USER_NO_RECONNECT`` is set.
+  It can be turned off by setting the ``RTE_VHOST_USER_NO_RECONNECT`` flag.
 
 * **Added NSH packet recognition in i40e.**
 
@@ -127,7 +135,7 @@ New Features
   Now AESNI MB PMD supports 128/192/256-bit counter mode AES encryption and
   decryption.
 
-* **Added support of AES counter mode for Intel QuickAssist devices.**
+* **Added support for AES counter mode with Intel QuickAssist devices.**
 
   Enabled support for the AES CTR algorithm for Intel QuickAssist devices.
   Provided support for algorithm-chaining operations.
@@ -141,33 +149,33 @@ New Features
 
   The following features/modifications have been added to rte_hash library:
 
-  * Enabled application developers to use an extra flag for rte_hash creation
-    to specify default behavior (multi-thread safe/unsafe) with rte_hash_add_key
-    function.
-  * Changed Cuckoo search algorithm to breadth first search for multi-writer
-    routine and split Cuckoo Search and Move operations in order to reduce
-    transactional code region and improve TSX performance.
-  * Added a hash multi-writer test case for test app.
+  * Enabled application developers to use an extra flag for ``rte_hash``
+    creation to specify default behavior (multi-thread safe/unsafe) with the
+    ``rte_hash_add_key`` function.
+  * Changed the Cuckoo Hash Search algorithm to breadth first search for
+    multi-writer routines and split Cuckoo Hash Search and Move operations in
+    order to reduce transactional code region and improve TSX performance.
+  * Added a hash multi-writer test case to the test app.
 
 * **Improved IP Pipeline Application.**
 
-  The following features have been added to ip_pipeline application:
+  The following features have been added to the ip_pipeline application:
 
-  * Configure the MAC address in the routing pipeline and automatic routes
+  * Configure the MAC address in the routing pipeline and automatic route
     updates with change in link state.
   * Enable RSS per network interface through the configuration file.
   * Streamline the CLI code.
 
 * **Added keepalive enhancements.**
 
-  Adds support for reporting of core states other than dead to
+  Added support for reporting of core states other than dead to
   monitoring applications, enabling the support of broader liveness
   reporting to external processes.
 
 * **Added packet capture framework.**
 
-  * A new library ``librte_pdump`` is added to provide packet capture API.
-  * A new ``app/pdump`` tool is added to capture packets in DPDK.
+  * A new library ``librte_pdump`` is added to provide packet capture API.
+  * A new ``app/pdump`` tool is added to demonstrate capture packets in DPDK.
 
 
 * **Added floating VEB support for i40e PF driver.**
@@ -179,6 +187,10 @@ New Features
   For information on this feature,  please see the "I40E Poll Mode Driver"
   section of the "Network Interface Controller Drivers" document.
 
+* **Added support for live migration of a VM with SRIOV VF.**
+
+  Live migration of a VM with Virtio and VF PMD's using the bonding PMD.
+
 
 Resolved Issues
 ---------------
@@ -197,18 +209,20 @@ EAL
 
 * **igb_uio: Fixed possible mmap failure for Linux >= 4.5.**
 
-  mmaping the iomem range of the PCI device fails for kernels that
-  enabled CONFIG_IO_STRICT_DEVMEM option:
+  The mmaping of the iomem range of the PCI device fails for kernels that
+  enabled the ``CONFIG_IO_STRICT_DEVMEM`` option. The error seen by the
+  user is as similar to the following::
+
+      EAL: pci_map_resource():
 
-  EAL: pci_map_resource():
-           cannot mmap(39, 0x7f1c51800000, 0x100000, 0x0):
-           Invalid argument (0xffffffffffffffff)
+          cannot mmap(39, 0x7f1c51800000, 0x100000, 0x0):
+          Invalid argument (0xffffffffffffffff)
 
-  CONFIG_IO_STRICT_DEVMEM is introduced in Linux v4.5
+  The ``CONFIG_IO_STRICT_DEVMEM`` kernel option was introduced in Linux v4.5.
 
-  Updated igb_uio to stop reserving PCI memory resources, from
-  kernel point of view iomem region looks like idle and mmap worked
-  again. This matches uio_pci_generic usage.
+  The issues was resolve by updating ``igb_uio`` to stop reserving PCI memory
+  resources. From the kernel point of view the iomem region looks like idle
+  and mmap works again. This matches the ``uio_pci_generic`` usage.
 
 
 Drivers
@@ -228,15 +242,29 @@ Drivers
   outer VLAN header.
   This issue is fixed by changing corresponding register for single VLAN.
 
+* **enic: Fixed several issues when stopping then restarting ports and queues.**
+
+  Fixed several crashes related to stopping then restarting ports and queues.
+  Fixed possible crash when re-configuring the number of Rx queue descriptors.
+
+* **enic: Fixed Rx data mis-alignment if mbuf data offset modified.**
+
+  Fixed possible Rx corruption when mbufs were returned to a pool with data
+  offset other than RTE_PKTMBUF_HEADROOM.
+
+* **enic: Fixed Tx IP/UDP/TCP checksum offload and VLAN insertion.**
+
+* **enic: Fixed Rx error and missed counters.**
+
 
 Libraries
 ~~~~~~~~~
 
 * **mbuf: Fixed refcnt update when detaching.**
 
-  Fix the ``rte_pktmbuf_detach()`` function to decrement the direct
-  mbuf's reference counter. The previous behavior was not to affect
-  the reference counter. It lead a memory leak of the direct mbuf.
+  Fix the ``rte_pktmbuf_detach()`` function to decrement the direct mbuf's
+  reference counter. The previous behavior was not to affect the reference
+  counter. This lead to a memory leak of the direct mbuf.
 
 
 Examples
@@ -266,9 +294,17 @@ API Changes
    * Add a short 1-2 sentence description of the API change. Use fixed width
      quotes for ``rte_function_names`` or ``rte_struct_names``. Use the past tense.
 
-* The following counters are removed from ``rte_eth_stats`` structure:
-  ibadcrc, ibadlen, imcasts, fdirmatch, fdirmiss,
-  tx_pause_xon, rx_pause_xon, tx_pause_xoff, rx_pause_xoff.
+* The following counters are removed from the ``rte_eth_stats`` structure:
+
+  * ``ibadcrc``
+  * ``ibadlen``
+  * ``imcasts``
+  * ``fdirmatch``
+  * ``fdirmiss``
+  * ``tx_pause_xon``
+  * ``rx_pause_xon``
+  * ``tx_pause_xoff``
+  * ``rx_pause_xoff``
 
 * The extended statistics are fetched by ids with ``rte_eth_xstats_get``
   after a lookup by name ``rte_eth_xstats_get_names``.
@@ -280,8 +316,8 @@ API Changes
   ``rte_vhost_avail_entries``.
 
 * All existing vhost APIs and callbacks with ``virtio_net`` struct pointer
-  as the parameter have been changed due to the ABI refactoring mentioned
-  below: it's replaced by ``int vid``.
+  as the parameter have been changed due to the ABI refactoring described
+  below. It is replaced by ``int vid``.
 
 * The function ``rte_vhost_enqueue_burst`` no longer supports concurrent enqueuing
   packets to the same queue.
@@ -289,6 +325,9 @@ API Changes
 * The function ``rte_eth_dev_set_mtu`` adds a new return value ``-EBUSY``, which
   indicates the operation is forbidden because the port is running.
 
+* The script ``dpdk_nic_bind.py`` is renamed to ``dpdk-devbind.py``.
+  And the script ``setup.sh`` is renamed to ``dpdk-setup.sh``.
+
 
 ABI Changes
 -----------
@@ -297,15 +336,15 @@ ABI Changes
      the previous releases and made in this release. Use fixed width quotes for
      ``rte_function_names`` or ``rte_struct_names``. Use the past tense.
 
-* The ``rte_port_source_params`` structure has new fields to support PCAP file.
+* The ``rte_port_source_params`` structure has new fields to support PCAP files.
   It was already in release 16.04 with ``RTE_NEXT_ABI`` flag.
 
 * The ``rte_eth_dev_info`` structure has new fields ``nb_rx_queues`` and ``nb_tx_queues``
-  to support number of queues configured by software.
+  to support the number of queues configured by software.
 
-* vhost ABI refactoring has been made: ``virtio_net`` structure is never
-  exported to application any more. Instead, a handle, ``vid``, has been
-  used to represent this structure internally.
+* A Vhost ABI refactoring has been made: the ``virtio_net`` structure is no
+  longer exported directly to the application. Instead, a handle, ``vid``, has
+  been used to represent this structure internally.
 
 
 Shared Library Versions
@@ -321,6 +360,7 @@ The libraries prepended with a plus sign were incremented in this version.
      librte_acl.so.2
      librte_cfgfile.so.2
      librte_cmdline.so.2
+     librte_cryptodev.so.1
      librte_distributor.so.1
      librte_eal.so.2
      librte_hash.so.2
index 09cbc17..693d813 100644 (file)
@@ -337,7 +337,7 @@ Generic example of configuration file section:
 
     <variable_name_1> = <value_1>
 
-    ...
+    ...
 
     <variable_name_N> = <value_N>
 
index b51b2dc..a1c10c0 100644 (file)
@@ -472,7 +472,7 @@ If the table is full, the whole packets table is transmitted using the l2fwd_sen
     l2fwd_send_packet(struct rte_mbuf *m, uint8_t port)
     {
         unsigned lcore_id, len;
-        struct lcore_queue_conf \*qconf;
+        struct lcore_queue_conf *qconf;
 
         lcore_id = rte_lcore_id();
         qconf = &lcore_queue_conf[lcore_id];
index c885cdb..e2e6223 100644 (file)
@@ -298,7 +298,7 @@ The get_ipv4_dst_port() function is shown below:
         int ret = 0;
         union ipv4_5tuple_host key;
 
-        ipv4_hdr = (uint8_t \*)ipv4_hdr + offsetof(struct ipv4_hdr, time_to_live);
+        ipv4_hdr = (uint8_t *)ipv4_hdr + offsetof(struct ipv4_hdr, time_to_live);
 
         m128i data = _mm_loadu_si128(( m128i*)(ipv4_hdr));
 
index ceb038e..ac0e7c9 100644 (file)
     OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
-dpdk_pdump Application
+dpdk-pdump Application
 ======================
 
-The ``dpdk_pdump`` tool is a Data Plane Development Kit (DPDK) tool that runs as
+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
+      * 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.
@@ -53,7 +53,7 @@ The tool has a number of command line options:
 
 .. code-block:: console
 
-   ./build/app/dpdk_pdump --
+   ./build/app/dpdk-pdump --
                           --pdump '(port=<port id> | device_id=<pci id or vdev name>),
                                    (queue=<queue_id>),
                                    (rx-dev=<iface or pcap file> |
@@ -95,10 +95,10 @@ 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
+      * 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.
+        (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
@@ -141,4 +141,4 @@ Example
 
 .. code-block:: console
 
-   $ sudo ./build/app/dpdk_pdump -- --pdump 'port=0,queue=*,rx-dev=/tmp/rx.pcap'
+   $ sudo ./build/app/dpdk-pdump -- --pdump 'port=0,queue=*,rx-dev=/tmp/rx.pcap'
index 542950b..73f2195 100644 (file)
     OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
-dpdk_proc_info Application
-==========================
+dpdk-procinfo Application
+=========================
 
-The dpdk_proc_info application is a Data Plane Development Kit (DPDK) 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
@@ -45,7 +45,7 @@ The application has a number of command line options:
 
 .. code-block:: console
 
-   ./$(RTE_TARGET)/app/dpdk_proc_info -- -m | [-p PORTMASK] [--stats | --xstats |
+   ./$(RTE_TARGET)/app/dpdk-procinfo -- -m | [-p PORTMASK] [--stats | --xstats |
    --stats-reset | --xstats-reset]
 
 Parameters
index 2d86a03..c3d1e97 100644 (file)
@@ -59,8 +59,8 @@ This allows network isolation, QOS, etc to be provided on a per client basis.
 In a typical setup, the network overlay tunnel is terminated at the Virtual/Tunnel End Point (VEP/TEP).
 The TEP is normally located at the physical host level ideally in the software switch.
 Due to processing constraints and the inevitable bottleneck that the switch
-becomes the ability to offload overlay support features becomes an important requirement.
-Intel® XL710 10/40 G Ethernet network card provides hardware filtering
+becomes, the ability to offload overlay support features becomes an important requirement.
+Intel® XL710 10/40 Gigabit Ethernet network card provides hardware filtering
 and offload capabilities to support overlay networks implementations such as MAC in UDP and MAC in GRE.
 
 Sample Code Overview
@@ -131,14 +131,14 @@ Compiling the Sample Code
 
     .. code-block:: console
 
-        CONFIG_RTE_LIBRTE_VHOST=n
+        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=y
+        CONFIG_RTE_LIBRTE_VHOST_USER=n
 
      After vhost is enabled and the implementation is selected, build the vhost library.
 
index a93e54d..2b7defc 100644 (file)
@@ -834,19 +834,19 @@ The above message indicates that device 0 has been registered with MAC address c
 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.
 
-Running virtio-user with vhost-switch
+Running virtio_user with vhost-switch
 -------------------------------------
 
-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,
+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.
 
 .. code-block:: console
 
     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 \
+    ./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
 
 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.
+Pleae note that there are some limitations (see release note for more information) in the usage of virtio_user.
index 7f299e0..aa02c15 100644 (file)
@@ -167,7 +167,7 @@ Virtio-Serial channels are configured via libvirt XML:
   </controller>
   <channel type='unix'>
     <source mode='bind' path='/tmp/powermonitor/{vm_name}.{channel_num}'/>
-    <target type='virtio' name='virtio.serial.port.poweragent.{vm_channel_num}/>
+    <target type='virtio' name='virtio.serial.port.poweragent.{vm_channel_num}'/>
     <address type='virtio-serial' controller='0' bus='0' port='{N}'/>
   </channel>
 
index 30e410d..f87e0c2 100644 (file)
@@ -999,7 +999,7 @@ For example, to move a pci device using ixgbe under DPDK management:
 .. code-block:: console
 
    # Check the status of the available devices.
-   ./tools/dpdk_nic_bind.py --status
+   ./tools/dpdk-devbind.py --status
 
    Network devices using DPDK-compatible driver
    ============================================
@@ -1011,11 +1011,11 @@ For example, to move a pci device using ixgbe under DPDK management:
 
 
    # Bind the device to igb_uio.
-   sudo ./tools/dpdk_nic_bind.py -b igb_uio 0000:0a:00.0
+   sudo ./tools/dpdk-devbind.py -b igb_uio 0000:0a:00.0
 
 
    # Recheck the status of the devices.
-   ./tools/dpdk_nic_bind.py --status
+   ./tools/dpdk-devbind.py --status
    Network devices using DPDK-compatible driver
    ============================================
    0000:0a:00.0 '82599ES 10-Gigabit' drv=igb_uio unused=
@@ -1118,9 +1118,9 @@ For example, to move a pci device under kernel management:
 
 .. code-block:: console
 
-   sudo ./tools/dpdk_nic_bind.py -b ixgbe 0000:0a:00.0
+   sudo ./tools/dpdk-devbind.py -b ixgbe 0000:0a:00.0
 
-   ./tools/dpdk_nic_bind.py --status
+   ./tools/dpdk-devbind.py --status
 
    Network devices using DPDK-compatible driver
    ============================================
index 3a6fc47..00a8f0c 100644 (file)
@@ -323,7 +323,7 @@ Building and Running the Switching Backend
     .. code-block:: console
 
         modprobe uio_pci_generic
-        python tools/dpdk_nic_bind.py -b uio_pci_generic 0000:09:00:00.0
+        python tools/dpdk-devbind.py -b uio_pci_generic 0000:09:00:00.0
 
     In this case, 0000:09:00.0 is the PCI address for the NIC controller.
 
index 95fbad8..a49a07f 100644 (file)
@@ -4507,7 +4507,7 @@ static void bnx2x_handle_fp_tq(struct bnx2x_fastpath *fp, int scan_fp)
        }
 
        bnx2x_ack_sb(sc, fp->igu_sb_id, USTORM_ID,
-                  le16toh(fp->fp_hc_idx), IGU_INT_ENABLE, 1);
+                  le16toh(fp->fp_hc_idx), IGU_INT_DISABLE, 1);
 }
 
 /*
@@ -8886,7 +8886,7 @@ int bnx2x_alloc_hsi_mem(struct bnx2x_softc *sc)
 /***************************/
 
                if (bnx2x_dma_alloc(sc, FW_BUF_SIZE, &sc->gz_buf_dma,
-                                 "fw_dec_buf", RTE_CACHE_LINE_SIZE) != 0) {
+                                 "fw_buf", RTE_CACHE_LINE_SIZE) != 0) {
                        sc->spq = NULL;
                        sc->sp = NULL;
                        sc->eq = NULL;
index c8d2bf2..f3ab355 100644 (file)
@@ -107,8 +107,8 @@ bnx2x_interrupt_action(struct rte_eth_dev *dev)
 
        PMD_DEBUG_PERIODIC_LOG(INFO, "Interrupt handled");
 
-       if (bnx2x_intr_legacy(sc, 0))
-               DELAY_MS(250);
+       bnx2x_intr_legacy(sc, 0);
+
        if (sc->periodic_flags & PERIODIC_GO)
                bnx2x_periodic_callout(sc);
        link_status = REG_RD(sc, sc->link_params.shmem_base +
index a3649d8..88053e3 100644 (file)
@@ -329,7 +329,7 @@ static int ena_com_init_io_sq(struct ena_com_dev *ena_dev,
                              struct ena_com_io_sq *io_sq)
 {
        size_t size;
-       int dev_node;
+       int dev_node = 0;
 
        ENA_TOUCH(ctx);
 
@@ -383,7 +383,7 @@ static int ena_com_init_io_cq(struct ena_com_dev *ena_dev,
                              struct ena_com_io_cq *io_cq)
 {
        size_t size;
-       int prev_node;
+       int prev_node = 0;
 
        ENA_TOUCH(ctx);
        memset(&io_cq->cdesc_addr, 0x0, sizeof(struct ena_com_io_desc_addr));
index 59082d2..47b07c9 100644 (file)
@@ -356,6 +356,7 @@ static int enicpmd_dev_configure(struct rte_eth_dev *eth_dev)
                        eth_dev->data->dev_conf.rxmode.split_hdr_size);
        }
 
+       enicpmd_vlan_offload_set(eth_dev, ETH_VLAN_STRIP_MASK);
        enic->hw_ip_checksum = eth_dev->data->dev_conf.rxmode.hw_ip_checksum;
        return 0;
 }
index 542f095..b4ca371 100644 (file)
@@ -317,6 +317,7 @@ enic_alloc_rx_queue_mbufs(struct enic *enic, struct vnic_rq *rq)
                        return -ENOMEM;
                }
 
+               mb->data_off = RTE_PKTMBUF_HEADROOM;
                dma_addr = (dma_addr_t)(mb->buf_physaddr
                           + RTE_PKTMBUF_HEADROOM);
                rq_enet_desc_enc(rqd, dma_addr,
index 845a8e6..50f0b28 100644 (file)
@@ -300,6 +300,7 @@ enic_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
                        (struct cq_enet_rq_desc *)&cqd);
 
                /* Push descriptor for newly allocated mbuf */
+               nmb->data_off = RTE_PKTMBUF_HEADROOM;
                dma_addr = (dma_addr_t)(nmb->buf_physaddr +
                                        RTE_PKTMBUF_HEADROOM);
                rq_enet_desc_enc(rqd_ptr, dma_addr,
index 144b2de..01f4a72 100644 (file)
@@ -2159,8 +2159,8 @@ fm10k_rss_hash_update(struct rte_eth_dev *dev,
 
        PMD_INIT_FUNC_TRACE();
 
-       if (rss_conf->rss_key_len < FM10K_RSSRK_SIZE *
-               FM10K_RSSRK_ENTRIES_PER_REG)
+       if (key && (rss_conf->rss_key_len < FM10K_RSSRK_SIZE *
+                               FM10K_RSSRK_ENTRIES_PER_REG))
                return -EINVAL;
 
        if (hf == 0)
@@ -2202,8 +2202,8 @@ fm10k_rss_hash_conf_get(struct rte_eth_dev *dev,
 
        PMD_INIT_FUNC_TRACE();
 
-       if (rss_conf->rss_key_len < FM10K_RSSRK_SIZE *
-                               FM10K_RSSRK_ENTRIES_PER_REG)
+       if (key && (rss_conf->rss_key_len < FM10K_RSSRK_SIZE *
+                               FM10K_RSSRK_ENTRIES_PER_REG))
                return -EINVAL;
 
        if (key != NULL)
index 3f9f05e..11a5804 100644 (file)
@@ -31,7 +31,6 @@
  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#include <sys/queue.h>
 #include <stdio.h>
 #include <errno.h>
 #include <stdint.h>
@@ -51,6 +50,7 @@
 #include <rte_alarm.h>
 #include <rte_dev.h>
 #include <rte_eth_ctrl.h>
+#include <rte_tailq.h>
 
 #include "i40e_logs.h"
 #include "base/i40e_prototype.h"
@@ -2628,10 +2628,10 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 
        if (i40e_is_40G_device(hw->device_id))
                /* For XL710 */
-               dev_info->speed_capa = ETH_LINK_SPEED_1G | ETH_LINK_SPEED_10G;
+               dev_info->speed_capa = ETH_LINK_SPEED_40G;
        else
                /* For X710 */
-               dev_info->speed_capa = ETH_LINK_SPEED_10G | ETH_LINK_SPEED_40G;
+               dev_info->speed_capa = ETH_LINK_SPEED_1G | ETH_LINK_SPEED_10G;
 }
 
 static int
@@ -4094,6 +4094,7 @@ i40e_vsi_release(struct i40e_vsi *vsi)
        struct i40e_pf *pf;
        struct i40e_hw *hw;
        struct i40e_vsi_list *vsi_list;
+       void *temp;
        int ret;
        struct i40e_mac_filter *f;
        uint16_t user_param = vsi->user_param;
@@ -4106,7 +4107,7 @@ i40e_vsi_release(struct i40e_vsi *vsi)
 
        /* VSI has child to attach, release child first */
        if (vsi->veb) {
-               TAILQ_FOREACH(vsi_list, &vsi->veb->head, list) {
+               TAILQ_FOREACH_SAFE(vsi_list, &vsi->veb->head, list, temp) {
                        if (i40e_vsi_release(vsi_list->vsi) != I40E_SUCCESS)
                                return -1;
                        TAILQ_REMOVE(&vsi->veb->head, vsi_list, list);
@@ -4115,7 +4116,7 @@ i40e_vsi_release(struct i40e_vsi *vsi)
        }
 
        if (vsi->floating_veb) {
-               TAILQ_FOREACH(vsi_list, &vsi->floating_veb->head, list) {
+               TAILQ_FOREACH_SAFE(vsi_list, &vsi->floating_veb->head, list, temp) {
                        if (i40e_vsi_release(vsi_list->vsi) != I40E_SUCCESS)
                                return -1;
                        TAILQ_REMOVE(&vsi->floating_veb->head, vsi_list, list);
@@ -4124,7 +4125,7 @@ i40e_vsi_release(struct i40e_vsi *vsi)
 
        /* Remove all macvlan filters of the VSI */
        i40e_vsi_remove_all_macvlan_filter(vsi);
-       TAILQ_FOREACH(f, &vsi->mac_list, next)
+       TAILQ_FOREACH_SAFE(f, &vsi->mac_list, next, temp)
                rte_free(f);
 
        if (vsi->type != I40E_VSI_MAIN &&
@@ -4682,6 +4683,7 @@ i40e_vsi_config_vlan_filter(struct i40e_vsi *vsi, bool on)
 {
        int i, num;
        struct i40e_mac_filter *f;
+       void *temp;
        struct i40e_mac_filter_info *mac_filter;
        enum rte_mac_filter_type desired_filter;
        int ret = I40E_SUCCESS;
@@ -4706,7 +4708,7 @@ i40e_vsi_config_vlan_filter(struct i40e_vsi *vsi, bool on)
        i = 0;
 
        /* Remove all existing mac */
-       TAILQ_FOREACH(f, &vsi->mac_list, next) {
+       TAILQ_FOREACH_SAFE(f, &vsi->mac_list, next, temp) {
                mac_filter[i] = f->mac_info;
                ret = i40e_vsi_delete_mac(vsi, &f->mac_info.mac_addr);
                if (ret) {
index 05cb415..51fb282 100644 (file)
@@ -269,7 +269,7 @@ _recv_raw_pkts_vec(struct i40e_rx_queue *rxq, struct rte_mbuf **rx_pkts,
         * D. fill info. from desc to mbuf
         */
 
-       for (pos = 0, nb_pkts_recd = 0; pos < RTE_I40E_VPMD_RX_BURST;
+       for (pos = 0, nb_pkts_recd = 0; pos < nb_pkts;
                        pos += RTE_I40E_DESCS_PER_LOOP,
                        rxdp += RTE_I40E_DESCS_PER_LOOP) {
                __m128i descs[RTE_I40E_DESCS_PER_LOOP];
index 31cc1be..06d1ee1 100644 (file)
@@ -108,7 +108,9 @@ typedef int16_t             s16;
 typedef uint32_t       u32;
 typedef int32_t                s32;
 typedef uint64_t       u64;
+#ifndef __cplusplus
 typedef int            bool;
+#endif
 
 #define mb()   rte_mb()
 #define wmb()  rte_wmb()
index 850e3ba..07d6449 100644 (file)
@@ -452,9 +452,9 @@ int virtio_dev_queue_setup(struct rte_eth_dev *dev,
                *pvq = cvq;
        }
 
-       /* For virtio-user case (that is when dev->pci_dev is NULL), we use
+       /* For virtio_user case (that is when dev->pci_dev is NULL), we use
         * virtual address. And we need properly set _offset_, please see
-        * MBUF_DATA_DMA_ADDR in virtqueue.h for more information.
+        * VIRTIO_MBUF_DATA_DMA_ADDR in virtqueue.h for more information.
         */
        if (dev->pci_dev)
                vq->offset = offsetof(struct rte_mbuf, buf_physaddr);
@@ -1541,7 +1541,7 @@ virtio_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
        if (dev->pci_dev)
                dev_info->driver_name = dev->driver->pci_drv.name;
        else
-               dev_info->driver_name = "virtio-user PMD";
+               dev_info->driver_name = "virtio_user PMD";
        dev_info->max_rx_queues = (uint16_t)hw->max_rx_queues;
        dev_info->max_tx_queues = (uint16_t)hw->max_tx_queues;
        dev_info->min_rx_bufsize = VIRTIO_MIN_RX_BUFSIZE;
index a27208e..724517e 100644 (file)
@@ -193,7 +193,8 @@ virtqueue_enqueue_recv_refill(struct virtqueue *vq, struct rte_mbuf *cookie)
 
        start_dp = vq->vq_ring.desc;
        start_dp[idx].addr =
-               MBUF_DATA_DMA_ADDR(cookie, vq->offset) - hw->vtnet_hdr_size;
+               VIRTIO_MBUF_ADDR(cookie, vq) +
+               RTE_PKTMBUF_HEADROOM - hw->vtnet_hdr_size;
        start_dp[idx].len =
                cookie->buf_len - RTE_PKTMBUF_HEADROOM + hw->vtnet_hdr_size;
        start_dp[idx].flags =  VRING_DESC_F_WRITE;
@@ -265,7 +266,7 @@ virtqueue_enqueue_xmit(struct virtnet_tx *txvq, struct rte_mbuf *cookie,
        }
 
        do {
-               start_dp[idx].addr  = MBUF_DATA_DMA_ADDR(cookie, vq->offset);
+               start_dp[idx].addr  = VIRTIO_MBUF_DATA_DMA_ADDR(cookie, vq);
                start_dp[idx].len   = cookie->data_len;
                start_dp[idx].flags = cookie->next ? VRING_DESC_F_NEXT : 0;
                idx = start_dp[idx].next;
@@ -467,13 +468,19 @@ void
 virtio_dev_rx_queue_release(void *rxq)
 {
        struct virtnet_rx *rxvq = rxq;
-       struct virtqueue *vq = rxvq->vq;
-       /* rxvq is freed when vq is freed, and as mz should be freed after the
+       struct virtqueue *vq;
+       const struct rte_memzone *mz;
+
+       if (rxvq == NULL)
+               return;
+
+       /*
+        * rxvq is freed when vq is freed, and as mz should be freed after the
         * del_queue, so we reserve the mz pointer first.
         */
-       const struct rte_memzone *mz = rxvq->mz;
+       vq = rxvq->vq;
+       mz = rxvq->mz;
 
-       /* no need to free rxq as vq and rxq are allocated together */
        virtio_dev_queue_release(vq);
        rte_memzone_free(mz);
 }
@@ -553,12 +560,20 @@ void
 virtio_dev_tx_queue_release(void *txq)
 {
        struct virtnet_tx *txvq = txq;
-       struct virtqueue *vq = txvq->vq;
-       /* txvq is freed when vq is freed, and as mz should be freed after the
+       struct virtqueue *vq;
+       const struct rte_memzone *mz;
+       const struct rte_memzone *hdr_mz;
+
+       if (txvq == NULL)
+               return;
+
+       /*
+        * txvq is freed when vq is freed, and as mz should be freed after the
         * del_queue, so we reserve the mz pointer first.
         */
-       const struct rte_memzone *hdr_mz = txvq->virtio_net_hdr_mz;
-       const struct rte_memzone *mz = txvq->mz;
+       vq = txvq->vq;
+       mz = txvq->mz;
+       hdr_mz = txvq->virtio_net_hdr_mz;
 
        virtio_dev_queue_release(vq);
        rte_memzone_free(mz);
index d8fcc15..6517aa8 100644 (file)
@@ -80,8 +80,9 @@ virtqueue_enqueue_recv_refill_simple(struct virtqueue *vq,
        vq->sw_ring[desc_idx] = cookie;
 
        start_dp = vq->vq_ring.desc;
-       start_dp[desc_idx].addr = MBUF_DATA_DMA_ADDR(cookie, vq->offset) -
-                                 vq->hw->vtnet_hdr_size;
+       start_dp[desc_idx].addr =
+               VIRTIO_MBUF_ADDR(cookie, vq) +
+               RTE_PKTMBUF_HEADROOM - vq->hw->vtnet_hdr_size;
        start_dp[desc_idx].len = cookie->buf_len -
                RTE_PKTMBUF_HEADROOM + vq->hw->vtnet_hdr_size;
 
@@ -120,8 +121,8 @@ virtio_rxq_rearm_vec(struct virtnet_rx *rxvq)
                *(uint64_t *)p = rxvq->mbuf_initializer;
 
                start_dp[i].addr =
-                       MBUF_DATA_DMA_ADDR(sw_ring[i], vq->offset) -
-                       vq->hw->vtnet_hdr_size;
+                       VIRTIO_MBUF_ADDR(sw_ring[i], vq) +
+                       RTE_PKTMBUF_HEADROOM - vq->hw->vtnet_hdr_size;
                start_dp[i].len = sw_ring[i]->buf_len -
                        RTE_PKTMBUF_HEADROOM + vq->hw->vtnet_hdr_size;
        }
@@ -371,7 +372,7 @@ virtio_xmit_pkts_simple(void *tx_queue, struct rte_mbuf **tx_pkts,
                        vq->vq_descx[desc_idx + i].cookie = tx_pkts[i];
                for (i = 0; i < nb_tail; i++) {
                        start_dp[desc_idx].addr =
-                               MBUF_DATA_DMA_ADDR(*tx_pkts, vq->offset);
+                               VIRTIO_MBUF_DATA_DMA_ADDR(*tx_pkts, vq);
                        start_dp[desc_idx].len = (*tx_pkts)->pkt_len;
                        tx_pkts++;
                        desc_idx++;
@@ -383,7 +384,7 @@ virtio_xmit_pkts_simple(void *tx_queue, struct rte_mbuf **tx_pkts,
                vq->vq_descx[desc_idx + i].cookie = tx_pkts[i];
        for (i = 0; i < nb_commit; i++) {
                start_dp[desc_idx].addr =
-                       MBUF_DATA_DMA_ADDR(*tx_pkts, vq->offset);
+                       VIRTIO_MBUF_DATA_DMA_ADDR(*tx_pkts, vq);
                start_dp[desc_idx].len = (*tx_pkts)->pkt_len;
                tx_pkts++;
                desc_idx++;
index 6b4f66e..daef09b 100644 (file)
@@ -331,7 +331,7 @@ virtio_user_pmd_devinit(const char *name, const char *params)
        int ret = -1;
 
        if (!params || params[0] == '\0') {
-               PMD_INIT_LOG(ERR, "arg %s is mandatory for virtio-user",
+               PMD_INIT_LOG(ERR, "arg %s is mandatory for virtio_user",
                          VIRTIO_USER_ARG_QUEUE_SIZE);
                goto end;
        }
@@ -351,7 +351,7 @@ virtio_user_pmd_devinit(const char *name, const char *params)
                        goto end;
                }
        } else {
-               PMD_INIT_LOG(ERR, "arg %s is mandatory for virtio-user\n",
+               PMD_INIT_LOG(ERR, "arg %s is mandatory for virtio_user\n",
                          VIRTIO_USER_ARG_QUEUE_SIZE);
                goto end;
        }
@@ -405,7 +405,7 @@ virtio_user_pmd_devinit(const char *name, const char *params)
 
        eth_dev = virtio_user_eth_dev_alloc(name);
        if (!eth_dev) {
-               PMD_INIT_LOG(ERR, "virtio-user fails to alloc device");
+               PMD_INIT_LOG(ERR, "virtio_user fails to alloc device");
                goto end;
        }
 
index 455aaaf..6737b81 100644 (file)
@@ -67,12 +67,21 @@ struct rte_mbuf;
 #define VIRTQUEUE_MAX_NAME_SZ 32
 
 #ifdef RTE_VIRTIO_USER
-#define MBUF_DATA_DMA_ADDR(mb, offset) \
-       ((uint64_t)((uintptr_t)(*(void **)((uintptr_t)mb + offset)) \
-                       + (mb)->data_off))
-#else /* RTE_VIRTIO_USER */
-#define MBUF_DATA_DMA_ADDR(mb, offset) rte_mbuf_data_dma_addr(mb)
-#endif /* RTE_VIRTIO_USER */
+/**
+ * Return the physical address (or virtual address in case of
+ * virtio-user) of mbuf data buffer.
+ */
+#define VIRTIO_MBUF_ADDR(mb, vq) (*(uint64_t *)((uintptr_t)(mb) + (vq)->offset))
+#else
+#define VIRTIO_MBUF_ADDR(mb, vq) ((mb)->buf_physaddr)
+#endif
+
+/**
+ * Return the physical address (or virtual address in case of
+ * virtio-user) of mbuf data buffer, taking care of mbuf data offset
+ */
+#define VIRTIO_MBUF_DATA_DMA_ADDR(mb, vq) \
+       (VIRTIO_MBUF_ADDR(mb, vq) + (mb)->data_off)
 
 #define VTNET_SQ_RQ_QUEUE_IDX 0
 #define VTNET_SQ_TQ_QUEUE_IDX 1
@@ -182,8 +191,8 @@ struct virtqueue {
        void *vq_ring_virt_mem;  /**< linear address of vring*/
        unsigned int vq_ring_size;
 
-       phys_addr_t vq_ring_mem; /**< physical address of vring */
-                               /**< use virtual address for virtio-user. */
+       phys_addr_t vq_ring_mem; /**< physical address of vring,
+                                 * or virtual address for virtio_user. */
 
        /**
         * Head of the free chain in the descriptor table. If
index 0adca98..8fe8157 100644 (file)
@@ -185,7 +185,7 @@ static const struct app_pktq_swq_params default_swq_params = {
 struct app_pktq_tm_params default_tm_params = {
        .parsed = 0,
        .file_name = "./config/tm_profile.cfg",
-       .burst_read = 64,
+       .burst_read = 24,
        .burst_write = 32,
 };
 
index bf12fd7..349db6b 100644 (file)
@@ -290,6 +290,7 @@ app_pipeline_fa_flow_config_bulk(struct app_params *app,
        void **req_entry_ptr;
        uint32_t *req_flow_id;
        uint32_t i;
+       int status;
 
        /* Check input arguments */
        if ((app == NULL) ||
@@ -368,6 +369,7 @@ app_pipeline_fa_flow_config_bulk(struct app_params *app,
        }
 
        /* Read response */
+       status = (rsp->n_flows == n_flows) ? 0 : -1;
 
        /* Commit flows */
        for (i = 0; i < rsp->n_flows; i++) {
@@ -408,7 +410,7 @@ app_pipeline_fa_flow_config_bulk(struct app_params *app,
        rte_free(req_flow_id);
        rte_free(req_entry_ptr);
 
-       return (rsp->n_flows == n_flows) ? 0 : -1;
+       return status;
 }
 
 int
index 8a762bc..026f00c 100644 (file)
@@ -221,7 +221,7 @@ pipeline_fc_parse_args(struct pipeline_flow_classification *p,
        uint32_t flow_id_offset_present = 0;
 
        uint32_t i;
-       char key_mask_str[PIPELINE_FC_FLOW_KEY_MAX_SIZE * 2];
+       char key_mask_str[PIPELINE_FC_FLOW_KEY_MAX_SIZE * 2 + 1];
 
        p->hash_offset = 0;
 
@@ -303,13 +303,13 @@ pipeline_fc_parse_args(struct pipeline_flow_classification *p,
                                params->name, arg_name);
                        key_mask_present = 1;
 
-                       PIPELINE_ARG_CHECK((mask_str_len <
+                       PIPELINE_ARG_CHECK((mask_str_len <=
                                (PIPELINE_FC_FLOW_KEY_MAX_SIZE * 2)),
                                "Parse error in section \"%s\": entry "
                                "\"%s\" is too long", params->name,
                                arg_name);
 
-                       snprintf(key_mask_str, sizeof(key_mask_str), "%s",
+                       snprintf(key_mask_str, mask_str_len + 1, "%s",
                                arg_value);
 
                        continue;
index 6146a28..356f02d 100644 (file)
@@ -366,7 +366,7 @@ pipeline_passthrough_parse_args(struct pipeline_passthrough_params *p,
        uint32_t dma_hash_offset_present = 0;
        uint32_t lb_present = 0;
        uint32_t i;
-       char dma_mask_str[PIPELINE_PASSTHROUGH_DMA_SIZE_MAX * 2];
+       char dma_mask_str[PIPELINE_PASSTHROUGH_DMA_SIZE_MAX * 2 + 1];
 
        /* default values */
        p->dma_enabled = 0;
@@ -454,7 +454,7 @@ pipeline_passthrough_parse_args(struct pipeline_passthrough_params *p,
                                params->name, arg_name);
                        dma_src_mask_present = 1;
 
-                       PIPELINE_ARG_CHECK((mask_str_len <
+                       PIPELINE_ARG_CHECK((mask_str_len <=
                                (PIPELINE_PASSTHROUGH_DMA_SIZE_MAX * 2)),
                                "Parse error in section \"%s\": entry "
                                "\"%s\" too long", params->name,
index ce25a2e..ff1dccd 100644 (file)
@@ -100,8 +100,8 @@ ipip_outbound(struct rte_mbuf *m, uint32_t offset, uint32_t is_ipv6,
        outip4->ip_ttl = IPDEFTTL;
        outip4->ip_p = IPPROTO_ESP;
 
-       outip4->ip_src.s_addr = src->ip4;
-       outip4->ip_dst.s_addr = dst->ip4;
+       outip4->ip_src.s_addr = src->ip.ip4;
+       outip4->ip_dst.s_addr = dst->ip.ip4;
 
        return outip4;
 }
index 1ca144b..5d04eb3 100644 (file)
@@ -1273,6 +1273,10 @@ cryptodevs_init(void)
                                                &qp_conf, dev_conf.socket_id))
                                rte_panic("Failed to setup queue %u for "
                                                "cdev_id %u\n", 0, cdev_id);
+
+               if (rte_cryptodev_start(cdev_id))
+                       rte_panic("Failed to start cryptodev %u\n",
+                                       cdev_id);
        }
 
        printf("\n");
index 0d2ee25..a442a74 100644 (file)
@@ -86,8 +86,8 @@ struct ip_addr {
                union {
                        uint64_t ip6[2];
                        uint8_t ip6_b[16];
-               };
-       };
+               } ip6;
+       } ip;
 };
 
 struct ipsec_sa {
index ab18b81..4439e0f 100644 (file)
@@ -53,8 +53,8 @@
 const struct ipsec_sa sa_out[] = {
        {
        .spi = 5,
-       .src.ip4 = IPv4(172, 16, 1, 5),
-       .dst.ip4 = IPv4(172, 16, 2, 5),
+       .src.ip.ip4 = IPv4(172, 16, 1, 5),
+       .dst.ip.ip4 = IPv4(172, 16, 2, 5),
        .cipher_algo = RTE_CRYPTO_CIPHER_AES_CBC,
        .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
        .digest_len = 12,
@@ -64,8 +64,8 @@ const struct ipsec_sa sa_out[] = {
        },
        {
        .spi = 6,
-       .src.ip4 = IPv4(172, 16, 1, 6),
-       .dst.ip4 = IPv4(172, 16, 2, 6),
+       .src.ip.ip4 = IPv4(172, 16, 1, 6),
+       .dst.ip.ip4 = IPv4(172, 16, 2, 6),
        .cipher_algo = RTE_CRYPTO_CIPHER_AES_CBC,
        .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
        .digest_len = 12,
@@ -93,8 +93,8 @@ const struct ipsec_sa sa_out[] = {
        },
        {
        .spi = 15,
-       .src.ip4 = IPv4(172, 16, 1, 5),
-       .dst.ip4 = IPv4(172, 16, 2, 5),
+       .src.ip.ip4 = IPv4(172, 16, 1, 5),
+       .dst.ip.ip4 = IPv4(172, 16, 2, 5),
        .cipher_algo = RTE_CRYPTO_CIPHER_NULL,
        .auth_algo = RTE_CRYPTO_AUTH_NULL,
        .digest_len = 0,
@@ -104,8 +104,8 @@ const struct ipsec_sa sa_out[] = {
        },
        {
        .spi = 16,
-       .src.ip4 = IPv4(172, 16, 1, 6),
-       .dst.ip4 = IPv4(172, 16, 2, 6),
+       .src.ip.ip4 = IPv4(172, 16, 1, 6),
+       .dst.ip.ip4 = IPv4(172, 16, 2, 6),
        .cipher_algo = RTE_CRYPTO_CIPHER_NULL,
        .auth_algo = RTE_CRYPTO_AUTH_NULL,
        .digest_len = 0,
@@ -115,9 +115,9 @@ const struct ipsec_sa sa_out[] = {
        },
        {
        .spi = 25,
-       .src.ip6_b = { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+       .src.ip.ip6.ip6_b = { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
                0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x55, 0x55 },
-       .dst.ip6_b = { 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
+       .dst.ip.ip6.ip6_b = { 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
                0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x55, 0x55 },
        .cipher_algo = RTE_CRYPTO_CIPHER_AES_CBC,
        .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
@@ -128,9 +128,9 @@ const struct ipsec_sa sa_out[] = {
        },
        {
        .spi = 26,
-       .src.ip6_b = { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+       .src.ip.ip6.ip6_b = { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
                0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x66, 0x66 },
-       .dst.ip6_b = { 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
+       .dst.ip.ip6.ip6_b = { 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
                0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x66, 0x66 },
        .cipher_algo = RTE_CRYPTO_CIPHER_AES_CBC,
        .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
@@ -145,8 +145,8 @@ const struct ipsec_sa sa_out[] = {
 const struct ipsec_sa sa_in[] = {
        {
        .spi = 105,
-       .src.ip4 = IPv4(172, 16, 2, 5),
-       .dst.ip4 = IPv4(172, 16, 1, 5),
+       .src.ip.ip4 = IPv4(172, 16, 2, 5),
+       .dst.ip.ip4 = IPv4(172, 16, 1, 5),
        .cipher_algo = RTE_CRYPTO_CIPHER_AES_CBC,
        .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
        .digest_len = 12,
@@ -156,8 +156,8 @@ const struct ipsec_sa sa_in[] = {
        },
        {
        .spi = 106,
-       .src.ip4 = IPv4(172, 16, 2, 6),
-       .dst.ip4 = IPv4(172, 16, 1, 6),
+       .src.ip.ip4 = IPv4(172, 16, 2, 6),
+       .dst.ip.ip4 = IPv4(172, 16, 1, 6),
        .cipher_algo = RTE_CRYPTO_CIPHER_AES_CBC,
        .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
        .digest_len = 12,
@@ -185,8 +185,8 @@ const struct ipsec_sa sa_in[] = {
        },
        {
        .spi = 115,
-       .src.ip4 = IPv4(172, 16, 2, 5),
-       .dst.ip4 = IPv4(172, 16, 1, 5),
+       .src.ip.ip4 = IPv4(172, 16, 2, 5),
+       .dst.ip.ip4 = IPv4(172, 16, 1, 5),
        .cipher_algo = RTE_CRYPTO_CIPHER_NULL,
        .auth_algo = RTE_CRYPTO_AUTH_NULL,
        .digest_len = 0,
@@ -196,8 +196,8 @@ const struct ipsec_sa sa_in[] = {
        },
        {
        .spi = 116,
-       .src.ip4 = IPv4(172, 16, 2, 6),
-       .dst.ip4 = IPv4(172, 16, 1, 6),
+       .src.ip.ip4 = IPv4(172, 16, 2, 6),
+       .dst.ip.ip4 = IPv4(172, 16, 1, 6),
        .cipher_algo = RTE_CRYPTO_CIPHER_NULL,
        .auth_algo = RTE_CRYPTO_AUTH_NULL,
        .digest_len = 0,
@@ -207,9 +207,9 @@ const struct ipsec_sa sa_in[] = {
        },
        {
        .spi = 125,
-       .src.ip6_b = { 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
+       .src.ip.ip6.ip6_b = { 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
                0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x55, 0x55 },
-       .dst.ip6_b = { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+       .dst.ip.ip6.ip6_b = { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
                0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x55, 0x55 },
        .cipher_algo = RTE_CRYPTO_CIPHER_AES_CBC,
        .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
@@ -220,9 +220,9 @@ const struct ipsec_sa sa_in[] = {
        },
        {
        .spi = 126,
-       .src.ip6_b = { 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
+       .src.ip.ip6.ip6_b = { 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
                0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x66, 0x66 },
-       .dst.ip6_b = { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+       .dst.ip.ip6.ip6_b = { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
                0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x66, 0x66 },
        .cipher_algo = RTE_CRYPTO_CIPHER_AES_CBC,
        .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
@@ -342,8 +342,8 @@ sa_add_rules(struct sa_ctx *sa_ctx, const struct ipsec_sa entries[],
 
                switch (sa->flags) {
                case IP4_TUNNEL:
-                       sa->src.ip4 = rte_cpu_to_be_32(sa->src.ip4);
-                       sa->dst.ip4 = rte_cpu_to_be_32(sa->dst.ip4);
+                       sa->src.ip.ip4 = rte_cpu_to_be_32(sa->src.ip.ip4);
+                       sa->dst.ip.ip4 = rte_cpu_to_be_32(sa->dst.ip.ip4);
                }
 
                if (inbound) {
@@ -473,15 +473,15 @@ single_inbound_lookup(struct ipsec_sa *sadb, struct rte_mbuf *pkt,
        case IP4_TUNNEL:
                src4_addr = RTE_PTR_ADD(ip, offsetof(struct ip, ip_src));
                if ((ip->ip_v == IPVERSION) &&
-                               (sa->src.ip4 == *src4_addr) &&
-                               (sa->dst.ip4 == *(src4_addr + 1)))
+                               (sa->src.ip.ip4 == *src4_addr) &&
+                               (sa->dst.ip.ip4 == *(src4_addr + 1)))
                        *sa_ret = sa;
                break;
        case IP6_TUNNEL:
                src6_addr = RTE_PTR_ADD(ip, offsetof(struct ip6_hdr, ip6_src));
                if ((ip->ip_v == IP6_VERSION) &&
-                               !memcmp(&sa->src.ip6, src6_addr, 16) &&
-                               !memcmp(&sa->dst.ip6, src6_addr + 16, 16))
+                               !memcmp(&sa->src.ip.ip6.ip6, src6_addr, 16) &&
+                               !memcmp(&sa->dst.ip.ip6.ip6, src6_addr + 16, 16))
                        *sa_ret = sa;
                break;
        case TRANSPORT:
index dd39cc1..66397a0 100644 (file)
@@ -1796,6 +1796,13 @@ initialize_cryptodevs(struct l2fwd_crypto_options *options, unsigned nb_ports,
                        return -1;
                }
 
+               retval = rte_cryptodev_start(cdev_id);
+               if (retval < 0) {
+                       printf("Failed to start device %u: error %d\n",
+                                       cdev_id, retval);
+                       return -1;
+               }
+
                l2fwd_enabled_crypto_mask |= (1 << cdev_id);
 
                enabled_cdevs[cdev_id] = 1;
index cd284b7..da7b00d 100644 (file)
@@ -110,7 +110,8 @@ static void
 print_stats(void)
 {
        uint64_t total_packets_dropped, total_packets_tx, total_packets_rx;
-       uint64_t total_vm_packets_dropped, total_vm_packets_tx, total_vm_packets_rx;
+       uint64_t total_vm_packets_dropped = 0;
+       uint64_t total_vm_packets_tx, total_vm_packets_rx;
        unsigned portid;
 
        total_packets_dropped = 0;
index 93c3216..0d6100c 100644 (file)
@@ -417,9 +417,10 @@ int pthread_detach(pthread_t tid)
        if (override) {
                struct lthread *lt = (struct lthread *)tid;
 
-               if (lt == lthread_current())
+               if (lt == lthread_current()) {
                        lthread_detach();
                        return 0;
+               }
                NOT_IMPLEMENTED;
        }
        return _sys_pthread_funcs.f_pthread_detach(tid);
index 3b98f42..92a9823 100644 (file)
@@ -327,6 +327,8 @@ port_init(uint8_t port)
        if (enable_tso == 0) {
                rte_vhost_feature_disable(1ULL << VIRTIO_NET_F_HOST_TSO4);
                rte_vhost_feature_disable(1ULL << VIRTIO_NET_F_HOST_TSO6);
+               rte_vhost_feature_disable(1ULL << VIRTIO_NET_F_GUEST_TSO4);
+               rte_vhost_feature_disable(1ULL << VIRTIO_NET_F_GUEST_TSO6);
        }
 
        rx_rings = (uint16_t)dev_info.max_rx_queues;
index 20e5beb..fc4123b 100644 (file)
@@ -148,8 +148,8 @@ int
 rte_cryptodev_parse_vdev_init_params(struct rte_crypto_vdev_init_params *params,
                const char *input_args)
 {
-       struct rte_kvargs *kvlist;
-       int ret;
+       struct rte_kvargs *kvlist = NULL;
+       int ret = 0;
 
        if (params == NULL)
                return -EINVAL;
@@ -187,8 +187,6 @@ rte_cryptodev_parse_vdev_init_params(struct rte_crypto_vdev_init_params *params,
                }
        }
 
-       return 0;
-
 free_kvlist:
        rte_kvargs_free(kvlist);
        return ret;
index 5d28341..1bd0a33 100644 (file)
@@ -144,16 +144,16 @@ memzone_reserve_aligned_thread_unsafe(const char *name, size_t len,
                return NULL;
        }
 
-       /* zone already exist */
-       if ((memzone_lookup_thread_unsafe(name)) != NULL) {
-               RTE_LOG(DEBUG, EAL, "%s(): memzone <%s> already exists\n",
+       if (strlen(name) > sizeof(mz->name) - 1) {
+               RTE_LOG(DEBUG, EAL, "%s(): memzone <%s>: name too long\n",
                        __func__, name);
-               rte_errno = EEXIST;
+               rte_errno = ENAMETOOLONG;
                return NULL;
        }
 
-       if (strlen(name) >= sizeof(mz->name) - 1) {
-               RTE_LOG(DEBUG, EAL, "%s(): memzone <%s>: name too long\n",
+       /* zone already exist */
+       if ((memzone_lookup_thread_unsafe(name)) != NULL) {
+               RTE_LOG(DEBUG, EAL, "%s(): memzone <%s> already exists\n",
                        __func__, name);
                rte_errno = EEXIST;
                return NULL;
index 0a594d7..481c732 100644 (file)
@@ -116,9 +116,9 @@ TAILQ_HEAD_INITIALIZER(solib_list);
 static const char *default_solib_dir = RTE_EAL_PMD_PATH;
 
 /*
- * Stringified version of solib path used by pmdinfo.py
+ * Stringified version of solib path used by dpdk-pmdinfo.py
  * Note: PLEASE DO NOT ALTER THIS without making a corresponding
- * change to tools/pmdinfo.py
+ * change to tools/dpdk-pmdinfo.py
  */
 static const char dpdk_solib_path[] __attribute__((used)) =
 "DPDK_PLUGIN_PATH=" RTE_EAL_PMD_PATH;
index feae486..924e894 100644 (file)
@@ -62,7 +62,11 @@ extern "C" {
  * Guarantees that the STORE operations generated before the barrier
  * occur before the STORE operations generated after.
  */
+#ifdef RTE_ARCH_64
+#define        rte_wmb() {asm volatile("lwsync" : : : "memory"); }
+#else
 #define        rte_wmb() {asm volatile("sync" : : : "memory"); }
+#endif
 
 /**
  * Read memory barrier.
@@ -70,13 +74,17 @@ extern "C" {
  * Guarantees that the LOAD operations generated before the barrier
  * occur before the LOAD operations generated after.
  */
+#ifdef RTE_ARCH_64
+#define        rte_rmb() {asm volatile("lwsync" : : : "memory"); }
+#else
 #define        rte_rmb() {asm volatile("sync" : : : "memory"); }
+#endif
 
 #define rte_smp_mb() rte_mb()
 
-#define rte_smp_wmb() rte_compiler_barrier()
+#define rte_smp_wmb() rte_wmb()
 
-#define rte_smp_rmb() rte_compiler_barrier()
+#define rte_smp_rmb() rte_rmb()
 
 /*------------------------- 16 bit atomic operations -------------------------*/
 /* To be compatible with Power7, use GCC built-in functions for 16 bit
index 4a686e6..cc3c0f1 100644 (file)
@@ -155,6 +155,14 @@ void __attribute__((constructor, used)) tailqinitfn_ ##t(void) \
                rte_panic("Cannot initialize tailq: %s\n", t.name); \
 }
 
+/* This macro permits both remove and free var within the loop safely.*/
+#ifndef TAILQ_FOREACH_SAFE
+#define TAILQ_FOREACH_SAFE(var, head, field, tvar)             \
+       for ((var) = TAILQ_FIRST((head));                       \
+           (var) && ((tvar) = TAILQ_NEXT((var), field), 1);    \
+           (var) = (tvar))
+#endif
+
 #ifdef __cplusplus
 }
 #endif
index eacc86c..bbffecf 100644 (file)
@@ -77,7 +77,7 @@ extern "C" {
  *   0-15 = release candidates
  *   16   = release
  */
-#define RTE_VER_RELEASE 3
+#define RTE_VER_RELEASE 4
 
 /**
  * Macro to compute a version number usable for comparisons
index 42a29fa..41e0a92 100644 (file)
@@ -99,6 +99,8 @@
 #include "eal_filesystem.h"
 #include "eal_hugepages.h"
 
+#define PFN_MASK_SIZE  8
+
 #ifdef RTE_LIBRTE_XEN_DOM0
 int rte_xen_dom0_supported(void)
 {
@@ -158,7 +160,7 @@ rte_mem_lock_page(const void *virt)
 phys_addr_t
 rte_mem_virt2phy(const void *virtaddr)
 {
-       int fd;
+       int fd, retval;
        uint64_t page, physaddr;
        unsigned long virt_pfn;
        int page_size;
@@ -209,10 +211,17 @@ rte_mem_virt2phy(const void *virtaddr)
                close(fd);
                return RTE_BAD_PHYS_ADDR;
        }
-       if (read(fd, &page, sizeof(uint64_t)) < 0) {
+
+       retval = read(fd, &page, PFN_MASK_SIZE);
+       close(fd);
+       if (retval < 0) {
                RTE_LOG(ERR, EAL, "%s(): cannot read /proc/self/pagemap: %s\n",
                                __func__, strerror(errno));
-               close(fd);
+               return RTE_BAD_PHYS_ADDR;
+       } else if (retval != PFN_MASK_SIZE) {
+               RTE_LOG(ERR, EAL, "%s(): read %d bytes from /proc/self/pagemap "
+                               "but expected %d:\n",
+                               __func__, retval, PFN_MASK_SIZE);
                return RTE_BAD_PHYS_ADDR;
        }
 
@@ -222,7 +231,7 @@ rte_mem_virt2phy(const void *virtaddr)
         */
        physaddr = ((page & 0x7fffffffffffffULL) * page_size)
                + ((unsigned long)virtaddr % page_size);
-       close(fd);
+
        return physaddr;
 }
 
index 0a6e3f1..f62a9ec 100644 (file)
@@ -1490,8 +1490,8 @@ rte_eth_stats_get(uint8_t port_id, struct rte_eth_stats *stats)
        memset(stats, 0, sizeof(*stats));
 
        RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->stats_get, -ENOTSUP);
-       (*dev->dev_ops->stats_get)(dev, stats);
        stats->rx_nombuf = dev->data->rx_mbuf_alloc_failed;
+       (*dev->dev_ops->stats_get)(dev, stats);
        return 0;
 }
 
index 4a8fbb1..059ad9e 100644 (file)
@@ -123,7 +123,9 @@ struct rte_mempool_objsz {
        /**< Total size of an object (header + elt + trailer). */
 };
 
-#define RTE_MEMPOOL_NAMESIZE 32 /**< Maximum length of a memory pool. */
+/**< Maximum length of a memory pool's name. */
+#define RTE_MEMPOOL_NAMESIZE (RTE_RING_NAMESIZE - \
+                             sizeof(RTE_MEMPOOL_MZ_PREFIX) + 1)
 #define RTE_MEMPOOL_MZ_PREFIX "MP_"
 
 /* "MP_<name>" */
@@ -208,7 +210,12 @@ struct rte_mempool_memhdr {
  * The RTE mempool structure.
  */
 struct rte_mempool {
-       char name[RTE_MEMPOOL_NAMESIZE]; /**< Name of mempool. */
+       /*
+        * Note: this field kept the RTE_MEMZONE_NAMESIZE size due to ABI
+        * compatibility requirements, it could be changed to
+        * RTE_MEMPOOL_NAMESIZE next time the ABI changes
+        */
+       char name[RTE_MEMZONE_NAMESIZE]; /**< Name of mempool. */
        union {
                void *pool_data;         /**< Ring or pool to store objects. */
                uint64_t pool_id;        /**< External mempool identifier. */
index fd0b64c..5f24de2 100644 (file)
@@ -81,6 +81,7 @@ rte_mempool_register_ops(const struct rte_mempool_ops *h)
        ops = &rte_mempool_ops_table.ops[ops_index];
        snprintf(ops->name, sizeof(ops->name), "%s", h->name);
        ops->alloc = h->alloc;
+       ops->free = h->free;
        ops->enqueue = h->enqueue;
        ops->dequeue = h->dequeue;
        ops->get_count = h->get_count;
index eb45e41..f928324 100644 (file)
@@ -100,6 +100,7 @@ extern "C" {
 #include <rte_lcore.h>
 #include <rte_atomic.h>
 #include <rte_branch_prediction.h>
+#include <rte_memzone.h>
 
 #define RTE_TAILQ_RING_NAME "RTE_RING"
 
@@ -126,8 +127,10 @@ struct rte_ring_debug_stats {
 } __rte_cache_aligned;
 #endif
 
-#define RTE_RING_NAMESIZE 32 /**< The maximum length of a ring name. */
 #define RTE_RING_MZ_PREFIX "RG_"
+/**< The maximum length of a ring name. */
+#define RTE_RING_NAMESIZE (RTE_MEMZONE_NAMESIZE - \
+                          sizeof(RTE_RING_MZ_PREFIX) + 1)
 
 #ifndef RTE_RING_PAUSE_REP_COUNT
 #define RTE_RING_PAUSE_REP_COUNT 0 /**< Yield after pause num of times, no yield
@@ -147,7 +150,12 @@ struct rte_memzone; /* forward declaration, so as not to require memzone.h */
  * a problem.
  */
 struct rte_ring {
-       char name[RTE_RING_NAMESIZE];    /**< Name of the ring. */
+       /*
+        * Note: this field kept the RTE_MEMZONE_NAMESIZE size due to ABI
+        * compatibility requirements, it could be changed to RTE_RING_NAMESIZE
+        * next time the ABI changes
+        */
+       char name[RTE_MEMZONE_NAMESIZE];    /**< Name of the ring. */
        int flags;                       /**< Flags supplied at creation. */
        const struct rte_memzone *memzone;
                        /**< Memzone, if any, containing the rte_ring */
@@ -748,7 +756,7 @@ __rte_ring_sc_do_dequeue(struct rte_ring *r, void **obj_table,
 
        /* copy in table */
        DEQUEUE_PTRS();
-       rte_smp_rmb();
+       rte_smp_wmb();
 
        __RING_STAT_ADD(r, deq_success, n);
        r->cons.tail = cons_next;
index c691339..2d3eeb7 100644 (file)
@@ -132,8 +132,10 @@ fdset_init(struct fdset *pfdset)
        if (pfdset == NULL)
                return;
 
-       for (i = 0; i < MAX_FDS; i++)
+       for (i = 0; i < MAX_FDS; i++) {
                pfdset->fd[i].fd = -1;
+               pfdset->fd[i].dat = NULL;
+       }
        pfdset->num = 0;
 }
 
@@ -166,14 +168,16 @@ fdset_add(struct fdset *pfdset, int fd, fd_cb rcb, fd_cb wcb, void *dat)
 
 /**
  *  Unregister the fd from the fdset.
+ *  Returns context of a given fd or NULL.
  */
-void
+void *
 fdset_del(struct fdset *pfdset, int fd)
 {
        int i;
+       void *dat = NULL;
 
        if (pfdset == NULL || fd == -1)
-               return;
+               return NULL;
 
        do {
                pthread_mutex_lock(&pfdset->fd_mutex);
@@ -181,13 +185,17 @@ fdset_del(struct fdset *pfdset, int fd)
                i = fdset_find_fd(pfdset, fd);
                if (i != -1 && pfdset->fd[i].busy == 0) {
                        /* busy indicates r/wcb is executing! */
+                       dat = pfdset->fd[i].dat;
                        pfdset->fd[i].fd = -1;
                        pfdset->fd[i].rcb = pfdset->fd[i].wcb = NULL;
+                       pfdset->fd[i].dat = NULL;
                        pfdset->num--;
                        i = -1;
                }
                pthread_mutex_unlock(&pfdset->fd_mutex);
        } while (i != -1);
+
+       return dat;
 }
 
 /**
@@ -203,6 +211,7 @@ fdset_del_slot(struct fdset *pfdset, int index)
 
        pfdset->fd[index].fd = -1;
        pfdset->fd[index].rcb = pfdset->fd[index].wcb = NULL;
+       pfdset->fd[index].dat = NULL;
        pfdset->num--;
 
        pthread_mutex_unlock(&pfdset->fd_mutex);
index 74ecde2..bd66ed1 100644 (file)
@@ -60,7 +60,7 @@ void fdset_init(struct fdset *pfdset);
 int fdset_add(struct fdset *pfdset, int fd,
        fd_cb rcb, fd_cb wcb, void *dat);
 
-void fdset_del(struct fdset *pfdset, int fd);
+void *fdset_del(struct fdset *pfdset, int fd);
 
 void fdset_event_dispatch(struct fdset *pfdset);
 
index f0ea3a2..b35594d 100644 (file)
@@ -43,6 +43,7 @@
 #include <sys/un.h>
 #include <sys/queue.h>
 #include <errno.h>
+#include <fcntl.h>
 #include <pthread.h>
 
 #include <rte_log.h>
@@ -60,6 +61,7 @@
 struct vhost_user_socket {
        char *path;
        int listenfd;
+       int connfd;
        bool is_server;
        bool reconnect;
 };
@@ -277,11 +279,13 @@ vhost_user_add_connection(int fd, struct vhost_user_socket *vsocket)
 
        RTE_LOG(INFO, VHOST_CONFIG, "new device, handle is %d\n", vid);
 
+       vsocket->connfd = fd;
        conn->vsocket = vsocket;
        conn->vid = vid;
        ret = fdset_add(&vhost_user.fdset, fd, vhost_user_msg_handler,
                        NULL, conn);
        if (ret < 0) {
+               vsocket->connfd = -1;
                free(conn);
                close(fd);
                RTE_LOG(ERR, VHOST_CONFIG,
@@ -329,6 +333,7 @@ vhost_user_msg_handler(int connfd, void *dat, int *remove)
                        RTE_LOG(ERR, VHOST_CONFIG,
                                "vhost read incorrect message\n");
 
+               vsocket->connfd = -1;
                close(connfd);
                *remove = 1;
                free(conn);
@@ -445,6 +450,14 @@ create_unix_socket(const char *path, struct sockaddr_un *un, bool is_server)
        RTE_LOG(INFO, VHOST_CONFIG, "vhost-user %s: socket created, fd: %d\n",
                is_server ? "server" : "client", fd);
 
+       if (!is_server && fcntl(fd, F_SETFL, O_NONBLOCK)) {
+               RTE_LOG(ERR, VHOST_CONFIG,
+                       "vhost-user: can't set nonblocking mode for socket, fd: "
+                       "%d (%s)\n", fd, strerror(errno));
+               close(fd);
+               return -1;
+       }
+
        memset(un, 0, sizeof(*un));
        un->sun_family = AF_UNIX;
        strncpy(un->sun_path, path, sizeof(un->sun_path));
@@ -512,9 +525,33 @@ struct vhost_user_reconnect_list {
 static struct vhost_user_reconnect_list reconn_list;
 static pthread_t reconn_tid;
 
+static int
+vhost_user_connect_nonblock(int fd, struct sockaddr *un, size_t sz)
+{
+       int ret, flags;
+
+       ret = connect(fd, un, sz);
+       if (ret < 0 && errno != EISCONN)
+               return -1;
+
+       flags = fcntl(fd, F_GETFL, 0);
+       if (flags < 0) {
+               RTE_LOG(ERR, VHOST_CONFIG,
+                       "can't get flags for connfd %d\n", fd);
+               return -2;
+       }
+       if ((flags & O_NONBLOCK) && fcntl(fd, F_SETFL, flags & ~O_NONBLOCK)) {
+               RTE_LOG(ERR, VHOST_CONFIG,
+                               "can't disable nonblocking on fd %d\n", fd);
+               return -2;
+       }
+       return 0;
+}
+
 static void *
 vhost_user_client_reconnect(void *arg __rte_unused)
 {
+       int ret;
        struct vhost_user_reconnect *reconn, *next;
 
        while (1) {
@@ -528,13 +565,23 @@ vhost_user_client_reconnect(void *arg __rte_unused)
                     reconn != NULL; reconn = next) {
                        next = TAILQ_NEXT(reconn, next);
 
-                       if (connect(reconn->fd, (struct sockaddr *)&reconn->un,
-                                   sizeof(reconn->un)) < 0)
+                       ret = vhost_user_connect_nonblock(reconn->fd,
+                                               (struct sockaddr *)&reconn->un,
+                                               sizeof(reconn->un));
+                       if (ret == -2) {
+                               close(reconn->fd);
+                               RTE_LOG(ERR, VHOST_CONFIG,
+                                       "reconnection for fd %d failed\n",
+                                       reconn->fd);
+                               goto remove_fd;
+                       }
+                       if (ret == -1)
                                continue;
 
                        RTE_LOG(INFO, VHOST_CONFIG,
                                "%s: connected\n", reconn->vsocket->path);
                        vhost_user_add_connection(reconn->fd, reconn->vsocket);
+remove_fd:
                        TAILQ_REMOVE(&reconn_list.head, reconn, next);
                        free(reconn);
                }
@@ -575,7 +622,8 @@ vhost_user_create_client(struct vhost_user_socket *vsocket)
        if (fd < 0)
                return -1;
 
-       ret = connect(fd, (struct sockaddr *)&un, sizeof(un));
+       ret = vhost_user_connect_nonblock(fd, (struct sockaddr *)&un,
+                                         sizeof(un));
        if (ret == 0) {
                vhost_user_add_connection(fd, vsocket);
                return 0;
@@ -585,7 +633,7 @@ vhost_user_create_client(struct vhost_user_socket *vsocket)
                "failed to connect to %s: %s\n",
                path, strerror(errno));
 
-       if (!vsocket->reconnect) {
+       if (ret == -2 || !vsocket->reconnect) {
                close(fd);
                return -1;
        }
@@ -635,6 +683,7 @@ rte_vhost_driver_register(const char *path, uint64_t flags)
                goto out;
        memset(vsocket, 0, sizeof(struct vhost_user_socket));
        vsocket->path = strdup(path);
+       vsocket->connfd = -1;
 
        if ((flags & RTE_VHOST_USER_CLIENT) != 0) {
                vsocket->reconnect = !(flags & RTE_VHOST_USER_NO_RECONNECT);
@@ -664,6 +713,30 @@ out:
        return ret;
 }
 
+static bool
+vhost_user_remove_reconnect(struct vhost_user_socket *vsocket)
+{
+       int found = false;
+       struct vhost_user_reconnect *reconn, *next;
+
+       pthread_mutex_lock(&reconn_list.mutex);
+
+       for (reconn = TAILQ_FIRST(&reconn_list.head);
+            reconn != NULL; reconn = next) {
+               next = TAILQ_NEXT(reconn, next);
+
+               if (reconn->vsocket == vsocket) {
+                       TAILQ_REMOVE(&reconn_list.head, reconn, next);
+                       close(reconn->fd);
+                       free(reconn);
+                       found = true;
+                       break;
+               }
+       }
+       pthread_mutex_unlock(&reconn_list.mutex);
+       return found;
+}
+
 /**
  * Unregister the specified vhost socket
  */
@@ -672,20 +745,34 @@ rte_vhost_driver_unregister(const char *path)
 {
        int i;
        int count;
+       struct vhost_user_connection *conn;
 
        pthread_mutex_lock(&vhost_user.mutex);
 
        for (i = 0; i < vhost_user.vsocket_cnt; i++) {
-               if (!strcmp(vhost_user.vsockets[i]->path, path)) {
-                       if (vhost_user.vsockets[i]->is_server) {
-                               fdset_del(&vhost_user.fdset,
-                                       vhost_user.vsockets[i]->listenfd);
-                               close(vhost_user.vsockets[i]->listenfd);
+               struct vhost_user_socket *vsocket = vhost_user.vsockets[i];
+
+               if (!strcmp(vsocket->path, path)) {
+                       if (vsocket->is_server) {
+                               fdset_del(&vhost_user.fdset, vsocket->listenfd);
+                               close(vsocket->listenfd);
                                unlink(path);
+                       } else if (vsocket->reconnect) {
+                               vhost_user_remove_reconnect(vsocket);
+                       }
+
+                       conn = fdset_del(&vhost_user.fdset, vsocket->connfd);
+                       if (conn) {
+                               RTE_LOG(INFO, VHOST_CONFIG,
+                                       "free connfd = %d for device '%s'\n",
+                                       vsocket->connfd, path);
+                               close(vsocket->connfd);
+                               vhost_destroy_device(conn->vid);
+                               free(conn);
                        }
 
-                       free(vhost_user.vsockets[i]->path);
-                       free(vhost_user.vsockets[i]);
+                       free(vsocket->path);
+                       free(vsocket);
 
                        count = --vhost_user.vsocket_cnt;
                        vhost_user.vsockets[i] = vhost_user.vsockets[count];
index 9c25ff6..f740179 100644 (file)
@@ -84,7 +84,7 @@ C_TO_O = $(CC) -Wp,-MD,$(call obj2dep,$(@)).tmp $(CFLAGS) \
 C_TO_O_STR = $(subst ','\'',$(C_TO_O)) #'# fix syntax highlight
 C_TO_O_DISP = $(if $(V),"$(C_TO_O_STR)","  CC $(@)")
 endif
-PMDINFO_GEN = $(RTE_SDK_BIN)/app/pmdinfogen $@ $@.pmd.c
+PMDINFO_GEN = $(RTE_SDK_BIN)/app/dpdk-pmdinfogen $@ $@.pmd.c
 PMDINFO_CC = $(CC) $(CFLAGS) -c -o $@.pmd.o $@.pmd.c
 PMDINFO_LD = $(CROSS)ld $(LDFLAGS) -r -o $@.o $@.pmd.o $@
 PMDINFO_TO_O = if grep -q 'PMD_REGISTER_DRIVER(.*)' $<; then \
index 886dbdd..eb28e11 100644 (file)
@@ -151,6 +151,7 @@ _LDLIBS-y += --no-whole-archive
 ifeq ($(CONFIG_RTE_BUILD_SHARED_LIB),n)
 # The static libraries do not know their dependencies.
 # So linking with static library requires explicit dependencies.
+_LDLIBS-$(CONFIG_RTE_LIBRTE_EAL)            += -lrt
 _LDLIBS-$(CONFIG_RTE_LIBRTE_SCHED)          += -lm
 _LDLIBS-$(CONFIG_RTE_LIBRTE_SCHED)          += -lrt
 _LDLIBS-$(CONFIG_RTE_LIBRTE_METER)          += -lm
index e93237f..5c94edf 100644 (file)
@@ -88,11 +88,13 @@ $(RTE_OUTPUT)/.config: $(RTE_CONFIG_TEMPLATE) FORCE | $(RTE_OUTPUT)
                $(CPP) -undef -P -x assembler-with-cpp \
                -ffreestanding \
                -o $(RTE_OUTPUT)/.config_tmp $(RTE_CONFIG_TEMPLATE) ; \
-               for config in $$(grep -v "^#" $(RTE_OUTPUT)/.config_tmp | cut -d"=" -f1 | sort | uniq -d); do \
-                       while [ $$(grep "^$${config}=" $(RTE_OUTPUT)/.config_tmp -c ) -gt 1 ]; do \
-                               sed -i "0,/^$${config}=/{//d}" $(RTE_OUTPUT)/.config_tmp; \
-                       done; \
-               done; \
+               config=$$(cat $(RTE_OUTPUT)/.config_tmp) ; \
+               echo "$$config" | awk -F '=' 'BEGIN {i=1} \
+                       /^#/ {pos[i++]=$$0} \
+                       !/^#/ {if (!s[$$1]) {pos[i]=$$0; s[$$1]=i++} \
+                               else {pos[s[$$1]]=$$0}} END \
+                       {for (j=1; j<i; j++) print pos[j]}' \
+                       > $(RTE_OUTPUT)/.config_tmp ; \
                if ! cmp -s $(RTE_OUTPUT)/.config_tmp $(RTE_OUTPUT)/.config; then \
                        cp $(RTE_OUTPUT)/.config_tmp $(RTE_OUTPUT)/.config ; \
                        cp $(RTE_OUTPUT)/.config_tmp $(RTE_OUTPUT)/.config.orig ; \
index 7cd352c..5217063 100644 (file)
@@ -117,18 +117,22 @@ install-runtime:
        $(Q)cp -a    $O/lib/* $(DESTDIR)$(libdir)
        $(Q)$(call rte_mkdir, $(DESTDIR)$(bindir))
        $(Q)tar -cf -      -C $O --exclude 'app/*.map' \
-               --exclude app/pmdinfogen \
+               --exclude app/dpdk-pmdinfogen \
                --exclude 'app/cmdline*' --exclude app/test \
                --exclude app/testacl --exclude app/testpipeline app | \
            tar -xf -      -C $(DESTDIR)$(bindir) --strip-components=1 \
                --keep-newer-files --warning=no-ignore-newer
        $(Q)$(call rte_mkdir,      $(DESTDIR)$(datadir))
        $(Q)cp -a $(RTE_SDK)/tools $(DESTDIR)$(datadir)
+       $(Q)$(call rte_symlink,    $(DESTDIR)$(datadir)/tools/dpdk-setup.sh, \
+                                  $(DESTDIR)$(datadir)/tools/setup.sh)
+       $(Q)$(call rte_symlink,    $(DESTDIR)$(datadir)/tools/dpdk-devbind.py, \
+                                  $(DESTDIR)$(datadir)/tools/dpdk_nic_bind.py)
        $(Q)$(call rte_mkdir,      $(DESTDIR)$(sbindir))
-       $(Q)$(call rte_symlink,    $(DESTDIR)$(datadir)/tools/dpdk_nic_bind.py, \
-                                  $(DESTDIR)$(sbindir)/dpdk_nic_bind)
-       $(Q)$(call rte_symlink,    $(DESTDIR)$(datadir)/tools/pmdinfo.py, \
-                                  $(DESTDIR)$(bindir)/dpdk_pmdinfo)
+       $(Q)$(call rte_symlink,    $(DESTDIR)$(datadir)/tools/dpdk-devbind.py, \
+                                  $(DESTDIR)$(sbindir)/dpdk-devbind)
+       $(Q)$(call rte_symlink,    $(DESTDIR)$(datadir)/tools/dpdk-pmdinfo.py, \
+                                  $(DESTDIR)$(bindir)/dpdk-pmdinfo)
 
 install-kmod:
 ifneq ($(wildcard $O/kmod/*),)
@@ -146,7 +150,7 @@ install-sdk:
        $(Q)cp -a               $(RTE_SDK)/scripts       $(DESTDIR)$(sdkdir)
        $(Q)$(call rte_mkdir,                            $(DESTDIR)$(targetdir)/app)
        $(Q)cp -a               $O/.config               $(DESTDIR)$(targetdir)
-       $(Q)cp -a               $O/app/pmdinfogen        $(DESTDIR)$(targetdir)/app
+       $(Q)cp -a               $O/app/dpdk-pmdinfogen   $(DESTDIR)$(targetdir)/app
        $(Q)$(call rte_symlink, $(DESTDIR)$(includedir), $(DESTDIR)$(targetdir)/include)
        $(Q)$(call rte_symlink, $(DESTDIR)$(libdir),     $(DESTDIR)$(targetdir)/lib)
 
index ff57181..ddbbbf6 100644 (file)
@@ -66,7 +66,7 @@ test fast_test perf_test:
        fi
 
 # this is a special target to ease the pain of running coverage tests
-# this runs all the autotests, cmdline_test script and dpdk_proc_info
+# this runs all the autotests, cmdline_test script and dpdk-procinfo
 coverage:
        @mkdir -p $(AUTOTEST_DIR) ; \
        cd $(AUTOTEST_DIR) ; \
@@ -78,7 +78,7 @@ coverage:
                        $(RTE_OUTPUT)/app/test \
                        $(RTE_TARGET) \
                        $(BLACKLIST) $(WHITELIST) ; \
-               $(RTE_OUTPUT)/app/dpdk_proc_info --file-prefix=ring_perf -- -m; \
+               $(RTE_OUTPUT)/app/dpdk-procinfo --file-prefix=ring_perf -- -m; \
        else \
                echo "No test found, please do a 'make build' first, or specify O=" ;\
        fi
index c36ad61..feda6c8 100755 (executable)
@@ -97,6 +97,17 @@ fixup_config() {
 #trap on ctrl-c to clean up
 trap cleanup_and_exit SIGINT
 
+if [ -z "$DPDK_MAKE_JOBS" ]
+then
+       # This counts the number of cpus on the system
+       if [ -e /usr/bin/lscpu ]
+       then
+               DPDK_MAKE_JOBS=`lscpu -p=cpu | grep -v "#" | wc -l`
+       else
+               DPDK_MAKE_JOBS=1
+       fi
+fi
+
 #Save the current branch
 CURRENT_BRANCH=`git branch | grep \* | cut -d' ' -f2`
 
@@ -183,7 +194,7 @@ log "INFO" "Configuring DPDK $TAG1"
 make config T=$TARGET O=$TARGET > $VERBOSE 2>&1
 
 log "INFO" "Building DPDK $TAG1. This might take a moment"
-make O=$TARGET > $VERBOSE 2>&1
+make -j$DPDK_MAKE_JOBS O=$TARGET > $VERBOSE 2>&1
 
 if [ $? -ne 0 ]
 then
@@ -214,7 +225,7 @@ log "INFO" "Configuring DPDK $TAG2"
 make config T=$TARGET O=$TARGET > $VERBOSE 2>&1
 
 log "INFO" "Building DPDK $TAG2. This might take a moment"
-make O=$TARGET > $VERBOSE 2>&1
+make -j$DPDK_MAKE_JOBS O=$TARGET > $VERBOSE 2>&1
 
 if [ $? -ne 0 ]
 then
similarity index 100%
rename from tools/dpdk_nic_bind.py
rename to tools/dpdk-devbind.py
similarity index 99%
rename from tools/pmdinfo.py
rename to tools/dpdk-pmdinfo.py
index 662034a..dcc8db8 100755 (executable)
@@ -1,6 +1,5 @@
 #!/usr/bin/env python
 # -------------------------------------------------------------------------
-# scripts/pmdinfo.py
 #
 # Utility to dump PMD_INFO_STRING support from an object file
 #
@@ -569,8 +568,7 @@ def main(stream=None):
     optparser = OptionParser(
         usage='usage: %prog [-hrtp] [-d <pci id file] <elf-file>',
         description="Dump pmd hardware support info",
-        add_help_option=True,
-        prog='pmdinfo.py')
+        add_help_option=True)
     optparser.add_option('-r', '--raw',
                          action='store_true', dest='raw_output',
                          help='Dump raw json strings')
similarity index 95%
rename from tools/setup.sh
rename to tools/dpdk-setup.sh
index 6097ab7..ac81b2e 100755 (executable)
@@ -32,7 +32,7 @@
 #   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 #
-# Run with "source /path/to/setup.sh"
+# Run with "source /path/to/dpdk-setup.sh"
 #
 
 #
@@ -422,13 +422,13 @@ grep_meminfo()
 }
 
 #
-# Calls dpdk_nic_bind.py --status to show the NIC and what they
+# Calls dpdk-devbind.py --status to show the NIC and what they
 # are all bound to, in terms of drivers.
 #
 show_nics()
 {
        if [ -d /sys/module/vfio_pci -o -d /sys/module/igb_uio ]; then
-               ${RTE_SDK}/tools/dpdk_nic_bind.py --status
+               ${RTE_SDK}/tools/dpdk-devbind.py --status
        else
                echo "# Please load the 'igb_uio' or 'vfio-pci' kernel module before "
                echo "# querying or adjusting NIC device bindings"
@@ -436,16 +436,16 @@ show_nics()
 }
 
 #
-# Uses dpdk_nic_bind.py to move devices to work with vfio-pci
+# Uses dpdk-devbind.py to move devices to work with vfio-pci
 #
 bind_nics_to_vfio()
 {
        if [ -d /sys/module/vfio_pci ]; then
-               ${RTE_SDK}/tools/dpdk_nic_bind.py --status
+               ${RTE_SDK}/tools/dpdk-devbind.py --status
                echo ""
                echo -n "Enter PCI address of device to bind to VFIO driver: "
                read PCI_PATH
-               sudo ${RTE_SDK}/tools/dpdk_nic_bind.py -b vfio-pci $PCI_PATH &&
+               sudo ${RTE_SDK}/tools/dpdk-devbind.py -b vfio-pci $PCI_PATH &&
                        echo "OK"
        else
                echo "# Please load the 'vfio-pci' kernel module before querying or "
@@ -454,16 +454,16 @@ bind_nics_to_vfio()
 }
 
 #
-# Uses dpdk_nic_bind.py to move devices to work with igb_uio
+# Uses dpdk-devbind.py to move devices to work with igb_uio
 #
 bind_nics_to_igb_uio()
 {
        if [ -d /sys/module/igb_uio ]; then
-               ${RTE_SDK}/tools/dpdk_nic_bind.py --status
+               ${RTE_SDK}/tools/dpdk-devbind.py --status
                echo ""
                echo -n "Enter PCI address of device to bind to IGB UIO driver: "
                read PCI_PATH
-               sudo ${RTE_SDK}/tools/dpdk_nic_bind.py -b igb_uio $PCI_PATH && echo "OK"
+               sudo ${RTE_SDK}/tools/dpdk-devbind.py -b igb_uio $PCI_PATH && echo "OK"
        else
                echo "# Please load the 'igb_uio' kernel module before querying or "
                echo "# adjusting NIC device bindings"
@@ -471,18 +471,18 @@ bind_nics_to_igb_uio()
 }
 
 #
-# Uses dpdk_nic_bind.py to move devices to work with kernel drivers again
+# Uses dpdk-devbind.py to move devices to work with kernel drivers again
 #
 unbind_nics()
 {
-       ${RTE_SDK}/tools/dpdk_nic_bind.py --status
+       ${RTE_SDK}/tools/dpdk-devbind.py --status
        echo ""
        echo -n "Enter PCI address of device to unbind: "
        read PCI_PATH
        echo ""
        echo -n "Enter name of kernel driver to bind the device to: "
        read DRV
-       sudo ${RTE_SDK}/tools/dpdk_nic_bind.py -b $DRV $PCI_PATH && echo "OK"
+       sudo ${RTE_SDK}/tools/dpdk-devbind.py -b $DRV $PCI_PATH && echo "OK"
 }
 
 #