New upstream version 17.11.4
[deb_dpdk.git] / examples / exception_path / main.c
index e5eedcc..ba081e3 100644 (file)
 #include <getopt.h>
 
 #include <netinet/in.h>
-#include <linux/if.h>
+#include <net/if.h>
+#ifdef RTE_EXEC_ENV_LINUXAPP
 #include <linux/if_tun.h>
+#endif
 #include <fcntl.h>
 #include <sys/ioctl.h>
 #include <unistd.h>
@@ -53,7 +55,6 @@
 #include <rte_log.h>
 #include <rte_memory.h>
 #include <rte_memcpy.h>
-#include <rte_memzone.h>
 #include <rte_eal.h>
 #include <rte_per_lcore.h>
 #include <rte_launch.h>
 #include <rte_lcore.h>
 #include <rte_branch_prediction.h>
 #include <rte_interrupts.h>
-#include <rte_pci.h>
 #include <rte_debug.h>
 #include <rte_ether.h>
 #include <rte_ethdev.h>
-#include <rte_ring.h>
-#include <rte_log.h>
 #include <rte_mempool.h>
 #include <rte_mbuf.h>
 #include <rte_string_fns.h>
 #include <rte_cycles.h>
 
+#ifndef APP_MAX_LCORE
+#if (RTE_MAX_LCORE > 64)
+#define APP_MAX_LCORE 64
+#else
+#define APP_MAX_LCORE RTE_MAX_LCORE
+#endif
+#endif
+
 /* Macros for printing using RTE_LOG */
 #define RTE_LOGTYPE_APP RTE_LOGTYPE_USER1
 #define FATAL_ERROR(fmt, args...)       rte_exit(EXIT_FAILURE, fmt "\n", ##args)
 #define PRINT_INFO(fmt, args...)        RTE_LOG(INFO, APP, fmt "\n", ##args)
 
 /* Max ports than can be used (each port is associated with two lcores) */
-#define MAX_PORTS               (RTE_MAX_LCORE / 2)
+#define MAX_PORTS               (APP_MAX_LCORE / 2)
 
 /* Max size of a single packet */
 #define MAX_PACKET_SZ (2048)
@@ -115,7 +121,7 @@ static const struct rte_eth_conf port_conf = {
                .hw_ip_checksum = 0,    /* IP checksum offload disabled */
                .hw_vlan_filter = 0,    /* VLAN filtering disabled */
                .jumbo_frame = 0,       /* Jumbo Frame Support disabled */
-               .hw_strip_crc = 0,      /* CRC stripped by hardware */
+               .hw_strip_crc = 1,      /* CRC stripped by hardware */
        },
        .txmode = {
                .mq_mode = ETH_MQ_TX_NONE,
@@ -135,7 +141,7 @@ static uint64_t input_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];
+static uint16_t port_ids[APP_MAX_LCORE];
 
 /* Structure type for recording lcore-specific stats */
 struct stats {
@@ -145,7 +151,7 @@ struct stats {
 };
 
 /* Array of lcore-specific stats */
-static struct stats lcore_stats[RTE_MAX_LCORE];
+static struct stats lcore_stats[APP_MAX_LCORE];
 
 /* Print out statistics on packets handled */
 static void
@@ -158,6 +164,9 @@ print_stats(void)
               " Lcore    Port            RX            TX    Dropped on TX\n"
               "-------  ------  ------------  ------------  ---------------\n");
        RTE_LCORE_FOREACH(i) {
+               /* limit ourselves to application supported cores only */
+               if (i >= APP_MAX_LCORE)
+                       break;
                printf("%6u %7u %13"PRIu64" %13"PRIu64" %16"PRIu64"\n",
                       i, (unsigned)port_ids[i],
                       lcore_stats[i].rx, lcore_stats[i].tx,
@@ -183,6 +192,7 @@ signal_handler(int signum)
        }
 }
 
+#ifdef RTE_EXEC_ENV_LINUXAPP
 /*
  * Create a tap network interface, or use existing one with same name.
  * If name[0]='\0' then a name is automatically assigned and returned in name.
@@ -215,6 +225,29 @@ static int tap_create(char *name)
 
        return fd;
 }
+#else
+/*
+ * Find a free tap network interface, or create a new one.
+ * The name is automatically assigned and returned in name.
+ */
+static int tap_create(char *name)
+{
+       int i, fd = -1;
+       char devname[PATH_MAX];
+
+       for (i = 0; i < 255; i++) {
+               snprintf(devname, sizeof(devname), "/dev/tap%d", i);
+               fd = open(devname, O_RDWR);
+               if (fd >= 0 || errno != EBUSY)
+                       break;
+       }
+
+       if (name)
+               snprintf(name, IFNAMSIZ, "tap%d", i);
+
+       return fd;
+}
+#endif
 
 /* Main processing loop */
 static int
