[dpdk-stable] [PATCH] examples/ip_fragmentation: support big packets

Noa Ezra noae at mellanox.com
Wed Dec 26 13:15:30 CET 2018


In some vendors the RX and TX configuration must be the same,
therefore the MTU size need to be equal to max_rx_pkt_len.
The MTU is the largest size packet in bytes that can be sent
on the network, therefore before changing this parameter,
the NIC could not receive packets larger than 1500 bytes,
which is the default MTU size.
In addition, scatter-gather need to be enabled in order to
receive frames bigger than mbuf size.

Cc: stable at dpdk.org

Signed-off-by: Noa Ezra <noae at mellanox.com>
---
 examples/ip_fragmentation/main.c | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/examples/ip_fragmentation/main.c b/examples/ip_fragmentation/main.c
index 17a877d..7420420 100644
--- a/examples/ip_fragmentation/main.c
+++ b/examples/ip_fragmentation/main.c
@@ -141,6 +141,7 @@ struct lcore_queue_conf {
 		.max_rx_pkt_len = JUMBO_FRAME_MAX_SIZE,
 		.split_hdr_size = 0,
 		.offloads = (DEV_RX_OFFLOAD_CHECKSUM |
+			     DEV_RX_OFFLOAD_SCATTER |
 			     DEV_RX_OFFLOAD_JUMBO_FRAME),
 	},
 	.txmode = {
@@ -425,7 +426,6 @@ struct rte_lpm6_config lpm6_config = {
 		 * Read packet from RX queues
 		 */
 		for (i = 0; i < qconf->n_rx_queue; i++) {
-
 			portid = qconf->rx_queue_list[i].portid;
 			nb_rx = rte_eth_rx_burst(portid, 0, pkts_burst,
 						 MAX_PKT_BURST);
@@ -777,7 +777,6 @@ struct rte_lpm6_config lpm6_config = {
 			RTE_LOG(INFO, IP_FRAG, "Creating direct mempool on socket %i\n",
 					socket);
 			snprintf(buf, sizeof(buf), "pool_direct_%i", socket);
-
 			mp = rte_pktmbuf_pool_create(buf, NB_MBUF, 32,
 				0, RTE_MBUF_DEFAULT_BUF_SIZE, socket);
 			if (mp == NULL) {
@@ -892,6 +891,16 @@ struct rte_lpm6_config lpm6_config = {
 		    dev_info.max_rx_pktlen,
 		    local_port_conf.rxmode.max_rx_pkt_len);
 
+		/* set the mtu to the maximum received packet size */
+		ret = rte_eth_dev_set_mtu(portid,
+			local_port_conf.rxmode.max_rx_pkt_len);
+		if (ret < 0) {
+			printf("\n");
+			rte_exit(EXIT_FAILURE, "Set MTU failed: "
+				"err=%d, port=%d\n",
+			ret, portid);
+		}
+
 		/* get the lcore_id for this port */
 		while (rte_lcore_is_enabled(rx_lcore_id) == 0 ||
 		       qconf->n_rx_queue == (unsigned)rx_queue_per_lcore) {
@@ -927,7 +936,7 @@ struct rte_lpm6_config lpm6_config = {
 			local_port_conf.txmode.offloads |=
 				DEV_TX_OFFLOAD_MBUF_FAST_FREE;
 		ret = rte_eth_dev_configure(portid, 1, (uint16_t)n_tx_queue,
-					    &local_port_conf);
+						&local_port_conf);
 		if (ret < 0) {
 			printf("\n");
 			rte_exit(EXIT_FAILURE, "Cannot configure device: "
@@ -936,7 +945,7 @@ struct rte_lpm6_config lpm6_config = {
 		}
 
 		ret = rte_eth_dev_adjust_nb_rx_tx_desc(portid, &nb_rxd,
-					    &nb_txd);
+					&nb_txd);
 		if (ret < 0) {
 			printf("\n");
 			rte_exit(EXIT_FAILURE, "Cannot adjust number of "
-- 
1.8.3.1



More information about the stable mailing list