app/testpmd: add extended Rx queue setup
[dpdk.git] / app / test-pmd / testpmd.c
index 1aa5f65..00cffae 100644 (file)
@@ -209,6 +209,15 @@ uint16_t stats_period; /**< Period to show statistics (disabled by default) */
  */
 uint8_t f_quit;
 
+/*
+ * Configuration of packet segments used to scatter received packets
+ * if some of split features is configured.
+ */
+uint16_t rx_pkt_seg_lengths[MAX_SEGS_BUFFER_SPLIT];
+uint8_t  rx_pkt_nb_segs; /**< Number of segments to split */
+uint16_t rx_pkt_seg_offsets[MAX_SEGS_BUFFER_SPLIT];
+uint8_t  rx_pkt_nb_offs; /**< Number of specified offsets */
+
 /*
  * Configuration of packet segments used by the "txonly" processing engine.
  */
@@ -2449,6 +2458,51 @@ setup_hairpin_queues(portid_t pi, portid_t p_pi, uint16_t cnt_pi)
        return 0;
 }
 
+/* Configure the Rx with optional split. */
+int
+rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
+              uint16_t nb_rx_desc, unsigned int socket_id,
+              struct rte_eth_rxconf *rx_conf, struct rte_mempool *mp)
+{
+       union rte_eth_rxseg rx_useg[MAX_SEGS_BUFFER_SPLIT] = {};
+       unsigned int i, mp_n;
+       int ret;
+
+       if (rx_pkt_nb_segs <= 1 ||
+           (rx_conf->offloads & RTE_ETH_RX_OFFLOAD_BUFFER_SPLIT) == 0) {
+               rx_conf->rx_seg = NULL;
+               rx_conf->rx_nseg = 0;
+               ret = rte_eth_rx_queue_setup(port_id, rx_queue_id,
+                                            nb_rx_desc, socket_id,
+                                            rx_conf, mp);
+               return ret;
+       }
+       for (i = 0; i < rx_pkt_nb_segs; i++) {
+               struct rte_eth_rxseg_split *rx_seg = &rx_useg[i].split;
+               struct rte_mempool *mpx;
+               /*
+                * Use last valid pool for the segments with number
+                * exceeding the pool index.
+                */
+               mp_n = (i > mbuf_data_size_n) ? mbuf_data_size_n - 1 : i;
+               mpx = mbuf_pool_find(socket_id, mp_n);
+               /* Handle zero as mbuf data buffer size. */
+               rx_seg->length = rx_pkt_seg_lengths[i] ?
+                                  rx_pkt_seg_lengths[i] :
+                                  mbuf_data_size[mp_n];
+               rx_seg->offset = i < rx_pkt_nb_offs ?
+                                  rx_pkt_seg_offsets[i] : 0;
+               rx_seg->mp = mpx ? mpx : mp;
+       }
+       rx_conf->rx_nseg = rx_pkt_nb_segs;
+       rx_conf->rx_seg = rx_useg;
+       ret = rte_eth_rx_queue_setup(port_id, rx_queue_id, nb_rx_desc,
+                                   socket_id, rx_conf, NULL);
+       rx_conf->rx_seg = NULL;
+       rx_conf->rx_nseg = 0;
+       return ret;
+}
+
 int
 start_port(portid_t pid)
 {
@@ -2563,7 +2617,7 @@ start_port(portid_t pid)
                                                return -1;
                                        }
 
-                                       diag = rte_eth_rx_queue_setup(pi, qi,
+                                       diag = rx_queue_setup(pi, qi,
                                             port->nb_rx_desc[qi],
                                             rxring_numa[pi],
                                             &(port->rx_conf[qi]),
@@ -2579,7 +2633,7 @@ start_port(portid_t pid)
                                                        port->socket_id);
                                                return -1;
                                        }
-                                       diag = rte_eth_rx_queue_setup(pi, qi,
+                                       diag = rx_queue_setup(pi, qi,
                                             port->nb_rx_desc[qi],
                                             port->socket_id,
                                             &(port->rx_conf[qi]),