app/testpmd: set default flow director mask
[dpdk.git] / app / test-pmd / testpmd.c
index e8a4b45..605163b 100644 (file)
@@ -199,53 +199,43 @@ queueid_t nb_txq = 1; /**< Number of TX queues per port. */
 uint16_t nb_rxd = RTE_TEST_RX_DESC_DEFAULT; /**< Number of RX descriptors. */
 uint16_t nb_txd = RTE_TEST_TX_DESC_DEFAULT; /**< Number of TX descriptors. */
 
+#define RTE_PMD_PARAM_UNSET -1
 /*
  * Configurable values of RX and TX ring threshold registers.
  */
-#define RX_PTHRESH 8 /**< Default value of RX prefetch threshold register. */
-#define RX_HTHRESH 8 /**< Default value of RX host threshold register. */
-#define RX_WTHRESH 0 /**< Default value of RX write-back threshold register. */
-
-#define TX_PTHRESH 32 /**< Default value of TX prefetch threshold register. */
-#define TX_HTHRESH 0 /**< Default value of TX host threshold register. */
-#define TX_WTHRESH 0 /**< Default value of TX write-back threshold register. */
-
-struct rte_eth_thresh rx_thresh = {
-       .pthresh = RX_PTHRESH,
-       .hthresh = RX_HTHRESH,
-       .wthresh = RX_WTHRESH,
-};
 
-struct rte_eth_thresh tx_thresh = {
-       .pthresh = TX_PTHRESH,
-       .hthresh = TX_HTHRESH,
-       .wthresh = TX_WTHRESH,
-};
+int8_t rx_pthresh = RTE_PMD_PARAM_UNSET;
+int8_t rx_hthresh = RTE_PMD_PARAM_UNSET;
+int8_t rx_wthresh = RTE_PMD_PARAM_UNSET;
+
+int8_t tx_pthresh = RTE_PMD_PARAM_UNSET;
+int8_t tx_hthresh = RTE_PMD_PARAM_UNSET;
+int8_t tx_wthresh = RTE_PMD_PARAM_UNSET;
 
 /*
  * Configurable value of RX free threshold.
  */
-uint16_t rx_free_thresh = 0; /* Immediately free RX descriptors by default. */
+int16_t rx_free_thresh = RTE_PMD_PARAM_UNSET;
 
 /*
  * Configurable value of RX drop enable.
  */
-uint8_t rx_drop_en = 0; /* Drop packets when no descriptors for queue. */
+int8_t rx_drop_en = RTE_PMD_PARAM_UNSET;
 
 /*
  * Configurable value of TX free threshold.
  */
-uint16_t tx_free_thresh = 0; /* Use default values. */
+int16_t tx_free_thresh = RTE_PMD_PARAM_UNSET;
 
 /*
  * Configurable value of TX RS bit threshold.
  */
-uint16_t tx_rs_thresh = 0; /* Use default values. */
+int16_t tx_rs_thresh = RTE_PMD_PARAM_UNSET;
 
 /*
  * Configurable value of TX queue flags.
  */
