apps: use helper to create mbuf pools
[dpdk.git] / examples / exception_path / main.c
index 0a19831..b3fe170 100644 (file)
@@ -1,35 +1,34 @@
 /*-
  *   BSD LICENSE
- * 
- *   Copyright(c) 2010-2013 Intel Corporation. All rights reserved.
+ *
+ *   Copyright(c) 2010-2014 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 
+ *
+ *   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 
+ *
+ *     * 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 
+ *     * 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 
+ *     * 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 
+ *
+ *   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.
- * 
  */
 
 #include <stdio.h>
@@ -55,7 +54,6 @@
 #include <rte_memory.h>
 #include <rte_memcpy.h>
 #include <rte_memzone.h>
-#include <rte_tailq.h>
 #include <rte_eal.h>
 #include <rte_per_lcore.h>
 #include <rte_launch.h>
 #define FATAL_ERROR(fmt, args...)       rte_exit(EXIT_FAILURE, fmt "\n", ##args)
 #define PRINT_INFO(fmt, args...)        RTE_LOG(INFO, APP, fmt "\n", ##args)
 
-/* NUMA socket to allocate mbuf pool on */
-#define SOCKET                  0
-
 /* Max ports than can be used (each port is associated with two lcores) */
 #define MAX_PORTS               (RTE_MAX_LCORE / 2)
 
 /* Max size of a single packet */
-#define MAX_PACKET_SZ           2048
+#define MAX_PACKET_SZ (2048)
 
-/* Number of bytes needed for each mbuf */
-#define MBUF_SZ \
-       (MAX_PACKET_SZ + sizeof(struct rte_mbuf) + RTE_PKTMBUF_HEADROOM)
+/* Size of the data buffer in each mbuf */
+#define MBUF_DATA_SZ (MAX_PACKET_SZ + RTE_PKTMBUF_HEADROOM)
 
 /* Number of mbufs in mempool that is created */
 #define NB_MBUF                 8192
  * controller's datasheet and supporting DPDK documentation for guidance
  * on how these parameters should be set.
  */
-/* RX ring configuration */
-static const struct rte_eth_rxconf rx_conf = {
-       .rx_thresh = {
-               .pthresh = 8,   /* Ring prefetch threshold */
-               .hthresh = 8,   /* Ring host threshold */
-               .wthresh = 4,   /* Ring writeback threshold */
-       },
-       .rx_free_thresh = 0,    /* Immediately free RX descriptors */
-};
-
-/*
- * These default values are optimized for use with the Intel(R) 82599 10 GbE
- * Controller and the DPDK ixgbe PMD. Consider using other values for other
- * network controllers and/or network drivers.
- */
-/* TX ring configuration */
-static const struct rte_eth_txconf tx_conf = {
-       .tx_thresh = {
-               .pthresh = 36,  /* Ring prefetch threshold */
-               .hthresh = 0,   /* Ring host threshold */
-               .wthresh = 0,   /* Ring writeback threshold */
-       },
-       .tx_free_thresh = 0,    /* Use PMD default values */
-       .tx_rs_thresh = 0,      /* Use PMD default values */
-};
 
 /* Options for configuring ethernet port */
 static const struct rte_eth_conf port_conf = {
@@ -149,7 +118,7 @@ static const struct rte_eth_conf port_conf = {
                .hw_strip_crc = 0,      /* CRC stripped by hardware */
        },
        .txmode = {
-               .mq_mode = ETH_DCB_NONE,
+               .mq_mode = ETH_MQ_TX_NONE,
        },
 };
 
@@ -160,10 +129,10 @@ static struct rte_mempool * pktmbuf_pool = NULL;
 static uint32_t ports_mask = 0;
 
 /* Mask of cores that read from NIC and write to tap */
-static uint32_t input_cores_mask = 0;
+static uint64_t input_cores_mask = 0;
 
 /* Mask of cores that read from tap and write to NIC */
-static uint32_t output_cores_mask = 0;
+static uint64_t output_cores_mask = 0;
 
 /* Array storing port_id that is associated with each lcore */
 static uint8_t port_ids[RTE_MAX_LCORE];
@@ -233,7 +202,7 @@ static int tap_create(char *name)
        ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
 
        if (name && *name)
