* [dpdk-dev] [PATCH 1/2] net/e1000: fix flex type filter
@ 2017-06-16 3:15 Wei Zhao
2017-06-16 3:15 ` [dpdk-dev] [PATCH 2/2] net/e1000: fix flex filter length error Wei Zhao
2017-06-16 5:04 ` [dpdk-dev] [PATCH v2 1/2] net/e1000: fix flex type filter Wei Zhao
0 siblings, 2 replies; 5+ messages in thread
From: Wei Zhao @ 2017-06-16 3:15 UTC (permalink / raw)
To: dev; +Cc: wenzhuo.lu, Wei Zhao
Fix bug in parse the flex info of wrong use local
varible index which will cause filter fail.
Fixes: 7cd77faf7129 ("net/igb: parse flow API flex filter")
Signed-off-by: Wei Zhao <wei.zhao1@intel.com>
---
drivers/net/e1000/igb_flow.c | 57 +++++++++++++++++++++++++++++++-------------
1 file changed, 41 insertions(+), 16 deletions(-)
diff --git a/drivers/net/e1000/igb_flow.c b/drivers/net/e1000/igb_flow.c
index ce48c0d..98538e6 100644
--- a/drivers/net/e1000/igb_flow.c
+++ b/drivers/net/e1000/igb_flow.c
@@ -77,6 +77,8 @@
} \
} while (0)
+#define IGB_FLEX_RAW_NUM 12
+
/**
* Please aware there's an asumption for all the parsers.
* rte_flow_item is using big endian, rte_flow_attr and
@@ -1043,8 +1045,11 @@ cons_parse_flex_filter(const struct rte_flow_attr *attr,
const struct rte_flow_item_raw *raw_spec;
const struct rte_flow_item_raw *raw_mask;
const struct rte_flow_action_queue *act_q;
- uint32_t index, i, offset, total_offset = 0;
- int32_t shift;
+ uint32_t index, i, offset, total_offset;
+ uint32_t max_offset = 0;
+ int32_t shift, j, raw_index = 0;
+ int32_t relative[IGB_FLEX_RAW_NUM] = {0};
+ int32_t raw_offset[IGB_FLEX_RAW_NUM] = {0};
if (!pattern) {
rte_flow_error_set(error, EINVAL,
@@ -1105,8 +1110,8 @@ cons_parse_flex_filter(const struct rte_flow_attr *attr,
else
offset = 0;
- for (index = 0; index < raw_spec->length; index++) {
- if (raw_mask->pattern[index] != 0xFF) {
+ for (j = 0; j < raw_spec->length; j++) {
+ if (raw_mask->pattern[j] != 0xFF) {
memset(filter, 0, sizeof(struct rte_eth_flex_filter));
rte_flow_error_set(error, EINVAL,
RTE_FLOW_ERROR_TYPE_ITEM,
@@ -1115,6 +1120,21 @@ cons_parse_flex_filter(const struct rte_flow_attr *attr,
}
}
+ total_offset = 0;
+
+ if (raw_spec->relative) {
+ for (j = raw_index; j > 0; j--) {
+ total_offset += raw_offset[j - 1];
+ if (!relative[j - 1])
+ break;
+ }
+ if (total_offset + raw_spec->length + offset > max_offset)
+ max_offset = total_offset + raw_spec->length + offset;
+ } else {
+ if (raw_spec->length + offset > max_offset)
+ max_offset = raw_spec->length + offset;
+ }
+
if ((raw_spec->length + offset + total_offset) >
RTE_FLEX_FILTER_MAXLEN) {
memset(filter, 0, sizeof(struct rte_eth_flex_filter));
@@ -1125,30 +1145,35 @@ cons_parse_flex_filter(const struct rte_flow_attr *attr,
}
if (raw_spec->relative == 0) {
- for (index = 0; index < raw_spec->length; index++)
- filter->bytes[index] = raw_spec->pattern[index];
- index = offset / CHAR_BIT;
+ for (j = 0; j < raw_spec->length; j++)
+ filter->bytes[offset + j] =
+ raw_spec->pattern[j];
+ j = offset / CHAR_BIT;
+ shift = offset % CHAR_BIT;
} else {
- for (index = 0; index < raw_spec->length; index++)
- filter->bytes[total_offset + index] =
- raw_spec->pattern[index];
- index = (total_offset + offset) / CHAR_BIT;
+ for (j = 0; j < raw_spec->length; j++)
+ filter->bytes[total_offset + offset + j] =
+ raw_spec->pattern[j];
+ j = (total_offset + offset) / CHAR_BIT;
+ shift = (total_offset + offset) % CHAR_BIT;
}
i = 0;
- for (shift = offset % CHAR_BIT; shift < CHAR_BIT; shift++) {
- filter->mask[index] |= (0x80 >> shift);
+ for ( ; shift < CHAR_BIT; shift++) {
+ filter->mask[j] |= (0x80 >> shift);
i++;
if (i == raw_spec->length)
break;
if (shift == (CHAR_BIT - 1)) {
- index++;
+ j++;
shift = -1;
}
}
- total_offset += offset + raw_spec->length;
+ relative[raw_index] = raw_spec->relative;
+ raw_offset[raw_index] = offset + raw_spec->length;
+ raw_index++;
/* check if the next not void item is RAW */
index++;
@@ -1167,7 +1192,7 @@ cons_parse_flex_filter(const struct rte_flow_attr *attr,
goto item_loop;
}
- filter->len = RTE_ALIGN(total_offset, 8);
+ filter->len = RTE_ALIGN(max_offset, 8);
/* parse action */
index = 0;
--
2.7.4
^ permalink raw reply [flat|nested] 5+ messages in thread
* [dpdk-dev] [PATCH 2/2] net/e1000: fix flex filter length error
2017-06-16 3:15 [dpdk-dev] [PATCH 1/2] net/e1000: fix flex type filter Wei Zhao
@ 2017-06-16 3:15 ` Wei Zhao
2017-06-16 5:04 ` [dpdk-dev] [PATCH v2 1/2] net/e1000: fix flex type filter Wei Zhao
1 sibling, 0 replies; 5+ messages in thread
From: Wei Zhao @ 2017-06-16 3:15 UTC (permalink / raw)
To: dev; +Cc: wenzhuo.lu, Wei Zhao
igb flex filter support a recognize any arbitrary
pattern within the first 128 bytes of the packet,
but the macro E1000_FLEX_FILTERS_MASK_SIZE define
only the first 64 byte.
Fixes: 231d43909a31 ("igb: migrate flex filter to new API")
Signed-off-by: Wei Zhao <wei.zhao1@intel.com>
---
drivers/net/e1000/e1000_ethdev.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/e1000/e1000_ethdev.h b/drivers/net/e1000/e1000_ethdev.h
index 9266540..85fd1a0 100644
--- a/drivers/net/e1000/e1000_ethdev.h
+++ b/drivers/net/e1000/e1000_ethdev.h
@@ -82,7 +82,7 @@
#define E1000_MAX_FLEX_FILTER_DWDS \
(E1000_MAX_FLEX_FILTER_LEN / sizeof(uint32_t))
#define E1000_FLEX_FILTERS_MASK_SIZE \
- (E1000_MAX_FLEX_FILTER_DWDS / 4)
+ (E1000_MAX_FLEX_FILTER_DWDS / 2)
#define E1000_FHFT_QUEUEING_LEN 0x0000007F
#define E1000_FHFT_QUEUEING_QUEUE 0x00000700
#define E1000_FHFT_QUEUEING_PRIO 0x00070000
--
2.7.4
^ permalink raw reply [flat|nested] 5+ messages in thread
* [dpdk-dev] [PATCH v2 1/2] net/e1000: fix flex type filter
2017-06-16 3:15 [dpdk-dev] [PATCH 1/2] net/e1000: fix flex type filter Wei Zhao
2017-06-16 3:15 ` [dpdk-dev] [PATCH 2/2] net/e1000: fix flex filter length error Wei Zhao
@ 2017-06-16 5:04 ` Wei Zhao
2017-06-16 5:04 ` [dpdk-dev] [PATCH v2 2/2] net/e1000: fix flex filter length error Wei Zhao
2017-06-16 16:00 ` [dpdk-dev] [PATCH v2 1/2] net/e1000: fix flex type filter Ferruh Yigit
1 sibling, 2 replies; 5+ messages in thread
From: Wei Zhao @ 2017-06-16 5:04 UTC (permalink / raw)
To: dev; +Cc: wenzhuo.lu, Wei Zhao
Fix bug in parse the flex info of wrong use local
variable index which will cause filter fail, and some
error in calculation mask.
Fixes: 7cd77faf7129 ("net/igb: parse flow API flex filter")
Signed-off-by: Wei Zhao <wei.zhao1@intel.com>
---
Changes in v2:
add more log for details and fix patch check warning.
---
drivers/net/e1000/igb_flow.c | 57 +++++++++++++++++++++++++++++++-------------
1 file changed, 41 insertions(+), 16 deletions(-)
diff --git a/drivers/net/e1000/igb_flow.c b/drivers/net/e1000/igb_flow.c
index ce48c0d..98538e6 100644
--- a/drivers/net/e1000/igb_flow.c
+++ b/drivers/net/e1000/igb_flow.c
@@ -77,6 +77,8 @@
} \
} while (0)
+#define IGB_FLEX_RAW_NUM 12
+
/**
* Please aware there's an asumption for all the parsers.
* rte_flow_item is using big endian, rte_flow_attr and
@@ -1043,8 +1045,11 @@ cons_parse_flex_filter(const struct rte_flow_attr *attr,
const struct rte_flow_item_raw *raw_spec;
const struct rte_flow_item_raw *raw_mask;
const struct rte_flow_action_queue *act_q;
- uint32_t index, i, offset, total_offset = 0;
- int32_t shift;
+ uint32_t index, i, offset, total_offset;
+ uint32_t max_offset = 0;
+ int32_t shift, j, raw_index = 0;
+ int32_t relative[IGB_FLEX_RAW_NUM] = {0};
+ int32_t raw_offset[IGB_FLEX_RAW_NUM] = {0};
if (!pattern) {
rte_flow_error_set(error, EINVAL,
@@ -1105,8 +1110,8 @@ cons_parse_flex_filter(const struct rte_flow_attr *attr,
else
offset = 0;
- for (index = 0; index < raw_spec->length; index++) {
- if (raw_mask->pattern[index] != 0xFF) {
+ for (j = 0; j < raw_spec->length; j++) {
+ if (raw_mask->pattern[j] != 0xFF) {
memset(filter, 0, sizeof(struct rte_eth_flex_filter));
rte_flow_error_set(error, EINVAL,
RTE_FLOW_ERROR_TYPE_ITEM,
@@ -1115,6 +1120,21 @@ cons_parse_flex_filter(const struct rte_flow_attr *attr,
}
}
+ total_offset = 0;
+
+ if (raw_spec->relative) {
+ for (j = raw_index; j > 0; j--) {
+ total_offset += raw_offset[j - 1];
+ if (!relative[j - 1])
+ break;
+ }
+ if (total_offset + raw_spec->length + offset > max_offset)
+ max_offset = total_offset + raw_spec->length + offset;
+ } else {
+ if (raw_spec->length + offset > max_offset)
+ max_offset = raw_spec->length + offset;
+ }
+
if ((raw_spec->length + offset + total_offset) >
RTE_FLEX_FILTER_MAXLEN) {
memset(filter, 0, sizeof(struct rte_eth_flex_filter));
@@ -1125,30 +1145,35 @@ cons_parse_flex_filter(const struct rte_flow_attr *attr,
}
if (raw_spec->relative == 0) {
- for (index = 0; index < raw_spec->length; index++)
- filter->bytes[index] = raw_spec->pattern[index];
- index = offset / CHAR_BIT;
+ for (j = 0; j < raw_spec->length; j++)
+ filter->bytes[offset + j] =
+ raw_spec->pattern[j];
+ j = offset / CHAR_BIT;
+ shift = offset % CHAR_BIT;
} else {
- for (index = 0; index < raw_spec->length; index++)
- filter->bytes[total_offset + index] =
- raw_spec->pattern[index];
- index = (total_offset + offset) / CHAR_BIT;
+ for (j = 0; j < raw_spec->length; j++)
+ filter->bytes[total_offset + offset + j] =
+ raw_spec->pattern[j];
+ j = (total_offset + offset) / CHAR_BIT;
+ shift = (total_offset + offset) % CHAR_BIT;
}
i = 0;
- for (shift = offset % CHAR_BIT; shift < CHAR_BIT; shift++) {
- filter->mask[index] |= (0x80 >> shift);
+ for ( ; shift < CHAR_BIT; shift++) {
+ filter->mask[j] |= (0x80 >> shift);
i++;
if (i == raw_spec->length)
break;
if (shift == (CHAR_BIT - 1)) {
- index++;
+ j++;
shift = -1;
}
}
- total_offset += offset + raw_spec->length;
+ relative[raw_index] = raw_spec->relative;
+ raw_offset[raw_index] = offset + raw_spec->length;
+ raw_index++;
/* check if the next not void item is RAW */
index++;
@@ -1167,7 +1192,7 @@ cons_parse_flex_filter(const struct rte_flow_attr *attr,
goto item_loop;
}
- filter->len = RTE_ALIGN(total_offset, 8);
+ filter->len = RTE_ALIGN(max_offset, 8);
/* parse action */
index = 0;
--
2.7.4
^ permalink raw reply [flat|nested] 5+ messages in thread
* [dpdk-dev] [PATCH v2 2/2] net/e1000: fix flex filter length error
2017-06-16 5:04 ` [dpdk-dev] [PATCH v2 1/2] net/e1000: fix flex type filter Wei Zhao
@ 2017-06-16 5:04 ` Wei Zhao
2017-06-16 16:00 ` [dpdk-dev] [PATCH v2 1/2] net/e1000: fix flex type filter Ferruh Yigit
1 sibling, 0 replies; 5+ messages in thread
From: Wei Zhao @ 2017-06-16 5:04 UTC (permalink / raw)
To: dev; +Cc: wenzhuo.lu, Wei Zhao
igb flex filter support a recognize any arbitrary
pattern within the first 128 bytes of the packet,
but the macro E1000_FLEX_FILTERS_MASK_SIZE define
only the first 64 byte.
Fixes: 231d43909a31 ("igb: migrate flex filter to new API")
Signed-off-by: Wei Zhao <wei.zhao1@intel.com>
---
drivers/net/e1000/e1000_ethdev.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/e1000/e1000_ethdev.h b/drivers/net/e1000/e1000_ethdev.h
index 9266540..85fd1a0 100644
--- a/drivers/net/e1000/e1000_ethdev.h
+++ b/drivers/net/e1000/e1000_ethdev.h
@@ -82,7 +82,7 @@
#define E1000_MAX_FLEX_FILTER_DWDS \
(E1000_MAX_FLEX_FILTER_LEN / sizeof(uint32_t))
#define E1000_FLEX_FILTERS_MASK_SIZE \
- (E1000_MAX_FLEX_FILTER_DWDS / 4)
+ (E1000_MAX_FLEX_FILTER_DWDS / 2)
#define E1000_FHFT_QUEUEING_LEN 0x0000007F
#define E1000_FHFT_QUEUEING_QUEUE 0x00000700
#define E1000_FHFT_QUEUEING_PRIO 0x00070000
--
2.7.4
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [dpdk-dev] [PATCH v2 1/2] net/e1000: fix flex type filter
2017-06-16 5:04 ` [dpdk-dev] [PATCH v2 1/2] net/e1000: fix flex type filter Wei Zhao
2017-06-16 5:04 ` [dpdk-dev] [PATCH v2 2/2] net/e1000: fix flex filter length error Wei Zhao
@ 2017-06-16 16:00 ` Ferruh Yigit
1 sibling, 0 replies; 5+ messages in thread
From: Ferruh Yigit @ 2017-06-16 16:00 UTC (permalink / raw)
To: Wei Zhao, dev; +Cc: wenzhuo.lu
On 6/16/2017 6:04 AM, Wei Zhao wrote:
> Fix bug in parse the flex info of wrong use local
> variable index which will cause filter fail, and some
> error in calculation mask.
>
> Fixes: 7cd77faf7129 ("net/igb: parse flow API flex filter")
>
> Signed-off-by: Wei Zhao <wei.zhao1@intel.com>
Series applied to dpdk-next-net/master, thanks.
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2017-06-16 16:00 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-06-16 3:15 [dpdk-dev] [PATCH 1/2] net/e1000: fix flex type filter Wei Zhao
2017-06-16 3:15 ` [dpdk-dev] [PATCH 2/2] net/e1000: fix flex filter length error Wei Zhao
2017-06-16 5:04 ` [dpdk-dev] [PATCH v2 1/2] net/e1000: fix flex type filter Wei Zhao
2017-06-16 5:04 ` [dpdk-dev] [PATCH v2 2/2] net/e1000: fix flex filter length error Wei Zhao
2017-06-16 16:00 ` [dpdk-dev] [PATCH v2 1/2] net/e1000: fix flex type filter Ferruh Yigit
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).