app/testpmd: separate forward config setup from display
[dpdk.git] / app / test-pmd / testpmd.c
index 38b9051..5afce27 100644 (file)
@@ -49,6 +49,7 @@
 #include <inttypes.h>
 
 #include <rte_common.h>
+#include <rte_errno.h>
 #include <rte_byteorder.h>
 #include <rte_log.h>
 #include <rte_debug.h>
@@ -77,7 +78,6 @@
 #endif
 
 #include "testpmd.h"
-#include "mempool_osdep.h"
 
 uint16_t verbose_level = 0; /**< Silent by default. */
 
@@ -410,12 +410,16 @@ mbuf_pool_create(uint16_t mbuf_seg_size, unsigned nb_mbuf,
                 unsigned int socket_id)
 {
        char pool_name[RTE_MEMPOOL_NAMESIZE];
-       struct rte_mempool *rte_mp;
+       struct rte_mempool *rte_mp = NULL;
        uint32_t mb_size;
 
        mb_size = sizeof(struct rte_mbuf) + mbuf_seg_size;
        mbuf_poolname_build(socket_id, pool_name, sizeof(pool_name));
 
+       RTE_LOG(INFO, USER1,
+               "create a new mbuf pool <%s>: n=%u, size=%u, socket=%u\n",
+               pool_name, nb_mbuf, mbuf_seg_size, socket_id);
+
 #ifdef RTE_LIBRTE_PMD_XENVIRT
        rte_mp = rte_mempool_gntalloc_create(pool_name, nb_mbuf, mb_size,
                (unsigned) mb_mempool_cache,
@@ -423,27 +427,33 @@ mbuf_pool_create(uint16_t mbuf_seg_size, unsigned nb_mbuf,
                rte_pktmbuf_pool_init, NULL,
                rte_pktmbuf_init, NULL,
                socket_id, 0);
-
-
-
-#else
-       if (mp_anon != 0)
-               rte_mp = mempool_anon_create(pool_name, nb_mbuf, mb_size,
-                                   (unsigned) mb_mempool_cache,
-                                   sizeof(struct rte_pktmbuf_pool_private),
-                                   rte_pktmbuf_pool_init, NULL,
-                                   rte_pktmbuf_init, NULL,
-                                   socket_id, 0);
-       else
-               /* wrapper to rte_mempool_create() */
-               rte_mp = rte_pktmbuf_pool_create(pool_name, nb_mbuf,
-                       mb_mempool_cache, 0, mbuf_seg_size, socket_id);
-
 #endif
 
+       /* if the former XEN allocation failed fall back to normal allocation */
+       if (rte_mp == NULL) {
+               if (mp_anon != 0) {
+                       rte_mp = rte_mempool_create_empty(pool_name, nb_mbuf,
+                               mb_size, (unsigned) mb_mempool_cache,
+                               sizeof(struct rte_pktmbuf_pool_private),
+                               socket_id, 0);
+
+                       if (rte_mempool_populate_anon(rte_mp) == 0) {
+                               rte_mempool_free(rte_mp);
+                               rte_mp = NULL;
+                       }
+                       rte_pktmbuf_pool_init(rte_mp, NULL);
+                       rte_mempool_obj_iter(rte_mp, rte_pktmbuf_init, NULL);
+               } else {
+                       /* wrapper to rte_mempool_create() */
+                       rte_mp = rte_pktmbuf_pool_create(pool_name, nb_mbuf,
+                               mb_mempool_cache, 0, mbuf_seg_size, socket_id);
+               }
+       }
+
        if (rte_mp == NULL) {
-               rte_exit(EXIT_FAILURE, "Creation of mbuf pool for socket %u "
-                                               "failed\n", socket_id);
+               rte_exit(EXIT_FAILURE,
+                       "Creation of mbuf pool for socket %u failed: %s\n",
+                       socket_id, rte_strerror(rte_errno));
        } else if (verbose_level > 0) {
                rte_mempool_dump(stdout, rte_mp);
        }
@@ -581,6 +591,8 @@ init_config(void)
        /* Configuration of packet forwarding streams. */
        if (init_fwd_streams() < 0)
                rte_exit(EXIT_FAILURE, "FAIL from init_fwd_streams()\n");
+
+       fwd_config_setup();
 }
 
 
@@ -759,7 +771,7 @@ fwd_port_stats_display(portid_t port_id, struct rte_eth_stats *stats)
                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);
-               if (((stats->ierrors - stats->imissed) + stats->rx_nombuf) > 0) {
+               if ((stats->ierrors + stats->rx_nombuf) > 0) {
                        printf("  RX-error: %-"PRIu64"\n",  stats->ierrors);
                        printf("  RX-nombufs: %-14"PRIu64"\n", stats->rx_nombuf);
                }
@@ -778,7 +790,7 @@ fwd_port_stats_display(portid_t port_id, struct rte_eth_stats *stats)
                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);
