app/testpmd: set packet dump based on verbosity level
[dpdk.git] / app / test-pmd / testpmd.c
index d9e0a5d..b057365 100644 (file)
@@ -178,6 +178,7 @@ struct fwd_engine * fwd_engines[] = {
        &tx_only_engine,
        &csum_fwd_engine,
        &icmp_echo_engine,
+       &noisy_vnf_engine,
 #if defined RTE_LIBRTE_PMD_SOFTNIC
        &softnic_fwd_engine,
 #endif
@@ -273,6 +274,40 @@ int16_t tx_free_thresh = RTE_PMD_PARAM_UNSET;
  */
 int16_t tx_rs_thresh = RTE_PMD_PARAM_UNSET;
 
+/*
+ * Configurable value of buffered packets before sending.
+ */
+uint16_t noisy_tx_sw_bufsz;
+
+/*
+ * Configurable value of packet buffer timeout.
+ */
+uint16_t noisy_tx_sw_buf_flush_time;
+
+/*
+ * Configurable value for size of VNF internal memory area
+ * used for simulating noisy neighbour behaviour
+ */
+uint64_t noisy_lkup_mem_sz;
+
+/*
+ * Configurable value of number of random writes done in
+ * VNF simulation memory area.
+ */
+uint64_t noisy_lkup_num_writes;
+
+/*
+ * Configurable value of number of random reads done in
+ * VNF simulation memory area.
+ */
+uint64_t noisy_lkup_num_reads;
+
+/*
+ * Configurable value of number of random reads/writes done in
+ * VNF simulation memory area.
+ */
+uint64_t noisy_lkup_num_reads_writes;
+
 /*
  * Receive Side Scaling (RSS) configuration.
  */
@@ -452,12 +487,9 @@ static void check_all_ports_link_status(uint32_t port_mask);
 static int eth_event_callback(portid_t port_id,
                              enum rte_eth_event_type type,
                              void *param, void *ret_param);
-static void eth_dev_event_callback(char *device_name,
+static void eth_dev_event_callback(const char *device_name,
                                enum rte_dev_event_type type,
                                void *param);
-static int eth_dev_event_callback_register(void);
-static int eth_dev_event_callback_unregister(void);
-
 
 /*
  * Check if all the ports are started.
@@ -533,9 +565,21 @@ set_default_fwd_ports_config(void)
        portid_t pt_id;
        int i = 0;
 
-       RTE_ETH_FOREACH_DEV(pt_id)
+       RTE_ETH_FOREACH_DEV(pt_id) {
                fwd_ports_ids[i++] = pt_id;
 
+               /* Update sockets info according to the attached device */
+               int socket_id = rte_eth_dev_socket_id(pt_id);
+               if (socket_id >= 0 && new_socket_id(socket_id)) {
+                       if (num_sockets >= RTE_MAX_NUMA_NODES) {
+                               rte_exit(EXIT_FAILURE,
+                                        "Total sockets greater than %u\n",
+                                        RTE_MAX_NUMA_NODES);
+                       }
+                       socket_ids[num_sockets++] = socket_id;
+               }
+       }
+
        nb_cfg_ports = nb_ports;
        nb_fwd_ports = nb_ports;
 }
@@ -989,12 +1033,6 @@ init_config(void)
 
        memset(port_per_socket,0,RTE_MAX_NUMA_NODES);
 
-       if (numa_support) {
-               memset(port_numa, NUMA_NO_CONFIG, RTE_MAX_ETHPORTS);
-               memset(rxring_numa, NUMA_NO_CONFIG, RTE_MAX_ETHPORTS);
-               memset(txring_numa, NUMA_NO_CONFIG, RTE_MAX_ETHPORTS);
-       }
-
        /* Configuration of logical cores. */
        fwd_lcores = rte_zmalloc("testpmd: fwd_lcores",
                                sizeof(struct fwd_lcore *) * nb_lcores,
@@ -1031,9 +1069,12 @@ init_config(void)
                        else {
                                uint32_t socket_id = rte_eth_dev_socket_id(pid);
 
-                               /* if socket_id is invalid, set to 0 */
+                               /*
+                                * if socket_id is invalid,
+                                * set to the first available socket.
+                                */
                                if (check_socket_id(socket_id) < 0)
-                                       socket_id = 0;
+                                       socket_id = socket_ids[0];
                                port_per_socket[socket_id]++;
                        }
                }
@@ -1189,9 +1230,12 @@ init_fwd_streams(void)
                        else {
                                port->socket_id = rte_eth_dev_socket_id(pid);
 
-                               /* if socket_id is invalid, set to 0 */
+                               /*
+                                * if socket_id is invalid,
+                                * set to the first available socket.
+                                */
                                if (check_socket_id(port->socket_id) < 0)
-                                       port->socket_id = 0;
+                                       port->socket_id = socket_ids[0];
                        }
                }
                else {
@@ -1323,8 +1367,9 @@ fwd_port_stats_display(portid_t port_id, struct rte_eth_stats *stats)
                       (uint64_t) (stats->ipackets + stats->imissed));
 
                if (cur_fwd_eng == &csum_fwd_engine)