-               rte_snprintf(ifr.ifr_name, IFNAMSIZ, name);
+               snprintf(ifr.ifr_name, IFNAMSIZ, "%s", name);
 
        ret = ioctl(fd, TUNSETIFF, (void *) &ifr);
        if (ret < 0) {
@@ -242,27 +211,27 @@ static int tap_create(char *name)
        }
 
        if (name)
-               rte_snprintf(name, IFNAMSIZ, ifr.ifr_name);
+               snprintf(name, IFNAMSIZ, "%s", ifr.ifr_name);
 
        return fd;
 }
 
 /* Main processing loop */
-static  __attribute__((noreturn)) int
+static int
 main_loop(__attribute__((unused)) void *arg)
 {
        const unsigned lcore_id = rte_lcore_id();
        char tap_name[IFNAMSIZ];
        int tap_fd;
 
-       /* Create new tap interface */
-       rte_snprintf(tap_name, IFNAMSIZ, "tap_dpdk_%.2u", lcore_id);
-       tap_fd = tap_create(tap_name);
-       if (tap_fd < 0)
-               FATAL_ERROR("Could not create tap interface \"%s\" (%d)",
-                           tap_name, tap_fd);
+       if ((1ULL << lcore_id) & input_cores_mask) {
+               /* Create new tap interface */
+               snprintf(tap_name, IFNAMSIZ, "tap_dpdk_%.2u", lcore_id);
+               tap_fd = tap_create(tap_name);
+               if (tap_fd < 0)
+                       FATAL_ERROR("Could not create tap interface \"%s\" (%d)",
+                                       tap_name, tap_fd);
 
-       if ((1 << lcore_id) & input_cores_mask) {
                PRINT_INFO("Lcore %u is reading from port %u and writing to %s",
                           lcore_id, (unsigned)port_ids[lcore_id], tap_name);
                fflush(stdout);
@@ -288,7 +257,14 @@ main_loop(__attribute__((unused)) void *arg)
                        }
                }
        }
