Add initial support for building ODP with DPDK pktio.

Reviewed-by: Petri Savolainen <petri.savolai...@nokia.com>
Signed-off-by: Matias Elo <matias....@nokia.com>
---
 DEPENDENCIES                                       | 54 ++++++++++++
 platform/linux-generic/Makefile.am                 |  2 +
 platform/linux-generic/include/odp_packet_dpdk.h   | 19 +++++
 .../linux-generic/include/odp_packet_io_internal.h |  3 +
 platform/linux-generic/m4/configure.m4             |  1 +
 platform/linux-generic/m4/odp_dpdk.m4              | 43 ++++++++++
 platform/linux-generic/pktio/dpdk.c                | 96 ++++++++++++++++++++++
 platform/linux-generic/pktio/io_ops.c              |  3 +
 8 files changed, 221 insertions(+)
 create mode 100644 platform/linux-generic/include/odp_packet_dpdk.h
 create mode 100644 platform/linux-generic/m4/odp_dpdk.m4
 create mode 100644 platform/linux-generic/pktio/dpdk.c

diff --git a/DEPENDENCIES b/DEPENDENCIES
index c2711d5..fe7df40 100644
--- a/DEPENDENCIES
+++ b/DEPENDENCIES
@@ -154,6 +154,60 @@ Prerequisites for building the OpenDataPlane (ODP) API
    netmap kernel module is loaded. If socket I/O is desired instead, it can be
    activated by setting the environment variable ODP_PKTIO_DISABLE_NETMAP.
 
+3.4 DPDK (optional)
+
+   Use DPDK for ODP packet I/O.
+
+3.4.1 Building DPDK
+
+   DPDK packet I/O has been tested to work with DPDK v2.2.0.
+
+   # Checkout DPDK code
+   $ git clone http://dpdk.org/git/dpdk
+   $ cd dpdk
+   $ git checkout v2.2.0
+
+   # Make and edit DPDK configuration
+   $ make config T=x86_64-native-linuxapp-gcc O=x86_64-native-linuxapp-gcc
+   $ cd x86_64-native-linuxapp-gcc
+   $ sed -ri 's,(CONFIG_RTE_BUILD_COMBINE_LIBS=).*,\1y,' .config
+   # To use I/O without DPDK supported NIC's enable pcap pmd:
+   $ sed -ri 's,(CONFIG_RTE_LIBRTE_PMD_PCAP=).*,\1y,' .config
+   $ cd ..
+
+   # Build DPDK
+   $ make install T=x86_64-native-linuxapp-gcc EXTRA_CFLAGS="-fPIC"
+
+3.4.2 Setup system
+
+   # Load DPDK modules
+   $ sudo /sbin/modprobe uio
+   $ cd <dpdk-dir>
+   $ sudo insmod x86_64-native-linuxapp-gcc/kmod/igb_uio.ko
+
+   Reserve and mount hugepages and bind supported interfaces to DPDK modules
+   following the DPDK documentation. ODP DPDK packet I/O has been tested with
+   512 x 2MB hugepages. All this can be done with the DPDK setup script
+   (<dpdk-dir>/tools/setup.sh).
+
+3.4.3 Building ODP
+
+   $ cd <odp_dir>
+   $ ./bootstrap
+   $ ./configure --with-dpdk-path=<dpdk_dir>/x86_64-native-linuxapp-gcc
+   $ make
+
+3.4.4 Running ODP with DPDK I/O
+
+   ODP applications will try use DPDK for packet I/O by default. If some other
+   I/O type is desired instead, DPDK I/O can be disabled by setting the
+   environment variable ODP_PKTIO_DISABLE_DPDK.
+
+   DPDK interfaces are accessed using indices. For example, two first DPDK
+   interfaces can be used with the odp_l2fwd example as follows:
+   $ cd <odp_dir>
+   $ sudo ./test/performance/odp_l2fwd -i 0,1 -c 2 -m 0
+
 4.0 Packages needed to build API tests
 
    Cunit test framework version 2.1-3 is required
diff --git a/platform/linux-generic/Makefile.am 
b/platform/linux-generic/Makefile.am
index 94f1408..9a57d95 100644
--- a/platform/linux-generic/Makefile.am
+++ b/platform/linux-generic/Makefile.am
@@ -103,6 +103,7 @@ noinst_HEADERS = \
                  ${srcdir}/include/odp_packet_io_internal.h \
                  ${srcdir}/include/odp_packet_io_queue.h \
                  ${srcdir}/include/odp_packet_netmap.h \
+                 ${srcdir}/include/odp_packet_dpdk.h \
                  ${srcdir}/include/odp_packet_socket.h \
                  ${srcdir}/include/odp_packet_tap.h \
                  ${srcdir}/include/odp_pkt_queue_internal.h \