-                       printf("  Bad-ipcsum: %-14"PRIu64" Bad-l4csum: %-14"PRIu64" \n",
-                              port->rx_bad_ip_csum, port->rx_bad_l4_csum);
+                       printf("  Bad-ipcsum: %-14"PRIu64" Bad-l4csum: %-14"PRIu64"Bad-outer-l4csum: %-14"PRIu64"\n",
+                              port->rx_bad_ip_csum, port->rx_bad_l4_csum,
+                              port->rx_bad_outer_l4_csum);
                if ((stats->ierrors + stats->rx_nombuf) > 0) {
                        printf("  RX-error: %-"PRIu64"\n",  stats->ierrors);
                        printf("  RX-nombufs: %-14"PRIu64"\n", stats->rx_nombuf);
@@ -1342,8 +1387,9 @@ fwd_port_stats_display(portid_t port_id, struct rte_eth_stats *stats)
                       (uint64_t) (stats->ipackets + stats->imissed));
 
                if (cur_fwd_eng == &csum_fwd_engine)
-                       printf("  Bad-ipcsum:%14"PRIu64"    Bad-l4csum:%14"PRIu64"\n",
-                              port->rx_bad_ip_csum, port->rx_bad_l4_csum);
+                       printf("  Bad-ipcsum:%14"PRIu64"    Bad-l4csum:%14"PRIu64"    Bad-outer-l4csum: %-14"PRIu64"\n",
+                              port->rx_bad_ip_csum, port->rx_bad_l4_csum,
+                              port->rx_bad_outer_l4_csum);
                if ((stats->ierrors + stats->rx_nombuf) > 0) {
                        printf("  RX-error:%"PRIu64"\n", stats->ierrors);
                        printf("  RX-nombufs:             %14"PRIu64"\n",
@@ -1407,7 +1453,9 @@ fwd_stream_stats_display(streamid_t stream_id)
        /* if checksum mode */
        if (cur_fwd_eng == &csum_fwd_engine) {
               printf("  RX- bad IP checksum: %-14u  Rx- bad L4 checksum: "
-                       "%-14u\n", fs->rx_bad_ip_csum, fs->rx_bad_l4_csum);
+                       "%-14u Rx- bad outer L4 checksum: %-14u\n",
+                       fs->rx_bad_ip_csum, fs->rx_bad_l4_csum,
+                       fs->rx_bad_outer_l4_csum);
        }
 
 #ifdef RTE_TEST_PMD_RECORD_BURST_STATS
@@ -1661,6 +1709,7 @@ start_packet_forwarding(int with_tx_first)
                fwd_streams[sm_id]->fwd_dropped = 0;
                fwd_streams[sm_id]->rx_bad_ip_csum = 0;
                fwd_streams[sm_id]->rx_bad_l4_csum = 0;
+               fwd_streams[sm_id]->rx_bad_outer_l4_csum = 0;
 
 #ifdef RTE_TEST_PMD_RECORD_BURST_STATS
                memset(&fwd_streams[sm_id]->rx_burst_stats, 0,
@@ -1766,6 +1815,9 @@ stop_packet_forwarding(void)
                ports[fwd_streams[sm_id]->rx_port].rx_bad_l4_csum =
                                                        rx_bad_l4_csum;
 
+               ports[fwd_streams[sm_id]->rx_port].rx_bad_outer_l4_csum +=
+                               fwd_streams[sm_id]->rx_bad_outer_l4_csum;
+
 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
                fwd_cycles = (uint64_t) (fwd_cycles +
                                         fwd_streams[sm_id]->core_cycles);
@@ -1948,7 +2000,7 @@ start_port(portid_t pid)
                                        return -1;
                                }
                        }
-
+                       configure_rxtx_dump_callbacks(0);
                        printf("Configuring Port %d (socket %u)\n", pi,
                                        port->socket_id);
                        /* configure port */
@@ -2047,7 +2099,7 @@ start_port(portid_t pid)
                                return -1;
                        }
                }
-
+               configure_rxtx_dump_callbacks(verbose_level);
                /* start port */
                if (rte_eth_dev_start(pi) < 0) {
                        printf("Fail to start port %d\n", pi);
@@ -2237,39 +2289,6 @@ reset_port(portid_t pid)
        printf("Done\n");
 }
 