-       else if ((1 << lcore_id) & output_cores_mask) {
+       else if ((1ULL << lcore_id) & output_cores_mask) {
+               /* Create new tap interface */
+               snprintf(tap_name, IFNAMSIZ, "tap_dpdk_%.2u", lcore_id);
+               tap_fd = tap_create(tap_name);
+               if (tap_fd < 0)
+                       FATAL_ERROR("Could not create tap interface \"%s\" (%d)",
+                                       tap_name, tap_fd);
+
                PRINT_INFO("Lcore %u is reading from %s and writing to port %u",
                           lcore_id, tap_name, (unsigned)port_ids[lcore_id]);
                fflush(stdout);
@@ -299,16 +275,17 @@ main_loop(__attribute__((unused)) void *arg)
                        if (m == NULL)
                                continue;
 
-                       ret = read(tap_fd, m->pkt.data, MAX_PACKET_SZ);
+                       ret = read(tap_fd, rte_pktmbuf_mtod(m, void *),
+                               MAX_PACKET_SZ);
                        lcore_stats[lcore_id].rx++;
                        if (unlikely(ret < 0)) {
                                FATAL_ERROR("Reading from %s interface failed",
                                            tap_name);
                        }
-                       m->pkt.nb_segs = 1;
-                       m->pkt.next = NULL;
-                       m->pkt.pkt_len = (uint16_t)ret;
-                       m->pkt.data_len = (uint16_t)ret;
+                       m->nb_segs = 1;
+                       m->next = NULL;
+                       m->pkt_len = (uint16_t)ret;
+                       m->data_len = (uint16_t)ret;
                        ret = rte_eth_tx_burst(port_ids[lcore_id], 0, &m, 1);
                        if (unlikely(ret < 1)) {
                                rte_pktmbuf_free(m);
@@ -321,8 +298,7 @@ main_loop(__attribute__((unused)) void *arg)
        }
        else {
                PRINT_INFO("Lcore %u has nothing to do", lcore_id);
-               for (;;)
-                       ; /* loop doing nothing */
+               return 0;
        }
        /*
         * Tap file is closed automatically when program exits. Putting close()
@@ -342,30 +318,30 @@ print_usage(const char *prgname)
 }
 
 /* Convert string to unsigned number. 0 is returned if error occurs */
-static uint32_t
+static uint64_t
 parse_unsigned(const char *portmask)
 {
        char *end = NULL;
-       unsigned long num;
+       uint64_t num;
 
-       num = strtoul(portmask, &end, 16);
+       num = strtoull(portmask, &end, 16);
        if ((portmask[0] == '\0') || (end == NULL) || (*end != '\0'))
                return 0;
 
-       return (uint32_t)num;
+       return (uint64_t)num;
 }
 
 /* Record affinities between ports and lcores in global port_ids[] array */
 static void
 setup_port_lcore_affinities(void)
 {
-       unsigned i;
+       unsigned long i;
        uint8_t tx_port = 0;
        uint8_t rx_port = 0;
 
        /* Setup port_ids[] array, and check masks were ok */
        RTE_LCORE_FOREACH(i) {
-               if (input_cores_mask & (1 << i)) {
+               if (input_cores_mask & (1ULL << i)) {
                        /* Skip ports that are not enabled */
                        while ((ports_mask & (1 << rx_port)) == 0) {
                                rx_port++;
@@ -375,7 +351,7 @@ setup_port_lcore_affinities(void)
 
                        port_ids[i] = rx_port++;
                }
-               else if (output_cores_mask & (1 << i)) {
+               else if (output_cores_mask & (1ULL << i)) {
                        /* Skip ports that are not enabled */
                        while ((ports_mask & (1 << tx_port)) == 0) {
                                tx_port++;
@@ -457,13 +433,15 @@ init_port(uint8_t port)
                FATAL_ERROR("Could not configure port%u (%d)",
                            (unsigned)port, ret);
 
-       ret = rte_eth_rx_queue_setup(port, 0, NB_RXD, SOCKET, &rx_conf,
-                                    pktmbuf_pool);
+       ret = rte_eth_rx_queue_setup(port, 0, NB_RXD, rte_eth_dev_socket_id(port),
+                               NULL,
+                               pktmbuf_pool);
        if (ret < 0)
                FATAL_ERROR("Could not setup up RX queue for port%u (%d)",
                            (unsigned)port, ret);
 
-       ret = rte_eth_tx_queue_setup(port, 0, NB_TXD, SOCKET, &tx_conf);
+       ret = rte_eth_tx_queue_setup(port, 0, NB_TXD, rte_eth_dev_socket_id(port),
+                               NULL);
        if (ret < 0)
                FATAL_ERROR("Could not setup up TX queue for port%u (%d)",
                            (unsigned)port, ret);
@@ -553,32 +531,17 @@ main(int argc, char** argv)
        parse_args(argc, argv);
 
        /* Create the mbuf pool */
-       pktmbuf_pool = rte_mempool_create("mbuf_pool", NB_MBUF, MBUF_SZ,
-                       MEMPOOL_CACHE_SZ,
-                       sizeof(struct rte_pktmbuf_pool_private),
-                       rte_pktmbuf_pool_init, NULL, rte_pktmbuf_init, NULL,
-                       SOCKET, 0);
+       pktmbuf_pool = rte_pktmbuf_pool_create("mbuf_pool", NB_MBUF,
+                       MEMPOOL_CACHE_SZ, 0, MBUF_DATA_SZ, rte_socket_id());
        if (pktmbuf_pool == NULL) {
                FATAL_ERROR("Could not initialise mbuf pool");
                return -1;
        }
 
-       /* Initialise PMD driver(s) */
-       ret = rte_pmd_init_all();
-       if (ret < 0)
-               FATAL_ERROR("Could not probe PMD (%d)", ret);
-
-       /* Scan PCI bus for recognised devices */
-       ret = rte_eal_pci_probe();
-       if (ret < 0)
-               FATAL_ERROR("Could not probe PCI (%d)", ret);
-
        /* Get number of ports found in scan */
        nb_sys_ports = rte_eth_dev_count();
        if (nb_sys_ports == 0)
-               FATAL_ERROR("No supported Ethernet devices found - check that "
-                           "CONFIG_RTE_LIBRTE_IGB_PMD=y and/or "
-                           "CONFIG_RTE_LIBRTE_IXGBE_PMD=y in the config file");
+               FATAL_ERROR("No supported Ethernet device found");
        /* Find highest port set in portmask */
        for (high_port = (sizeof(ports_mask) * 8) - 1;
                        (high_port != 0) && !(ports_mask & (1 << high_port));