app/testpmd: add retry option
[dpdk.git] / app / test-pmd / config.c
index 938b456..eb5514d 100644 (file)
@@ -1,7 +1,7 @@
 /*-
  *   BSD LICENSE
  *
- *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
+ *   Copyright(c) 2010-2016 Intel Corporation. All rights reserved.
  *   All rights reserved.
  *
  *   Redistribution and use in source and binary forms, with or without
 
 static char *flowtype_to_str(uint16_t flow_type);
 
+static const struct {
+       enum tx_pkt_split split;
+       const char *name;
+} tx_split_name[] = {
+       {
+               .split = TX_PKT_SPLIT_OFF,
+               .name = "off",
+       },
+       {
+               .split = TX_PKT_SPLIT_ON,
+               .name = "on",
+       },
+       {
+               .split = TX_PKT_SPLIT_RND,
+               .name = "rand",
+       },
+};
+
 struct rss_type_info {
        char str[32];
        uint64_t rss_type;
@@ -154,9 +172,7 @@ nic_stats_display(portid_t port_id)
                printf("  RX-packets: %-10"PRIu64" RX-missed: %-10"PRIu64" RX-bytes:  "
                       "%-"PRIu64"\n",
                       stats.ipackets, stats.imissed, stats.ibytes);
-               printf("  RX-badcrc:  %-10"PRIu64" RX-badlen: %-10"PRIu64" RX-errors: "
-                      "%-"PRIu64"\n",
-                      stats.ibadcrc, stats.ibadlen, stats.ierrors);
+               printf("  RX-errors: %-"PRIu64"\n", stats.ierrors);
                printf("  RX-nombuf:  %-10"PRIu64"\n",
                       stats.rx_nombuf);
                printf("  TX-packets: %-10"PRIu64" TX-errors: %-10"PRIu64" TX-bytes:  "
@@ -167,9 +183,7 @@ nic_stats_display(portid_t port_id)
                printf("  RX-packets:              %10"PRIu64"    RX-errors: %10"PRIu64
                       "    RX-bytes: %10"PRIu64"\n",
                       stats.ipackets, stats.ierrors, stats.ibytes);
-               printf("  RX-badcrc:               %10"PRIu64"    RX-badlen: %10"PRIu64
-                      "  RX-errors:  %10"PRIu64"\n",
-                      stats.ibadcrc, stats.ibadlen, stats.ierrors);
+               printf("  RX-errors:  %10"PRIu64"\n", stats.ierrors);
                printf("  RX-nombuf:               %10"PRIu64"\n",
                       stats.rx_nombuf);
                printf("  TX-packets:              %10"PRIu64"    TX-errors: %10"PRIu64
@@ -177,12 +191,6 @@ nic_stats_display(portid_t port_id)
                       stats.opackets, stats.oerrors, stats.obytes);
        }
 
-       /* stats fdir */
-       if (fdir_conf.mode != RTE_FDIR_MODE_NONE)
-               printf("  Fdirmiss:   %-10"PRIu64" Fdirmatch: %-10"PRIu64"\n",
-                      stats.fdirmiss,
-                      stats.fdirmatch);
-
        if (port->rx_queue_stats_mapping_enabled) {
                printf("\n");
                for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {
@@ -201,14 +209,6 @@ nic_stats_display(portid_t port_id)
                }
        }
 
-       /* Display statistics of XON/XOFF pause frames, if any. */
-       if ((stats.tx_pause_xon  | stats.rx_pause_xon |
-            stats.tx_pause_xoff | stats.rx_pause_xoff) > 0) {
-               printf("  RX-XOFF:    %-10"PRIu64" RX-XON:    %-10"PRIu64"\n",
-                      stats.rx_pause_xoff, stats.rx_pause_xon);
-               printf("  TX-XOFF:    %-10"PRIu64" TX-XON:    %-10"PRIu64"\n",
-                      stats.tx_pause_xoff, stats.tx_pause_xon);
-       }
        printf("  %s############################%s\n",
               nic_stats_border, nic_stats_border);
 }
