app/testpmd: fix error message when closing port twice
[dpdk.git] / app / test-pmd / testpmd.c
index e38c441..386bf84 100644 (file)
@@ -1,7 +1,7 @@
 /*-
  *   BSD LICENSE
  *
- *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
+ *   Copyright(c) 2010-2015 Intel Corporation. All rights reserved.
  *   All rights reserved.
  *
  *   Redistribution and use in source and binary forms, with or without
@@ -332,7 +332,7 @@ 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 ((ports[p].enabled == 0) && (p < size))
+       while ((p < size) && (ports[p].enabled == 0))
                p++;
        return p;
 }
@@ -393,83 +393,24 @@ set_def_fwd_config(void)
 /*
  * Configuration initialisation done once at init time.
  */
-struct mbuf_ctor_arg {
-       uint16_t seg_buf_offset; /**< offset of data in data segment of mbuf. */
-       uint16_t seg_buf_size;   /**< size of data segment in mbuf. */
-};
-
-struct mbuf_pool_ctor_arg {
-       uint16_t seg_buf_size; /**< size of data segment in mbuf. */
-};
-
-static void
-testpmd_mbuf_ctor(struct rte_mempool *mp,
-                 void *opaque_arg,
-                 void *raw_mbuf,
-                 __attribute__((unused)) unsigned i)
-{
-       struct mbuf_ctor_arg *mb_ctor_arg;
-       struct rte_mbuf    *mb;
-
-       mb_ctor_arg = (struct mbuf_ctor_arg *) opaque_arg;
-       mb = (struct rte_mbuf *) raw_mbuf;
-
-       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->ol_flags     = 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
-testpmd_mbuf_pool_ctor(struct rte_mempool *mp,
-                      void *opaque_arg)
-{
-       struct mbuf_pool_ctor_arg      *mbp_ctor_arg;
-       struct rte_pktmbuf_pool_private *mbp_priv;
-
-       if (mp->private_data_size < sizeof(struct rte_pktmbuf_pool_private)) {
-               printf("%s(%s) private_data_size %d < %d\n",
-                      __func__, mp->name, (int) mp->private_data_size,
-                      (int) sizeof(struct rte_pktmbuf_pool_private));
-               return;
-       }
-       mbp_ctor_arg = (struct mbuf_pool_ctor_arg *) opaque_arg;
-       mbp_priv = rte_mempool_get_priv(mp);
-       mbp_priv->mbuf_data_room_size = mbp_ctor_arg->seg_buf_size;
-}
-
 static void
 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 mbuf_pool_ctor_arg mbp_ctor_arg;
-       struct mbuf_ctor_arg mb_ctor_arg;
        uint32_t mb_size;
 
-       mbp_ctor_arg.seg_buf_size = (uint16_t) (RTE_PKTMBUF_HEADROOM +
-                                               mbuf_seg_size);
-       mb_ctor_arg.seg_buf_offset =
-               (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;
+       mb_size = sizeof(struct rte_mbuf) + mbuf_seg_size;
        mbuf_poolname_build(socket_id, pool_name, sizeof(pool_name));
 
 #ifdef RTE_LIBRTE_PMD_XENVIRT
        rte_mp = rte_mempool_gntalloc_create(pool_name, nb_mbuf, mb_size,
-                                   (unsigned) mb_mempool_cache,
-                                   sizeof(struct rte_pktmbuf_pool_private),
-                                   testpmd_mbuf_pool_ctor, &mbp_ctor_arg,
-                                   testpmd_mbuf_ctor, &mb_ctor_arg,
-                                   socket_id, 0);
+               (unsigned) mb_mempool_cache,
+               sizeof(struct rte_pktmbuf_pool_private),
+               rte_pktmbuf_pool_init, NULL,
+               rte_pktmbuf_init, NULL,
+               socket_id, 0);
 
 
 
@@ -478,16 +419,13 @@ mbuf_pool_create(uint16_t mbuf_seg_size, unsigned nb_mbuf,
                rte_mp = mempool_anon_create(pool_name, nb_mbuf, mb_size,
                                    (unsigned) mb_mempool_cache,
                                    sizeof(struct rte_pktmbuf_pool_private),
-                                   testpmd_mbuf_pool_ctor, &mbp_ctor_arg,
-                                   testpmd_mbuf_ctor, &mb_ctor_arg,
+                                   rte_pktmbuf_pool_init, NULL,
+                                   rte_pktmbuf_init, NULL,
                                    socket_id, 0);
        else
-               rte_mp = rte_mempool_create(pool_name, nb_mbuf, mb_size,
-                                   (unsigned) mb_mempool_cache,
-                                   sizeof(struct rte_pktmbuf_pool_private),
-                                   testpmd_mbuf_pool_ctor, &mbp_ctor_arg,
-                                   testpmd_mbuf_ctor, &mb_ctor_arg,
-                                   socket_id, 0);
+               /* 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
 
@@ -1264,7 +1202,8 @@ all_ports_started(void)
        FOREACH_PORT(pi, ports) {
                port = &ports[pi];
                /* Check if there is a port which is not started */
-               if (port->port_status != RTE_PORT_STARTED)
+               if ((port->port_status != RTE_PORT_STARTED) &&
+                       (port->slave_flag == 0))
                        return 0;
        }
 
@@ -1280,7 +1219,8 @@ all_ports_stopped(void)
 
        FOREACH_PORT(pi, ports) {
                port = &ports[pi];
-               if (port->port_status != RTE_PORT_STOPPED)
+               if ((port->port_status != RTE_PORT_STOPPED) &&
+                       (port->slave_flag == 0))
                        return 0;
        }
 
@@ -1533,6 +1473,12 @@ close_port(portid_t pid)
                        continue;
 
                port = &ports[pi];
+               if (rte_atomic16_cmpset(&(port->port_status),
+                       RTE_PORT_CLOSED, RTE_PORT_CLOSED) == 1) {
+                       printf("Port %d is already closed\n", pi);
+                       continue;
+               }
+
                if (rte_atomic16_cmpset(&(port->port_status),
                        RTE_PORT_STOPPED, RTE_PORT_HANDLING) == 0) {
                        printf("Port %d is now not stopped\n", pi);
@@ -1604,8 +1550,6 @@ detach_port(uint8_t port_id)
                return;
        }
 
-       rte_eth_promiscuous_disable(port_id);
-
        if (rte_eth_dev_detach(port_id, name))
                return;
 
@@ -1633,6 +1577,9 @@ pmd_test_exit(void)
 {
        portid_t pt_id;
 
+       if (test_done == 0)
+               stop_packet_forwarding();
+
        FOREACH_PORT(pt_id, ports) {
                printf("Stopping port %d...", pt_id);
                fflush(stdout);
@@ -1869,6 +1816,22 @@ init_port_config(void)
        }
 }
 
+void set_port_slave_flag(portid_t slave_pid)
+{
+       struct rte_port *port;
+
+       port = &ports[slave_pid];
+       port->slave_flag = 1;
+}
+
+void clear_port_slave_flag(portid_t slave_pid)
+{
+       struct rte_port *port;
+
+       port = &ports[slave_pid];
+       port->slave_flag = 0;
+}
+
 const uint16_t vlan_tags[] = {
                0,  1,  2,  3,  4,  5,  6,  7,
                8,  9, 10, 11,  12, 13, 14, 15,
@@ -1881,10 +1844,10 @@ get_eth_dcb_conf(struct rte_eth_conf *eth_conf, struct dcb_config *dcb_conf)
 {
         uint8_t i;
 
-       /*
-        * Builds up the correct configuration for dcb+vt based on the vlan tags array
-        * given above, and the number of traffic classes available for use.
-        */
+       /*
+        * Builds up the correct configuration for dcb+vt based on the vlan tags array
+        * given above, and the number of traffic classes available for use.
+        */
        if (dcb_conf->dcb_mode == DCB_VT_ENABLED) {
                struct rte_eth_vmdq_dcb_conf vmdq_rx_conf;
                struct rte_eth_vmdq_dcb_tx_conf vmdq_tx_conf;