-uint32_t txq_flags = 0; /* No flags set. */
+int32_t txq_flags = RTE_PMD_PARAM_UNSET;
 
 /*
  * Receive Side Scaling (RSS) configuration.
@@ -296,7 +286,19 @@ struct rte_fdir_conf fdir_conf = {
        .mode = RTE_FDIR_MODE_NONE,
        .pballoc = RTE_FDIR_PBALLOC_64K,
        .status = RTE_FDIR_REPORT_STATUS,
-       .flexbytes_offset = 0x6,
+       .mask = {
+               .vlan_tci_mask = 0x0,
+               .ipv4_mask     = {
+                       .src_ip = 0xFFFFFFFF,
+                       .dst_ip = 0xFFFFFFFF,
+               },
+               .ipv6_mask     = {
+                       .src_ip = {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF},
+                       .dst_ip = {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF},
+               },
+               .src_port_mask = 0xFFFF,
+               .dst_port_mask = 0xFFFF,
+       },
        .drop_queue = 127,
 };
 
@@ -398,18 +400,17 @@ testpmd_mbuf_ctor(struct rte_mempool *mp,
        mb_ctor_arg = (struct mbuf_ctor_arg *) opaque_arg;
        mb = (struct rte_mbuf *) raw_mbuf;
 
-       mb->type         = RTE_MBUF_PKT;
        mb->pool         = mp;
        mb->buf_addr     = (void *) ((char *)mb + mb_ctor_arg->seg_buf_offset);
        mb->buf_physaddr = (uint64_t) (rte_mempool_virt2phy(mp, mb) +
                        mb_ctor_arg->seg_buf_offset);
        mb->buf_len      = mb_ctor_arg->seg_buf_size;
-       mb->type         = RTE_MBUF_PKT;
        mb->ol_flags     = 0;
-       mb->pkt.data     = (char *) mb->buf_addr + RTE_PKTMBUF_HEADROOM;
-       mb->pkt.nb_segs  = 1;
-       mb->pkt.vlan_macip.data = 0;
-       mb->pkt.hash.rss = 0;
+       mb->data_off     = RTE_PKTMBUF_HEADROOM;
+       mb->nb_segs      = 1;
+       mb->tx_offload   = 0;
+       mb->vlan_tci     = 0;
+       mb->hash.rss     = 0;
 }
 
 static void
@@ -443,7 +444,7 @@ mbuf_pool_create(uint16_t mbuf_seg_size, unsigned nb_mbuf,
        mbp_ctor_arg.seg_buf_size = (uint16_t) (RTE_PKTMBUF_HEADROOM +
                                                mbuf_seg_size);
        mb_ctor_arg.seg_buf_offset =
-               (uint16_t) CACHE_LINE_ROUNDUP(sizeof(struct rte_mbuf));
+               (uint16_t) RTE_CACHE_LINE_ROUNDUP(sizeof(struct rte_mbuf));
        mb_ctor_arg.seg_buf_size = mbp_ctor_arg.seg_buf_size;
        mb_size = mb_ctor_arg.seg_buf_offset + mb_ctor_arg.seg_buf_size;
        mbuf_poolname_build(socket_id, pool_name, sizeof(pool_name));
@@ -519,7 +520,7 @@ init_config(void)
        /* Configuration of logical cores. */
        fwd_lcores = rte_zmalloc("testpmd: fwd_lcores",
                                sizeof(struct fwd_lcore *) * nb_lcores,
-                               CACHE_LINE_SIZE);
+                               RTE_CACHE_LINE_SIZE);
        if (fwd_lcores == NULL) {
                rte_exit(EXIT_FAILURE, "rte_zmalloc(%d (struct fwd_lcore *)) "
                                                        "failed\n", nb_lcores);
@@ -527,7 +528,7 @@ init_config(void)
        for (lc_id = 0; lc_id < nb_lcores; lc_id++) {
                fwd_lcores[lc_id] = rte_zmalloc("testpmd: struct fwd_lcore",
                                               sizeof(struct fwd_lcore),
-                                              CACHE_LINE_SIZE);
+                                              RTE_CACHE_LINE_SIZE);
                if (fwd_lcores[lc_id] == NULL) {
                        rte_exit(EXIT_FAILURE, "rte_zmalloc(struct fwd_lcore) "
                                                                "failed\n");
@@ -565,7 +566,7 @@ init_config(void)
        /* Configuration of Ethernet ports. */
        ports = rte_zmalloc("testpmd: ports",
                            sizeof(struct rte_port) * nb_ports,
-                           CACHE_LINE_SIZE);
+                           RTE_CACHE_LINE_SIZE);
        if (ports == NULL) {
                rte_exit(EXIT_FAILURE, "rte_zmalloc(%d struct rte_port) "
                                                        "failed\n", nb_ports);
@@ -614,7 +615,9 @@ init_config(void)
         * Records which Mbuf pool to use by each logical core, if needed.
         */
        for (lc_id = 0; lc_id < nb_lcores; lc_id++) {
-               mbp = mbuf_pool_find(rte_lcore_to_socket_id(lc_id));
+               mbp = mbuf_pool_find(
+                       rte_lcore_to_socket_id(fwd_lcores_cpuids[lc_id]));
+
                if (mbp == NULL)
                        mbp = mbuf_pool_find(0);
                fwd_lcores[lc_id]->mbp = mbp;
@@ -627,14 +630,14 @@ init_config(void)
 
 
 void
-reconfig(portid_t new_port_id)
+reconfig(portid_t new_port_id, unsigned socket_id)
 {
        struct rte_port *port;
 
        /* Reconfiguration of Ethernet ports. */
        ports = rte_realloc(ports,
                            sizeof(struct rte_port) * nb_ports,
-                           CACHE_LINE_SIZE);
+                           RTE_CACHE_LINE_SIZE);
        if (ports == NULL) {
                rte_exit(EXIT_FAILURE, "rte_realloc(%d struct rte_port) failed\n",
                                nb_ports);
@@ -646,6 +649,7 @@ reconfig(portid_t new_port_id)
        /* set flag to initialize port/queue */
        port->need_reconfig = 1;
        port->need_reconfig_queues = 1;
+       port->socket_id = socket_id;
 
        init_port_config();
 }
@@ -710,14 +714,14 @@ init_fwd_streams(void)
        /* init new */
        nb_fwd_streams = nb_fwd_streams_new;
        fwd_streams = rte_zmalloc("testpmd: fwd_streams",
-               sizeof(struct fwd_stream *) * nb_fwd_streams, CACHE_LINE_SIZE);
+               sizeof(struct fwd_stream *) * nb_fwd_streams, RTE_CACHE_LINE_SIZE);
        if (fwd_streams == NULL)
                rte_exit(EXIT_FAILURE, "rte_zmalloc(%d (struct fwd_stream *)) "
                                                "failed\n", nb_fwd_streams);
 
        for (sm_id = 0; sm_id < nb_fwd_streams; sm_id++) {
                fwd_streams[sm_id] = rte_zmalloc("testpmd: struct fwd_stream",
-                               sizeof(struct fwd_stream), CACHE_LINE_SIZE);
+                               sizeof(struct fwd_stream), RTE_CACHE_LINE_SIZE);
                if (fwd_streams[sm_id] == NULL)
                        rte_exit(EXIT_FAILURE, "rte_zmalloc(struct fwd_stream)"
                                                                " failed\n");
@@ -1513,6 +1517,18 @@ all_ports_stopped(void)
        return 1;
 }
 
+int
+port_is_started(portid_t port_id)
+{
+       if (port_id_is_invalid(port_id))
+               return -1;
+
+       if (ports[port_id].port_status != RTE_PORT_STARTED)
+               return 0;
+
+       return 1;
+}
+
 void
 pmd_test_exit(void)
 {
@@ -1666,6 +1682,47 @@ map_port_queue_stats_mapping_registers(uint8_t pi, struct rte_port *port)
        }
 }
 