@@ -750,7 +750,7 @@ ring_dma_zone_lookup(const char *ring_name, uint8_t port_id, uint16_t q_id)
                printf("%s ring memory zoneof (port %d, queue %d) not"
                       "found (zone name = %s\n",
                       ring_name, port_id, q_id, mz_name);
-       return (mz);
+       return mz;
 }
 
 union igb_ring_dword {
@@ -893,8 +893,9 @@ fwd_lcores_config_display(void)
 void
 rxtx_config_display(void)
 {
-       printf("  %s packet forwarding - CRC stripping %s - "
+       printf("  %s packet forwarding%s - CRC stripping %s - "
               "packets/burst=%d\n", cur_fwd_eng->fwd_mode_name,
+              retry_enabled == 0 ? "" : " with retry",
               rx_mode.hw_strip_crc ? "enabled" : "disabled",
               nb_pkt_per_burst);
 
@@ -1131,6 +1132,7 @@ simple_fwd_config_setup(void)
                fwd_streams[i]->tx_port   = fwd_ports_ids[j];
                fwd_streams[i]->tx_queue  = 0;
                fwd_streams[i]->peer_addr = j;
+               fwd_streams[i]->retry_enabled = retry_enabled;
 
                if (port_topology == PORT_TOPOLOGY_PAIRED) {
                        fwd_streams[j]->rx_port   = fwd_ports_ids[j];
@@ -1138,6 +1140,7 @@ simple_fwd_config_setup(void)
                        fwd_streams[j]->tx_port   = fwd_ports_ids[i];
                        fwd_streams[j]->tx_queue  = 0;
                        fwd_streams[j]->peer_addr = i;
+                       fwd_streams[j]->retry_enabled = retry_enabled;
                }
        }
 }
@@ -1206,6 +1209,7 @@ rss_fwd_config_setup(void)
                fs->tx_port = fwd_ports_ids[txp];
                fs->tx_queue = rxq;
                fs->peer_addr = fs->tx_port;
+               fs->retry_enabled = retry_enabled;
                rxq = (queueid_t) (rxq + 1);
                if (rxq < nb_q)
                        continue;
@@ -1251,10 +1255,7 @@ dcb_fwd_config_setup(void)
        /* reinitialize forwarding streams */
        init_fwd_streams();
        sm_id = 0;
-       if ((rxp & 0x1) == 0)
-               txp = (portid_t) (rxp + 1);
-       else
-               txp = (portid_t) (rxp - 1);
+       txp = 1;
        /* get the dcb info on the first RX and TX ports */
        (void)rte_eth_dev_get_dcb_info(fwd_ports_ids[rxp], &rxp_dcb_info);
        (void)rte_eth_dev_get_dcb_info(fwd_ports_ids[txp], &txp_dcb_info);
@@ -1283,6 +1284,7 @@ dcb_fwd_config_setup(void)
                                fs->tx_port = fwd_ports_ids[txp];
                                fs->tx_queue = txq + j % nb_tx_queue;
                                fs->peer_addr = fs->tx_port;
+                               fs->retry_enabled = retry_enabled;
                        }
                        fwd_lcores[lc_id]->stream_nb +=
                                rxp_dcb_info.tc_queue.tc_rxq[i][tc].nb_queue;
@@ -1351,8 +1353,9 @@ icmp_echo_config_setup(void)
                        fs->rx_port = fwd_ports_ids[rxp];
                        fs->rx_queue = rxq;
                        fs->tx_port = fs->rx_port;
-                       fs->tx_queue = lc_id;
+                       fs->tx_queue = rxq;
                        fs->peer_addr = fs->tx_port;
+                       fs->retry_enabled = retry_enabled;
                        if (verbose_level > 0)
                                printf("  stream=%d port=%d rxq=%d txq=%d\n",
                                       sm_id, fs->rx_port, fs->rx_queue,
@@ -1384,21 +1387,22 @@ fwd_config_setup(void)
                simple_fwd_config_setup();
 }
 
