app/testpmd: request link status interrupt
[dpdk.git] / app / test-pmd / parameters.c
index 19fbf46..e3499cd 100644 (file)
@@ -1,7 +1,7 @@
 /*-
  *   BSD LICENSE
  *
- *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
+ *   Copyright(c) 2010-2017 Intel Corporation. All rights reserved.
  *   All rights reserved.
  *
  *   Redistribution and use in source and binary forms, with or without
 #include <rte_memory.h>
 #include <rte_memzone.h>
 #include <rte_launch.h>
-#include <rte_tailq.h>
 #include <rte_eal.h>
 #include <rte_per_lcore.h>
 #include <rte_lcore.h>
 #include <rte_atomic.h>
 #include <rte_branch_prediction.h>
-#include <rte_ring.h>
 #include <rte_mempool.h>
 #include <rte_interrupts.h>
 #include <rte_pci.h>
@@ -78,6 +76,7 @@
 #ifdef RTE_LIBRTE_PMD_BOND
 #include <rte_eth_bond.h>
 #endif
+#include <rte_flow.h>
 
 #include "testpmd.h"
 
@@ -145,18 +144,22 @@ usage(char* progname)
               "(N: none  or match (default) or always).\n");
        printf("  --pkt-filter-size=N: set Flow Director mode "
               "(N: 64K (default mode) or 128K or 256K).\n");
-       printf("  --pkt-filter-flexbytes-offset=N: set flexbytes-offset. "
-              "The offset is defined in word units counted from the "
-              "first byte of the destination Ethernet MAC address. "
-              "0 <= N <= 32.\n");
        printf("  --pkt-filter-drop-queue=N: set drop-queue. "
               "In perfect mode, when you add a rule with queue = -1 "
               "the packet will be enqueued into the rx drop-queue. "
               "If the drop-queue doesn't exist, the packet is dropped. "
               "By default drop-queue=127.\n");
-       printf("  --crc-strip: enable CRC stripping by hardware.\n");
+#ifdef RTE_LIBRTE_LATENCY_STATS
+       printf("  --latencystats=N: enable latency and jitter statistcs "
+              "monitoring on forwarding lcore id N.\n");
+#endif
+       printf("  --disable-crc-strip: disable CRC stripping by hardware.\n");
+       printf("  --enable-lro: enable large receive offload.\n");
        printf("  --enable-rx-cksum: enable rx hardware checksum offload.\n");
        printf("  --disable-hw-vlan: disable hardware vlan.\n");
+       printf("  --disable-hw-vlan-filter: disable hardware vlan filter.\n");
+       printf("  --disable-hw-vlan-strip: disable hardware vlan strip.\n");
+       printf("  --disable-hw-vlan-extend: disable hardware vlan extend.\n");
        printf("  --enable-drop-en: enable per queue packet drop.\n");
        printf("  --disable-rss: disable rss.\n");
        printf("  --port-topology=N: set port topology (N: paired (default) or "
@@ -193,9 +196,11 @@ usage(char* progname)
               "(0 <= mapping <= %d).\n", RTE_ETHDEV_QUEUE_STAT_CNTRS - 1);
        printf("  --no-flush-rx: Don't flush RX streams before forwarding."
               " Used mainly with PCAP drivers.\n");
-       printf("  --txpkts=X[,Y]*: set TX segment sizes.\n");
+       printf("  --txpkts=X[,Y]*: set TX segment sizes"
+               " or total packet length.\n");
        printf("  --disable-link-check: disable check on link status when "
               "starting/stopping ports.\n");
+       printf("  --no-lsc-interrupt: disable link status change interrupt.\n");
 }
 
 #ifdef RTE_LIBRTE_CMDLINE
@@ -370,6 +375,7 @@ parse_portnuma_config(const char *q_arg)
        };
        unsigned long int_fld[_NUM_FLD];
        char *str_fld[_NUM_FLD];
+       portid_t pid;
 
        /* reset from value set at definition */
        while ((p = strchr(p0,'(')) != NULL) {
@@ -391,14 +397,17 @@ parse_portnuma_config(const char *q_arg)
                                return -1;
                }
                port_id = (uint8_t)int_fld[FLD_PORT];
-               if (port_id >= nb_ports) {
-                       printf("Invalid port, range is [0, %d]\n", nb_ports - 1);
+               if (port_id_is_invalid(port_id, ENABLED_WARN)) {
+                       printf("Valid port range is [0");
+                       RTE_ETH_FOREACH_DEV(pid)
+                               printf(", %d", pid);
+                       printf("]\n");
                        return -1;
                }
                socket_id = (uint8_t)int_fld[FLD_SOCKET];
-               if(socket_id >= MAX_SOCKET) {
+               if(socket_id >= max_socket) {
                        printf("Invalid socket id, range is [0, %d]\n",
-                                MAX_SOCKET - 1);
+                                max_socket - 1);
                        return -1;
                }
                port_numa[port_id] = socket_id;
@@ -423,6 +432,7 @@ parse_ringnuma_config(const char *q_arg)
        };
        unsigned long int_fld[_NUM_FLD];
        char *str_fld[_NUM_FLD];
