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 index4d44282312..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