DPDK patches and discussions
 help / color / mirror / Atom feed
* [PATCH v5 0/2] example/l3fwd: relax l3fwd rx RSS/Offload if needed
@ 2023-11-13 16:11 Trevor Tao
  2023-11-13 16:11 ` [PATCH v5 1/2] examples/l3fwd: relax RSS requirement with option Trevor Tao
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Trevor Tao @ 2023-11-13 16:11 UTC (permalink / raw)
  To: dev; +Cc: Trevor Tao

This series try to relax l3fwd rx RSS/Offload mode requirement if they
are not supported by underlying hw or virtual devices, there is an
option named relax_rx_mode added to enable this option.

Trevor Tao (2):
  examples/l3fwd: relax RSS requirement with option
  examples/l3fwd: relax RX Offload with option

 examples/l3fwd/l3fwd.h     | 12 ++++++++++--
 examples/l3fwd/l3fwd_em.h  |  2 +-
 examples/l3fwd/l3fwd_lpm.h |  2 +-
 examples/l3fwd/main.c      | 35 ++++++++++++++++++++++++++++++++++-
 4 files changed, 46 insertions(+), 5 deletions(-)

-- 
2.34.1


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v5 1/2] examples/l3fwd: relax RSS requirement with option
  2023-11-13 16:11 [PATCH v5 0/2] example/l3fwd: relax l3fwd rx RSS/Offload if needed Trevor Tao
@ 2023-11-13 16:11 ` Trevor Tao
  2023-11-13 21:05   ` Konstantin Ananyev
  2023-11-13 16:11 ` [PATCH v5 2/2] examples/l3fwd: relax RX Offload " Trevor Tao
  2023-11-22 23:08 ` [PATCH v5 0/2] example/l3fwd: relax l3fwd rx RSS/Offload if needed Thomas Monjalon
  2 siblings, 1 reply; 6+ messages in thread
From: Trevor Tao @ 2023-11-13 16:11 UTC (permalink / raw)
  To: dev; +Cc: Trevor Tao

Now the port Rx mq_mode had been set to RTE_ETH_MQ_RX_RSS
by default, but some hw and/or virtual interface does not
support the RSS and offload mode presupposed, e.g., some
virtio interfaces in the cloud don't support
RSS and the error msg may like:

virtio_dev_configure(): RSS support requested but not supported by
the device
Port0 dev_configure = -95

So to enable the l3fwd running in that environment, the Rx mode requirement
can be relaxed to reflect the hardware feature reality here, and the l3fwd
can run smoothly then.

An option named "disable-rss" is added to disable the RX RSS explicitly,
and it's disabled by default.

Signed-off-by: Trevor Tao <taozj888@163.com>
---
 examples/l3fwd/main.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c
index 6063eb1399..b42365ef1b 100644
--- a/examples/l3fwd/main.c
+++ b/examples/l3fwd/main.c
@@ -73,6 +73,7 @@ static enum L3FWD_LOOKUP_MODE lookup_mode;
 static int numa_on = 1; /**< NUMA is enabled by default. */
 static int parse_ptype; /**< Parse packet type using rx callback, and */
 			/**< disabled by default */
+static int disable_rss; /**< Disable the RX RSS mode */
 static int per_port_pool; /**< Use separate buffer pools per port; disabled */
 			  /**< by default */
 
@@ -678,6 +679,7 @@ static const char short_options[] =
 #define CMD_LINE_OPT_MAX_PKT_LEN "max-pkt-len"
 #define CMD_LINE_OPT_HASH_ENTRY_NUM "hash-entry-num"
 #define CMD_LINE_OPT_PARSE_PTYPE "parse-ptype"
+#define CMD_LINE_OPT_DISABLE_RSS "disable-rss"
 #define CMD_LINE_OPT_PER_PORT_POOL "per-port-pool"
 #define CMD_LINE_OPT_MODE "mode"
 #define CMD_LINE_OPT_EVENTQ_SYNC "eventq-sched"
@@ -705,6 +707,7 @@ enum {
 	CMD_LINE_OPT_MAX_PKT_LEN_NUM,
 	CMD_LINE_OPT_HASH_ENTRY_NUM_NUM,
 	CMD_LINE_OPT_PARSE_PTYPE_NUM,
+	CMD_LINE_OPT_DISABLE_RSS_NUM,
 	CMD_LINE_OPT_RULE_IPV4_NUM,
 	CMD_LINE_OPT_RULE_IPV6_NUM,
 	CMD_LINE_OPT_ALG_NUM,
@@ -728,6 +731,7 @@ static const struct option lgopts[] = {
 	{CMD_LINE_OPT_MAX_PKT_LEN, 1, 0, CMD_LINE_OPT_MAX_PKT_LEN_NUM},
 	{CMD_LINE_OPT_HASH_ENTRY_NUM, 1, 0, CMD_LINE_OPT_HASH_ENTRY_NUM_NUM},
 	{CMD_LINE_OPT_PARSE_PTYPE, 0, 0, CMD_LINE_OPT_PARSE_PTYPE_NUM},
+	{CMD_LINE_OPT_DISABLE_RSS, 0, 0, CMD_LINE_OPT_DISABLE_RSS_NUM},
 	{CMD_LINE_OPT_PER_PORT_POOL, 0, 0, CMD_LINE_OPT_PARSE_PER_PORT_POOL},
 	{CMD_LINE_OPT_MODE, 1, 0, CMD_LINE_OPT_MODE_NUM},
 	{CMD_LINE_OPT_EVENTQ_SYNC, 1, 0, CMD_LINE_OPT_EVENTQ_SYNC_NUM},
@@ -853,6 +857,11 @@ parse_args(int argc, char **argv)
 			parse_ptype = 1;
 			break;
 
+		case CMD_LINE_OPT_DISABLE_RSS_NUM:
+			printf("Disable RX RSS\n");
+			disable_rss = 1;
+			break;
+
 		case CMD_LINE_OPT_PARSE_PER_PORT_POOL:
 			printf("per port buffer pool is enabled\n");
 			per_port_pool = 1;
@@ -1257,7 +1266,7 @@ l3fwd_poll_resource_setup(void)
 		local_port_conf.rx_adv_conf.rss_conf.rss_hf &=
 			dev_info.flow_type_rss_offloads;
 
-		if (dev_info.max_rx_queues == 1)
+		if (disable_rss == 1 || dev_info.max_rx_queues == 1)
 			local_port_conf.rxmode.mq_mode = RTE_ETH_MQ_RX_NONE;
 
 		if (local_port_conf.rx_adv_conf.rss_conf.rss_hf !=
-- 
2.34.1


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v5 2/2] examples/l3fwd: relax RX Offload with option
  2023-11-13 16:11 [PATCH v5 0/2] example/l3fwd: relax l3fwd rx RSS/Offload if needed Trevor Tao
  2023-11-13 16:11 ` [PATCH v5 1/2] examples/l3fwd: relax RSS requirement with option Trevor Tao