-static void
+void
 pkt_fwd_config_display(struct fwd_config *cfg)
 {
        struct fwd_stream *fs;
        lcoreid_t  lc_id;
        streamid_t sm_id;
 
-       printf("%s packet forwarding - ports=%d - cores=%d - streams=%d - "
+       printf("%s packet forwarding%s - ports=%d - cores=%d - streams=%d - "
                "NUMA support %s, MP over anonymous pages %s\n",
                cfg->fwd_eng->fwd_mode_name,
+               retry_enabled == 0 ? "" : " with retry",
                cfg->nb_fwd_ports, cfg->nb_fwd_lcores, cfg->nb_fwd_streams,
                numa_support == 1 ? "enabled" : "disabled",
                mp_anon != 0 ? "enabled" : "disabled");
 
-       if (strcmp(cfg->fwd_eng->fwd_mode_name, "mac_retry") == 0)
+       if (retry_enabled)
                printf("TX retry num: %u, delay between TX retries: %uus\n",
                        burst_tx_retry_num, burst_tx_delay_time);
        for (lc_id = 0; lc_id < cfg->nb_fwd_lcores; lc_id++) {
@@ -1423,14 +1427,6 @@ pkt_fwd_config_display(struct fwd_config *cfg)
        printf("\n");
 }
 
-
-void
-fwd_config_display(void)
-{
-       fwd_config_setup();
-       pkt_fwd_config_display(&cur_fwd_config);
-}
-
 int
 set_fwd_lcores_list(unsigned int *lcorelist, unsigned int nb_lc)
 {
@@ -1568,6 +1564,22 @@ set_fwd_ports_number(uint16_t nb_pt)
               (unsigned int) nb_fwd_ports);
 }
 
+int
+port_is_forwarding(portid_t port_id)
+{
+       unsigned int i;
+
+       if (port_id_is_invalid(port_id, ENABLED_WARN))
+               return -1;
+
+       for (i = 0; i < nb_fwd_ports; i++) {
+               if (fwd_ports_ids[i] == port_id)
+                       return 1;
+       }
+
+       return 0;
+}
+
 void
 set_nb_pkt_per_burst(uint16_t nb)
 {
@@ -1582,6 +1594,49 @@ set_nb_pkt_per_burst(uint16_t nb)
               (unsigned int) nb_pkt_per_burst);
 }
 
