[ovs-dev] [PATCH v2] netdev-dpdk: add DPDK pdump capability

Aaron Conole aconole at redhat.com
Wed Aug 10 15:53:40 UTC 2016


Ciara Loftus <ciara.loftus at intel.com> writes:

> This commit provides the ability to 'listen' on DPDK ports and save
> packets to a pcap file with a DPDK app that uses the librte_pdump
> library. One such app is the 'pdump' app that can be found in the DPDK
> 'app' directory. Instructions on how to use this can be found in
> INSTALL.DPDK-ADVANCED.md
>
> Pdump capability in OVS with DPDK will only be initialised if the
> CONFIG_RTE_LIBRTE_PMD_PCAP=y and CONFIG_RTE_LIBRTE_PDUMP=y options are
> set in DPDK. libpcap is required if the above configuration is used.
>
> Signed-off-by: Ciara Loftus <ciara.loftus at intel.com>
> ---

Hi Ciara,

I haven't reviewed this patch, but am planning on it.  Is there a reason
not to use the ovs mirroring facility in favor of pdump?  Do you have
any metrics to share?  Curious, because I've used the ovs mirror for
dpdk ports (including bonds), and it worked fine for me (but I never
tested for the perfomance impact).

Would it make sense to mention that as well in the documentation?

-Aaron