@ 2023-11-13 16:11 ` Trevor Tao
  2023-11-13 21:13   ` Konstantin Ananyev
  2023-11-22 23:08 ` [PATCH v5 0/2] example/l3fwd: relax l3fwd rx RSS/Offload if needed Thomas Monjalon
  2 siblings, 1 reply; 6+ messages in thread
From: Trevor Tao @ 2023-11-13 16:11 UTC (permalink / raw)
  To: dev; +Cc: Trevor Tao

Now the port Rx offload mode is set to RTE_ETH_RX_OFFLOAD_CHECKSUM
by default, but some hw and/or virtual interface does not support
the offload mode presupposed, e.g., some virtio interfaces in
the cloud may only partly support RTE_ETH_RX_OFFLOAD_UDP_CKSUM/
RTE_ETH_RX_OFFLOAD_TCP_CKSUM,
but not RTE_ETH_RX_OFFLOAD_IPV4_CKSUM, and the error msg here:

Ethdev port_id=0 requested Rx offloads 0xe does not match Rx offloads
capabilities 0x201d in rte_eth_dev_configure()

So to enable the l3fwd running in that environment, the Rx mode requirement
can be relaxed to reflect the hardware feature reality here with an option
relax_rx_offload, and the l3fwd can run smoothly then.
A warning msg would be provided to user in case it happens here.

On the other side, enabling the software cksum check in case missing the
hw support.

The relax action for rx cksum offload is just enabled when
relax_rx_offload is true which is false by default.

Signed-off-by: Trevor Tao <taozj888@163.com>
---
 examples/l3fwd/l3fwd.h     | 12 ++++++++++--
 examples/l3fwd/l3fwd_em.h  |  2 +-
 examples/l3fwd/l3fwd_lpm.h |  2 +-
 examples/l3fwd/main.c      | 24 ++++++++++++++++++++++++
 4 files changed, 36 insertions(+), 4 deletions(-)

diff --git a/examples/l3fwd/l3fwd.h b/examples/l3fwd/l3fwd.h
index b55855c932..e7ae0e5834 100644
--- a/examples/l3fwd/l3fwd.h
+++ b/examples/l3fwd/l3fwd.h
@@ -159,7 +159,7 @@ send_single_packet(struct lcore_conf *qconf,
 
 #ifdef DO_RFC_1812_CHECKS
 static inline int
-is_valid_ipv4_pkt(struct rte_ipv4_hdr *pkt, uint32_t link_len)
+is_valid_ipv4_pkt(struct rte_ipv4_hdr *pkt, uint32_t link_len, uint64_t ol_flags)
 {
 	/* From http://www.rfc-editor.org/rfc/rfc1812.txt section 5.2.2 */
 	/*
@@ -170,7 +170,15 @@ is_valid_ipv4_pkt(struct rte_ipv4_hdr *pkt, uint32_t link_len)
 		return -1;
 
 	/* 2. The IP checksum must be correct. */
-	/* this is checked in H/W */
+	/* if this is not checked in H/W, check it. */
+	if ((ol_flags & RTE_MBUF_F_RX_IP_CKSUM_MASK) == RTE_MBUF_F_RX_IP_CKSUM_NONE) {
+		uint16_t actual_cksum, expected_cksum;
+		actual_cksum = pkt->hdr_checksum;
+		pkt->hdr_checksum = 0;
+		expected_cksum = rte_ipv4_cksum(pkt);
+		if (actual_cksum != expected_cksum)
+			return -2;
+	}
 
 	/*
 	 * 3. The IP version number must be 4. If the version number is not 4
diff --git a/examples/l3fwd/l3fwd_em.h b/examples/l3fwd/l3fwd_em.h
index 7d051fc076..1fee2e2e6c 100644
--- a/examples/l3fwd/l3fwd_em.h
+++ b/examples/l3fwd/l3fwd_em.h
@@ -20,7 +20,7 @@ l3fwd_em_handle_ipv4(struct rte_mbuf *m, uint16_t portid,
 
 #ifdef DO_RFC_1812_CHECKS
 	/* Check to make sure the packet is valid (RFC1812) */
-	if (is_valid_ipv4_pkt(ipv4_hdr, m->pkt_len) < 0) {
+	if (is_valid_ipv4_pkt(ipv4_hdr, m->pkt_len, m->ol_flags) < 0) {
 		rte_pktmbuf_free(m);
 		return BAD_PORT;
 	}
diff --git a/examples/l3fwd/l3fwd_lpm.h b/examples/l3fwd/l3fwd_lpm.h
index c61b969584..4ee61e8d88 100644
--- a/examples/l3fwd/l3fwd_lpm.h
+++ b/examples/l3fwd/l3fwd_lpm.h
@@ -22,7 +22,7 @@ l3fwd_lpm_simple_forward(struct rte_mbuf *m, uint16_t portid,
 
 #ifdef DO_RFC_1812_CHECKS
 		/* Check to make sure the packet is valid (RFC1812) */
-		if (is_valid_ipv4_pkt(ipv4_hdr, m->pkt_len) < 0) {
+		if (is_valid_ipv4_pkt(ipv4_hdr, m->pkt_len, m->ol_flags) < 0) {
 			rte_pktmbuf_free(m);
 			return;
 		}
diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c
index b42365ef1b..851e7e68f9 100644
--- a/examples/l3fwd/main.c
+++ b/examples/l3fwd/main.c
@@ -74,6 +74,8 @@ static int numa_on = 1; /**< NUMA is enabled by default. */
 static int parse_ptype; /**< Parse packet type using rx callback, and */
 			/**< disabled by default */
 static int disable_rss; /**< Disable the RX RSS mode */
+static int relax_rx_offload; /**< Relax RX offload mode, and */
+			     /**< disabled by default */
 static int per_port_pool; /**< Use separate buffer pools per port; disabled */
 			  /**< by default */
 
@@ -680,6 +682,7 @@ static const char short_options[] =
 #define CMD_LINE_OPT_HASH_ENTRY_NUM "hash-entry-num"
 #define CMD_LINE_OPT_PARSE_PTYPE "parse-ptype"
 #define CMD_LINE_OPT_DISABLE_RSS "disable-rss"
+#define CMD_LINE_OPT_RELAX_RX_OFFLOAD "relax-rx-offload"
 #define CMD_LINE_OPT_PER_PORT_POOL "per-port-pool"
 #define CMD_LINE_OPT_MODE "mode"
 #define CMD_LINE_OPT_EVENTQ_SYNC "eventq-sched"
@@ -708,6 +711,7 @@ enum {
 	CMD_LINE_OPT_HASH_ENTRY_NUM_NUM,
 	CMD_LINE_OPT_PARSE_PTYPE_NUM,
 	CMD_LINE_OPT_DISABLE_RSS_NUM,
+	CMD_LINE_OPT_RELAX_RX_OFFLOAD_NUM,
 	CMD_LINE_OPT_RULE_IPV4_NUM,
 	CMD_LINE_OPT_RULE_IPV6_NUM,
 	CMD_LINE_OPT_ALG_NUM,
@@ -731,6 +735,7 @@ static const struct option lgopts[] = {
 	{CMD_LINE_OPT_MAX_PKT_LEN, 1, 0, CMD_LINE_OPT_MAX_PKT_LEN_NUM},
 	{CMD_LINE_OPT_HASH_ENTRY_NUM, 1, 0, CMD_LINE_OPT_HASH_ENTRY_NUM_NUM},
 	{CMD_LINE_OPT_PARSE_PTYPE, 0, 0, CMD_LINE_OPT_PARSE_PTYPE_NUM},
+	{CMD_LINE_OPT_RELAX_RX_OFFLOAD, 0, 0, CMD_LINE_OPT_RELAX_RX_OFFLOAD_NUM},
 	{CMD_LINE_OPT_DISABLE_RSS, 0, 0, CMD_LINE_OPT_DISABLE_RSS_NUM},
 	{CMD_LINE_OPT_PER_PORT_POOL, 0, 0, CMD_LINE_OPT_PARSE_PER_PORT_POOL},
 	{CMD_LINE_OPT_MODE, 1, 0, CMD_LINE_OPT_MODE_NUM},
@@ -857,6 +862,11 @@ parse_args(int argc, char **argv)
 			parse_ptype = 1;
 			break;
 
+		case CMD_LINE_OPT_RELAX_RX_OFFLOAD_NUM:
+			printf("Relax rx offload mode is enabled\n");
+			relax_rx_offload = 1;
+			break;
+
 		case CMD_LINE_OPT_DISABLE_RSS_NUM:
 			printf("Disable RX RSS\n");
 			disable_rss = 1;
@@ -1278,6 +1288,20 @@ l3fwd_poll_resource_setup(void)
 				local_port_conf.rx_adv_conf.rss_conf.rss_hf);
 		}
 
+		/* relax the rx offload requirement */
+		if ((local_port_conf.rxmode.offloads & dev_info.rx_offload_capa) !=
+			local_port_conf.rxmode.offloads) {
+			printf("Port %u requested Rx offloads 0x%"PRIx64" does not"
+				" match Rx offloads capabilities 0x%"PRIx64"\n",
+				portid, local_port_conf.rxmode.offloads,
+				dev_info.rx_offload_capa);
+			if (relax_rx_offload) {
+				local_port_conf.rxmode.offloads &= dev_info.rx_offload_capa;
+				printf("warning: modified the rx offload to 0x%"PRIx64" based on device"
+				" capability\n", local_port_conf.rxmode.offloads);
+			}
+		}
+
 		ret = rte_eth_dev_configure(portid, nb_rx_queue,
 					(uint16_t)n_tx_queue, &local_port_conf);
 		if (ret < 0)
-- 
2.34.1


^ permalink raw reply	[flat|nested] 6+ messages in thread

* RE: [PATCH v5 1/2] examples/l3fwd: relax RSS requirement with option
  2023-11-13 16:11 ` [PATCH v5 1/2] examples/l3fwd: relax RSS requirement with option Trevor Tao
