ethdev: increase port id range
[dpdk.git] / examples / l3fwd / main.c
index acedd20..a5e55ba 100644 (file)
@@ -52,7 +52,6 @@
 #include <rte_memcpy.h>
 #include <rte_memzone.h>
 #include <rte_eal.h>
-#include <rte_per_lcore.h>
 #include <rte_launch.h>
 #include <rte_atomic.h>
 #include <rte_cycles.h>
@@ -66,7 +65,6 @@
 #include <rte_debug.h>
 #include <rte_ether.h>
 #include <rte_ethdev.h>
-#include <rte_ring.h>
 #include <rte_mempool.h>
 #include <rte_mbuf.h>
 #include <rte_ip.h>
@@ -126,7 +124,7 @@ uint32_t hash_entry_number = HASH_ENTRY_NUMBER_DEFAULT;
 struct lcore_conf lcore_conf[RTE_MAX_LCORE];
 
 struct lcore_params {
-       uint8_t port_id;
+       uint16_t port_id;
        uint8_t queue_id;
        uint8_t lcore_id;
 } __rte_cache_aligned;
@@ -157,7 +155,7 @@ static struct rte_eth_conf port_conf = {
                .hw_ip_checksum = 1, /**< IP checksum offload enabled */
                .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 */
        },
        .rx_adv_conf = {
                .rss_conf = {
@@ -247,7 +245,7 @@ check_lcore_params(void)
 static int
 check_port_config(const unsigned nb_ports)
 {
-       unsigned portid;
+       uint16_t portid;
        uint16_t i;
 
        for (i = 0; i < nb_lcore_params; ++i) {
@@ -265,7 +263,7 @@ check_port_config(const unsigned nb_ports)
 }
 
 static uint8_t
-get_port_n_rx_queues(const uint8_t port)
+get_port_n_rx_queues(const uint16_t port)
 {
        int queue = -1;
        uint16_t i;
@@ -447,7 +445,7 @@ parse_config(const char *q_arg)
 static void
 parse_eth_dest(const char *optarg)
 {
-       uint8_t portid;
+       uint16_t portid;
        char *port_end;
        uint8_t c, *dest, peer_addr[6];
 
@@ -475,6 +473,13 @@ parse_eth_dest(const char *optarg)
 #define MAX_JUMBO_PKT_LEN  9600
 #define MEMPOOL_CACHE_SIZE 256
 
+static const char short_options[] =
+       "p:"  /* portmask */
+       "P"   /* promiscuous */
+       "L"   /* enable long prefix match */
+       "E"   /* enable exact match */
+       ;
+
 #define CMD_LINE_OPT_CONFIG "config"
 #define CMD_LINE_OPT_ETH_DEST "eth-dest"
 #define CMD_LINE_OPT_NO_NUMA "no-numa"
@@ -482,6 +487,31 @@ parse_eth_dest(const char *optarg)
 #define CMD_LINE_OPT_ENABLE_JUMBO "enable-jumbo"
 #define CMD_LINE_OPT_HASH_ENTRY_NUM "hash-entry-num"
 #define CMD_LINE_OPT_PARSE_PTYPE "parse-ptype"
+enum {
+       /* long options mapped to a short option */
+
+       /* first long only option value must be >= 256, so that we won't
+        * conflict with short options */
+       CMD_LINE_OPT_MIN_NUM = 256,
+       CMD_LINE_OPT_CONFIG_NUM,
+       CMD_LINE_OPT_ETH_DEST_NUM,
+       CMD_LINE_OPT_NO_NUMA_NUM,
+       CMD_LINE_OPT_IPV6_NUM,
+       CMD_LINE_OPT_ENABLE_JUMBO_NUM,
+       CMD_LINE_OPT_HASH_ENTRY_NUM_NUM,
+       CMD_LINE_OPT_PARSE_PTYPE_NUM,
+};
+
+static const struct option lgopts[] = {
+       {CMD_LINE_OPT_CONFIG, 1, 0, CMD_LINE_OPT_CONFIG_NUM},
+       {CMD_LINE_OPT_ETH_DEST, 1, 0, CMD_LINE_OPT_ETH_DEST_NUM},
+       {CMD_LINE_OPT_NO_NUMA, 0, 0, CMD_LINE_OPT_NO_NUMA_NUM},
+       {CMD_LINE_OPT_IPV6, 0, 0, CMD_LINE_OPT_IPV6_NUM},
+       {CMD_LINE_OPT_ENABLE_JUMBO, 0, 0, CMD_LINE_OPT_ENABLE_JUMBO_NUM},
+       {CMD_LINE_OPT_HASH_ENTRY_NUM, 1, 0, CMD_LINE_OPT_HASH_ENTRY_NUM_NUM},
+       {CMD_LINE_OPT_PARSE_PTYPE, 0, 0, CMD_LINE_OPT_PARSE_PTYPE_NUM},
+       {NULL, 0, 0, 0}
+};
 
 /*
  * This expression is used to calculate the number of mbufs needed
@@ -491,10 +521,10 @@ parse_eth_dest(const char *optarg)
  * value of 8192
  */
 #define NB_MBUF RTE_MAX(       \
-       (nb_ports*nb_rx_queue*RTE_TEST_RX_DESC_DEFAULT +        \
-       nb_ports*nb_lcores*MAX_PKT_BURST +                      \
-       nb_ports*n_tx_queue*RTE_TEST_TX_DESC_DEFAULT +          \
-       nb_lcores*MEMPOOL_CACHE_SIZE),                          \
+       (nb_ports*nb_rx_queue*nb_rxd +          \
+       nb_ports*nb_lcores*MAX_PKT_BURST +      \
+       nb_ports*n_tx_queue*nb_txd +            \
+       nb_lcores*MEMPOOL_CACHE_SIZE),          \
        (unsigned)8192)
 
 /* Parse the argument given in the command line of the application */
@@ -505,16 +535,6 @@ parse_args(int argc, char **argv)
        char **argvopt;
        int option_index;
        char *prgname = argv[0];
-       static struct option lgopts[] = {
-               {CMD_LINE_OPT_CONFIG, 1, 0, 0},
-               {CMD_LINE_OPT_ETH_DEST, 1, 0, 0},
-               {CMD_LINE_OPT_NO_NUMA, 0, 0, 0},
-               {CMD_LINE_OPT_IPV6, 0, 0, 0},
-               {CMD_LINE_OPT_ENABLE_JUMBO, 0, 0, 0},
-               {CMD_LINE_OPT_HASH_ENTRY_NUM, 1, 0, 0},
-               {CMD_LINE_OPT_PARSE_PTYPE, 0, 0, 0},
-               {NULL, 0, 0, 0}
-       };
 
        argvopt = argv;
 
@@ -535,7 +555,7 @@ parse_args(int argc, char **argv)
                "L3FWD: LPM and EM are mutually exclusive, select only one";
        const char *str13 = "L3FWD: LPM or EM none selected, default LPM on";
 
-       while ((opt = getopt_long(argc, argvopt, "p:PLE",
+       while ((opt = getopt_long(argc, argvopt, short_options,
                                lgopts, &option_index)) != EOF) {
 
                switch (opt) {
@@ -548,6 +568,7 @@ parse_args(int argc, char **argv)
                                return -1;
                        }
                        break;
+
                case 'P':
                        printf("%s\n", str2);
                        promiscuous_on = 1;
@@ -564,89 +585,71 @@ parse_args(int argc, char **argv)
                        break;
 
                /* long options */
-               case 0:
-                       if (!strncmp(lgopts[option_index].name,
-                                       CMD_LINE_OPT_CONFIG,
-                                       sizeof(CMD_LINE_OPT_CONFIG))) {
-
-                               ret = parse_config(optarg);
-                               if (ret) {
-                                       printf("%s\n", str5);
-                                       print_usage(prgname);
-                                       return -1;
-                               }
-                       }
-
-                       if (!strncmp(lgopts[option_index].name,
-                                       CMD_LINE_OPT_ETH_DEST,
-                                       sizeof(CMD_LINE_OPT_ETH_DEST))) {
-                                       parse_eth_dest(optarg);
-                       }
-
-                       if (!strncmp(lgopts[option_index].name,
-                                       CMD_LINE_OPT_NO_NUMA,
-                                       sizeof(CMD_LINE_OPT_NO_NUMA))) {
-                               printf("%s\n", str6);
-                               numa_on = 0;
+               case CMD_LINE_OPT_CONFIG_NUM:
+                       ret = parse_config(optarg);
+                       if (ret) {
+                               printf("%s\n", str5);
+                               print_usage(prgname);
+                               return -1;
                        }
+                       break;
 
-                       if (!strncmp(lgopts[option_index].name,
-                               CMD_LINE_OPT_IPV6,
-                               sizeof(CMD_LINE_OPT_IPV6))) {
-                               printf("%sn", str7);
-                               ipv6 = 1;
-                       }
+               case CMD_LINE_OPT_ETH_DEST_NUM:
+                       parse_eth_dest(optarg);
+                       break;
 
-                       if (!strncmp(lgopts[option_index].name,
-                                       CMD_LINE_OPT_ENABLE_JUMBO,
-                                       sizeof(CMD_LINE_OPT_ENABLE_JUMBO))) {
-                               struct option lenopts = {
-                                       "max-pkt-len", required_argument, 0, 0
-                               };
-
-                               printf("%s\n", str8);
-                               port_conf.rxmode.jumbo_frame = 1;
-
-                               /*
-                                * if no max-pkt-len set, use the default
-                                * value ETHER_MAX_LEN.
-                                */
-                               if (0 == getopt_long(argc, argvopt, "",
-                                               &lenopts, &option_index)) {
-                                       ret = parse_max_pkt_len(optarg);
-                                       if ((ret < 64) ||
-                                               (ret > MAX_JUMBO_PKT_LEN)) {
-                                               printf("%s\n", str9);
-                                               print_usage(prgname);
-                                               return -1;
-                                       }
-                                       port_conf.rxmode.max_rx_pkt_len = ret;
-                               }
-                               printf("%s %u\n", str10,
-                               (unsigned int)port_conf.rxmode.max_rx_pkt_len);
-                       }
+               case CMD_LINE_OPT_NO_NUMA_NUM:
+                       printf("%s\n", str6);
+                       numa_on = 0;
+                       break;
 
-                       if (!strncmp(lgopts[option_index].name,
-                               CMD_LINE_OPT_HASH_ENTRY_NUM,
-                               sizeof(CMD_LINE_OPT_HASH_ENTRY_NUM))) {
+               case CMD_LINE_OPT_IPV6_NUM:
+                       printf("%sn", str7);
+                       ipv6 = 1;
+                       break;
 
-                               ret = parse_hash_entry_number(optarg);
-                               if ((ret > 0) && (ret <= L3FWD_HASH_ENTRIES)) {
-                                       hash_entry_number = ret;
-                               } else {
-                                       printf("%s\n", str11);
+               case CMD_LINE_OPT_ENABLE_JUMBO_NUM: {
+                       struct option lenopts = {
+                               "max-pkt-len", required_argument, 0, 0
+                       };
+
+                       printf("%s\n", str8);
+                       port_conf.rxmode.jumbo_frame = 1;
+
+                       /*
+                        * if no max-pkt-len set, use the default
+                        * value ETHER_MAX_LEN.
+                        */
+                       if (getopt_long(argc, argvopt, "",
+                                       &lenopts, &option_index) == 0) {
+                               ret = parse_max_pkt_len(optarg);
+                               if ((ret < 64) ||
+                                       (ret > MAX_JUMBO_PKT_LEN)) {
+                                       printf("%s\n", str9);
                                        print_usage(prgname);
                                        return -1;
                                }
+                               port_conf.rxmode.max_rx_pkt_len = ret;
                        }
+                       printf("%s %u\n", str10,
+                               (unsigned int)port_conf.rxmode.max_rx_pkt_len);
+                       break;
+               }
 
-                       if (!strncmp(lgopts[option_index].name,
-                                    CMD_LINE_OPT_PARSE_PTYPE,
-                                    sizeof(CMD_LINE_OPT_PARSE_PTYPE))) {
-                               printf("soft parse-ptype is enabled\n");
-                               parse_ptype = 1;
+               case CMD_LINE_OPT_HASH_ENTRY_NUM_NUM:
+                       ret = parse_hash_entry_number(optarg);
+                       if ((ret > 0) && (ret <= L3FWD_HASH_ENTRIES)) {
+                               hash_entry_number = ret;
+                       } else {
+                               printf("%s\n", str11);
+                               print_usage(prgname);
+                               return -1;
                        }
+                       break;
 
+               case CMD_LINE_OPT_PARSE_PTYPE_NUM:
+                       printf("soft parse-ptype is enabled\n");
+                       parse_ptype = 1;
                        break;
 
                default:
@@ -684,7 +687,7 @@ parse_args(int argc, char **argv)
                argv[optind-1] = prgname;
 
        ret = optind-1;
-       optind = 0; /* reset getopt lib */
+       optind = 1; /* reset getopt lib */
        return ret;
 }
 
@@ -747,11 +750,12 @@ init_mem(unsigned nb_mbuf)
 
 /* 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");
@@ -770,14 +774,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 */
@@ -815,7 +818,7 @@ signal_handler(int signum)
 }
 
 static int
-prepare_ptype_parser(uint8_t portid, uint16_t queueid)
+prepare_ptype_parser(uint16_t portid, uint16_t queueid)
 {
        if (parse_ptype) {
                printf("Port %d: softly parse packet type info\n", portid);
@@ -844,10 +847,10 @@ main(int argc, char **argv)
        struct rte_eth_txconf *txconf;
        int ret;
        unsigned nb_ports;
-       uint16_t queueid;
+       uint16_t queueid, portid;
        unsigned lcore_id;
        uint32_t n_tx_queue, nb_lcores;
-       uint8_t portid, nb_rx_queue, queue, socketid;
+       uint8_t nb_rx_queue, queue, socketid;
 
        /* init EAL */
        ret = rte_eal_init(argc, argv);
@@ -914,6 +917,13 @@ main(int argc, char **argv)
                                "Cannot configure device: err=%d, port=%d\n",
                                ret, portid);
 
+               ret = rte_eth_dev_adjust_nb_rx_tx_desc(portid, &nb_rxd,
+                                                      &nb_txd);
+               if (ret < 0)
+                       rte_exit(EXIT_FAILURE,
+                                "Cannot adjust number of descriptors: err=%d, "
+                                "port=%d\n", ret, portid);
+
                rte_eth_macaddr_get(portid, &ports_eth_addr[portid]);
                print_ethaddr(" Address:", &ports_eth_addr[portid]);
                printf(", ");
@@ -1038,7 +1048,7 @@ main(int argc, char **argv)
        }
 
 
-       check_all_ports_link_status((uint8_t)nb_ports, enabled_port_mask);
+       check_all_ports_link_status(nb_ports, enabled_port_mask);
 
        ret = 0;
        /* launch per-lcore init on every lcore */