app/testpmd: add generic event handler
[dpdk.git] / app / test-pmd / testpmd.c
index 8068254..28d9b26 100644 (file)
@@ -306,7 +306,7 @@ struct rte_eth_rxmode rx_mode = {
        .hw_vlan_strip  = 1, /**< VLAN strip enabled. */
        .hw_vlan_extend = 0, /**< Extended VLAN disabled. */
        .jumbo_frame    = 0, /**< Jumbo Frame Support disabled. */
-       .hw_strip_crc   = 0, /**< CRC stripping by hardware disabled. */
+       .hw_strip_crc   = 1, /**< CRC stripping by hardware enabled. */
 };
 
 struct rte_fdir_conf fdir_conf = {
@@ -351,6 +351,9 @@ struct rte_stats_bitrates *bitrate_data;
 /* Forward function declarations */
 static void map_port_queue_stats_mapping_registers(uint8_t pi, struct rte_port *port);
 static void check_all_ports_link_status(uint32_t port_mask);
+static void eth_event_callback(uint8_t port_id,
+                              enum rte_eth_event_type type,
+                              void *param);
 
 /*
  * Check if all the ports are started.
@@ -358,20 +361,6 @@ static void check_all_ports_link_status(uint32_t port_mask);
  */
 static int all_ports_started(void);
 
-/*
- * Find next enabled port
- */
-portid_t
-find_next_port(portid_t p, struct rte_port *ports, int size)
-{
-       if (ports == NULL)
-               rte_exit(-EINVAL, "failed to find a next port id\n");
-
-       while ((p < size) && (ports[p].enabled == 0))
-               p++;
-       return p;
-}
-
 /*
  * Setup default configuration.
  */
@@ -572,7 +561,7 @@ init_config(void)
                                                 socket_num);
        }
 