-               if (((stats->ierrors - stats->imissed) + stats->rx_nombuf) > 0) {
+               if ((stats->ierrors + stats->rx_nombuf) > 0) {
                        printf("  RX-error:%"PRIu64"\n", stats->ierrors);
                        printf("  RX-nombufs:             %14"PRIu64"\n",
                               stats->rx_nombuf);
@@ -1269,11 +1281,6 @@ start_port(portid_t pid)
        struct rte_port *port;
        struct ether_addr mac_addr;
 
-       if (test_done == 0) {
-               printf("Please stop forwarding first\n");
-               return -1;
-       }
-
        if (port_id_is_invalid(pid, ENABLED_WARN))
                return 0;
 
@@ -1425,10 +1432,6 @@ stop_port(portid_t pid)
        struct rte_port *port;
        int need_check_link_status = 0;
 
-       if (test_done == 0) {
-               printf("Please stop forwarding first\n");
-               return;
-       }
        if (dcb_test) {
                dcb_test = 0;
                dcb_config = 0;
@@ -1443,6 +1446,16 @@ stop_port(portid_t pid)
                if (pid != pi && pid != (portid_t)RTE_PORT_ALL)
                        continue;
 
+               if (port_is_forwarding(pi) != 0 && test_done == 0) {
+                       printf("Please remove port %d from forwarding configuration.\n", pi);
+                       continue;
+               }
+
+               if (port_is_bonding_slave(pi)) {
+                       printf("Please remove port %d from bonded device.\n", pi);
+                       continue;
+               }
+
                port = &ports[pi];
                if (rte_atomic16_cmpset(&(port->port_status), RTE_PORT_STARTED,
                                                RTE_PORT_HANDLING) == 0)
@@ -1467,11 +1480,6 @@ close_port(portid_t pid)
        portid_t pi;
        struct rte_port *port;
 
-       if (test_done == 0) {
-               printf("Please stop forwarding first\n");
-               return;
-       }
-
        if (port_id_is_invalid(pid, ENABLED_WARN))
                return;
 
@@ -1481,6 +1489,16 @@ close_port(portid_t pid)
                if (pid != pi && pid != (portid_t)RTE_PORT_ALL)
                        continue;
 
+               if (port_is_forwarding(pi) != 0 && test_done == 0) {
+                       printf("Please remove port %d from forwarding configuration.\n", pi);
+                       continue;
+               }
+
+               if (port_is_bonding_slave(pi)) {
+                       printf("Please remove port %d from bonded device.\n", pi);
+                       continue;
+               }
+
                port = &ports[pi];
                if (rte_atomic16_cmpset(&(port->port_status),
                        RTE_PORT_CLOSED, RTE_PORT_CLOSED) == 1) {
@@ -1498,7 +1516,7 @@ close_port(portid_t pid)
 
                if (rte_atomic16_cmpset(&(port->port_status),
                        RTE_PORT_HANDLING, RTE_PORT_CLOSED) == 0)
-                       printf("Port %d can not be set into stopped\n", pi);
+                       printf("Port %d cannot be set to closed\n", pi);
        }
 
        printf("Done\n");
@@ -1507,7 +1525,7 @@ close_port(portid_t pid)
 void
 attach_port(char *identifier)
 {
-       portid_t i, j, pi = 0;
+       portid_t pi = 0;
 
        printf("Attaching a new port...\n");
 
@@ -1516,11 +1534,6 @@ attach_port(char *identifier)
                return;
        }
 
-       if (test_done == 0) {
-               printf("Please stop forwarding first\n");
-               return;
-       }
-
        if (rte_eth_dev_attach(identifier, &pi))
                return;
 
@@ -1530,16 +1543,6 @@ attach_port(char *identifier)
 
        nb_ports = rte_eth_dev_count();
 
-       /* set_default_fwd_ports_config(); */
-       memset(fwd_ports_ids, 0, sizeof(fwd_ports_ids));
-       i = 0;
-       FOREACH_PORT(j, ports) {
-               fwd_ports_ids[i] = j;
-               i++;
-       }
-       nb_cfg_ports = nb_ports;
-       nb_fwd_ports++;
-
        ports[pi].port_status = RTE_PORT_STOPPED;
 
        printf("Port %d is attached. Now total ports is %d\n", pi, nb_ports);
@@ -1549,7 +1552,6 @@ attach_port(char *identifier)
 void
 detach_port(uint8_t port_id)
 {
-       portid_t i, pi = 0;
        char name[RTE_ETH_NAME_MAX_LEN];
 
        printf("Detaching a port...\n");
@@ -1565,16 +1567,6 @@ detach_port(uint8_t port_id)
        ports[port_id].enabled = 0;
        nb_ports = rte_eth_dev_count();
 
-       /* set_default_fwd_ports_config(); */
-       memset(fwd_ports_ids, 0, sizeof(fwd_ports_ids));
-       i = 0;
-       FOREACH_PORT(pi, ports) {
-               fwd_ports_ids[i] = pi;
-               i++;
-       }
-       nb_cfg_ports = nb_ports;
-       nb_fwd_ports--;
-
        printf("Port '%s' is detached. Now total ports is %d\n",
                        name, nb_ports);
        printf("Done\n");
@@ -1641,7 +1633,7 @@ check_all_ports_link_status(uint32_t port_mask)
                                continue;
                        }
                        /* clear all_ports_up flag if any link down */
-                       if (link.link_status == 0) {
+                       if (link.link_status == ETH_LINK_DOWN) {
                                all_ports_up = 0;
                                break;
                        }
@@ -1844,6 +1836,14 @@ void clear_port_slave_flag(portid_t slave_pid)
        port->slave_flag = 0;
 }
 
+uint8_t port_is_bonding_slave(portid_t slave_pid)
+{
+       struct rte_port *port;
+
+       port = &ports[slave_pid];
+       return port->slave_flag;
+}
+
 const uint16_t vlan_tags[] = {
                0,  1,  2,  3,  4,  5,  6,  7,
                8,  9, 10, 11,  12, 13, 14, 15,