dpdk: fix generic flow input parsing in FDIR
This patch fixes the issue that in DPDK FDIR generic flow parsing, the inputs will be changed during processing, which will lead to a failure in vnet flow when creating generic flow rules. Type: fix Signed-off-by: Ting Xu <ting.xu@intel.com> Change-Id: I107735a305ff48593d66746e0cd642c76ad5700d
This commit is contained in:
96
build/external/patches/dpdk_22.03/0001-net-ice-fix-raw-flow-input-pattern-value-change-i.patch
vendored
Normal file
96
build/external/patches/dpdk_22.03/0001-net-ice-fix-raw-flow-input-pattern-value-change-i.patch
vendored
Normal file
@ -0,0 +1,96 @@
|
||||
From 794d99b8abeeb401a374489a9e3c629d023c271f Mon Sep 17 00:00:00 2001
|
||||
From: Ting Xu <ting.xu@intel.com>
|
||||
Date: Fri, 4 Mar 2022 07:26:28 +0000
|
||||
Subject: [PATCH v2] net/ice: fix raw flow input pattern value change in FDIR
|
||||
|
||||
When parsing raw flow pattern in FDIR, the input parameter spec and
|
||||
mask are used directly and the original value will be changed. It
|
||||
will cause error if these values are used in other functions. In this
|
||||
patch, temporary variables are created to store the spec and mask.
|
||||
|
||||
Fixes: 25be39cc1760 ("net/ice: enable protocol agnostic flow offloading in FDIR")
|
||||
|
||||
Cc: stable@dpdk.org
|
||||
|
||||
Signed-off-by: Ting Xu <ting.xu@intel.com>
|
||||
---
|
||||
drivers/net/ice/ice_fdir_filter.c | 25 +++++++++++++++++++------
|
||||
1 file changed, 19 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ice/ice_fdir_filter.c b/drivers/net/ice/ice_fdir_filter.c
|
||||
index 7954c6d8ea..5ff1afac90 100644
|
||||
--- a/drivers/net/ice/ice_fdir_filter.c
|
||||
+++ b/drivers/net/ice/ice_fdir_filter.c
|
||||
@@ -1868,10 +1868,11 @@ ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad,
|
||||
break;
|
||||
|
||||
/* convert raw spec & mask from byte string to int */
|
||||
- unsigned char *tmp_spec =
|
||||
+ unsigned char *spec_pattern =
|
||||
(uint8_t *)(uintptr_t)raw_spec->pattern;
|
||||
- unsigned char *tmp_mask =
|
||||
+ unsigned char *mask_pattern =
|
||||
(uint8_t *)(uintptr_t)raw_mask->pattern;
|
||||
+ uint8_t *tmp_spec, *tmp_mask;
|
||||
uint16_t udp_port = 0;
|
||||
uint16_t tmp_val = 0;
|
||||
uint8_t pkt_len = 0;
|
||||
@@ -1883,8 +1884,18 @@ ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad,
|
||||
pkt_len)
|
||||
return -rte_errno;
|
||||
|
||||
+ tmp_spec = rte_zmalloc(NULL, pkt_len / 2, 0);
|
||||
+ if (!tmp_spec)
|
||||
+ return -rte_errno;
|
||||
+
|
||||
+ tmp_mask = rte_zmalloc(NULL, pkt_len / 2, 0);
|
||||
+ if (!tmp_mask) {
|
||||
+ rte_free(tmp_spec);
|
||||
+ return -rte_errno;
|
||||
+ }
|
||||
+
|
||||
for (i = 0, j = 0; i < pkt_len; i += 2, j++) {
|
||||
- tmp = tmp_spec[i];
|
||||
+ tmp = spec_pattern[i];
|
||||
if (tmp >= 'a' && tmp <= 'f')
|
||||
tmp_val = tmp - 'a' + 10;
|
||||
if (tmp >= 'A' && tmp <= 'F')
|
||||
@@ -1893,7 +1904,7 @@ ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad,
|
||||
tmp_val = tmp - '0';
|
||||
|
||||
tmp_val *= 16;
|
||||
- tmp = tmp_spec[i + 1];
|
||||
+ tmp = spec_pattern[i + 1];
|
||||
if (tmp >= 'a' && tmp <= 'f')
|
||||
tmp_spec[j] = tmp_val + tmp - 'a' + 10;
|
||||
if (tmp >= 'A' && tmp <= 'F')
|
||||
@@ -1901,7 +1912,7 @@ ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad,
|
||||
if (tmp >= '0' && tmp <= '9')
|
||||
tmp_spec[j] = tmp_val + tmp - '0';
|
||||
|
||||
- tmp = tmp_mask[i];
|
||||
+ tmp = mask_pattern[i];
|
||||
if (tmp >= 'a' && tmp <= 'f')
|
||||
tmp_val = tmp - 'a' + 10;
|
||||
if (tmp >= 'A' && tmp <= 'F')
|
||||
@@ -1910,7 +1921,7 @@ ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad,
|
||||
tmp_val = tmp - '0';
|
||||
|
||||
tmp_val *= 16;
|
||||
- tmp = tmp_mask[i + 1];
|
||||
+ tmp = mask_pattern[i + 1];
|
||||
if (tmp >= 'a' && tmp <= 'f')
|
||||
tmp_mask[j] = tmp_val + tmp - 'a' + 10;
|
||||
if (tmp >= 'A' && tmp <= 'F')
|
||||
@@ -1953,6 +1964,8 @@ ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad,
|
||||
|
||||
filter->parser_ena = true;
|
||||
|
||||
+ rte_free(tmp_spec);
|
||||
+ rte_free(tmp_mask);
|
||||
break;
|
||||
}
|
||||
|
||||
--
|
||||
2.17.1
|
||||
|
Reference in New Issue
Block a user