Thread (6 messages) 6 messages, 3 authors, 2021-03-05

Re: [dpdk-dev] [PATCH] net/i40e: fix IPv4 fragment offload issue

From: Xing, Beilei <hidden>
Date: 2021-03-02 06:53:44

quoted hunk ↗ jump to hunk
-----Original Message-----
From: Li, Xiaoyun <redacted>
Sent: Friday, February 26, 2021 4:15 PM
To: dev@dpdk.org; Xing, Beilei <redacted>; Guo, Jia
[off-list ref]; Finn, Emma [off-list ref]
Cc: Li, Xiaoyun <redacted>; stable@dpdk.org
Subject: [PATCH] net/i40e: fix IPv4 fragment offload issue

IPv4 fragment_offset mask was required to be 0 no matter what the spec value
was. But zero mask means not caring about fragment_offset field then both
non-frag and frag packets should hit the rule.

But the actual fragment rules should be like the following:
Only non-fragment packets can hit Rule 1:
Rule 1: mask=0x3fff, spec=0
Only fragment packets can hit rule 2:
Rule 2: mask=0x3fff, spec=0x8, last=0x2000

This patch allows the above rules.

Fixes: 42044b69c67d ("net/i40e: support input set selection for FDIR")
Cc: stable@dpdk.org

Signed-off-by: Xiaoyun Li <redacted>
---
 drivers/net/i40e/i40e_flow.c | 89 ++++++++++++++++++++++++++++++++----
 1 file changed, 80 insertions(+), 9 deletions(-)
diff --git a/drivers/net/i40e/i40e_flow.c b/drivers/net/i40e/i40e_flow.c index
4d44282312..86d96d9a11 100644
--- a/drivers/net/i40e/i40e_flow.c
+++ b/drivers/net/i40e/i40e_flow.c
+						   "Invalid IPv4 "
+						   "fragment_offset mask");
Needn't split the comments line.
+						return -rte_errno;
+					}
+					/*
+					 * non-frag rule:
+					 * mask=0x3fff,sepc=0
Typo: sepc->spec
+					 * frag rule:
+					 * mask=0x3fff,spec=0x8,last=0x2000
+					 */
+					if (frag_spec ==
+					    (1 << RTE_IPV4_HDR_FO_SHIFT) &&
+					    frag_last ==
RTE_IPV4_HDR_MF_FLAG) {
+						pctype =
+
I40E_FILTER_PCTYPE_FRAG_IPV4;
+					} else if (frag_spec || frag_last) {
+						rte_flow_error_set(error,
+						   EINVAL,
+
RTE_FLOW_ERROR_TYPE_ITEM,
+						   item,
+						   "Invalid IPv4 "
+						   "fragment_offset rule");
Same as above.
+						return -rte_errno;
+					}
+				} else if (frag_spec || frag_last) {
+					rte_flow_error_set(error,
+						EINVAL,
+
	RTE_FLOW_ERROR_TYPE_ITEM,
+						item,
+						"Invalid fragment_offset");
+					return -rte_errno;
+				}

 				if (input_set & (I40E_INSET_DMAC |
I40E_INSET_SMAC)) {
 					if (input_set & (I40E_INSET_IPV4_SRC
|
--
2.25.1
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help