[dpdk-dev] [PATCH v3 02/10] app/testpmd: convert to new Ethdev Rx offloads API

Patil, Harish Harish.Patil at cavium.com
Fri Jan 19 20:30:05 CET 2018


-----Original Message-----
From: dev <dev-bounces at dpdk.org> on behalf of Shahaf Shuler
<shahafs at mellanox.com>
Date: Tuesday, December 26, 2017 at 1:44 AM
To: "jingjing.wu at intel.com" <jingjing.wu at intel.com>,
"ferruh.yigit at intel.com" <ferruh.yigit at intel.com>
Cc: "dev at dpdk.org" <dev at dpdk.org>
Subject: [dpdk-dev] [PATCH v3 02/10] app/testpmd: convert to new Ethdev
Rx	offloads API

>Ethdev Rx offloads API has changed since:
>
>commit ce17eddefc20 ("ethdev: introduce Rx queue offloads API")
>
>Convert the application to use the new API. The is no functionality
>changes rather simple conversion of the flags.
>
>Signed-off-by: Shahaf Shuler <shahafs at mellanox.com>
>---
> app/test-pmd/cmdline.c    | 51 +++++++++++++++++++++++-------------------
> app/test-pmd/config.c     | 36 +++++++++++++++++++----------
> app/test-pmd/parameters.c | 32 +++++++++++++-------------
> app/test-pmd/testpmd.c    | 19 +++++++---------
> 4 files changed, 77 insertions(+), 61 deletions(-)
>
>diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
>index f71d96301..d8c73a9b1 100644
>--- a/app/test-pmd/cmdline.c
>+++ b/app/test-pmd/cmdline.c
>@@ -1577,6 +1577,7 @@ cmd_config_max_pkt_len_parsed(void *parsed_result,
> 				__attribute__((unused)) void *data)
> {
> 	struct cmd_config_max_pkt_len_result *res = parsed_result;
>+	uint64_t rx_offloads = rx_mode.offloads;
> 
> 	if (!all_ports_stopped()) {
> 		printf("Please stop all ports first\n");
>@@ -1594,14 +1595,16 @@ cmd_config_max_pkt_len_parsed(void *parsed_result,
> 
> 		rx_mode.max_rx_pkt_len = res->value;
> 		if (res->value > ETHER_MAX_LEN)
>-			rx_mode.jumbo_frame = 1;
>+			rx_offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
> 		else
>-			rx_mode.jumbo_frame = 0;
>+			rx_offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
> 	} else {
> 		printf("Unknown parameter\n");
> 		return;
> 	}
> 
>+	rx_mode.offloads = rx_offloads;
>+
> 	init_port_config();
> 
> 	cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
>@@ -1703,6 +1706,7 @@ cmd_config_rx_mode_flag_parsed(void *parsed_result,
> 				__attribute__((unused)) void *data)
> {
> 	struct cmd_config_rx_mode_flag *res = parsed_result;
>+	uint64_t rx_offloads = rx_mode.offloads;
> 
> 	if (!all_ports_stopped()) {
> 		printf("Please stop all ports first\n");
>@@ -1711,48 +1715,48 @@ cmd_config_rx_mode_flag_parsed(void
>*parsed_result,
> 
> 	if (!strcmp(res->name, "crc-strip")) {
> 		if (!strcmp(res->value, "on"))
>-			rx_mode.hw_strip_crc = 1;
>+			rx_offloads |= DEV_RX_OFFLOAD_CRC_STRIP;
> 		else if (!strcmp(res->value, "off"))
>-			rx_mode.hw_strip_crc = 0;
>+			rx_offloads &= ~DEV_RX_OFFLOAD_CRC_STRIP;
> 		else {
> 			printf("Unknown parameter\n");
> 			return;
> 		}
> 	} else if (!strcmp(res->name, "scatter")) {
>-		if (!strcmp(res->value, "on"))
>-			rx_mode.enable_scatter = 1;
>-		else if (!strcmp(res->value, "off"))
>-			rx_mode.enable_scatter = 0;
>-		else {
>+		if (!strcmp(res->value, "on")) {
>+			rx_offloads |= DEV_RX_OFFLOAD_SCATTER;
>+		} else if (!strcmp(res->value, "off")) {
>+			rx_offloads &= ~DEV_RX_OFFLOAD_SCATTER;
>+		} else {
> 			printf("Unknown parameter\n");
> 			return;
> 		}
> 	} else if (!strcmp(res->name, "rx-cksum")) {
> 		if (!strcmp(res->value, "on"))
>-			rx_mode.hw_ip_checksum = 1;
>+			rx_offloads |= DEV_RX_OFFLOAD_CHECKSUM;
> 		else if (!strcmp(res->value, "off"))
>-			rx_mode.hw_ip_checksum = 0;
>+			rx_offloads &= ~DEV_RX_OFFLOAD_CHECKSUM;
> 		else {
> 			printf("Unknown parameter\n");
> 			return;
> 		}
> 	} else if (!strcmp(res->name, "rx-timestamp")) {
> 		if (!strcmp(res->value, "on"))
>-			rx_mode.hw_timestamp = 1;
>+			rx_offloads |= DEV_RX_OFFLOAD_TIMESTAMP;
> 		else if (!strcmp(res->value, "off"))
>-			rx_mode.hw_timestamp = 0;
>+			rx_offloads &= ~DEV_RX_OFFLOAD_TIMESTAMP;
> 		else {
> 			printf("Unknown parameter\n");
> 			return;
> 		}
> 	} else if (!strcmp(res->name, "hw-vlan")) {
> 		if (!strcmp(res->value, "on")) {
>-			rx_mode.hw_vlan_filter = 1;
>-			rx_mode.hw_vlan_strip  = 1;
>+			rx_offloads |= (DEV_RX_OFFLOAD_VLAN_FILTER |
>+					DEV_RX_OFFLOAD_VLAN_STRIP);
> 		}
> 		else if (!strcmp(res->value, "off")) {
>-			rx_mode.hw_vlan_filter = 0;
>-			rx_mode.hw_vlan_strip  = 0;
>+			rx_offloads &= ~(DEV_RX_OFFLOAD_VLAN_FILTER |
>+					DEV_RX_OFFLOAD_VLAN_STRIP);
> 		}
> 		else {
> 			printf("Unknown parameter\n");
>@@ -1760,27 +1764,27 @@ cmd_config_rx_mode_flag_parsed(void
>*parsed_result,
> 		}
> 	} else if (!strcmp(res->name, "hw-vlan-filter")) {
> 		if (!strcmp(res->value, "on"))
>-			rx_mode.hw_vlan_filter = 1;
>+			rx_offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
> 		else if (!strcmp(res->value, "off"))
>-			rx_mode.hw_vlan_filter = 0;
>+			rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_FILTER;
> 		else {
> 			printf("Unknown parameter\n");
> 			return;
> 		}
> 	} else if (!strcmp(res->name, "hw-vlan-strip")) {
> 		if (!strcmp(res->value, "on"))
>-			rx_mode.hw_vlan_strip  = 1;
>+			rx_offloads |= DEV_RX_OFFLOAD_VLAN_STRIP;
> 		else if (!strcmp(res->value, "off"))
>-			rx_mode.hw_vlan_strip  = 0;
>+			rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;
> 		else {
> 			printf("Unknown parameter\n");
> 			return;
> 		}
> 	} else if (!strcmp(res->name, "hw-vlan-extend")) {
> 		if (!strcmp(res->value, "on"))
>-			rx_mode.hw_vlan_extend = 1;
>+			rx_offloads |= DEV_RX_OFFLOAD_VLAN_EXTEND;
> 		else if (!strcmp(res->value, "off"))
>-			rx_mode.hw_vlan_extend = 0;
>+			rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_EXTEND;
> 		else {
> 			printf("Unknown parameter\n");
> 			return;
>@@ -1798,6 +1802,7 @@ cmd_config_rx_mode_flag_parsed(void *parsed_result,
> 		printf("Unknown parameter\n");
> 		return;
> 	}
>+	rx_mode.offloads = rx_offloads;
> 
> 	init_port_config();
> 
>diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
>index 387fefbaa..3bc99be76 100644
>--- a/app/test-pmd/config.c
>+++ b/app/test-pmd/config.c
>@@ -540,14 +540,12 @@ port_infos_display(portid_t port_id)
> void
> port_offload_cap_display(portid_t port_id)
> {
>-	struct rte_eth_dev *dev;
> 	struct rte_eth_dev_info dev_info;
> 	static const char *info_border = "************";
> 
> 	if (port_id_is_invalid(port_id, ENABLED_WARN))
> 		return;
> 
>-	dev = &rte_eth_devices[port_id];
> 	rte_eth_dev_info_get(port_id, &dev_info);
> 
> 	printf("\n%s Port %d supported offload features: %s\n",
>@@ -555,7 +553,8 @@ port_offload_cap_display(portid_t port_id)
> 
> 	if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_VLAN_STRIP) {
> 		printf("VLAN stripped:                 ");
>-		if (dev->data->dev_conf.rxmode.hw_vlan_strip)
>+		if (ports[port_id].dev_conf.rxmode.offloads &
>+		    DEV_RX_OFFLOAD_VLAN_STRIP)
> 			printf("on\n");
> 		else
> 			printf("off\n");
>@@ -563,7 +562,8 @@ port_offload_cap_display(portid_t port_id)
> 
> 	if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_QINQ_STRIP) {
> 		printf("Double VLANs stripped:         ");
>-		if (dev->data->dev_conf.rxmode.hw_vlan_extend)
>+		if (ports[port_id].dev_conf.rxmode.offloads &
>+		    DEV_RX_OFFLOAD_VLAN_EXTEND)
> 			printf("on\n");
> 		else
> 			printf("off\n");
>@@ -571,7 +571,8 @@ port_offload_cap_display(portid_t port_id)
> 
> 	if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_IPV4_CKSUM) {
> 		printf("RX IPv4 checksum:              ");
>-		if (dev->data->dev_conf.rxmode.hw_ip_checksum)
>+		if (ports[port_id].dev_conf.rxmode.offloads &
>+		    DEV_RX_OFFLOAD_IPV4_CKSUM)
> 			printf("on\n");
> 		else
> 			printf("off\n");
>@@ -579,7 +580,8 @@ port_offload_cap_display(portid_t port_id)
> 
> 	if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_UDP_CKSUM) {
> 		printf("RX UDP checksum:               ");
>-		if (dev->data->dev_conf.rxmode.hw_ip_checksum)
>+		if (ports[port_id].dev_conf.rxmode.offloads &
>+		    DEV_RX_OFFLOAD_UDP_CKSUM)
> 			printf("on\n");
> 		else
> 			printf("off\n");
>@@ -587,18 +589,26 @@ port_offload_cap_display(portid_t port_id)
> 
> 	if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_TCP_CKSUM) {
> 		printf("RX TCP checksum:               ");
>-		if (dev->data->dev_conf.rxmode.hw_ip_checksum)
>+		if (ports[port_id].dev_conf.rxmode.offloads &
>+		    DEV_RX_OFFLOAD_TCP_CKSUM)
> 			printf("on\n");
> 		else
> 			printf("off\n");
> 	}
> 
>-	if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM)
>-		printf("RX Outer IPv4 checksum:        on");
>+	if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM) {
>+		printf("RX Outer IPv4 checksum:               ");
>+		if (ports[port_id].dev_conf.rxmode.offloads &
>+		    DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM)
>+			printf("on\n");
>+		else
>+			printf("off\n");
>+	}
> 
> 	if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_TCP_LRO) {
> 		printf("Large receive offload:         ");
>-		if (dev->data->dev_conf.rxmode.enable_lro)
>+		if (ports[port_id].dev_conf.rxmode.offloads &
>+		    DEV_RX_OFFLOAD_TCP_LRO)
> 			printf("on\n");
> 		else
> 			printf("off\n");
>@@ -615,7 +625,8 @@ port_offload_cap_display(portid_t port_id)
> 
> 	if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_TIMESTAMP) {
> 		printf("HW timestamp:                  ");
>-		if (dev->data->dev_conf.rxmode.hw_timestamp)
>+		if (ports[port_id].dev_conf.rxmode.offloads &
>+		    DEV_RX_OFFLOAD_TIMESTAMP)
> 			printf("on\n");
> 		else
> 			printf("off\n");
>@@ -1676,7 +1687,8 @@ rxtx_config_display(void)
> 
> 		printf("  port %d:\n", (unsigned int)pid);
> 		printf("  CRC stripping %s\n",
>-				ports[pid].dev_conf.rxmode.hw_strip_crc ?
>+				(ports[pid].dev_conf.rxmode.offloads &
>+				 DEV_RX_OFFLOAD_CRC_STRIP) ?
> 				"enabled" : "disabled");
> 		printf("  RX queues=%d - RX desc=%d - RX free threshold=%d\n",
> 				nb_rxq, nb_rxd, rx_conf->rx_free_thresh);
>diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
>index 84e7a63ef..263651cba 100644
>--- a/app/test-pmd/parameters.c
>+++ b/app/test-pmd/parameters.c
>@@ -566,6 +566,8 @@ launch_args_parse(int argc, char** argv)
> 	char **argvopt;
> 	int opt_idx;
> 	enum { TX, RX };
>+	/* Default Rx offloads for all ports. */
>+	uint64_t rx_offloads = rx_mode.offloads;
> 
> 	static struct option lgopts[] = {
> 		{ "help",			0, 0, 0 },
>@@ -804,7 +806,8 @@ launch_args_parse(int argc, char** argv)
> 				if (n >= ETHER_MIN_LEN) {
> 					rx_mode.max_rx_pkt_len = (uint32_t) n;
> 					if (n > ETHER_MAX_LEN)
>-					    rx_mode.jumbo_frame = 1;
>+						rx_offloads |=
>+							DEV_RX_OFFLOAD_JUMBO_FRAME;
> 				} else
> 					rte_exit(EXIT_FAILURE,
> 						 "Invalid max-pkt-len=%d - should be > %d\n",
>@@ -897,34 +900,30 @@ launch_args_parse(int argc, char** argv)
> 			}
> #endif
> 			if (!strcmp(lgopts[opt_idx].name, "disable-crc-strip"))
>-				rx_mode.hw_strip_crc = 0;
>+				rx_offloads &= ~DEV_RX_OFFLOAD_CRC_STRIP;
> 			if (!strcmp(lgopts[opt_idx].name, "enable-lro"))
>-				rx_mode.enable_lro = 1;
>+				rx_offloads |= DEV_RX_OFFLOAD_TCP_LRO;
> 			if (!strcmp(lgopts[opt_idx].name, "enable-scatter"))
>-				rx_mode.enable_scatter = 1;
>+				rx_offloads |= DEV_RX_OFFLOAD_SCATTER;
> 			if (!strcmp(lgopts[opt_idx].name, "enable-rx-cksum"))
>-				rx_mode.hw_ip_checksum = 1;
>+				rx_offloads |= DEV_RX_OFFLOAD_CHECKSUM;
> 			if (!strcmp(lgopts[opt_idx].name,
> 					"enable-rx-timestamp"))
>-				rx_mode.hw_timestamp = 1;
>-
>-			if (!strcmp(lgopts[opt_idx].name, "disable-hw-vlan")) {
>-				rx_mode.hw_vlan_filter = 0;
>-				rx_mode.hw_vlan_strip  = 0;
>-				rx_mode.hw_vlan_extend = 0;
>-			}
>+				rx_offloads |= DEV_RX_OFFLOAD_TIMESTAMP;
>+			if (!strcmp(lgopts[opt_idx].name, "disable-hw-vlan"))
>+				rx_offloads &= ~DEV_RX_OFFLOAD_VLAN;
> 
> 			if (!strcmp(lgopts[opt_idx].name,
> 					"disable-hw-vlan-filter"))
>-				rx_mode.hw_vlan_filter = 0;
>+				rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_FILTER;
> 
> 			if (!strcmp(lgopts[opt_idx].name,
> 					"disable-hw-vlan-strip"))
>-				rx_mode.hw_vlan_strip  = 0;
>+				rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;
> 
> 			if (!strcmp(lgopts[opt_idx].name,
> 					"disable-hw-vlan-extend"))
>-				rx_mode.hw_vlan_extend = 0;
>+				rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_EXTEND;
> 
> 			if (!strcmp(lgopts[opt_idx].name, "enable-drop-en"))
> 				rx_drop_en = 1;
>@@ -1140,4 +1139,7 @@ launch_args_parse(int argc, char** argv)
> 			break;
> 		}
> 	}
>+
>+	/* Set offload configuration from command line parameters. */
>+	rx_mode.offloads = rx_offloads;
> }
>diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
>index c3ab44849..6785b095f 100644
>--- a/app/test-pmd/testpmd.c
>+++ b/app/test-pmd/testpmd.c
>@@ -338,15 +338,10 @@ lcoreid_t latencystats_lcore_id = -1;
>  */
> struct rte_eth_rxmode rx_mode = {
> 	.max_rx_pkt_len = ETHER_MAX_LEN, /**< Default maximum frame length. */
>-	.split_hdr_size = 0,
>-	.header_split   = 0, /**< Header Split disabled. */
>-	.hw_ip_checksum = 0, /**< IP checksum offload disabled. */
>-	.hw_vlan_filter = 1, /**< VLAN filtering enabled. */
>-	.hw_vlan_strip  = 1, /**< VLAN strip enabled. */
>-	.hw_vlan_extend = 0, /**< Extended VLAN disabled. */
>-	.jumbo_frame    = 0, /**< Jumbo Frame Support disabled. */
>-	.hw_strip_crc   = 1, /**< CRC stripping by hardware enabled. */
>-	.hw_timestamp   = 0, /**< HW timestamp enabled. */
>+	.offloads = (DEV_RX_OFFLOAD_VLAN_FILTER |
>+		     DEV_RX_OFFLOAD_VLAN_STRIP |
>+		     DEV_RX_OFFLOAD_CRC_STRIP),
>+	.ignore_offload_bitfield = 1,
> };
> 
> struct rte_fdir_conf fdir_conf = {
>@@ -1521,6 +1516,8 @@ start_port(portid_t pid)
> 				port->need_reconfig_queues = 1;
> 				return -1;
> 			}
>+			/* Apply Rx offloads configuration */
>+			port->rx_conf.offloads = port->dev_conf.rxmode.offloads;
> 			/* setup rx queues */
> 			for (qi = 0; qi < nb_rxq; qi++) {
> 				if ((numa_support) &&
>@@ -2252,7 +2249,7 @@ init_port_dcb_config(portid_t pid,
> 	retval = get_eth_dcb_conf(&port_conf, dcb_mode, num_tcs, pfc_en);
> 	if (retval < 0)
> 		return retval;
>-	port_conf.rxmode.hw_vlan_filter = 1;
>+	port_conf.rxmode.offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
> 
> 	/**
> 	 * Write the configuration into the device.
>@@ -2301,7 +2298,7 @@ init_port_dcb_config(portid_t pid,
> 
> 	rxtx_port_config(rte_port);
> 	/* VLAN filter */
>-	rte_port->dev_conf.rxmode.hw_vlan_filter = 1;
>+	rte_port->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
> 	for (i = 0; i < RTE_DIM(vlan_tags); i++)
> 		rx_vft_set(pid, vlan_tags[i], 1);
> 
>-- 
>2.12.0
>

Hi Shahaf,
This testpmd change is causing some issues for qede PMD.
In this patch, rte_eth_dev_configure() and RX/TX queue setup functions are
called for the second time after applying TX offloads but without calling
rte_eth_dev_close() before.
Also there is no way in the driver to detect that this is a port
reconfiguration condition in which case it needs to do certain resources
deallocation/cleanup based on prior configuration.
Ideally, we don’t want to maintain port states in driver internally. So is
there any suggestions here?

Thanks,
Harish




>



More information about the dev mailing list