@ 2023-11-13 21:05   ` Konstantin Ananyev
  0 siblings, 0 replies; 6+ messages in thread
From: Konstantin Ananyev @ 2023-11-13 21:05 UTC (permalink / raw)
  To: Trevor Tao, dev



> Now the port Rx mq_mode had been set to RTE_ETH_MQ_RX_RSS
> by default, but some hw and/or virtual interface does not
> support the RSS and offload mode presupposed, e.g., some
> virtio interfaces in the cloud don't support
> RSS and the error msg may like:
> 
> virtio_dev_configure(): RSS support requested but not supported by
> the device
> Port0 dev_configure = -95
> 
> So to enable the l3fwd running in that environment, the Rx mode requirement
> can be relaxed to reflect the hardware feature reality here, and the l3fwd
> can run smoothly then.
> 
> An option named "disable-rss" is added to disable the RX RSS explicitly,
> and it's disabled by default.
> 
> Signed-off-by: Trevor Tao <taozj888@163.com>
> ---
>  examples/l3fwd/main.c | 11 ++++++++++-
>  1 file changed, 10 insertions(+), 1 deletion(-)
> 
> diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c
> index 6063eb1399..b42365ef1b 100644
> --- a/examples/l3fwd/main.c
> +++ b/examples/l3fwd/main.c
> @@ -73,6 +73,7 @@ static enum L3FWD_LOOKUP_MODE lookup_mode;
>  static int numa_on = 1; /**< NUMA is enabled by default. */
>  static int parse_ptype; /**< Parse packet type using rx callback, and */
>  			/**< disabled by default */
> +static int disable_rss; /**< Disable the RX RSS mode */
>  static int per_port_pool; /**< Use separate buffer pools per port; disabled */
>  			  /**< by default */
> 
> @@ -678,6 +679,7 @@ static const char short_options[] =
>  #define CMD_LINE_OPT_MAX_PKT_LEN "max-pkt-len"
>  #define CMD_LINE_OPT_HASH_ENTRY_NUM "hash-entry-num"
>  #define CMD_LINE_OPT_PARSE_PTYPE "parse-ptype"
> +#define CMD_LINE_OPT_DISABLE_RSS "disable-rss"
>  #define CMD_LINE_OPT_PER_PORT_POOL "per-port-pool"
>  #define CMD_LINE_OPT_MODE "mode"
>  #define CMD_LINE_OPT_EVENTQ_SYNC "eventq-sched"
> @@ -705,6 +707,7 @@ enum {
>  	CMD_LINE_OPT_MAX_PKT_LEN_NUM,
>  	CMD_LINE_OPT_HASH_ENTRY_NUM_NUM,
>  	CMD_LINE_OPT_PARSE_PTYPE_NUM,
> +	CMD_LINE_OPT_DISABLE_RSS_NUM,
>  	CMD_LINE_OPT_RULE_IPV4_NUM,
>  	CMD_LINE_OPT_RULE_IPV6_NUM,
>  	CMD_LINE_OPT_ALG_NUM,
> @@ -728,6 +731,7 @@ static const struct option lgopts[] = {
>  	{CMD_LINE_OPT_MAX_PKT_LEN, 1, 0, CMD_LINE_OPT_MAX_PKT_LEN_NUM},
>  	{CMD_LINE_OPT_HASH_ENTRY_NUM, 1, 0, CMD_LINE_OPT_HASH_ENTRY_NUM_NUM},
>  	{CMD_LINE_OPT_PARSE_PTYPE, 0, 0, CMD_LINE_OPT_PARSE_PTYPE_NUM},
> +	{CMD_LINE_OPT_DISABLE_RSS, 0, 0, CMD_LINE_OPT_DISABLE_RSS_NUM},
>  	{CMD_LINE_OPT_PER_PORT_POOL, 0, 0, CMD_LINE_OPT_PARSE_PER_PORT_POOL},
>  	{CMD_LINE_OPT_MODE, 1, 0, CMD_LINE_OPT_MODE_NUM},
>  	{CMD_LINE_OPT_EVENTQ_SYNC, 1, 0, CMD_LINE_OPT_EVENTQ_SYNC_NUM},
> @@ -853,6 +857,11 @@ parse_args(int argc, char **argv)
>  			parse_ptype = 1;
>  			break;
> 
> +		case CMD_LINE_OPT_DISABLE_RSS_NUM:
> +			printf("Disable RX RSS\n");
> +			disable_rss = 1;
> +			break;
> +
>  		case CMD_LINE_OPT_PARSE_PER_PORT_POOL:
>  			printf("per port buffer pool is enabled\n");
>  			per_port_pool = 1;
> @@ -1257,7 +1266,7 @@ l3fwd_poll_resource_setup(void)
>  		local_port_conf.rx_adv_conf.rss_conf.rss_hf &=
>  			dev_info.flow_type_rss_offloads;
> 
> -		if (dev_info.max_rx_queues == 1)
> +		if (disable_rss == 1 || dev_info.max_rx_queues == 1)
>  			local_port_conf.rxmode.mq_mode = RTE_ETH_MQ_RX_NONE;
> 
>  		if (local_port_conf.rx_adv_conf.rss_conf.rss_hf !=
> --

Acked-by: Konstantin Ananyev <konstantin.ananyev@huawei.com>
 

> 2.34.1


^ permalink raw reply	[flat|nested] 6+ messages in thread

* RE: [PATCH v5 2/2] examples/l3fwd: relax RX Offload with option
  2023-11-13 16:11 ` [PATCH v5 2/2] examples/l3fwd: relax RX Offload " Trevor Tao