+       portid_t pid;
        #define RX_RING_ONLY 0x1
        #define TX_RING_ONLY 0x2
        #define RXTX_RING    0x3
@@ -447,14 +457,17 @@ parse_ringnuma_config(const char *q_arg)
                                return -1;
                }
                port_id = (uint8_t)int_fld[FLD_PORT];
-               if (port_id >= nb_ports) {
-                       printf("Invalid port, range is [0, %d]\n", nb_ports - 1);
+               if (port_id_is_invalid(port_id, ENABLED_WARN)) {
+                       printf("Valid port range is [0");
+                       RTE_ETH_FOREACH_DEV(pid)
+                               printf(", %d", pid);
+                       printf("]\n");
                        return -1;
                }
                socket_id = (uint8_t)int_fld[FLD_SOCKET];
-               if (socket_id >= MAX_SOCKET) {
+               if (socket_id >= max_socket) {
                        printf("Invalid socket id, range is [0, %d]\n",
-                               MAX_SOCKET - 1);
+                               max_socket - 1);
                        return -1;
                }
                ring_flag = (uint8_t)int_fld[FLD_FLAG];
@@ -517,11 +530,18 @@ launch_args_parse(int argc, char** argv)
                { "pkt-filter-mode",            1, 0, 0 },
                { "pkt-filter-report-hash",     1, 0, 0 },
                { "pkt-filter-size",            1, 0, 0 },
-               { "pkt-filter-flexbytes-offset",1, 0, 0 },
                { "pkt-filter-drop-queue",      1, 0, 0 },
-               { "crc-strip",                  0, 0, 0 },
+#ifdef RTE_LIBRTE_LATENCY_STATS
+               { "latencystats",               1, 0, 0 },
+#endif
+               { "disable-crc-strip",          0, 0, 0 },
+               { "enable-lro",                 0, 0, 0 },
                { "enable-rx-cksum",            0, 0, 0 },
+               { "enable-scatter",             0, 0, 0 },
                { "disable-hw-vlan",            0, 0, 0 },
+               { "disable-hw-vlan-filter",     0, 0, 0 },
+               { "disable-hw-vlan-strip",      0, 0, 0 },
+               { "disable-hw-vlan-extend",     0, 0, 0 },
                { "enable-drop-en",            0, 0, 0 },
                { "disable-rss",                0, 0, 0 },
                { "port-topology",              1, 0, 0 },
@@ -549,6 +569,7 @@ launch_args_parse(int argc, char** argv)
                { "no-flush-rx",        0, 0, 0 },
                { "txpkts",                     1, 0, 0 },
                { "disable-link-check",         0, 0, 0 },
+               { "no-lsc-interrupt",           0, 0, 0 },
                { 0, 0, 0, 0 },
        };
 
@@ -624,8 +645,7 @@ launch_args_parse(int argc, char** argv)
                                        nb_fwd_ports = (uint8_t) n;
                                else
                                        rte_exit(EXIT_FAILURE,
-                                                "nb-ports should be > 0 and <= %d\n",
-                                                nb_ports);
+                                                "Invalid port %d\n", n);
                        }
                        if (!strcmp(lgopts[opt_idx].name, "nb-cores")) {
                                n = atoi(optarg);
@@ -660,12 +680,12 @@ launch_args_parse(int argc, char** argv)
                                           "invalid ring-numa configuration\n");
                        if (!strcmp(lgopts[opt_idx].name, "socket-num")) {
                                n = atoi(optarg);
-                               if(n < MAX_SOCKET)
+                               if((uint8_t)n < max_socket)
                                        socket_num = (uint8_t)n;
                                else
                                        rte_exit(EXIT_FAILURE,
                                                "The socket number should be < %d\n",
-                                               MAX_SOCKET);
+                                               max_socket);
                        }
                        if (!strcmp(lgopts[opt_idx].name, "mbuf-size")) {
                                n = atoi(optarg);
@@ -700,12 +720,17 @@ launch_args_parse(int argc, char** argv)
                                                RTE_FDIR_MODE_SIGNATURE;
                                else if (!strcmp(optarg, "perfect"))
                                        fdir_conf.mode = RTE_FDIR_MODE_PERFECT;
+                               else if (!strcmp(optarg, "perfect-mac-vlan"))
+                                       fdir_conf.mode = RTE_FDIR_MODE_PERFECT_MAC_VLAN;
+                               else if (!strcmp(optarg, "perfect-tunnel"))
+                                       fdir_conf.mode = RTE_FDIR_MODE_PERFECT_TUNNEL;
                                else if (!strcmp(optarg, "none"))
                                        fdir_conf.mode = RTE_FDIR_MODE_NONE;
                                else
                                        rte_exit(EXIT_FAILURE,
                                                 "pkt-mode-invalid %s invalid - must be: "
-                                                "none, signature or perfect\n",
+                                                "none, signature, perfect, perfect-mac-vlan"
+                                                " or perfect-tunnel\n",
                                                 optarg);
                        }
                        if (!strcmp(lgopts[opt_idx].name,
@@ -740,17 +765,6 @@ launch_args_parse(int argc, char** argv)
                                                 " must be: 64K or 128K or 256K\n",
                                                 optarg);
                        }
