mbuf: remove the rte_pktmbuf structure
[dpdk.git] / examples / dpdk_qat / main.c
index 2a4a0ec..75c9876 100644 (file)
@@ -1,36 +1,34 @@
 /*-
  *   BSD LICENSE
- * 
- *   Copyright(c) 2010-2012 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.
- * 
- *  version: DPDK.L.1.2.3-3
  */
 
 #include <stdio.h>
@@ -97,9 +95,7 @@
 #define TX_WTHRESH 0  /**< Default values of TX write-back threshold reg. */
 
 #define MAX_PKT_BURST 32
-#define BURST_TX_DRAIN 200000ULL /* around 100us at 2 Ghz */
-
-#define SOCKET0 0
+#define BURST_TX_DRAIN_US 100 /* TX drain every ~100us */
 
 #define TX_QUEUE_FLUSH_MASK 0xFFFFFFFF
 #define TSC_COUNT_LIMIT 1000
@@ -122,6 +118,9 @@ static struct ether_addr ports_eth_addr[RTE_MAX_ETHPORTS];
 static unsigned enabled_port_mask = 0;
 static int promiscuous_on = 1; /**< Ports set in promiscuous mode on by default. */
 
+/* list of enabled ports */
+static uint32_t dst_ports[RTE_MAX_ETHPORTS];
+
 struct mbuf_table {
        uint16_t len;
        struct rte_mbuf *m_table[MAX_PKT_BURST];
@@ -160,6 +159,7 @@ static uint16_t nb_lcore_params = sizeof(lcore_params_array_default) /
 
 static struct rte_eth_conf port_conf = {
        .rxmode = {
+               .mq_mode        = ETH_MQ_RX_RSS,
                .split_hdr_size = 0,
                .header_split   = 0, /**< Header Split disabled */
                .hw_ip_checksum = 1, /**< IP checksum offload enabled */
@@ -170,10 +170,11 @@ static struct rte_eth_conf port_conf = {
        .rx_adv_conf = {
                .rss_conf = {
                        .rss_key = NULL,
-                       .rss_hf = ETH_RSS_IPV4,
+                       .rss_hf = ETH_RSS_IP,
                },
        },
        .txmode = {
+               .mq_mode = ETH_MQ_TX_NONE,
        },
 };
 
@@ -316,18 +317,13 @@ nic_tx_send_packet(struct rte_mbuf *pkt, uint8_t port)
        qconf->tx_mbufs[port].len = len;
 }
 
-static inline uint8_t
-get_output_port(uint8_t input_port)
-{
-       return (uint8_t)(input_port ^ 1);
-}
-
 /* main processing loop */
 static __attribute__((noreturn)) int
 main_loop(__attribute__((unused)) void *dummy)
 {
        uint32_t lcoreid;
        struct lcore_conf *qconf;
+       const uint64_t drain_tsc = (rte_get_tsc_hz() + US_PER_S - 1) / US_PER_S * BURST_TX_DRAIN_US;
 
        lcoreid = rte_lcore_id();
        qconf = &lcore_conf[lcoreid];
@@ -347,7 +343,7 @@ main_loop(__attribute__((unused)) void *dummy)
                        tsc = rte_rdtsc();
 
                        diff_tsc = tsc - qconf->tsc;
-                       if (unlikely(diff_tsc > BURST_TX_DRAIN)) {
+                       if (unlikely(diff_tsc > drain_tsc)) {
                                nic_tx_flush_queues(qconf);
                                crypto_flush_tx_queue(lcoreid);
                                qconf->tsc = tsc;
@@ -388,10 +384,10 @@ main_loop(__attribute__((unused)) void *dummy)
                        }
                }
 
-               port = get_output_port(pkt->pkt.in_port);
+               port = dst_ports[pkt->in_port];
 
                /* Transmit the packet */
-               nic_tx_send_packet(pkt, port);
+               nic_tx_send_packet(pkt, (uint8_t)port);
        }
 }
 
@@ -493,10 +489,10 @@ static void
 print_usage(const char *prgname)
 {
        printf ("%s [EAL options] -- -p PORTMASK [--no-promisc]"
-               "  [--config (port,queue,lcore)[,(port,queue,lcore]]\n"
+               "  [--config '(port,queue,lcore)[,(port,queue,lcore)]'\n"
                "  -p PORTMASK: hexadecimal bitmask of ports to configure\n"
                "  --no-promisc: disable promiscuous mode (default is ON)\n"
-               "  --config (port,queue,lcore): rx queues configuration\n",
+               "  --config '(port,queue,lcore)': rx queues configuration\n",
                prgname);
 }
 
@@ -547,7 +543,7 @@ parse_config(const char *q_arg)
                if(size >= sizeof(s))
                        return -1;
 
-               rte_snprintf(s, sizeof(s), "%.*s", size, p);
+               snprintf(s, sizeof(s), "%.*s", size, p);
                if (rte_strsplit(s, sizeof(s), str_fld, _NUM_FLD, ',') != _NUM_FLD)
                        return -1;
                for (i = 0; i < _NUM_FLD; i++) {
@@ -658,7 +654,7 @@ init_mem(void)
                        return -1;
                }
                if (pktmbuf_pool[socketid] == NULL) {
-                       rte_snprintf(s, sizeof(s), "mbuf_pool_%d", socketid);
+                       snprintf(s, sizeof(s), "mbuf_pool_%d", socketid);
                        pktmbuf_pool[socketid] =
                                rte_mempool_create(s, NB_MBUF, MBUF_SIZE, 32,
                                        sizeof(struct rte_pktmbuf_pool_private),
@@ -685,7 +681,8 @@ MAIN(int argc, char **argv)
        uint16_t queueid;
        unsigned lcoreid;
        uint32_t nb_tx_queue;
-       uint8_t portid, nb_rx_queue, queue, socketid;
+       uint8_t portid, nb_rx_queue, queue, socketid, last_port;
+        unsigned nb_ports_in_mask = 0;
 
        /* init EAL */
        ret = rte_eal_init(argc, argv);
@@ -699,16 +696,6 @@ MAIN(int argc, char **argv)
        if (ret < 0)
                return -1;
 
-       /* init driver */
-#ifdef RTE_LIBRTE_IGB_PMD
-       if (rte_igb_pmd_init() < 0)
-               rte_panic("Cannot init igb pmd\n");
-#endif
-#ifdef RTE_LIBRTE_IXGBE_PMD
-       if (rte_ixgbe_pmd_init() < 0)
-               rte_panic("Cannot init ixgbe pmd\n");
-#endif
-
        if (rte_eal_pci_probe() < 0)
                rte_panic("Cannot probe PCI\n");
 
@@ -730,6 +717,33 @@ MAIN(int argc, char **argv)
        if (check_port_config(nb_ports) < 0)
                rte_panic("check_port_config failed\n");
 
+        /* reset dst_ports */
+        for (portid = 0; portid < RTE_MAX_ETHPORTS; portid++)
+                dst_ports[portid] = 0;
+        last_port = 0;
+
+        /*
+         * Each logical core is assigned a dedicated TX queue on each port.
+         */
+        for (portid = 0; portid < nb_ports; portid++) {
+                /* skip ports that are not enabled */
+                if ((enabled_port_mask & (1 << portid)) == 0)
+                        continue;
+
+                if (nb_ports_in_mask % 2) {
+                        dst_ports[portid] = last_port;
+                        dst_ports[last_port] = portid;
+                }
+                else
+                        last_port = portid;
+
+                nb_ports_in_mask++;
+        }
+        if (nb_ports_in_mask % 2) {
+                printf("Notice: odd number of ports in portmask.\n");
+                dst_ports[last_port] = last_port;
+        }
+
        /* initialize all ports */
        for (portid = 0; portid < nb_ports; portid++) {
                /* skip ports that are not enabled */
@@ -796,7 +810,7 @@ MAIN(int argc, char **argv)
                        fflush(stdout);
 
                        ret = rte_eth_rx_queue_setup(portid, queueid, nb_rxd,
-                                       socketid, &rx_conf, pktmbuf_pool[socketid]);
+                                       socketid, &rx_conf, pktmbuf_pool[socketid]);
                        if (ret < 0)
                                rte_panic("rte_eth_rx_queue_setup: err=%d,"
                                                "port=%d\n", ret, portid);