+static const char *
+tx_split_get_name(enum tx_pkt_split split)
+{
+       uint32_t i;
+
+       for (i = 0; i != RTE_DIM(tx_split_name); i++) {
+               if (tx_split_name[i].split == split)
+                       return tx_split_name[i].name;
+       }
+       return NULL;
+}
+
+void
+set_tx_pkt_split(const char *name)
+{
+       uint32_t i;
+
+       for (i = 0; i != RTE_DIM(tx_split_name); i++) {
+               if (strcmp(tx_split_name[i].name, name) == 0) {
+                       tx_pkt_split = tx_split_name[i].split;
+                       return;
+               }
+       }
+       printf("unknown value: \"%s\"\n", name);
+}
+
+void
+show_tx_pkt_segments(void)
+{
+       uint32_t i, n;
+       const char *split;
+
+       n = tx_pkt_nb_segs;
+       split = tx_split_get_name(tx_pkt_split);
+
+       printf("Number of segments: %u\n", n);
+       printf("Segment sizes: ");
+       for (i = 0; i != n - 1; i++)
+               printf("%hu,", tx_pkt_seg_lengths[i]);
+       printf("%hu\n", tx_pkt_seg_lengths[i]);
+       printf("Split packet: %s\n", split);
+}
+
 void
 set_tx_pkt_segments(unsigned *seg_lengths, unsigned nb_segs)
 {
@@ -1633,8 +1688,35 @@ list_pkt_forwarding_modes(void)
 
        if (strlen (fwd_modes) == 0) {
                while ((fwd_eng = fwd_engines[i++]) != NULL) {
-                       strcat(fwd_modes, fwd_eng->fwd_mode_name);
-                       strcat(fwd_modes, separator);
+                       strncat(fwd_modes, fwd_eng->fwd_mode_name,
+                                       sizeof(fwd_modes) - strlen(fwd_modes) - 1);
+                       strncat(fwd_modes, separator,
+                                       sizeof(fwd_modes) - strlen(fwd_modes) - 1);
+               }
+               fwd_modes[strlen(fwd_modes) - strlen(separator)] = '\0';
+       }
+
+       return fwd_modes;
+}
+
+char*
+list_pkt_forwarding_retry_modes(void)
+{
+       static char fwd_modes[128] = "";
+       const char *separator = "|";
+       struct fwd_engine *fwd_eng;
+       unsigned i = 0;
+
+       if (strlen(fwd_modes) == 0) {
+               while ((fwd_eng = fwd_engines[i++]) != NULL) {
+                       if (fwd_eng == &rx_only_engine)
+                               continue;
+                       strncat(fwd_modes, fwd_eng->fwd_mode_name,
+                                       sizeof(fwd_modes) -
+                                       strlen(fwd_modes) - 1);
+                       strncat(fwd_modes, separator,
+                                       sizeof(fwd_modes) -
+                                       strlen(fwd_modes) - 1);
                }
                fwd_modes[strlen(fwd_modes) - strlen(separator)] = '\0';
        }
@@ -1651,8 +1733,9 @@ set_pkt_forwarding_mode(const char *fwd_mode_name)
        i = 0;
        while ((fwd_eng = fwd_engines[i]) != NULL) {
                if (! strcmp(fwd_eng->fwd_mode_name, fwd_mode_name)) {
-                       printf("Set %s packet forwarding mode\n",
-                              fwd_mode_name);
+                       printf("Set %s packet forwarding mode%s\n",
+                              fwd_mode_name,
+                              retry_enabled == 0 ? "" : " with retry");
                        cur_fwd_eng = fwd_eng;
                        return;
                }
@@ -1781,28 +1864,37 @@ rx_vlan_all_filter_set(portid_t port_id, int on)
 }
 
 void
-vlan_tpid_set(portid_t port_id, uint16_t tp_id)
+vlan_tpid_set(portid_t port_id, enum rte_vlan_type vlan_type, uint16_t tp_id)
 {
        int diag;
+
        if (port_id_is_invalid(port_id, ENABLED_WARN))
                return;
 
-       diag = rte_eth_dev_set_vlan_ether_type(port_id, tp_id);
+       diag = rte_eth_dev_set_vlan_ether_type(port_id, vlan_type, tp_id);
        if (diag == 0)
                return;
 
-       printf("tx_vlan_tpid_set(port_pi=%d, tpid=%d) failed "
+       printf("tx_vlan_tpid_set(port_pi=%d, vlan_type=%d, tpid=%d) failed "
               "diag=%d\n",
-              port_id, tp_id, diag);
+              port_id, vlan_type, tp_id, diag);
 }
 
 void
 tx_vlan_set(portid_t port_id, uint16_t vlan_id)
 {
+       int vlan_offload;
        if (port_id_is_invalid(port_id, ENABLED_WARN))
                return;
        if (vlan_id_is_invalid(vlan_id))
                return;
+
+       vlan_offload = rte_eth_dev_get_vlan_offload(port_id);
+       if (vlan_offload & ETH_VLAN_EXTEND_OFFLOAD) {
+               printf("Error, as QinQ has been enabled.\n");
+               return;
+       }
+
        tx_vlan_reset(port_id);
        ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_INSERT_VLAN;
        ports[port_id].tx_vlan_id = vlan_id;
@@ -1811,12 +1903,20 @@ tx_vlan_set(portid_t port_id, uint16_t vlan_id)
 void
 tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer)
 {
+       int vlan_offload;
        if (port_id_is_invalid(port_id, ENABLED_WARN))
                return;
        if (vlan_id_is_invalid(vlan_id))
                return;
        if (vlan_id_is_invalid(vlan_id_outer))
                return;
+
+       vlan_offload = rte_eth_dev_get_vlan_offload(port_id);
+       if (!(vlan_offload & ETH_VLAN_EXTEND_OFFLOAD)) {
+               printf("Error, as QinQ hasn't been enabled.\n");
+               return;
+       }
+
        tx_vlan_reset(port_id);
        ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_INSERT_QINQ;
        ports[port_id].tx_vlan_id = vlan_id;