app/testpmd: add loopback topology
authorCyril Chemparathy <cchemparathy@tilera.com>
Thu, 3 Apr 2014 17:30:11 +0000 (10:30 -0700)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Fri, 16 May 2014 11:23:08 +0000 (13:23 +0200)
This commits adds a new "loop" option to the --port-topology argument.  With
the loop option specified, ingress traffic is simply transmitted back on the
same interface.

Signed-off-by: Cyril Chemparathy <cchemparathy@tilera.com>
Acked-by: Thomas Monjalon <thomas.monjalon@6wind.com>
app/test-pmd/config.c
app/test-pmd/parameters.c
app/test-pmd/testpmd.h

index 134bf07..d0e21b7 100644 (file)
@@ -731,7 +731,8 @@ simple_fwd_config_setup(void)
        portid_t j;
        portid_t inc = 2;
 
-       if (port_topology == PORT_TOPOLOGY_CHAINED) {
+       if (port_topology == PORT_TOPOLOGY_CHAINED ||
+           port_topology == PORT_TOPOLOGY_LOOP) {
                inc = 1;
        } else if (nb_fwd_ports % 2) {
                printf("\nWarning! Cannot handle an odd number of ports "
@@ -759,7 +760,10 @@ simple_fwd_config_setup(void)
        setup_fwd_config_of_each_lcore(&cur_fwd_config);
 
        for (i = 0; i < cur_fwd_config.nb_fwd_ports; i = (portid_t) (i + inc)) {
-               j = (portid_t) ((i + 1) % cur_fwd_config.nb_fwd_ports);
+               if (port_topology != PORT_TOPOLOGY_LOOP)
+                       j = (portid_t) ((i + 1) % cur_fwd_config.nb_fwd_ports);
+               else
+                       j = i;
                fwd_streams[i]->rx_port   = fwd_ports_ids[i];
                fwd_streams[i]->rx_queue  = 0;
                fwd_streams[i]->tx_port   = fwd_ports_ids[j];
@@ -823,10 +827,18 @@ rss_fwd_config_setup(void)
                struct fwd_stream *fs;
 
                fs = fwd_streams[lc_id];
+
                if ((rxp & 0x1) == 0)
                        txp = (portid_t) (rxp + 1);
                else
                        txp = (portid_t) (rxp - 1);
+               /*
+                * if we are in loopback, simply send stuff out through the
+                * ingress port
+                */
+               if (port_topology == PORT_TOPOLOGY_LOOP)
+                       txp = rxp;
+
                fs->rx_port = fwd_ports_ids[rxp];
                fs->rx_queue = rxq;
                fs->tx_port = fwd_ports_ids[txp];
index f537e49..d47d020 100644 (file)
@@ -756,6 +756,8 @@ launch_args_parse(int argc, char** argv)
                                        port_topology = PORT_TOPOLOGY_PAIRED;
                                else if (!strcmp(optarg, "chained"))
                                        port_topology = PORT_TOPOLOGY_CHAINED;
+                               else if (!strcmp(optarg, "loop"))
+                                       port_topology = PORT_TOPOLOGY_LOOP;
                                else
                                        rte_exit(EXIT_FAILURE, "port-topology %s invalid -"
                                                 " must be: paired or chained \n",
index 5b4ee6f..a4842ec 100644 (file)
@@ -80,7 +80,8 @@ typedef uint16_t streamid_t;
 
 enum {
        PORT_TOPOLOGY_PAIRED,
-       PORT_TOPOLOGY_CHAINED
+       PORT_TOPOLOGY_CHAINED,
+       PORT_TOPOLOGY_LOOP,
 };
 
 #ifdef RTE_TEST_PMD_RECORD_BURST_STATS