apps: use helper to create mbuf pools
[dpdk.git] / examples / kni / main.c
index 41e3722..96ca473 100644 (file)
@@ -1,13 +1,13 @@
 /*-
  *   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
  *   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
@@ -17,7 +17,7 @@
  *     * 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
@@ -54,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>
@@ -81,9 +80,8 @@
 /* Max size of a single packet */
 #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 * 16)
@@ -125,36 +123,6 @@ struct kni_port_params {
 
 static struct kni_port_params *kni_port_params_array[RTE_MAX_ETHPORTS];
 
-/* RX and TX Prefetch, Host, and Write-back threshold values should be
- * carefully set for optimal performance. Consult the network
- * 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 struct rte_eth_conf port_conf = {
@@ -243,8 +211,8 @@ signal_handler(int signum)
                return;
        }
 
-       /* When we receive a RTMIN signal, stop kni processing */
-       if (signum == SIGRTMIN{
+       /* When we receive a RTMIN or SIGINT signal, stop kni processing */
+       if (signum == SIGRTMIN || signum == SIGINT){
                printf("SIGRTMIN is received, and the KNI processing is "
                                                        "going to stop\n");
                rte_atomic32_inc(&kni_stop);
@@ -465,7 +433,7 @@ parse_config(const char *arg)
                        printf("Invalid config parameters\n");
                        goto fail;
                }
-               rte_snprintf(s, sizeof(s), "%.*s", size, p);
+               snprintf(s, sizeof(s), "%.*s", size, p);
                nb_token = rte_strsplit(s, sizeof(s), str_fld, _NUM_FLD, ',');
                if (nb_token <= FLD_LCORE_TX) {
                        printf("Invalid config parameters\n");
@@ -491,9 +459,9 @@ parse_config(const char *arg)
                        printf("Port %d has been configured\n", port_id);
                        goto fail;
                }
-               kni_port_params_array[port_id] = 
-                       (struct kni_port_params*)rte_zmalloc("KNI_port_params",
-                       sizeof(struct kni_port_params), CACHE_LINE_SIZE);
+               kni_port_params_array[port_id] =
+                       rte_zmalloc("KNI_port_params",
+                                   sizeof(struct kni_port_params), RTE_CACHE_LINE_SIZE);
                kni_port_params_array[port_id]->port_id = port_id;
                kni_port_params_array[port_id]->lcore_rx =
                                        (uint8_t)int_fld[i++];
@@ -557,7 +525,7 @@ validate_parameters(uint32_t portmask)
                                        "port %d transmitting not enabled\n",
                                        kni_port_params_array[i]->lcore_tx,
                                        kni_port_params_array[i]->port_id);
-                       
+
        }
 
        return 0;
@@ -616,6 +584,25 @@ parse_args(int argc, char **argv)
        return ret;
 }
 
+/* Initialize KNI subsystem */
+static void
+init_kni(void)
+{
+       unsigned int num_of_kni_ports = 0, i;
+       struct kni_port_params **params = kni_port_params_array;
+
+       /* Calculate the maximum number of KNI interfaces that will be used */
+       for (i = 0; i < RTE_MAX_ETHPORTS; i++) {
+               if (kni_port_params_array[i]) {
+                       num_of_kni_ports += (params[i]->nb_lcore_k ?
+                               params[i]->nb_lcore_k : 1);
+               }
+       }
+
+       /* Invoke rte KNI init to preallocate the ports */
+       rte_kni_init(num_of_kni_ports);
+}
+
 /* Initialise a single port on an Ethernet device */
 static void
 init_port(uint8_t port)