@@ -139,6 +140,7 @@ __LIB__libodp_la_SOURCES = \
                           pktio/pktio_common.c \
                           pktio/loop.c \
                           pktio/netmap.c \
+                          pktio/dpdk.c \
                           pktio/socket.c \
                           pktio/socket_mmap.c \
                           pktio/sysfs.c \
diff --git a/platform/linux-generic/include/odp_packet_dpdk.h 
b/platform/linux-generic/include/odp_packet_dpdk.h
new file mode 100644
index 0000000..af3a7c3
--- /dev/null
+++ b/platform/linux-generic/include/odp_packet_dpdk.h
@@ -0,0 +1,19 @@
+/* Copyright (c) 2016, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#ifndef ODP_PACKET_DPDK_H
+#define ODP_PACKET_DPDK_H
+
+#include <odp/packet_io.h>
+#include <odp/pool.h>
+
+/** Packet IO using DPDK interface */
+typedef struct {
+       odp_pool_t pool;                  /**< pool to alloc packets from */
+       odp_pktio_capability_t  capa;     /**< interface capabilities */
+} pkt_dpdk_t;
+
+#endif
diff --git a/platform/linux-generic/include/odp_packet_io_internal.h 
b/platform/linux-generic/include/odp_packet_io_internal.h
index a734877..e732b85 100644
--- a/platform/linux-generic/include/odp_packet_io_internal.h
+++ b/platform/linux-generic/include/odp_packet_io_internal.h
@@ -32,6 +32,7 @@ extern "C" {
 #include <odp_packet_socket.h>
 #include <odp_packet_netmap.h>
 #include <odp_packet_tap.h>
+#include <odp_packet_dpdk.h>
 
 #define PKTIO_NAME_LEN 256
 
@@ -82,6 +83,7 @@ struct pktio_entry {
                pkt_sock_mmap_t pkt_sock_mmap;  /**< using socket mmap
                                                 *   API for IO */
                pkt_netmap_t pkt_nm;            /**< using netmap API for IO */
+               pkt_dpdk_t pkt_dpdk;            /**< using DPDK for IO */
 #ifdef HAVE_PCAP
                pkt_pcap_t pkt_pcap;            /**< Using pcap for IO */
 #endif
@@ -222,6 +224,7 @@ int single_send_queue(pktio_entry_t *entry, int index, 
odp_packet_t packets[],
                      int num);
 
 extern const pktio_if_ops_t netmap_pktio_ops;
+extern const pktio_if_ops_t dpdk_pktio_ops;
 extern const pktio_if_ops_t sock_mmsg_pktio_ops;
 extern const pktio_if_ops_t sock_mmap_pktio_ops;
 extern const pktio_if_ops_t loopback_pktio_ops;
diff --git a/platform/linux-generic/m4/configure.m4 
b/platform/linux-generic/m4/configure.m4
index df6dc64..589722f 100644
--- a/platform/linux-generic/m4/configure.m4
+++ b/platform/linux-generic/m4/configure.m4
@@ -19,6 +19,7 @@ AC_LINK_IFELSE(
 m4_include([platform/linux-generic/m4/odp_pthread.m4])
 m4_include([platform/linux-generic/m4/odp_openssl.m4])
 m4_include([platform/linux-generic/m4/odp_netmap.m4])
+m4_include([platform/linux-generic/m4/odp_dpdk.m4])
 m4_include([platform/linux-generic/m4/odp_pcap.m4])
 
 AC_CONFIG_FILES([platform/linux-generic/Makefile
diff --git a/platform/linux-generic/m4/odp_dpdk.m4 
b/platform/linux-generic/m4/odp_dpdk.m4
new file mode 100644
index 0000000..3be5d82
--- /dev/null
+++ b/platform/linux-generic/m4/odp_dpdk.m4
@@ -0,0 +1,43 @@
+##########################################################################
+# Enable DPDK support
+##########################################################################
+AC_ARG_ENABLE([dpdk_support],
+    [  --enable-dpdk-support  include dpdk IO support],
+    [if test x$enableval = xyes; then
+        dpdk_support=yes
+    fi])
+
+##########################################################################
+# Set optional DPDK path
+##########################################################################
+AC_ARG_WITH([dpdk-path],
+AC_HELP_STRING([--with-dpdk-path=DIR   path to dpdk build directory],
+               [(or in the default path if not specified).]),
+    [DPDK_PATH=$withval
+    AM_CPPFLAGS="$AM_CPPFLAGS -msse4.2 -isystem $DPDK_PATH/include"
+    AM_LDFLAGS="$AM_LDFLAGS -L$DPDK_PATH/lib"
+    LIBS="$LIBS -ldpdk -ldl -lpcap"
+    dpdk_support=yes],[])
+
+##########################################################################
+# Save and set temporary compilation flags
+##########################################################################
+OLD_CPPFLAGS=$CPPFLAGS
+CPPFLAGS="$AM_CPPFLAGS $CPPFLAGS"
+
+##########################################################################
+# Check for DPDK availability
+##########################################################################
+if test x$dpdk_support = xyes
+then
+    AC_CHECK_HEADERS([rte_config.h], [],
+        [AC_MSG_FAILURE(["can't find DPDK header"])])
+    ODP_CFLAGS="$ODP_CFLAGS -DODP_DPDK"
+else
+    dpdk_support=no
+fi
+
+##########################################################################
+# Restore old saved variables
+##########################################################################
+CPPFLAGS=$OLD_CPPFLAGS
diff --git a/platform/linux-generic/pktio/dpdk.c 
b/platform/linux-generic/pktio/dpdk.c
new file mode 100644
index 0000000..31fe9ae
--- /dev/null
+++ b/platform/linux-generic/pktio/dpdk.c
@@ -0,0 +1,96 @@
+/* Copyright (c) 2016, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#ifdef ODP_DPDK
+
+#include <odp_posix_extensions.h>
+
+#include <odp_packet_io_internal.h>
+#include <odp_packet_dpdk.h>
+#include <odp_debug_internal.h>
+
+#include <rte_config.h>
+#include <rte_mbuf.h>
+
+static int dpdk_close(pktio_entry_t *pktio_entry ODP_UNUSED)
+{
+       return 0;
+}
+
+static int dpdk_open(odp_pktio_t id ODP_UNUSED,
+                    pktio_entry_t *pktio_entry ODP_UNUSED,
+                    const char *netdev ODP_UNUSED,
+                    odp_pool_t pool ODP_UNUSED)
+{
+       return 0;
+}
+
+static int dpdk_start(pktio_entry_t *pktio_entry ODP_UNUSED)
+{
+       return 0;
+}
+
+static int dpdk_stop(pktio_entry_t *pktio_entry ODP_UNUSED)
+{
+       return 0;
+}
+
+static int dpdk_recv_queue(pktio_entry_t *pktio_entry ODP_UNUSED,
+                          int index ODP_UNUSED,
+                          odp_packet_t pkt_table[] ODP_UNUSED,
+                          int num ODP_UNUSED)
+{
+       return 0;
+}
+
+static int dpdk_recv(pktio_entry_t *pktio_entry ODP_UNUSED,
+                    odp_packet_t pkt_table[] ODP_UNUSED,
+                    unsigned num ODP_UNUSED)
+{
+       return 0;
+}
+
+static int dpdk_send_queue(pktio_entry_t *pktio_entry ODP_UNUSED,
+                          int index ODP_UNUSED,
+                          odp_packet_t pkt_table[] ODP_UNUSED,
+                          int num ODP_UNUSED)
+{
+       return 0;
+}
+
+static int dpdk_send(pktio_entry_t *pktio_entry ODP_UNUSED,
+                    odp_packet_t pkt_table[] ODP_UNUSED,
+                    unsigned num ODP_UNUSED)
+{
+       return 0;
+}
+
+const pktio_if_ops_t dpdk_pktio_ops = {
+       .name = "dpdk",
+       .init = NULL,
+       .term = NULL,
+       .open = dpdk_open,
+       .close = dpdk_close,
+       .start = dpdk_start,
+       .stop = dpdk_stop,
+       .recv = dpdk_recv,
+       .send = dpdk_send,
+       .recv_queue = dpdk_recv_queue,
+       .send_queue = dpdk_send_queue,
+       .link_status = NULL,
+       .mtu_get = NULL,
+       .promisc_mode_set = NULL,
+       .promisc_mode_get = NULL,
+       .mac_get = NULL,
+       .capability = NULL,
+       .input_queues_config = NULL,
+       .output_queues_config = NULL,
+       .in_queues = NULL,
+       .pktin_queues = NULL,
+       .pktout_queues = NULL
+};
+
+#endif /* ODP_DPDK */
diff --git a/platform/linux-generic/pktio/io_ops.c 
b/platform/linux-generic/pktio/io_ops.c
index 1933abc..cb43041 100644
--- a/platform/linux-generic/pktio/io_ops.c
+++ b/platform/linux-generic/pktio/io_ops.c
@@ -12,6 +12,9 @@
  * Array must be NULL terminated */
 const pktio_if_ops_t * const pktio_if_ops[]  = {
        &loopback_pktio_ops,
+#ifdef ODP_DPDK
+       &dpdk_pktio_ops,
+#endif
 #ifdef ODP_NETMAP
        &netmap_pktio_ops,
 #endif
-- 
1.9.1

_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to