@ 2023-11-13 21:13   ` Konstantin Ananyev
  0 siblings, 0 replies; 6+ messages in thread
From: Konstantin Ananyev @ 2023-11-13 21:13 UTC (permalink / raw)
  To: Trevor Tao, dev



> Now the port Rx offload mode is set to RTE_ETH_RX_OFFLOAD_CHECKSUM
> by default, but some hw and/or virtual interface does not support
> the offload mode presupposed, e.g., some virtio interfaces in
> the cloud may only partly support RTE_ETH_RX_OFFLOAD_UDP_CKSUM/
> RTE_ETH_RX_OFFLOAD_TCP_CKSUM,
> but not RTE_ETH_RX_OFFLOAD_IPV4_CKSUM, and the error msg here:
> 
> Ethdev port_id=0 requested Rx offloads 0xe does not match Rx offloads
> capabilities 0x201d in rte_eth_dev_configure()
> 
> So to enable the l3fwd running in that environment, the Rx mode requirement
> can be relaxed to reflect the hardware feature reality here with an option
> relax_rx_offload, and the l3fwd can run smoothly then.
> A warning msg would be provided to user in case it happens here.
> 
> On the other side, enabling the software cksum check in case missing the
> hw support.
> 
> The relax action for rx cksum offload is just enabled when
> relax_rx_offload is true which is false by default.
> 
> Signed-off-by: Trevor Tao <taozj888@163.com>
> ---
>  examples/l3fwd/l3fwd.h     | 12 ++++++++++--
>  examples/l3fwd/l3fwd_em.h  |  2 +-
>  examples/l3fwd/l3fwd_lpm.h |  2 +-
>  examples/l3fwd/main.c      | 24 ++++++++++++++++++++++++
>  4 files changed, 36 insertions(+), 4 deletions(-)
> 
> diff --git a/examples/l3fwd/l3fwd.h b/examples/l3fwd/l3fwd.h
> index b55855c932..e7ae0e5834 100644
> --- a/examples/l3fwd/l3fwd.h
> +++ b/examples/l3fwd/l3fwd.h
> @@ -159,7 +159,7 @@ send_single_packet(struct lcore_conf *qconf,
> 
>  #ifdef DO_RFC_1812_CHECKS
>  static inline int
> -is_valid_ipv4_pkt(struct rte_ipv4_hdr *pkt, uint32_t link_len)
> +is_valid_ipv4_pkt(struct rte_ipv4_hdr *pkt, uint32_t link_len, uint64_t ol_flags)
>  {
>  	/* From http://www.rfc-editor.org/rfc/rfc1812.txt section 5.2.2 */
>  	/*
> @@ -170,7 +170,15 @@ is_valid_ipv4_pkt(struct rte_ipv4_hdr *pkt, uint32_t link_len)
>  		return -1;
> 
>  	/* 2. The IP checksum must be correct. */
> -	/* this is checked in H/W */
> +	/* if this is not checked in H/W, check it. */
> +	if ((ol_flags & RTE_MBUF_F_RX_IP_CKSUM_MASK) == RTE_MBUF_F_RX_IP_CKSUM_NONE) {

Actually, we probably also need to check for RTE_MBUF_F_RX_IP_CKSUM_BAD,
But that is a subject for another patch (fix actually).

 Acked-by: Konstantin Ananyev <konstantin.ananyev@huawei.com>


> +		uint16_t actual_cksum, expected_cksum;
> +		actual_cksum = pkt->hdr_checksum;
> +		pkt->hdr_checksum = 0;
> +		expected_cksum = rte_ipv4_cksum(pkt);
> +		if (actual_cksum != expected_cksum)
> +			return -2;
> +	}
> 
>  	/*
>  	 * 3. The IP version number must be 4. If the version number is not 4
> diff --git a/examples/l3fwd/l3fwd_em.h b/examples/l3fwd/l3fwd_em.h
> index 7d051fc076..1fee2e2e6c 100644
> --- a/examples/l3fwd/l3fwd_em.h
> +++ b/examples/l3fwd/l3fwd_em.h
> @@ -20,7 +20,7 @@ l3fwd_em_handle_ipv4(struct rte_mbuf *m, uint16_t portid,
> 
>  #ifdef DO_RFC_1812_CHECKS
>  	/* Check to make sure the packet is valid (RFC1812) */
> -	if (is_valid_ipv4_pkt(ipv4_hdr, m->pkt_len) < 0) {
> +	if (is_valid_ipv4_pkt(ipv4_hdr, m->pkt_len, m->ol_flags) < 0) {
>  		rte_pktmbuf_free(m);
>  		return BAD_PORT;
>  	}
> diff --git a/examples/l3fwd/l3fwd_lpm.h b/examples/l3fwd/l3fwd_lpm.h
> index c61b969584..4ee61e8d88 100644
> --- a/examples/l3fwd/l3fwd_lpm.h
> +++ b/examples/l3fwd/l3fwd_lpm.h
> @@ -22,7 +22,7 @@ l3fwd_lpm_simple_forward(struct rte_mbuf *m, uint16_t portid,
> 
>  #ifdef DO_RFC_1812_CHECKS
>  		/* Check to make sure the packet is valid (RFC1812) */
> -		if (is_valid_ipv4_pkt(ipv4_hdr, m->pkt_len) < 0) {
> +		if (is_valid_ipv4_pkt(ipv4_hdr, m->pkt_len, m->ol_flags) < 0) {
>  			rte_pktmbuf_free(m);
>  			return;
>  		}
> diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c
> index b42365ef1b..851e7e68f9 100644
> --- a/examples/l3fwd/main.c
> +++ b/examples/l3fwd/main.c
> @@ -74,6 +74,8 @@ static int numa_on = 1; /**< NUMA is enabled by default. */
>  static int parse_ptype; /**< Parse packet type using rx callback, and */
>  			/**< disabled by default */
>  static int disable_rss; /**< Disable the RX RSS mode */
> +static int relax_rx_offload; /**< Relax RX offload mode, and */
> +			     /**< disabled by default */
>  static int per_port_pool; /**< Use separate buffer pools per port; disabled */
>  			  /**< by default */
> 
> @@ -680,6 +682,7 @@ static const char short_options[] =
>  #define CMD_LINE_OPT_HASH_ENTRY_NUM "hash-entry-num"
>  #define CMD_LINE_OPT_PARSE_PTYPE "parse-ptype"
>  #define CMD_LINE_OPT_DISABLE_RSS "disable-rss"
> +#define CMD_LINE_OPT_RELAX_RX_OFFLOAD "relax-rx-offload"
>  #define CMD_LINE_OPT_PER_PORT_POOL "per-port-pool"
>  #define CMD_LINE_OPT_MODE "mode"
>  #define CMD_LINE_OPT_EVENTQ_SYNC "eventq-sched"
> @@ -708,6 +711,7 @@ enum {
>  	CMD_LINE_OPT_HASH_ENTRY_NUM_NUM,
>  	CMD_LINE_OPT_PARSE_PTYPE_NUM,
>  	CMD_LINE_OPT_DISABLE_RSS_NUM,
> +	CMD_LINE_OPT_RELAX_RX_OFFLOAD_NUM,
>  	CMD_LINE_OPT_RULE_IPV4_NUM,
>  	CMD_LINE_OPT_RULE_IPV6_NUM,
>  	CMD_LINE_OPT_ALG_NUM,
> @@ -731,6 +735,7 @@ static const struct option lgopts[] = {
>  	{CMD_LINE_OPT_MAX_PKT_LEN, 1, 0, CMD_LINE_OPT_MAX_PKT_LEN_NUM},
>  	{CMD_LINE_OPT_HASH_ENTRY_NUM, 1, 0, CMD_LINE_OPT_HASH_ENTRY_NUM_NUM},
>  	{CMD_LINE_OPT_PARSE_PTYPE, 0, 0, CMD_LINE_OPT_PARSE_PTYPE_NUM},
> +	{CMD_LINE_OPT_RELAX_RX_OFFLOAD, 0, 0, CMD_LINE_OPT_RELAX_RX_OFFLOAD_NUM},
>  	{CMD_LINE_OPT_DISABLE_RSS, 0, 0, CMD_LINE_OPT_DISABLE_RSS_NUM},
>  	{CMD_LINE_OPT_PER_PORT_POOL, 0, 0, CMD_LINE_OPT_PARSE_PER_PORT_POOL},
>  	{CMD_LINE_OPT_MODE, 1, 0, CMD_LINE_OPT_MODE_NUM},
> @@ -857,6 +862,11 @@ parse_args(int argc, char **argv)
>  			parse_ptype = 1;
>  			break;
> 
> +		case CMD_LINE_OPT_RELAX_RX_OFFLOAD_NUM:
> +			printf("Relax rx offload mode is enabled\n");
> +			relax_rx_offload = 1;
> +			break;
> +
>  		case CMD_LINE_OPT_DISABLE_RSS_NUM:
>  			printf("Disable RX RSS\n");
>  			disable_rss = 1;
> @@ -1278,6 +1288,20 @@ l3fwd_poll_resource_setup(void)
>  				local_port_conf.rx_adv_conf.rss_conf.rss_hf);
>  		}
> 
> +		/* relax the rx offload requirement */
> +		if ((local_port_conf.rxmode.offloads & dev_info.rx_offload_capa) !=
> +			local_port_conf.rxmode.offloads) {
> +			printf("Port %u requested Rx offloads 0x%"PRIx64" does not"
> +				" match Rx offloads capabilities 0x%"PRIx64"\n",
> +				portid, local_port_conf.rxmode.offloads,
> +				dev_info.rx_offload_capa);
> +			if (relax_rx_offload) {
> +				local_port_conf.rxmode.offloads &= dev_info.rx_offload_capa;
> +				printf("warning: modified the rx offload to 0x%"PRIx64" based on device"
> +				" capability\n", local_port_conf.rxmode.offloads);
> +			}
> +		}
> +
>  		ret = rte_eth_dev_configure(portid, nb_rx_queue,
>  					(uint16_t)n_tx_queue, &local_port_conf);
>  		if (ret < 0)
> --
> 2.34.1


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v5 0/2] example/l3fwd: relax l3fwd rx RSS/Offload if needed
  2023-11-13 16:11 [PATCH v5 0/2] example/l3fwd: relax l3fwd rx RSS/Offload if needed Trevor Tao
  2023-11-13 16:11 ` [PATCH v5 1/2] examples/l3fwd: relax RSS requirement with option Trevor Tao
  2023-11-13 16:11 ` [PATCH v5 2/2] examples/l3fwd: relax RX Offload " Trevor Tao
@ 2023-11-22 23:08 ` Thomas Monjalon
  2 siblings, 0 replies; 6+ messages in thread