-                       if (!strcmp(lgopts[opt_idx].name,
-                                   "pkt-filter-flexbytes-offset")) {
-                               n = atoi(optarg);
-                               if ( n >= 0 && n <= (int) 32)
-                                       fdir_conf.flexbytes_offset =
-                                               (uint8_t) n;
-                               else
-                                       rte_exit(EXIT_FAILURE,
-                                                "flexbytes %d invalid - must"
-                                                "be  >= 0 && <= 32\n", n);
-                       }
                        if (!strcmp(lgopts[opt_idx].name,
                                    "pkt-filter-drop-queue")) {
                                n = atoi(optarg);
@@ -761,8 +775,25 @@ launch_args_parse(int argc, char** argv)
                                                 "drop queue %d invalid - must"
                                                 "be >= 0 \n", n);
                        }
-                       if (!strcmp(lgopts[opt_idx].name, "crc-strip"))
-                               rx_mode.hw_strip_crc = 1;
+#ifdef RTE_LIBRTE_LATENCY_STATS
+                       if (!strcmp(lgopts[opt_idx].name,
+                                   "latencystats")) {
+                               n = atoi(optarg);
+                               if (n >= 0) {
+                                       latencystats_lcore_id = (lcoreid_t) n;
+                                       latencystats_enabled = 1;
+                               } else
+                                       rte_exit(EXIT_FAILURE,
+                                                "invalid lcore id %d for latencystats"
+                                                " must be >= 0\n", n);
+                       }
+#endif
+                       if (!strcmp(lgopts[opt_idx].name, "disable-crc-strip"))
+                               rx_mode.hw_strip_crc = 0;
+                       if (!strcmp(lgopts[opt_idx].name, "enable-lro"))
+                               rx_mode.enable_lro = 1;
+                       if (!strcmp(lgopts[opt_idx].name, "enable-scatter"))
+                               rx_mode.enable_scatter = 1;
                        if (!strcmp(lgopts[opt_idx].name, "enable-rx-cksum"))
                                rx_mode.hw_ip_checksum = 1;
 
@@ -772,6 +803,18 @@ launch_args_parse(int argc, char** argv)
                                rx_mode.hw_vlan_extend = 0;
                        }
 
+                       if (!strcmp(lgopts[opt_idx].name,
+                                       "disable-hw-vlan-filter"))
+                               rx_mode.hw_vlan_filter = 0;
+
+                       if (!strcmp(lgopts[opt_idx].name,
+                                       "disable-hw-vlan-strip"))
+                               rx_mode.hw_vlan_strip  = 0;
+
+                       if (!strcmp(lgopts[opt_idx].name,
+                                       "disable-hw-vlan-extend"))
+                               rx_mode.hw_vlan_extend = 0;
+
                        if (!strcmp(lgopts[opt_idx].name, "enable-drop-en"))
                                rx_drop_en = 1;
 
@@ -797,22 +840,26 @@ launch_args_parse(int argc, char** argv)
                                rss_hf = ETH_RSS_UDP;
                        if (!strcmp(lgopts[opt_idx].name, "rxq")) {
                                n = atoi(optarg);
-                               if (n >= 1 && n <= (int) MAX_QUEUE_ID)
+                               if (n >= 0 && n <= (int) MAX_QUEUE_ID)
                                        nb_rxq = (queueid_t) n;
                                else
                                        rte_exit(EXIT_FAILURE, "rxq %d invalid - must be"
-                                                 " >= 1 && <= %d\n", n,
+                                                 " >= 0 && <= %d\n", n,
                                                  (int) MAX_QUEUE_ID);
                        }
                        if (!strcmp(lgopts[opt_idx].name, "txq")) {
                                n = atoi(optarg);
-                               if (n >= 1 && n <= (int) MAX_QUEUE_ID)
+                               if (n >= 0 && n <= (int) MAX_QUEUE_ID)
                                        nb_txq = (queueid_t) n;
                                else
                                        rte_exit(EXIT_FAILURE, "txq %d invalid - must be"
-                                                 " >= 1 && <= %d\n", n,
+                                                 " >= 0 && <= %d\n", n,
                                                  (int) MAX_QUEUE_ID);
                        }
+                       if (!nb_rxq && !nb_txq) {
+                               rte_exit(EXIT_FAILURE, "Either rx or tx queues should "
+                                               "be non-zero\n");
+                       }
                        if (!strcmp(lgopts[opt_idx].name, "burst")) {
                                n = atoi(optarg);
                                if ((n >= 1) && (n <= MAX_PKT_BURST))
@@ -953,6 +1000,8 @@ launch_args_parse(int argc, char** argv)
                                no_flush_rx = 1;
                        if (!strcmp(lgopts[opt_idx].name, "disable-link-check"))
                                no_link_check = 1;
+                       if (!strcmp(lgopts[opt_idx].name, "no-lsc-interrupt"))
+                               lsc_interrupt = 0;
 
                        break;
                case 'h':