-       FOREACH_PORT(pid, ports) {
+       RTE_ETH_FOREACH_DEV(pid) {
                port = &ports[pid];
                rte_eth_dev_info_get(pid, &port->dev_info);
 
@@ -657,7 +646,7 @@ init_fwd_streams(void)
        queueid_t q;
 
        /* set socket id according to numa or not */
-       FOREACH_PORT(pid, ports) {
+       RTE_ETH_FOREACH_DEV(pid) {
                port = &ports[pid];
                if (nb_rxq > port->dev_info.max_rx_queues) {
                        printf("Fail: nb_rxq(%d) is greater than "
@@ -1301,7 +1290,7 @@ all_ports_started(void)
        portid_t pi;
        struct rte_port *port;
 
-       FOREACH_PORT(pi, ports) {
+       RTE_ETH_FOREACH_DEV(pi) {
                port = &ports[pi];
                /* Check if there is a port which is not started */
                if ((port->port_status != RTE_PORT_STARTED) &&
@@ -1319,7 +1308,7 @@ all_ports_stopped(void)
        portid_t pi;
        struct rte_port *port;
 
-       FOREACH_PORT(pi, ports) {
+       RTE_ETH_FOREACH_DEV(pi) {
                port = &ports[pi];
                if ((port->port_status != RTE_PORT_STOPPED) &&
                        (port->slave_flag == 0))
@@ -1361,13 +1350,14 @@ start_port(portid_t pid)
        queueid_t qi;
        struct rte_port *port;
        struct ether_addr mac_addr;
+       enum rte_eth_event_type event_type;
 
        if (port_id_is_invalid(pid, ENABLED_WARN))
                return 0;
 
        if(dcb_config)
                dcb_test = 1;
-       FOREACH_PORT(pi, ports) {
+       RTE_ETH_FOREACH_DEV(pi) {
                if (pid != pi && pid != (portid_t)RTE_PORT_ALL)
                        continue;
 
@@ -1472,6 +1462,21 @@ start_port(portid_t pid)
                                return -1;
                        }
                }
+
+               for (event_type = RTE_ETH_EVENT_UNKNOWN;
+                    event_type < RTE_ETH_EVENT_MAX;
+                    event_type++) {
+                       diag = rte_eth_dev_callback_register(pi,
+                                                       event_type,
+                                                       eth_event_callback,
+                                                       NULL);
+                       if (diag) {
+                               printf("Failed to setup even callback for event %d\n",
+                                       event_type);
+                               return -1;
+                       }
+               }
+
                /* start port */
                if (rte_eth_dev_start(pi) < 0) {
                        printf("Fail to start port %d\n", pi);
@@ -1524,7 +1529,7 @@ stop_port(portid_t pid)
 
        printf("Stopping ports...\n");
 
-       FOREACH_PORT(pi, ports) {
+       RTE_ETH_FOREACH_DEV(pi) {
                if (pid != pi && pid != (portid_t)RTE_PORT_ALL)
                        continue;
 
@@ -1567,7 +1572,7 @@ close_port(portid_t pid)
 
        printf("Closing ports...\n");
 
-       FOREACH_PORT(pi, ports) {
+       RTE_ETH_FOREACH_DEV(pi) {
                if (pid != pi && pid != (portid_t)RTE_PORT_ALL)
                        continue;
 
@@ -1622,7 +1627,6 @@ attach_port(char *identifier)
        if (rte_eth_dev_attach(identifier, &pi))
                return;
 
-       ports[pi].enabled = 1;
        socket_id = (unsigned)rte_eth_dev_socket_id(pi);
        /* if socket_id is invalid, set to 0 */
        if (check_socket_id(socket_id) < 0)
@@ -1656,7 +1660,6 @@ detach_port(uint8_t port_id)
        if (rte_eth_dev_detach(port_id, name))
                return;
 
-       ports[port_id].enabled = 0;
        nb_ports = rte_eth_dev_count();
 
        printf("Port '%s' is detached. Now total ports is %d\n",
@@ -1675,7 +1678,7 @@ pmd_test_exit(void)
 
        if (ports != NULL) {
                no_link_check = 1;
-               FOREACH_PORT(pt_id, ports) {
+               RTE_ETH_FOREACH_DEV(pt_id) {
                        printf("\nShutting down port %d...\n", pt_id);
                        fflush(stdout);
                        stop_port(pt_id);
@@ -1706,7 +1709,7 @@ check_all_ports_link_status(uint32_t port_mask)
        fflush(stdout);
        for (count = 0; count <= MAX_CHECK_TIME; count++) {
                all_ports_up = 1;
-               FOREACH_PORT(portid, ports) {
+               RTE_ETH_FOREACH_DEV(portid) {
                        if ((port_mask & (1 << portid)) == 0)
                                continue;
                        memset(&link, 0, sizeof(link));
@@ -1746,6 +1749,34 @@ check_all_ports_link_status(uint32_t port_mask)
        }
 }
 
+/* This function is used by the interrupt thread */
+static void
+eth_event_callback(uint8_t port_id, enum rte_eth_event_type type, void *param)
+{
+       static const char * const event_desc[] = {
+               [RTE_ETH_EVENT_UNKNOWN] = "Unknown",
+               [RTE_ETH_EVENT_INTR_LSC] = "LSC",
+               [RTE_ETH_EVENT_QUEUE_STATE] = "Queue state",
+               [RTE_ETH_EVENT_INTR_RESET] = "Interrupt reset",
+               [RTE_ETH_EVENT_VF_MBOX] = "VF Mbox",
+               [RTE_ETH_EVENT_MACSEC] = "MACsec",
+               [RTE_ETH_EVENT_INTR_RMV] = "device removal",
+               [RTE_ETH_EVENT_MAX] = NULL,
+       };
+
+       RTE_SET_USED(param);
+
+       if (type >= RTE_ETH_EVENT_MAX) {
+               fprintf(stderr, "\nPort %" PRIu8 ": %s called upon invalid event %d\n",
+                       port_id, __func__, type);
+               fflush(stderr);
+       } else {
+               printf("\nPort %" PRIu8 ": %s event\n", port_id,
+                       event_desc[type]);
+               fflush(stdout);
+       }
+}
+
 static int
 set_tx_queue_stats_mapping_registers(uint8_t port_id, struct rte_port *port)
 {
@@ -1871,7 +1902,7 @@ init_port_config(void)
        portid_t pid;
        struct rte_port *port;
 
-       FOREACH_PORT(pid, ports) {
+       RTE_ETH_FOREACH_DEV(pid) {
                port = &ports[pid];
                port->dev_conf.rxmode = rx_mode;
                port->dev_conf.fdir_conf = fdir_conf;
@@ -2084,8 +2115,6 @@ init_port_dcb_config(portid_t pid,
 static void
 init_port(void)
 {
-       portid_t pid;
-
        /* Configuration of Ethernet ports. */
        ports = rte_zmalloc("testpmd: ports",
                            sizeof(struct rte_port) * RTE_MAX_ETHPORTS,
@@ -2095,10 +2124,6 @@ init_port(void)
                                "rte_zmalloc(%d struct rte_port) failed\n",
                                RTE_MAX_ETHPORTS);
        }
-
-       /* enabled allocated ports */
-       for (pid = 0; pid < nb_ports; pid++)
-               ports[pid].enabled = 1;
 }
 
 static void
@@ -2176,7 +2201,7 @@ main(int argc, char** argv)
                rte_exit(EXIT_FAILURE, "Start ports failed\n");
 
        /* set all ports to promiscuous mode by default */
-       FOREACH_PORT(port_id, ports)
+       RTE_ETH_FOREACH_DEV(port_id)
                rte_eth_promiscuous_enable(port_id);
 
        /* Init metrics library */