From: Thomas Monjalon @ 2023-11-22 23:08 UTC (permalink / raw)
  To: Trevor Tao; +Cc: dev, konstantin.v.ananyev

13/11/2023 17:11, Trevor Tao:
> This series try to relax l3fwd rx RSS/Offload mode requirement if they
> are not supported by underlying hw or virtual devices, there is an
> option named relax_rx_mode added to enable this option.
> 
> Trevor Tao (2):
>   examples/l3fwd: relax RSS requirement with option
>   examples/l3fwd: relax RX Offload with option

Applied with minor improvements, thanks.




^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2023-11-22 23:09 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-11-13 16:11 [PATCH v5 0/2] example/l3fwd: relax l3fwd rx RSS/Offload if needed Trevor Tao
2023-11-13 16:11 ` [PATCH v5 1/2] examples/l3fwd: relax RSS requirement with option Trevor Tao
2023-11-13 21:05   ` Konstantin Ananyev
2023-11-13 16:11 ` [PATCH v5 2/2] examples/l3fwd: relax RX Offload " Trevor Tao
2023-11-13 21:13   ` Konstantin Ananyev
2023-11-22 23:08 ` [PATCH v5 0/2] example/l3fwd: relax l3fwd rx RSS/Offload if needed Thomas Monjalon

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).