> v2:
> - specify ovs_rundir in rte_pdump_init
> - update documentation
> - remove dpdk-pdump DB value & associated mentions in the docs
> - added call to rte_pdump_uninit() on failure
> - remove pdump_server_socket on exit
> ---
>  INSTALL.DPDK-ADVANCED.md | 38 ++++++++++++++++++++++++++++++++++++--
>  NEWS                     |  1 +
>  acinclude.m4             | 23 +++++++++++++++++++++++
>  lib/netdev-dpdk.c        | 18 ++++++++++++++++++
>  4 files changed, 78 insertions(+), 2 deletions(-)
>
> diff --git a/INSTALL.DPDK-ADVANCED.md b/INSTALL.DPDK-ADVANCED.md
> index 8279556..11b603a 100755
> --- a/INSTALL.DPDK-ADVANCED.md
> +++ b/INSTALL.DPDK-ADVANCED.md
> @@ -12,7 +12,8 @@ OVS DPDK ADVANCED INSTALL GUIDE
>  7. [QOS](#qos)
>  8. [Rate Limiting](#rl)
>  9. [Flow Control](#fc)
> -10. [Vsperf](#vsperf)
> +10. [Pdump](#pdump)
> +11. [Vsperf](#vsperf)
>  
>  ## <a name="overview"></a> 1. Overview
>  
> @@ -947,7 +948,40 @@ respective parameter. To disable the flow control at tx side,
>  
>  `ovs-vsctl set Interface dpdk0 options:tx-flow-ctrl=false`
>  
> -## <a name="vsperf"></a> 10. Vsperf
> +## <a name="pdump"></a> 10. Pdump
> +
> +Pdump allows you to listen on DPDK ports and view the traffic that is
> +passing on them. To use this utility, one must have libpcap installed
> +on the system. Furthermore, DPDK must be built with CONFIG_RTE_LIBRTE_PDUMP=y
> +and CONFIG_RTE_LIBRTE_PMD_PCAP=y.
> +
> +To use pdump, simply launch OVS as usual. Then, navigate to the 'app/pdump'
> +directory in DPDK, 'make' the application and run like so:
> +
> +```
> +sudo ./build/app/dpdk_pdump --
> +--pdump port=0,queue=0,rx-dev=/tmp/pkts.pcap
> +--server-socket-path=/usr/local/var/run/openvswitch
> +```
> +
> +The above command captures traffic received on queue 0 of port 0 and stores
> +it in /tmp/pkts.pcap. Other combinations of port numbers, queues numbers and
> +pcap locations are of course also available to use. 'server-socket-path' must
> +be set to the value of ovs_rundir() which typically resolves to
> +'/usr/local/var/run/openvswitch'.
> +More information on the pdump app and its usage can be found in the below link.
> +
> +http://dpdk.org/doc/guides/sample_app_ug/pdump.html
> +
> +Many tools are available to view the contents of the pcap file. Once example is
> +tcpdump. Issue the following command to view the contents of 'pkts.pcap':
> +
> +`tcpdump -r pkts.pcap`
> +
> +A performance decrease is expected when using a monitoring application like
> +the DPDK pdump app.
> +
> +## <a name="vsperf"></a> 11. Vsperf
>  
>  Vsperf project goal is to develop vSwitch test framework that can be used to
>  validate the suitability of different vSwitch implementations in a Telco deployment
> diff --git a/NEWS b/NEWS
> index c2ed71d..3f40e23 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -69,6 +69,7 @@ Post-v2.5.0
>       * Basic connection tracking for the userspace datapath (no ALG,
>         fragmentation or NAT support yet)
>       * Support for DPDK 16.07
> +     * Optional support for DPDK pdump enabled.
>     - Increase number of registers to 16.
>     - ovs-benchmark: This utility has been removed due to lack of use and
>       bitrot.
> diff --git a/acinclude.m4 b/acinclude.m4
> index bbbad23..5548213 100644
> --- a/acinclude.m4
> +++ b/acinclude.m4
> @@ -221,6 +221,29 @@ AC_DEFUN([OVS_CHECK_DPDK], [
>        [AC_SEARCH_LIBS([get_mempolicy],[numa],[],[AC_MSG_ERROR([unable to find libnuma, install the dependency package])])
>         DPDK_EXTRA_LIB="-lnuma"])
>  
> +    AC_COMPILE_IFELSE([
> +      AC_LANG_PROGRAM(
> +        [
> +          #include <rte_config.h>
> +#if RTE_LIBRTE_PMD_PCAP
> +#error
> +#endif
> +        ], [])
> +      ], [],
> +      [AC_SEARCH_LIBS([pcap_dump],[pcap],[],[AC_MSG_ERROR([unable to find libpcap, install the dependency package])])
> +       DPDK_EXTRA_LIB="-lpcap"
> +       AC_COMPILE_IFELSE([
> +         AC_LANG_PROGRAM(
> +           [
> +             #include <rte_config.h>
> +#if RTE_LIBRTE_PDUMP
> +#error
> +#endif
> +         ], [])
> +       ], [],
> +       [AC_DEFINE([DPDK_PDUMP], [1], [DPDK pdump enabled in OVS.])])
> +     ])
> +
>      # On some systems we have to add -ldl to link with dpdk
>      #
>      # This code, at first, tries to link without -ldl (""),
> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
> index 0e6db26..9de5bb3 100644
> --- a/lib/netdev-dpdk.c
> +++ b/lib/netdev-dpdk.c
> @@ -57,6 +57,9 @@
>  #include "rte_config.h"
>  #include "rte_mbuf.h"
>  #include "rte_meter.h"
> +#ifdef DPDK_PDUMP
> +#include "rte_pdump.h"
> +#endif
>  #include "rte_virtio_net.h"
>  
>  VLOG_DEFINE_THIS_MODULE(dpdk);
> @@ -3418,6 +3421,21 @@ dpdk_init__(const struct smap *ovs_other_config)
>  
>      dpdk_vhost_class_init();
>  
> +#ifdef DPDK_PDUMP
> +    VLOG_INFO("DPDK pdump packet capture enabled");
> +    err = rte_pdump_init(ovs_rundir());
> +    if (err) {
> +        VLOG_INFO("Error initialising DPDK pdump");
> +        rte_pdump_uninit();
> +    } else {
> +        char server_socket_path[PATH_MAX];
> +
> +        snprintf(server_socket_path, sizeof(server_socket_path), "%s/%s",
> +                 ovs_rundir(), "pdump_server_socket");
> +        fatal_signal_add_file_to_unlink(server_socket_path);
> +    }
> +#endif
> +
>      /* Finally, register the dpdk classes */
>      netdev_dpdk_register();
>  }



More information about the dev mailing list