@@ -336,11 +369,13 @@ static void
 setup_port_lcore_affinities(void)
 {
        unsigned long i;
-       uint8_t tx_port = 0;
-       uint8_t rx_port = 0;
+       uint16_t tx_port = 0;
+       uint16_t rx_port = 0;
 
        /* Setup port_ids[] array, and check masks were ok */
-       RTE_LCORE_FOREACH(i) {
+       for (i = 0; i < APP_MAX_LCORE; i++) {
+               if (!rte_lcore_is_enabled(i))
+                       continue;
                if (input_cores_mask & (1ULL << i)) {
                        /* Skip ports that are not enabled */
                        while ((ports_mask & (1 << rx_port)) == 0) {
@@ -420,45 +455,54 @@ parse_args(int argc, char **argv)
 
 /* Initialise a single port on an Ethernet device */
 static void
-init_port(uint8_t port)
+init_port(uint16_t port)
 {
        int ret;
+       uint16_t nb_rxd = NB_RXD;
+       uint16_t nb_txd = NB_TXD;
 
        /* Initialise device and RX/TX queues */
-       PRINT_INFO("Initialising port %u ...", (unsigned)port);
+       PRINT_INFO("Initialising port %u ...", port);
        fflush(stdout);
        ret = rte_eth_dev_configure(port, 1, 1, &port_conf);
        if (ret < 0)
-               FATAL_ERROR("Could not configure port%u (%d)",
-                           (unsigned)port, ret);
+               FATAL_ERROR("Could not configure port%u (%d)", port, ret);
+
+       ret = rte_eth_dev_adjust_nb_rx_tx_desc(port, &nb_rxd, &nb_txd);
+       if (ret < 0)
+               FATAL_ERROR("Could not adjust number of descriptors for port%u (%d)",
+                           port, ret);
 
-       ret = rte_eth_rx_queue_setup(port, 0, NB_RXD, rte_eth_dev_socket_id(port),
+       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);
+                               port, ret);
 
-       ret = rte_eth_tx_queue_setup(port, 0, NB_TXD, rte_eth_dev_socket_id(port),
+       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);
+                               port, ret);
 
        ret = rte_eth_dev_start(port);
        if (ret < 0)
-               FATAL_ERROR("Could not start port%u (%d)", (unsigned)port, ret);
+               FATAL_ERROR("Could not start port%u (%d)", port, ret);
 
        rte_eth_promiscuous_enable(port);
 }
 
 /* Check the link status of all ports in up to 9s, and print them finally */
 static void
-check_all_ports_link_status(uint8_t port_num, uint32_t port_mask)
+check_all_ports_link_status(uint16_t port_num, uint32_t port_mask)
 {
 #define CHECK_INTERVAL 100 /* 100ms */
 #define MAX_CHECK_TIME 90 /* 9s (90 * 100ms) in total */
-       uint8_t portid, count, all_ports_up, print_flag = 0;
+       uint16_t portid;
+       uint8_t count, all_ports_up, print_flag = 0;
        struct rte_eth_link link;
 
        printf("\nChecking link status");
@@ -473,14 +517,13 @@ check_all_ports_link_status(uint8_t port_num, uint32_t port_mask)
                        /* print link status if flag set */
                        if (print_flag == 1) {
                                if (link.link_status)
-                                       printf("Port %d Link Up - speed %u "
-                                               "Mbps - %s\n", (uint8_t)portid,
-                                               (unsigned)link.link_speed,
+                                       printf(
+                                       "Port%d Link Up. Speed %u Mbps - %s\n",
+                                               portid, link.link_speed,
                                (link.link_duplex == ETH_LINK_FULL_DUPLEX) ?
                                        ("full-duplex") : ("half-duplex\n"));
                                else
-                                       printf("Port %d Link Down\n",
-                                               (uint8_t)portid);
+                                       printf("Port %d Link Down\n", portid);
                                continue;
                        }
                        /* clear all_ports_up flag if any link down */
@@ -513,7 +556,7 @@ main(int argc, char** argv)
 {
        int ret;
        unsigned i,high_port;
-       uint8_t nb_sys_ports, port;
+       uint16_t nb_sys_ports, port;
 
        /* Associate signal_hanlder function with USR signals */
        signal(SIGUSR1, signal_handler);