From: Dekel Peled <dekelp@nvidia.com>
To: orika@nvidia.com, thomas@monjalon.net, ferruh.yigit@intel.com,
arybchenko@solarflare.com, konstantin.ananyev@intel.com,
olivier.matz@6wind.com, wenzhuo.lu@intel.com,
beilei.xing@intel.com, bernard.iremonger@intel.com,
matan@nvidia.com, shahafs@nvidia.com, viacheslavo@nvidia.com
Cc: dev@dpdk.org
Subject: [dpdk-dev] [PATCH v3 07/11] net/mlx5: support match on IPv4 fragment packets
Date: Mon, 5 Oct 2020 11:35:49 +0300 [thread overview]
Message-ID: <b37eb6be1f9c4221ce567b0c8e29458647765edb.1601886720.git.dekelp@nvidia.com> (raw)
In-Reply-To: <cover.1601886719.git.dekelp@nvidia.com>
This patch adds to MLX5 PMD the support of matching on IPv4
fragmented and non-fragmented packets, using the IPv4 header
fragment_offset field.
Signed-off-by: Dekel Peled <dekelp@nvidia.com>
Acked-by: Ori Kam <orika@nvidia.com>
---
drivers/net/mlx5/mlx5_flow.c | 48 ++++++++----
drivers/net/mlx5/mlx5_flow.h | 10 +++
drivers/net/mlx5/mlx5_flow_dv.c | 156 +++++++++++++++++++++++++++++++------
drivers/net/mlx5/mlx5_flow_verbs.c | 9 ++-
4 files changed, 178 insertions(+), 45 deletions(-)
diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c
index ffa7646..906741f 100644
--- a/drivers/net/mlx5/mlx5_flow.c
+++ b/drivers/net/mlx5/mlx5_flow.c
@@ -474,6 +474,8 @@ struct mlx5_flow_tunnel_info {
* Bit-masks covering supported fields by the NIC to compare with user mask.
* @param[in] size
* Bit-masks size in bytes.
+ * @param[in] range_accepted
+ * True if range of values is accepted for specific fields, false otherwise.
* @param[out] error
* Pointer to error structure.
*
@@ -485,6 +487,7 @@ struct mlx5_flow_tunnel_info {
const uint8_t *mask,
const uint8_t *nic_mask,
unsigned int size,
+ bool range_accepted,
struct rte_flow_error *error)
{
unsigned int i;
@@ -502,7 +505,7 @@ struct mlx5_flow_tunnel_info {
RTE_FLOW_ERROR_TYPE_ITEM, item,
"mask/last without a spec is not"
" supported");
- if (item->spec && item->last) {
+ if (item->spec && item->last && !range_accepted) {
uint8_t spec[size];
uint8_t last[size];
unsigned int i;
@@ -1277,7 +1280,8 @@ struct mlx5_flow_tunnel_info {
ret = mlx5_flow_item_acceptable
(item, (const uint8_t *)mask,
(const uint8_t *)&rte_flow_item_icmp6_mask,
- sizeof(struct rte_flow_item_icmp6), error);
+ sizeof(struct rte_flow_item_icmp6),
+ MLX5_ITEM_RANGE_NOT_ACCEPTED, error);
if (ret < 0)
return ret;
return 0;
@@ -1329,7 +1333,8 @@ struct mlx5_flow_tunnel_info {
ret = mlx5_flow_item_acceptable
(item, (const uint8_t *)mask,
(const uint8_t *)&rte_flow_item_icmp_mask,
- sizeof(struct rte_flow_item_icmp), error);
+ sizeof(struct rte_flow_item_icmp),
+ MLX5_ITEM_RANGE_NOT_ACCEPTED, error);
if (ret < 0)
return ret;
return 0;
@@ -1384,7 +1389,7 @@ struct mlx5_flow_tunnel_info {
ret = mlx5_flow_item_acceptable(item, (const uint8_t *)mask,
(const uint8_t *)&nic_mask,
sizeof(struct rte_flow_item_eth),
- error);
+ MLX5_ITEM_RANGE_NOT_ACCEPTED, error);
return ret;
}
@@ -1438,7 +1443,7 @@ struct mlx5_flow_tunnel_info {
ret = mlx5_flow_item_acceptable(item, (const uint8_t *)mask,
(const uint8_t *)&nic_mask,
sizeof(struct rte_flow_item_vlan),
- error);
+ MLX5_ITEM_RANGE_NOT_ACCEPTED, error);
if (ret)
return ret;
if (!tunnel && mask->tci != RTE_BE16(0x0fff)) {
@@ -1502,6 +1507,7 @@ struct mlx5_flow_tunnel_info {
uint64_t last_item,
uint16_t ether_type,
const struct rte_flow_item_ipv4 *acc_mask,
+ bool range_accepted,
struct rte_flow_error *error)
{
const struct rte_flow_item_ipv4 *mask = item->mask;
@@ -1572,7 +1578,7 @@ struct mlx5_flow_tunnel_info {
acc_mask ? (const uint8_t *)acc_mask
: (const uint8_t *)&nic_mask,
sizeof(struct rte_flow_item_ipv4),
- error);
+ range_accepted, error);
if (ret < 0)
return ret;
return 0;
@@ -1592,6 +1598,8 @@ struct mlx5_flow_tunnel_info {
* @param[in] acc_mask
* Acceptable mask, if NULL default internal default mask
* will be used to check whether item fields are supported.
+ * @param[in] range_accepted
+ * True if range of values is accepted for specific fields, false otherwise.
* @param[out] error
* Pointer to error structure.
*
@@ -1671,7 +1679,7 @@ struct mlx5_flow_tunnel_info {
acc_mask ? (const uint8_t *)acc_mask
: (const uint8_t *)&nic_mask,
sizeof(struct rte_flow_item_ipv6),
- error);
+ MLX5_ITEM_RANGE_NOT_ACCEPTED, error);
if (ret < 0)
return ret;
return 0;
@@ -1726,7 +1734,8 @@ struct mlx5_flow_tunnel_info {
ret = mlx5_flow_item_acceptable
(item, (const uint8_t *)mask,
(const uint8_t *)&rte_flow_item_udp_mask,
- sizeof(struct rte_flow_item_udp), error);
+ sizeof(struct rte_flow_item_udp), MLX5_ITEM_RANGE_NOT_ACCEPTED,
+ error);
if (ret < 0)
return ret;
return 0;
@@ -1781,7 +1790,8 @@ struct mlx5_flow_tunnel_info {
ret = mlx5_flow_item_acceptable
(item, (const uint8_t *)mask,
(const uint8_t *)flow_mask,
- sizeof(struct rte_flow_item_tcp), error);
+ sizeof(struct rte_flow_item_tcp), MLX5_ITEM_RANGE_NOT_ACCEPTED,
+ error);
if (ret < 0)
return ret;
return 0;
@@ -1835,7 +1845,7 @@ struct mlx5_flow_tunnel_info {
(item, (const uint8_t *)mask,
(const uint8_t *)&rte_flow_item_vxlan_mask,
sizeof(struct rte_flow_item_vxlan),
- error);
+ MLX5_ITEM_RANGE_NOT_ACCEPTED, error);
if (ret < 0)
return ret;
if (spec) {
@@ -1906,7 +1916,7 @@ struct mlx5_flow_tunnel_info {
(item, (const uint8_t *)mask,
(const uint8_t *)&rte_flow_item_vxlan_gpe_mask,
sizeof(struct rte_flow_item_vxlan_gpe),
- error);
+ MLX5_ITEM_RANGE_NOT_ACCEPTED, error);
if (ret < 0)
return ret;
if (spec) {
@@ -1980,7 +1990,7 @@ struct mlx5_flow_tunnel_info {
ret = mlx5_flow_item_acceptable
(item, (const uint8_t *)mask,
(const uint8_t *)&gre_key_default_mask,
- sizeof(rte_be32_t), error);
+ sizeof(rte_be32_t), MLX5_ITEM_RANGE_NOT_ACCEPTED, error);
return ret;
}
@@ -2032,7 +2042,8 @@ struct mlx5_flow_tunnel_info {
ret = mlx5_flow_item_acceptable
(item, (const uint8_t *)mask,
(const uint8_t *)&nic_mask,
- sizeof(struct rte_flow_item_gre), error);
+ sizeof(struct rte_flow_item_gre), MLX5_ITEM_RANGE_NOT_ACCEPTED,
+ error);
if (ret < 0)
return ret;
#ifndef HAVE_MLX5DV_DR
@@ -2107,7 +2118,8 @@ struct mlx5_flow_tunnel_info {
ret = mlx5_flow_item_acceptable
(item, (const uint8_t *)mask,
(const uint8_t *)&nic_mask,
- sizeof(struct rte_flow_item_geneve), error);
+ sizeof(struct rte_flow_item_geneve),
+ MLX5_ITEM_RANGE_NOT_ACCEPTED, error);
if (ret)
return ret;
if (spec) {
@@ -2190,7 +2202,8 @@ struct mlx5_flow_tunnel_info {
ret = mlx5_flow_item_acceptable
(item, (const uint8_t *)mask,
(const uint8_t *)&rte_flow_item_mpls_mask,
- sizeof(struct rte_flow_item_mpls), error);
+ sizeof(struct rte_flow_item_mpls),
+ MLX5_ITEM_RANGE_NOT_ACCEPTED, error);
if (ret < 0)
return ret;
return 0;
@@ -2245,7 +2258,8 @@ struct mlx5_flow_tunnel_info {
ret = mlx5_flow_item_acceptable
(item, (const uint8_t *)mask,
(const uint8_t *)&rte_flow_item_nvgre_mask,
- sizeof(struct rte_flow_item_nvgre), error);
+ sizeof(struct rte_flow_item_nvgre),
+ MLX5_ITEM_RANGE_NOT_ACCEPTED, error);
if (ret < 0)
return ret;
return 0;
@@ -2339,7 +2353,7 @@ struct mlx5_flow_tunnel_info {
acc_mask ? (const uint8_t *)acc_mask
: (const uint8_t *)&nic_mask,
sizeof(struct rte_flow_item_ecpri),
- error);
+ MLX5_ITEM_RANGE_NOT_ACCEPTED, error);
}
/* Allocate unique ID for the split Q/RSS subflows. */
diff --git a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.h
index 279daf2..1e30c93 100644
--- a/drivers/net/mlx5/mlx5_flow.h
+++ b/drivers/net/mlx5/mlx5_flow.h
@@ -330,6 +330,14 @@ enum mlx5_feature_name {
#define MLX5_ENCAPSULATION_DECISION_SIZE (sizeof(struct rte_flow_item_eth) + \
sizeof(struct rte_flow_item_ipv4))
+/* IPv4 fragment_offset field contains relevant data in bits 2 to 15. */
+#define MLX5_IPV4_FRAG_OFFSET_MASK \
+ (RTE_IPV4_HDR_OFFSET_MASK | RTE_IPV4_HDR_MF_FLAG)
+
+/* Specific item's fields can accept a range of values (using spec and last). */
+#define MLX5_ITEM_RANGE_NOT_ACCEPTED false
+#define MLX5_ITEM_RANGE_ACCEPTED true
+
/* Software header modify action numbers of a flow. */
#define MLX5_ACT_NUM_MDF_IPV4 1
#define MLX5_ACT_NUM_MDF_IPV6 4
@@ -985,6 +993,7 @@ int mlx5_flow_item_acceptable(const struct rte_flow_item *item,
const uint8_t *mask,
const uint8_t *nic_mask,
unsigned int size,
+ bool range_accepted,
struct rte_flow_error *error);
int mlx5_flow_validate_item_eth(const struct rte_flow_item *item,
uint64_t item_flags,
@@ -1002,6 +1011,7 @@ int mlx5_flow_validate_item_ipv4(const struct rte_flow_item *item,
uint64_t last_item,
uint16_t ether_type,
const struct rte_flow_item_ipv4 *acc_mask,
+ bool range_accepted,
struct rte_flow_error *error);
int mlx5_flow_validate_item_ipv6(const struct rte_flow_item *item,
uint64_t item_flags,
diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c
index 0a0a5a4..3379caf 100644
--- a/drivers/net/mlx5/mlx5_flow_dv.c
+++ b/drivers/net/mlx5/mlx5_flow_dv.c
@@ -1418,7 +1418,7 @@ struct field_modify_info modify_tcp[] = {
ret = mlx5_flow_item_acceptable(item, (const uint8_t *)mask,
(const uint8_t *)&nic_mask,
sizeof(struct rte_flow_item_mark),
- error);
+ MLX5_ITEM_RANGE_NOT_ACCEPTED, error);
if (ret < 0)
return ret;
return 0;
@@ -1494,7 +1494,7 @@ struct field_modify_info modify_tcp[] = {
ret = mlx5_flow_item_acceptable(item, (const uint8_t *)mask,
(const uint8_t *)&nic_mask,
sizeof(struct rte_flow_item_meta),
- error);
+ MLX5_ITEM_RANGE_NOT_ACCEPTED, error);
return ret;
}
@@ -1547,7 +1547,7 @@ struct field_modify_info modify_tcp[] = {
ret = mlx5_flow_item_acceptable(item, (const uint8_t *)mask,
(const uint8_t *)&nic_mask,
sizeof(struct rte_flow_item_tag),
- error);
+ MLX5_ITEM_RANGE_NOT_ACCEPTED, error);
if (ret < 0)
return ret;
if (mask->index != 0xff)
@@ -1618,7 +1618,7 @@ struct field_modify_info modify_tcp[] = {
(item, (const uint8_t *)mask,
(const uint8_t *)&rte_flow_item_port_id_mask,
sizeof(struct rte_flow_item_port_id),
- error);
+ MLX5_ITEM_RANGE_NOT_ACCEPTED, error);
if (ret)
return ret;
if (!spec)
@@ -1691,7 +1691,7 @@ struct field_modify_info modify_tcp[] = {
ret = mlx5_flow_item_acceptable(item, (const uint8_t *)mask,
(const uint8_t *)&nic_mask,
sizeof(struct rte_flow_item_vlan),
- error);
+ MLX5_ITEM_RANGE_NOT_ACCEPTED, error);
if (ret)
return ret;
if (!tunnel && mask->tci != RTE_BE16(0x0fff)) {
@@ -1778,11 +1778,126 @@ struct field_modify_info modify_tcp[] = {
RTE_FLOW_ERROR_TYPE_ITEM, item,
"Match is supported for GTP"
" flags only");
- return mlx5_flow_item_acceptable
- (item, (const uint8_t *)mask,
- (const uint8_t *)&nic_mask,
- sizeof(struct rte_flow_item_gtp),
- error);
+ return mlx5_flow_item_acceptable(item, (const uint8_t *)mask,
+ (const uint8_t *)&nic_mask,
+ sizeof(struct rte_flow_item_gtp),
+ MLX5_ITEM_RANGE_NOT_ACCEPTED, error);
+}
+
+/**
+ * Validate IPV4 item.
+ * Use existing validation function mlx5_flow_validate_item_ipv4(), and
+ * add specific validation of fragment_offset field,
+ *
+ * @param[in] item
+ * Item specification.
+ * @param[in] item_flags
+ * Bit-fields that holds the items detected until now.
+ * @param[out] error
+ * Pointer to error structure.
+ *
+ * @return
+ * 0 on success, a negative errno value otherwise and rte_errno is set.
+ */
+static int
+flow_dv_validate_item_ipv4(const struct rte_flow_item *item,
+ uint64_t item_flags,
+ uint64_t last_item,
+ uint16_t ether_type,
+ struct rte_flow_error *error)
+{
+ int ret;
+ const struct rte_flow_item_ipv4 *spec = item->spec;
+ const struct rte_flow_item_ipv4 *last = item->last;
+ const struct rte_flow_item_ipv4 *mask = item->mask;
+ rte_be16_t fragment_offset_spec = 0;
+ rte_be16_t fragment_offset_last = 0;
+ const struct rte_flow_item_ipv4 nic_ipv4_mask = {
+ .hdr = {
+ .src_addr = RTE_BE32(0xffffffff),
+ .dst_addr = RTE_BE32(0xffffffff),
+ .type_of_service = 0xff,
+ .fragment_offset = RTE_BE16(0xffff),
+ .next_proto_id = 0xff,
+ .time_to_live = 0xff,
+ },
+ };
+
+ ret = mlx5_flow_validate_item_ipv4(item, item_flags, last_item,
+ ether_type, &nic_ipv4_mask,
+ MLX5_ITEM_RANGE_ACCEPTED, error);
+ if (ret < 0)
+ return ret;
+ if (spec && mask)
+ fragment_offset_spec = spec->hdr.fragment_offset &
+ mask->hdr.fragment_offset;
+ if (!fragment_offset_spec)
+ return 0;
+ /*
+ * spec and mask are valid, enforce using full mask to make sure the
+ * complete value is used correctly.
+ */
+ if ((mask->hdr.fragment_offset & RTE_BE16(MLX5_IPV4_FRAG_OFFSET_MASK))
+ != RTE_BE16(MLX5_IPV4_FRAG_OFFSET_MASK))
+ return rte_flow_error_set(error, EINVAL,
+ RTE_FLOW_ERROR_TYPE_ITEM_MASK,
+ item, "must use full mask for"
+ " fragment_offset");
+ /*
+ * Match on fragment_offset 0x2000 means MF is 1 and frag-offset is 0,
+ * indicating this is 1st fragment of fragmented packet.
+ * This is not yet supported in MLX5, return appropriate error message.
+ */
+ if (fragment_offset_spec == RTE_BE16(RTE_IPV4_HDR_MF_FLAG))
+ return rte_flow_error_set(error, ENOTSUP,
+ RTE_FLOW_ERROR_TYPE_ITEM, item,
+ "match on first fragment not "
+ "supported");
+ if (fragment_offset_spec && !last)
+ return rte_flow_error_set(error, ENOTSUP,
+ RTE_FLOW_ERROR_TYPE_ITEM, item,
+ "specified value not supported");
+ /* spec and last are valid, validate the specified range. */
+ fragment_offset_last = last->hdr.fragment_offset &
+ mask->hdr.fragment_offset;
+ /*
+ * Match on fragment_offset spec 0x2001 and last 0x3fff
+ * means MF is 1 and frag-offset is > 0.
+ * This packet is fragment 2nd and onward, excluding last.
+ * This is not yet supported in MLX5, return appropriate
+ * error message.
+ */
+ if (fragment_offset_spec == RTE_BE16(RTE_IPV4_HDR_MF_FLAG + 1) &&
+ fragment_offset_last == RTE_BE16(MLX5_IPV4_FRAG_OFFSET_MASK))
+ return rte_flow_error_set(error, ENOTSUP,
+ RTE_FLOW_ERROR_TYPE_ITEM_LAST,
+ last, "match on following "
+ "fragments not supported");
+ /*
+ * Match on fragment_offset spec 0x0001 and last 0x1fff
+ * means MF is 0 and frag-offset is > 0.
+ * This packet is last fragment of fragmented packet.
+ * This is not yet supported in MLX5, return appropriate
+ * error message.
+ */
+ if (fragment_offset_spec == RTE_BE16(1) &&
+ fragment_offset_last == RTE_BE16(RTE_IPV4_HDR_OFFSET_MASK))
+ return rte_flow_error_set(error, ENOTSUP,
+ RTE_FLOW_ERROR_TYPE_ITEM_LAST,
+ last, "match on last "
+ "fragment not supported");
+ /*
+ * Match on fragment_offset spec 0x0001 and last 0x3fff
+ * means MF and/or frag-offset is not 0.
+ * This is a fragmented packet.
+ * Other range values are invalid and rejected.
+ */
+ if (!(fragment_offset_spec == RTE_BE16(1) &&
+ fragment_offset_last == RTE_BE16(MLX5_IPV4_FRAG_OFFSET_MASK)))
+ return rte_flow_error_set(error, ENOTSUP,
+ RTE_FLOW_ERROR_TYPE_ITEM_LAST, last,
+ "specified range not supported");
+ return 0;
}
/**
@@ -5084,15 +5199,6 @@ struct field_modify_info modify_tcp[] = {
.dst_port = RTE_BE16(UINT16_MAX),
}
};
- const struct rte_flow_item_ipv4 nic_ipv4_mask = {
- .hdr = {
- .src_addr = RTE_BE32(0xffffffff),
- .dst_addr = RTE_BE32(0xffffffff),
- .type_of_service = 0xff,
- .next_proto_id = 0xff,
- .time_to_live = 0xff,
- },
- };
const struct rte_flow_item_ipv6 nic_ipv6_mask = {
.hdr = {
.src_addr =
@@ -5192,11 +5298,9 @@ struct field_modify_info modify_tcp[] = {
case RTE_FLOW_ITEM_TYPE_IPV4:
mlx5_flow_tunnel_ip_check(items, next_protocol,
&item_flags, &tunnel);
- ret = mlx5_flow_validate_item_ipv4(items, item_flags,
- last_item,
- ether_type,
- &nic_ipv4_mask,
- error);
+ ret = flow_dv_validate_item_ipv4(items, item_flags,
+ last_item, ether_type,
+ error);
if (ret < 0)
return ret;
last_item = tunnel ? MLX5_FLOW_LAYER_INNER_L3_IPV4 :
@@ -6296,6 +6400,10 @@ struct field_modify_info modify_tcp[] = {
ipv4_m->hdr.time_to_live);
MLX5_SET(fte_match_set_lyr_2_4, headers_v, ip_ttl_hoplimit,
ipv4_v->hdr.time_to_live & ipv4_m->hdr.time_to_live);
+ MLX5_SET(fte_match_set_lyr_2_4, headers_m, frag,
+ !!(ipv4_m->hdr.fragment_offset));
+ MLX5_SET(fte_match_set_lyr_2_4, headers_v, frag,
+ !!(ipv4_v->hdr.fragment_offset & ipv4_m->hdr.fragment_offset));
}
/**
diff --git a/drivers/net/mlx5/mlx5_flow_verbs.c b/drivers/net/mlx5/mlx5_flow_verbs.c
index 62c18b8..276bcb5 100644
--- a/drivers/net/mlx5/mlx5_flow_verbs.c
+++ b/drivers/net/mlx5/mlx5_flow_verbs.c
@@ -1312,10 +1312,11 @@
}
break;
case RTE_FLOW_ITEM_TYPE_IPV4:
- ret = mlx5_flow_validate_item_ipv4(items, item_flags,
- last_item,
- ether_type, NULL,
- error);
+ ret = mlx5_flow_validate_item_ipv4
+ (items, item_flags,
+ last_item, ether_type, NULL,
+ MLX5_ITEM_RANGE_NOT_ACCEPTED,
+ error);
if (ret < 0)
return ret;
last_item = tunnel ? MLX5_FLOW_LAYER_INNER_L3_IPV4 :
--
1.8.3.1
next prev parent reply other threads:[~2020-10-05 8:38 UTC|newest]
Thread overview: 101+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-09-30 14:10 [dpdk-dev] [PATCH 00/10] support match on L3 fragmented packets Dekel Peled
2020-09-30 14:10 ` [dpdk-dev] [PATCH 01/10] ethdev: add extensions attributes to IPv6 item Dekel Peled
2020-09-30 14:54 ` Ori Kam
2020-09-30 14:10 ` [dpdk-dev] [PATCH 02/10] ethdev: add IPv6 fragment extension header item Dekel Peled
2020-09-30 14:55 ` Ori Kam
2020-09-30 14:10 ` [dpdk-dev] [PATCH 03/10] app/testpmd: support IPv4 fragments Dekel Peled
2020-09-30 14:54 ` Ori Kam
2020-09-30 14:10 ` [dpdk-dev] [PATCH 04/10] app/testpmd: support IPv6 fragments Dekel Peled
2020-09-30 14:10 ` [dpdk-dev] [PATCH 05/10] app/testpmd: support IPv6 fragment extension item Dekel Peled
2020-09-30 14:56 ` Ori Kam
2020-09-30 14:10 ` [dpdk-dev] [PATCH 06/10] net/mlx5: remove handling of ICMP fragmented packets Dekel Peled
2020-09-30 14:10 ` [dpdk-dev] [PATCH 07/10] net/mlx5: support match on IPv4 fragment packets Dekel Peled
2020-09-30 14:10 ` [dpdk-dev] [PATCH 08/10] net/mlx5: support match on IPv6 " Dekel Peled
2020-09-30 14:10 ` [dpdk-dev] [PATCH 09/10] net/mlx5: support match on IPv6 fragment ext. item Dekel Peled
2020-09-30 14:10 ` [dpdk-dev] [PATCH 10/10] doc: update release notes for MLX5 L3 frag support Dekel Peled
2020-10-01 21:14 ` [dpdk-dev] [PATCH v2 00/11] support match on L3 fragmented packets Dekel Peled
2020-10-01 21:14 ` [dpdk-dev] [PATCH v2 01/11] ethdev: add extensions attributes to IPv6 item Dekel Peled
2020-10-04 13:45 ` Ori Kam
2020-10-01 21:14 ` [dpdk-dev] [PATCH v2 02/11] ethdev: add IPv6 fragment extension header item Dekel Peled
2020-10-01 21:27 ` Stephen Hemminger
2020-10-01 21:15 ` [dpdk-dev] [PATCH v2 03/11] app/testpmd: support IPv4 fragments Dekel Peled
2020-10-04 13:47 ` Ori Kam
2020-10-01 21:15 ` [dpdk-dev] [PATCH v2 04/11] app/testpmd: support IPv6 fragments Dekel Peled
2020-10-04 13:49 ` Ori Kam
2020-10-01 21:15 ` [dpdk-dev] [PATCH v2 05/11] app/testpmd: support IPv6 fragment extension item Dekel Peled
2020-10-04 13:47 ` Ori Kam
2020-10-01 21:15 ` [dpdk-dev] [PATCH v2 06/11] net/mlx5: remove handling of ICMP fragmented packets Dekel Peled
2020-10-04 13:49 ` Ori Kam
2020-10-01 21:15 ` [dpdk-dev] [PATCH v2 07/11] net/mlx5: support match on IPv4 fragment packets Dekel Peled
2020-10-04 13:48 ` Ori Kam
2020-10-01 21:15 ` [dpdk-dev] [PATCH v2 08/11] net/mlx5: support match on IPv6 " Dekel Peled
2020-10-01 21:15 ` [dpdk-dev] [PATCH v2 09/11] net/mlx5: support match on IPv6 fragment ext. item Dekel Peled
2020-10-04 13:51 ` Ori Kam
2020-10-01 21:15 ` [dpdk-dev] [PATCH v2 10/11] doc: update release notes for MLX5 L3 frag support Dekel Peled
2020-10-04 13:55 ` Ori Kam
2020-10-01 21:15 ` [dpdk-dev] [PATCH v2 11/11] net/mlx5: enforce limitation on IPv6 next proto Dekel Peled
2020-10-04 13:55 ` Ori Kam
2020-10-05 8:35 ` [dpdk-dev] [PATCH v3 00/11] support match on L3 fragmented packets Dekel Peled
2020-10-05 8:35 ` [dpdk-dev] [PATCH v3 01/11] ethdev: add extensions attributes to IPv6 item Dekel Peled
2020-10-06 23:43 ` Ajit Khaparde
2020-10-07 6:59 ` Dekel Peled
2020-10-05 8:35 ` [dpdk-dev] [PATCH v3 02/11] ethdev: add IPv6 fragment extension header item Dekel Peled
2020-10-05 8:50 ` Ori Kam
2020-10-05 8:35 ` [dpdk-dev] [PATCH v3 03/11] app/testpmd: support IPv4 fragments Dekel Peled
2020-10-05 8:35 ` [dpdk-dev] [PATCH v3 04/11] app/testpmd: support IPv6 fragments Dekel Peled
2020-10-05 8:35 ` [dpdk-dev] [PATCH v3 05/11] app/testpmd: support IPv6 fragment extension item Dekel Peled
2020-10-05 8:35 ` [dpdk-dev] [PATCH v3 06/11] net/mlx5: remove handling of ICMP fragmented packets Dekel Peled
2020-10-05 8:35 ` Dekel Peled [this message]
2020-10-05 8:35 ` [dpdk-dev] [PATCH v3 08/11] net/mlx5: support match on IPv6 fragment packets Dekel Peled
2020-10-05 8:51 ` Ori Kam
2020-10-05 8:35 ` [dpdk-dev] [PATCH v3 09/11] net/mlx5: support match on IPv6 fragment ext. item Dekel Peled
2020-10-05 8:35 ` [dpdk-dev] [PATCH v3 10/11] doc: update release notes for MLX5 L3 frag support Dekel Peled
2020-10-05 8:35 ` [dpdk-dev] [PATCH v3 11/11] net/mlx5: enforce limitation on IPv6 next proto Dekel Peled
2020-10-07 10:53 ` [dpdk-dev] [PATCH v4 00/11] support match on L3 fragmented packets Dekel Peled
2020-10-07 10:54 ` [dpdk-dev] [PATCH v4 01/11] ethdev: add extensions attributes to IPv6 item Dekel Peled
2020-10-08 3:14 ` Ajit Khaparde
2020-10-08 7:03 ` Dekel Peled
2020-10-08 18:28 ` Ajit Khaparde
2020-10-07 10:54 ` [dpdk-dev] [PATCH v4 02/11] ethdev: add IPv6 fragment extension header item Dekel Peled
2020-10-07 10:54 ` [dpdk-dev] [PATCH v4 03/11] app/testpmd: support IPv4 fragments Dekel Peled
2020-10-07 10:54 ` [dpdk-dev] [PATCH v4 04/11] app/testpmd: support IPv6 fragments Dekel Peled
2020-10-07 10:54 ` [dpdk-dev] [PATCH v4 05/11] app/testpmd: support IPv6 fragment extension item Dekel Peled
2020-10-07 10:54 ` [dpdk-dev] [PATCH v4 06/11] net/mlx5: remove handling of ICMP fragmented packets Dekel Peled
2020-10-07 10:54 ` [dpdk-dev] [PATCH v4 07/11] net/mlx5: support match on IPv4 fragment packets Dekel Peled
2020-10-07 10:54 ` [dpdk-dev] [PATCH v4 08/11] net/mlx5: support match on IPv6 " Dekel Peled
2020-10-07 10:54 ` [dpdk-dev] [PATCH v4 09/11] net/mlx5: support match on IPv6 fragment ext. item Dekel Peled
2020-10-07 10:54 ` [dpdk-dev] [PATCH v4 10/11] doc: update release notes for MLX5 L3 frag support Dekel Peled
2020-10-07 10:54 ` [dpdk-dev] [PATCH v4 11/11] net/mlx5: enforce limitation on IPv6 next proto Dekel Peled
2020-10-07 11:15 ` [dpdk-dev] [PATCH v4 00/11] support match on L3 fragmented packets Ori Kam
2020-10-12 10:42 ` [dpdk-dev] [PATCH v5 " Dekel Peled
2020-10-12 10:43 ` [dpdk-dev] [PATCH v5 01/11] ethdev: add extensions attributes to IPv6 item Dekel Peled
2020-10-12 20:41 ` Thomas Monjalon
2020-10-13 8:22 ` Dekel Peled
2020-10-12 10:43 ` [dpdk-dev] [PATCH v5 02/11] ethdev: add IPv6 fragment extension header item Dekel Peled
2020-10-12 20:50 ` Thomas Monjalon
2020-10-13 8:11 ` Dekel Peled
2020-10-12 10:43 ` [dpdk-dev] [PATCH v5 03/11] app/testpmd: support IPv4 fragments Dekel Peled
2020-10-12 10:43 ` [dpdk-dev] [PATCH v5 04/11] app/testpmd: support IPv6 fragments Dekel Peled
2020-10-12 10:43 ` [dpdk-dev] [PATCH v5 05/11] app/testpmd: support IPv6 fragment extension item Dekel Peled
2020-10-12 10:43 ` [dpdk-dev] [PATCH v5 06/11] net/mlx5: remove handling of ICMP fragmented packets Dekel Peled
2020-10-12 10:43 ` [dpdk-dev] [PATCH v5 07/11] net/mlx5: support match on IPv4 fragment packets Dekel Peled
2020-10-12 10:43 ` [dpdk-dev] [PATCH v5 08/11] net/mlx5: support match on IPv6 " Dekel Peled
2020-10-12 10:43 ` [dpdk-dev] [PATCH v5 09/11] net/mlx5: support match on IPv6 fragment ext. item Dekel Peled
2020-10-12 10:43 ` [dpdk-dev] [PATCH v5 10/11] doc: update release notes for MLX5 L3 frag support Dekel Peled
2020-10-12 19:29 ` Thomas Monjalon
2020-10-12 10:43 ` [dpdk-dev] [PATCH v5 11/11] net/mlx5: enforce limitation on IPv6 next proto Dekel Peled
2020-10-13 13:32 ` [dpdk-dev] [PATCH v6 0/5] support match on L3 fragmented packets Dekel Peled
2020-10-13 13:32 ` [dpdk-dev] [PATCH v6 1/5] ethdev: add extensions attributes to IPv6 item Dekel Peled
2020-10-14 10:36 ` Thomas Monjalon
2020-10-13 13:32 ` [dpdk-dev] [PATCH v6 2/5] ethdev: add IPv6 fragment extension header item Dekel Peled
2020-10-14 10:37 ` Thomas Monjalon
2020-10-13 13:32 ` [dpdk-dev] [PATCH v6 3/5] app/testpmd: support IPv4 fragments Dekel Peled
2020-10-13 13:32 ` [dpdk-dev] [PATCH v6 4/5] app/testpmd: support IPv6 fragments Dekel Peled
2020-10-13 13:32 ` [dpdk-dev] [PATCH v6 5/5] app/testpmd: support IPv6 fragment extension item Dekel Peled
2020-10-14 16:35 ` [dpdk-dev] [PATCH v7 0/5] support match on L3 fragmented packets Dekel Peled
2020-10-14 16:35 ` [dpdk-dev] [PATCH v7 1/5] ethdev: add extensions attributes to IPv6 item Dekel Peled
2020-10-14 16:35 ` [dpdk-dev] [PATCH v7 2/5] ethdev: add IPv6 fragment extension header item Dekel Peled
2020-10-14 16:35 ` [dpdk-dev] [PATCH v7 3/5] app/testpmd: support IPv4 fragments Dekel Peled
2020-10-14 16:35 ` [dpdk-dev] [PATCH v7 4/5] app/testpmd: support IPv6 fragments Dekel Peled
2020-10-14 16:35 ` [dpdk-dev] [PATCH v7 5/5] app/testpmd: support IPv6 fragment extension item Dekel Peled
2020-10-14 17:18 ` [dpdk-dev] [PATCH v7 0/5] support match on L3 fragmented packets Ferruh Yigit
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=b37eb6be1f9c4221ce567b0c8e29458647765edb.1601886720.git.dekelp@nvidia.com \
--to=dekelp@nvidia.com \
--cc=arybchenko@solarflare.com \
--cc=beilei.xing@intel.com \
--cc=bernard.iremonger@intel.com \
--cc=dev@dpdk.org \
--cc=ferruh.yigit@intel.com \
--cc=konstantin.ananyev@intel.com \
--cc=matan@nvidia.com \
--cc=olivier.matz@6wind.com \
--cc=orika@nvidia.com \
--cc=shahafs@nvidia.com \
--cc=thomas@monjalon.net \
--cc=viacheslavo@nvidia.com \
--cc=wenzhuo.lu@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).