-static int
-eth_dev_event_callback_register(void)
-{
-       int ret;
-
-       /* register the device event callback */
-       ret = rte_dev_event_callback_register(NULL,
-               eth_dev_event_callback, NULL);
-       if (ret) {
-               printf("Failed to register device event callback\n");
-               return -1;
-       }
-
-       return 0;
-}
-
-
-static int
-eth_dev_event_callback_unregister(void)
-{
-       int ret;
-
-       /* unregister the device event callback */
-       ret = rte_dev_event_callback_unregister(NULL,
-               eth_dev_event_callback, NULL);
-       if (ret < 0) {
-               printf("Failed to unregister device event callback\n");
-               return -1;
-       }
-
-       return 0;
-}
-
 void
 attach_port(char *identifier)
 {
@@ -2287,9 +2306,9 @@ attach_port(char *identifier)
                return;
 
        socket_id = (unsigned)rte_eth_dev_socket_id(pi);
-       /* if socket_id is invalid, set to 0 */
+       /* if socket_id is invalid, set to the first available socket. */
        if (check_socket_id(socket_id) < 0)
-               socket_id = 0;
+               socket_id = socket_ids[0];
        reconfig(pi, socket_id);
        rte_eth_promiscuous_enable(pi);
 
@@ -2376,14 +2395,26 @@ pmd_test_exit(void)
 
        if (hot_plug) {
                ret = rte_dev_event_monitor_stop();
-               if (ret)
+               if (ret) {
                        RTE_LOG(ERR, EAL,
                                "fail to stop device event monitor.");
+                       return;
+               }
 
-               ret = eth_dev_event_callback_unregister();
-               if (ret)
+               ret = rte_dev_event_callback_unregister(NULL,
+                       eth_dev_event_callback, NULL);
+               if (ret < 0) {
+                       RTE_LOG(ERR, EAL,
+                               "fail to unregister device event callback.\n");
+                       return;
+               }
+
+               ret = rte_dev_hotplug_handle_disable();
+               if (ret) {
                        RTE_LOG(ERR, EAL,
-                               "fail to unregister all event callbacks.");
+                               "fail to disable hotplug handling.\n");
+                       return;
+               }
        }
 
        printf("\nBye...\n");
@@ -2498,11 +2529,11 @@ eth_event_callback(portid_t port_id, enum rte_eth_event_type type, void *param,
        RTE_SET_USED(ret_param);
 
        if (type >= RTE_ETH_EVENT_MAX) {
-               fprintf(stderr, "\nPort %" PRIu8 ": %s called upon invalid event %d\n",
+               fprintf(stderr, "\nPort %" PRIu16 ": %s called upon invalid event %d\n",
                        port_id, __func__, type);
                fflush(stderr);
        } else if (event_print_mask & (UINT32_C(1) << type)) {
-               printf("\nPort %" PRIu8 ": %s event\n", port_id,
+               printf("\nPort %" PRIu16 ": %s event\n", port_id,
                        event_desc[type]);
                fflush(stdout);
        }
@@ -2524,9 +2555,12 @@ eth_event_callback(portid_t port_id, enum rte_eth_event_type type, void *param,
 
 /* This function is used by the interrupt thread */
 static void
-eth_dev_event_callback(char *device_name, enum rte_dev_event_type type,
+eth_dev_event_callback(const char *device_name, enum rte_dev_event_type type,
                             __rte_unused void *arg)
 {
+       uint16_t port_id;
+       int ret;
+
        if (type >= RTE_DEV_EVENT_MAX) {
                fprintf(stderr, "%s called upon invalid event %d\n",
                        __func__, type);
@@ -2537,9 +2571,13 @@ eth_dev_event_callback(char *device_name, enum rte_dev_event_type type,
        case RTE_DEV_EVENT_REMOVE:
                RTE_LOG(ERR, EAL, "The device: %s has been removed!\n",
                        device_name);
-               /* TODO: After finish failure handle, begin to stop
-                * packet forward, stop port, close port, detach port.
-                */
+               ret = rte_eth_dev_get_port_by_name(device_name, &port_id);
+               if (ret) {
+                       RTE_LOG(ERR, EAL, "can not get port by device %s!\n",
+                               device_name);
+                       return;
+               }
+               rmv_event_callback((void *)(intptr_t)port_id);
                break;
        case RTE_DEV_EVENT_ADD:
                RTE_LOG(ERR, EAL, "The device: %s has been added!\n",
@@ -2928,6 +2966,11 @@ init_port(void)
                                "rte_zmalloc(%d struct rte_port) failed\n",
                                RTE_MAX_ETHPORTS);
        }
+
+       /* Initialize ports NUMA structures */
+       memset(port_numa, NUMA_NO_CONFIG, RTE_MAX_ETHPORTS);
+       memset(rxring_numa, NUMA_NO_CONFIG, RTE_MAX_ETHPORTS);
+       memset(txring_numa, NUMA_NO_CONFIG, RTE_MAX_ETHPORTS);
 }
 
 static void
@@ -3062,14 +3105,27 @@ main(int argc, char** argv)
        init_config();
 
        if (hot_plug) {
-               /* enable hot plug monitoring */
+               ret = rte_dev_hotplug_handle_enable();
+               if (ret) {
+                       RTE_LOG(ERR, EAL,
+                               "fail to enable hotplug handling.");
+                       return -1;
+               }
+
                ret = rte_dev_event_monitor_start();
                if (ret) {
-                       rte_errno = EINVAL;
+                       RTE_LOG(ERR, EAL,
+                               "fail to start device event monitoring.");
                        return -1;
                }
-               eth_dev_event_callback_register();
 
+               ret = rte_dev_event_callback_register(NULL,
+                       eth_dev_event_callback, NULL);
+               if (ret) {
+                       RTE_LOG(ERR, EAL,
+                               "fail  to register device event callback\n");
+                       return -1;
+               }
        }
 
        if (start_port(RTE_PORT_ALL) != 0)