@@ -631,13 +618,13 @@ init_port(uint8_t port)
                            (unsigned)port, ret);
 
        ret = rte_eth_rx_queue_setup(port, 0, NB_RXD,
-               rte_eth_dev_socket_id(port), &rx_conf, pktmbuf_pool);
+               rte_eth_dev_socket_id(port), NULL, pktmbuf_pool);
        if (ret < 0)
                rte_exit(EXIT_FAILURE, "Could not setup up RX queue for "
                                "port%u (%d)\n", (unsigned)port, ret);
 
        ret = rte_eth_tx_queue_setup(port, 0, NB_TXD,
-               rte_eth_dev_socket_id(port), &tx_conf);
+               rte_eth_dev_socket_id(port), NULL);
        if (ret < 0)
                rte_exit(EXIT_FAILURE, "Could not setup up TX queue for "
                                "port%u (%d)\n", (unsigned)port, ret);
@@ -727,7 +714,7 @@ kni_change_mtu(uint8_t port_id, unsigned new_mtu)
        /* Set new MTU */
        if (new_mtu > ETHER_MAX_LEN)
                conf.rxmode.jumbo_frame = 1;
-       else 
+       else
                conf.rxmode.jumbo_frame = 0;
 
        /* mtu + length of header + length of FCS = max pkt length */
@@ -793,12 +780,12 @@ kni_alloc(uint8_t port_id)
                /* Clear conf at first */
                memset(&conf, 0, sizeof(conf));
                if (params[port_id]->nb_lcore_k) {
-                       rte_snprintf(conf.name, RTE_KNI_NAMESIZE,
+                       snprintf(conf.name, RTE_KNI_NAMESIZE,
                                        "vEth%u_%u", port_id, i);
                        conf.core_id = params[port_id]->lcore_k[i];
                        conf.force_bind = 1;
                } else
-                       rte_snprintf(conf.name, RTE_KNI_NAMESIZE,
+                       snprintf(conf.name, RTE_KNI_NAMESIZE,
                                                "vEth%u", port_id);
                conf.group_id = (uint16_t)port_id;
                conf.mbuf_size = MAX_PACKET_SZ;
@@ -864,6 +851,7 @@ main(int argc, char** argv)
        signal(SIGUSR1, signal_handler);
        signal(SIGUSR2, signal_handler);
        signal(SIGRTMIN, signal_handler);
+       signal(SIGINT, signal_handler);
 
        /* Initialise EAL */
        ret = rte_eal_init(argc, argv);
@@ -878,32 +866,17 @@ main(int argc, char** argv)
                rte_exit(EXIT_FAILURE, "Could not parse input parameters\n");
 
        /* 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,
-                       rte_socket_id(), 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) {
                rte_exit(EXIT_FAILURE, "Could not initialise mbuf pool\n");
                return -1;
        }
 
-       /* Initialise PMD driver(s) */
-       ret = rte_pmd_init_all();
-       if (ret < 0)
-               rte_exit(EXIT_FAILURE, "Could not initialise PMD (%d)\n", ret);
-
-       /* Scan PCI bus for recognised devices */
-       ret = rte_eal_pci_probe();
-       if (ret < 0)
-               rte_exit(EXIT_FAILURE, "Could not probe PCI (%d)\n", ret);
-
        /* Get number of ports found in scan */
        nb_sys_ports = rte_eth_dev_count();
        if (nb_sys_ports == 0)
-               rte_exit(EXIT_FAILURE, "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\n");
+               rte_exit(EXIT_FAILURE, "No supported Ethernet device found\n");
 
        /* Check if the configured port ID is valid */
        for (i = 0; i < RTE_MAX_ETHPORTS; i++)
@@ -911,6 +884,9 @@ main(int argc, char** argv)
                        rte_exit(EXIT_FAILURE, "Configured invalid "
                                                "port ID %u\n", i);
 
+       /* Initialize KNI subsystem */
+       init_kni();
+
        /* Initialise each port */
        for (port = 0; port < nb_sys_ports; port++) {
                /* Skip ports that are not enabled */
@@ -939,6 +915,9 @@ main(int argc, char** argv)
                        continue;
                kni_free_kni(port);
        }
+#ifdef RTE_LIBRTE_XEN_DOM0
+       rte_kni_close();
+#endif
        for (i = 0; i < RTE_MAX_ETHPORTS; i++)
                if (kni_port_params_array[i]) {
                        rte_free(kni_port_params_array[i]);