ring: relax alignment constraint on ring structure
[dpdk.git] / app / test-pmd / config.c
index 3053b56..dd051f5 100644 (file)
@@ -754,6 +754,8 @@ vlan_id_is_invalid(uint16_t vlan_id)
 static int
 port_reg_off_is_invalid(portid_t port_id, uint32_t reg_off)
 {
+       const struct rte_pci_device *pci_dev;
+       const struct rte_bus *bus;
        uint64_t pci_len;
 
        if (reg_off & 0x3) {
@@ -762,7 +764,21 @@ port_reg_off_is_invalid(portid_t port_id, uint32_t reg_off)
                       (unsigned)reg_off);
                return 1;
        }
-       pci_len = ports[port_id].dev_info.pci_dev->mem_resource[0].len;
+
+       if (!ports[port_id].dev_info.device) {
+               printf("Invalid device\n");
+               return 0;
+       }
+
+       bus = rte_bus_find_by_device(ports[port_id].dev_info.device);
+       if (bus && !strcmp(bus->name, "pci")) {
+               pci_dev = RTE_DEV_TO_PCI(ports[port_id].dev_info.device);
+       } else {
+               printf("Not a PCI device\n");
+               return 1;
+       }
+
+       pci_len = pci_dev->mem_resource[0].len;
        if (reg_off >= pci_len) {
                printf("Port %d: register offset %u (0x%X) out of port PCI "
                       "resource (length=%"PRIu64")\n",
@@ -1882,23 +1898,40 @@ setup_fwd_config_of_each_lcore(struct fwd_config *cfg)
        }
 }
 
+static portid_t
+fwd_topology_tx_port_get(portid_t rxp)
+{
+       static int warning_once = 1;
+
+       RTE_ASSERT(rxp < cur_fwd_config.nb_fwd_ports);
+
+       switch (port_topology) {
+       default:
+       case PORT_TOPOLOGY_PAIRED:
+               if ((rxp & 0x1) == 0) {
+                       if (rxp + 1 < cur_fwd_config.nb_fwd_ports)
+                               return rxp + 1;
+                       if (warning_once) {
+                               printf("\nWarning! port-topology=paired"
+                                      " and odd forward ports number,"
+                                      " the last port will pair with"
+                                      " itself.\n\n");
+                               warning_once = 0;
+                       }
+                       return rxp;
+               }
+               return rxp - 1;
+       case PORT_TOPOLOGY_CHAINED:
+               return (rxp + 1) % cur_fwd_config.nb_fwd_ports;
+       case PORT_TOPOLOGY_LOOP:
+               return rxp;
+       }
+}
+
 static void
 simple_fwd_config_setup(void)
 {
        portid_t i;
-       portid_t j;
-       portid_t inc = 2;
-
-       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 "
-                      "with the current port topology. Configuration "
-                      "must be changed to have an even number of ports, "
-                      "or relaunch application with "
-                      "--port-topology=chained\n\n");
-       }
 
        cur_fwd_config.nb_fwd_ports = (portid_t) nb_fwd_ports;
        cur_fwd_config.nb_fwd_streams =
@@ -1917,26 +1950,14 @@ simple_fwd_config_setup(void)
                        (lcoreid_t) cur_fwd_config.nb_fwd_ports;
        setup_fwd_config_of_each_lcore(&cur_fwd_config);
 
-       for (i = 0; i < cur_fwd_config.nb_fwd_ports; i = (portid_t) (i + inc)) {
-               if (port_topology != PORT_TOPOLOGY_LOOP)
-                       j = (portid_t) ((i + 1) % cur_fwd_config.nb_fwd_ports);
-               else
-                       j = i;
+       for (i = 0; i < cur_fwd_config.nb_fwd_ports; 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];
+               fwd_streams[i]->tx_port   =
+                               fwd_ports_ids[fwd_topology_tx_port_get(i)];
                fwd_streams[i]->tx_queue  = 0;
                fwd_streams[i]->peer_addr = fwd_streams[i]->tx_port;
                fwd_streams[i]->retry_enabled = retry_enabled;
-
-               if (port_topology == PORT_TOPOLOGY_PAIRED) {
-                       fwd_streams[j]->rx_port   = fwd_ports_ids[j];
-                       fwd_streams[j]->rx_queue  = 0;
-                       fwd_streams[j]->tx_port   = fwd_ports_ids[i];
-                       fwd_streams[j]->tx_queue  = 0;
-                       fwd_streams[j]->peer_addr = fwd_streams[j]->tx_port;
-                       fwd_streams[j]->retry_enabled = retry_enabled;
-               }
        }
 }
 
@@ -1944,11 +1965,6 @@ simple_fwd_config_setup(void)
  * For the RSS forwarding test all streams distributed over lcores. Each stream
  * being composed of a RX queue to poll on a RX port for input messages,
  * associated with a TX queue of a TX port where to send forwarded packets.
- * All packets received on the RX queue of index "RxQj" of the RX port "RxPi"
- * are sent on the TX queue "TxQl" of the TX port "TxPk" according to the two
- * following rules:
- *    - TxPk = (RxPi + 1) if RxPi is even, (RxPi - 1) if RxPi is odd
- *    - TxQl = RxQj
  */
 static void
 rss_fwd_config_setup(void)
@@ -1980,19 +1996,7 @@ rss_fwd_config_setup(void)
                struct fwd_stream *fs;
 
                fs = fwd_streams[sm_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 >= cur_fwd_config.nb_fwd_ports)
-                       txp = rxp;
-
+               txp = fwd_topology_tx_port_get(rxp);
                fs->rx_port = fwd_ports_ids[rxp];
                fs->rx_queue = rxq;
                fs->tx_port = fwd_ports_ids[txp];