+static void
+rxtx_port_config(struct rte_port *port)
+{
+       port->rx_conf = port->dev_info.default_rxconf;
+       port->tx_conf = port->dev_info.default_txconf;
+
+       /* Check if any RX/TX parameters have been passed */
+       if (rx_pthresh != RTE_PMD_PARAM_UNSET)
+               port->rx_conf.rx_thresh.pthresh = rx_pthresh;
+
+       if (rx_hthresh != RTE_PMD_PARAM_UNSET)
+               port->rx_conf.rx_thresh.hthresh = rx_hthresh;
+
+       if (rx_wthresh != RTE_PMD_PARAM_UNSET)
+               port->rx_conf.rx_thresh.wthresh = rx_wthresh;
+
+       if (rx_free_thresh != RTE_PMD_PARAM_UNSET)
+               port->rx_conf.rx_free_thresh = rx_free_thresh;
+
+       if (rx_drop_en != RTE_PMD_PARAM_UNSET)
+               port->rx_conf.rx_drop_en = rx_drop_en;
+
+       if (tx_pthresh != RTE_PMD_PARAM_UNSET)
+               port->tx_conf.tx_thresh.pthresh = tx_pthresh;
+
+       if (tx_hthresh != RTE_PMD_PARAM_UNSET)
+               port->tx_conf.tx_thresh.hthresh = tx_hthresh;
+
+       if (tx_wthresh != RTE_PMD_PARAM_UNSET)
+               port->tx_conf.tx_thresh.wthresh = tx_wthresh;
+
+       if (tx_rs_thresh != RTE_PMD_PARAM_UNSET)
+               port->tx_conf.tx_rs_thresh = tx_rs_thresh;
+
+       if (tx_free_thresh != RTE_PMD_PARAM_UNSET)
+               port->tx_conf.tx_free_thresh = tx_free_thresh;
+
+       if (txq_flags != RTE_PMD_PARAM_UNSET)
+               port->tx_conf.txq_flags = txq_flags;
+}
+
 void
 init_port_config(void)
 {
@@ -1684,7 +1741,6 @@ init_port_config(void)
                        port->dev_conf.rx_adv_conf.rss_conf.rss_hf = 0;
                }
 
-               /* In SR-IOV mode, RSS mode is not available */
                if (port->dcb_flag == 0 && port->dev_info.max_vfs == 0) {
                        if( port->dev_conf.rx_adv_conf.rss_conf.rss_hf != 0)
                                port->dev_conf.rxmode.mq_mode = ETH_MQ_RX_RSS;
@@ -1692,13 +1748,18 @@ init_port_config(void)
                                port->dev_conf.rxmode.mq_mode = ETH_MQ_RX_NONE;
                }
 
-               port->rx_conf.rx_thresh = rx_thresh;
-               port->rx_conf.rx_free_thresh = rx_free_thresh;
-               port->rx_conf.rx_drop_en = rx_drop_en;
-               port->tx_conf.tx_thresh = tx_thresh;
-               port->tx_conf.tx_rs_thresh = tx_rs_thresh;
-               port->tx_conf.tx_free_thresh = tx_free_thresh;
-               port->tx_conf.txq_flags = txq_flags;
+               if (port->dev_info.max_vfs != 0) {
+                       if (port->dev_conf.rx_adv_conf.rss_conf.rss_hf != 0)
+                               port->dev_conf.rxmode.mq_mode =
+                                       ETH_MQ_RX_VMDQ_RSS;
+                       else
+                               port->dev_conf.rxmode.mq_mode =
+                                       ETH_MQ_RX_NONE;
+
+                       port->dev_conf.txmode.mq_mode = ETH_MQ_TX_NONE;
+               }
+
+               rxtx_port_config(port);
 
                rte_eth_macaddr_get(pid, &port->eth_addr);
 
@@ -1820,11 +1881,7 @@ init_port_dcb_config(portid_t pid,struct dcb_config *dcb_conf)
        rte_port = &ports[pid];
        memcpy(&rte_port->dev_conf, &port_conf,sizeof(struct rte_eth_conf));
 
-       rte_port->rx_conf.rx_thresh = rx_thresh;
-       rte_port->rx_conf.rx_free_thresh = rx_free_thresh;
-       rte_port->tx_conf.tx_thresh = tx_thresh;
-       rte_port->tx_conf.tx_rs_thresh = tx_rs_thresh;
-       rte_port->tx_conf.tx_free_thresh = tx_free_thresh;
+       rxtx_port_config(rte_port);
        /* VLAN filter */
        rte_port->dev_conf.rxmode.hw_vlan_filter = 1;
        for (i = 0; i < nb_vlan; i++){
@@ -1839,10 +1896,6 @@ init_port_dcb_config(portid_t pid,struct dcb_config *dcb_conf)
        return 0;
 }
 
-#ifdef RTE_EXEC_ENV_BAREMETAL
-#define main _main
-#endif
-
 int
 main(int argc, char** argv)
 {
@@ -1855,12 +1908,7 @@ main(int argc, char** argv)
 
        nb_ports = (portid_t) rte_eth_dev_count();
        if (nb_ports == 0)
-               rte_exit(EXIT_FAILURE, "No probed ethernet devices - "
-                                                       "check that "
-                         "CONFIG_RTE_LIBRTE_IGB_PMD=y and that "
-                         "CONFIG_RTE_LIBRTE_EM_PMD=y and that "
-                         "CONFIG_RTE_LIBRTE_IXGBE_PMD=y in your "
-                         "configuration file\n");
+               rte_exit(EXIT_FAILURE, "No probed ethernet device\n");
 
        set_def_fwd_config();
        if (nb_lcores == 0)