DPDK patches and discussions
 help / color / mirror / Atom feed
From: Ferruh Yigit <ferruh.yigit@amd.com>
To: "Thomas Monjalon" <thomas@monjalon.net>,
	"Wisam Jaddo" <wisamm@nvidia.com>, "Ori Kam" <orika@nvidia.com>,
	"Aman Singh" <aman.deep.singh@intel.com>,
	"Yuying Zhang" <yuying.zhang@intel.com>,
	"Ajit Khaparde" <ajit.khaparde@broadcom.com>,
	"Somnath Kotur" <somnath.kotur@broadcom.com>,
	"Hemant Agrawal" <hemant.agrawal@nxp.com>,
	"Sachin Saxena" <sachin.saxena@nxp.com>,
	"Matan Azrad" <matan@nvidia.com>,
	"Viacheslav Ovsiienko" <viacheslavo@nvidia.com>,
	"Chaoyong He" <chaoyong.he@corigine.com>,
	"Niklas Söderlund" <niklas.soderlund@corigine.com>,
	"Andrew Rybchenko" <andrew.rybchenko@oktetlabs.ru>,
	"Olivier Matz" <olivier.matz@6wind.com>
Cc: David Marchand <david.marchand@redhat.com>, <dev@dpdk.org>
Subject: [PATCH v6 4/8] ethdev: use GRE protocol struct for flow matching
Date: Thu, 2 Feb 2023 12:44:56 +0000	[thread overview]
Message-ID: <20230202124500.2578857-5-ferruh.yigit@amd.com> (raw)
In-Reply-To: <20230202124500.2578857-1-ferruh.yigit@amd.com>

From: Thomas Monjalon <thomas@monjalon.net>

As announced in the deprecation notice, flow item structures
should re-use the protocol header definitions from the directory lib/net/.

The protocol struct is added in an unnamed union, keeping old field names.

The GRE header struct members are used in apps and drivers
instead of the redundant fields in the flow items.

Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
Acked-by: Ferruh Yigit <ferruh.yigit@amd.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@corigine.com>
Acked-by: Ori Kam <orika@nvidia.com>
Acked-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
---
 app/test-flow-perf/items_gen.c           |  4 ++--
 app/test-pmd/cmdline_flow.c              | 14 +++++------
 doc/guides/prog_guide/rte_flow.rst       |  6 +----
 doc/guides/rel_notes/deprecation.rst     |  1 -
 drivers/net/bnxt/tf_ulp/ulp_rte_parser.c | 12 +++++-----
 drivers/net/dpaa2/dpaa2_flow.c           | 12 +++++-----
 drivers/net/mlx5/hws/mlx5dr_definer.c    |  8 +++----
 drivers/net/mlx5/mlx5_flow.c             | 22 ++++++++---------
 drivers/net/mlx5/mlx5_flow_dv.c          | 30 +++++++++++++-----------
 drivers/net/mlx5/mlx5_flow_verbs.c       | 10 ++++----
 drivers/net/nfp/nfp_flow.c               |  9 +++----
 lib/ethdev/rte_flow.h                    | 24 +++++++++++++------
 lib/net/rte_gre.h                        |  5 ++++
 13 files changed, 84 insertions(+), 73 deletions(-)

diff --git a/app/test-flow-perf/items_gen.c b/app/test-flow-perf/items_gen.c
index a58245239ba1..0f19e5e53648 100644
--- a/app/test-flow-perf/items_gen.c
+++ b/app/test-flow-perf/items_gen.c
@@ -173,10 +173,10 @@ add_gre(struct rte_flow_item *items,
 	__rte_unused struct additional_para para)
 {
 	static struct rte_flow_item_gre gre_spec = {
-		.protocol = RTE_BE16(RTE_ETHER_TYPE_TEB),
+		.hdr.proto = RTE_BE16(RTE_ETHER_TYPE_TEB),
 	};
 	static struct rte_flow_item_gre gre_mask = {
-		.protocol = RTE_BE16(0xffff),
+		.hdr.proto = RTE_BE16(0xffff),
 	};
 
 	items[items_counter].type = RTE_FLOW_ITEM_TYPE_GRE;
diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c
index b904f8c3d45c..0e115956514c 100644
--- a/app/test-pmd/cmdline_flow.c
+++ b/app/test-pmd/cmdline_flow.c
@@ -4071,7 +4071,7 @@ static const struct token token_list[] = {
 		.next = NEXT(item_gre, NEXT_ENTRY(COMMON_UNSIGNED),
 			     item_param),
 		.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_gre,
-					     protocol)),
+					     hdr.proto)),
 	},
 	[ITEM_GRE_C_RSVD0_VER] = {
 		.name = "c_rsvd0_ver",
@@ -4082,7 +4082,7 @@ static const struct token token_list[] = {
 		.next = NEXT(item_gre, NEXT_ENTRY(COMMON_UNSIGNED),
 			     item_param),
 		.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_gre,
-					     c_rsvd0_ver)),
+					     hdr.c_rsvd0_ver)),
 	},
 	[ITEM_GRE_C_BIT] = {
 		.name = "c_bit",
@@ -4090,7 +4090,7 @@ static const struct token token_list[] = {
 		.next = NEXT(item_gre, NEXT_ENTRY(COMMON_BOOLEAN),
 			     item_param),
 		.args = ARGS(ARGS_ENTRY_MASK_HTON(struct rte_flow_item_gre,
-						  c_rsvd0_ver,
+						  hdr.c_rsvd0_ver,
 						  "\x80\x00\x00\x00")),
 	},
 	[ITEM_GRE_S_BIT] = {
@@ -4098,7 +4098,7 @@ static const struct token token_list[] = {
 		.help = "sequence number bit (S)",
 		.next = NEXT(item_gre, NEXT_ENTRY(COMMON_BOOLEAN), item_param),
 		.args = ARGS(ARGS_ENTRY_MASK_HTON(struct rte_flow_item_gre,
-						  c_rsvd0_ver,
+						  hdr.c_rsvd0_ver,
 						  "\x10\x00\x00\x00")),
 	},
 	[ITEM_GRE_K_BIT] = {
@@ -4106,7 +4106,7 @@ static const struct token token_list[] = {
 		.help = "key bit (K)",
 		.next = NEXT(item_gre, NEXT_ENTRY(COMMON_BOOLEAN), item_param),
 		.args = ARGS(ARGS_ENTRY_MASK_HTON(struct rte_flow_item_gre,
-						  c_rsvd0_ver,
+						  hdr.c_rsvd0_ver,
 						  "\x20\x00\x00\x00")),
 	},
 	[ITEM_FUZZY] = {
@@ -7837,7 +7837,7 @@ parse_vc_action_mplsogre_encap(struct context *ctx, const struct token *token,
 		},
 	};
 	struct rte_flow_item_gre gre = {
-		.protocol = rte_cpu_to_be_16(ETHER_TYPE_MPLS_UNICAST),
+		.hdr.proto = rte_cpu_to_be_16(ETHER_TYPE_MPLS_UNICAST),
 	};
 	struct rte_flow_item_mpls mpls = {
 		.ttl = 0,
@@ -7935,7 +7935,7 @@ parse_vc_action_mplsogre_decap(struct context *ctx, const struct token *token,
 		},
 	};
 	struct rte_flow_item_gre gre = {
-		.protocol = rte_cpu_to_be_16(ETHER_TYPE_MPLS_UNICAST),
+		.hdr.proto = rte_cpu_to_be_16(ETHER_TYPE_MPLS_UNICAST),
 	};
 	struct rte_flow_item_mpls mpls;
 	uint8_t *header;
diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst
index 116722351486..603e1b866be3 100644
--- a/doc/guides/prog_guide/rte_flow.rst
+++ b/doc/guides/prog_guide/rte_flow.rst
@@ -980,8 +980,7 @@ Item: ``GRE``
 
 Matches a GRE header.
 
-- ``c_rsvd0_ver``: checksum, reserved 0 and version.
-- ``protocol``: protocol type.
+- ``hdr``:  header definition (``rte_gre.h``).
 - Default ``mask`` matches protocol only.
 
 Item: ``GRE_KEY``
@@ -1000,9 +999,6 @@ Item: ``GRE_OPTION``
 Matches a GRE optional fields (checksum/key/sequence).
 This should be preceded by item ``GRE``.
 
-- ``checksum``: checksum.
-- ``key``: key.
-- ``sequence``: sequence.
 - The items in GRE_OPTION do not change bit flags(c_bit/k_bit/s_bit) in GRE
   item. The bit flags need be set with GRE item by application. When the items
   present, the corresponding bits in GRE spec and mask should be set "1" by
diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index df8b5bcb1b64..3bb15cf9f7a5 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -73,7 +73,6 @@ Deprecation Notices
   - ``rte_flow_item_e_tag``
   - ``rte_flow_item_geneve``
   - ``rte_flow_item_geneve_opt``
-  - ``rte_flow_item_gre``
   - ``rte_flow_item_gtp``
   - ``rte_flow_item_icmp6``
   - ``rte_flow_item_icmp6_nd_na``
diff --git a/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c b/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c
index 80869b79c3fe..c1e231ce8c49 100644
--- a/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c
+++ b/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c
@@ -1461,16 +1461,16 @@ ulp_rte_gre_hdr_handler(const struct rte_flow_item *item,
 		return BNXT_TF_RC_ERROR;
 	}
 
-	size = sizeof(((struct rte_flow_item_gre *)NULL)->c_rsvd0_ver);
+	size = sizeof(((struct rte_flow_item_gre *)NULL)->hdr.c_rsvd0_ver);
 	ulp_rte_prsr_fld_mask(params, &idx, size,
-			      ulp_deference_struct(gre_spec, c_rsvd0_ver),
-			      ulp_deference_struct(gre_mask, c_rsvd0_ver),
+			      ulp_deference_struct(gre_spec, hdr.c_rsvd0_ver),
+			      ulp_deference_struct(gre_mask, hdr.c_rsvd0_ver),
 			      ULP_PRSR_ACT_DEFAULT);
 
-	size = sizeof(((struct rte_flow_item_gre *)NULL)->protocol);
+	size = sizeof(((struct rte_flow_item_gre *)NULL)->hdr.proto);
 	ulp_rte_prsr_fld_mask(params, &idx, size,
-			      ulp_deference_struct(gre_spec, protocol),
-			      ulp_deference_struct(gre_mask, protocol),
+			      ulp_deference_struct(gre_spec, hdr.proto),
+			      ulp_deference_struct(gre_mask, hdr.proto),
 			      ULP_PRSR_ACT_DEFAULT);
 
 	/* Update the hdr_bitmap with GRE */
diff --git a/drivers/net/dpaa2/dpaa2_flow.c b/drivers/net/dpaa2/dpaa2_flow.c
index eec7e6065097..8a6d44da4875 100644
--- a/drivers/net/dpaa2/dpaa2_flow.c
+++ b/drivers/net/dpaa2/dpaa2_flow.c
@@ -154,7 +154,7 @@ static const struct rte_flow_item_sctp dpaa2_flow_item_sctp_mask = {
 };
 
 static const struct rte_flow_item_gre dpaa2_flow_item_gre_mask = {
-	.protocol = RTE_BE16(0xffff),
+	.hdr.proto = RTE_BE16(0xffff),
 };
 
 #endif
@@ -2792,7 +2792,7 @@ dpaa2_configure_flow_gre(struct rte_flow *flow,
 		return -1;
 	}
 
-	if (!mask->protocol)
+	if (!mask->hdr.proto)
 		return 0;
 
 	index = dpaa2_flow_extract_search(
@@ -2841,8 +2841,8 @@ dpaa2_configure_flow_gre(struct rte_flow *flow,
 				&flow->qos_rule,
 				NET_PROT_GRE,
 				NH_FLD_GRE_TYPE,
-				&spec->protocol,
-				&mask->protocol,
+				&spec->hdr.proto,
+				&mask->hdr.proto,
 				sizeof(rte_be16_t));
 	if (ret) {
 		DPAA2_PMD_ERR(
@@ -2855,8 +2855,8 @@ dpaa2_configure_flow_gre(struct rte_flow *flow,
 			&flow->fs_rule,
 			NET_PROT_GRE,
 			NH_FLD_GRE_TYPE,
-			&spec->protocol,
-			&mask->protocol,
+			&spec->hdr.proto,
+			&mask->hdr.proto,
 			sizeof(rte_be16_t));
 	if (ret) {
 		DPAA2_PMD_ERR(
diff --git a/drivers/net/mlx5/hws/mlx5dr_definer.c b/drivers/net/mlx5/hws/mlx5dr_definer.c
index 604384a24253..3a438f2c9d12 100644
--- a/drivers/net/mlx5/hws/mlx5dr_definer.c
+++ b/drivers/net/mlx5/hws/mlx5dr_definer.c
@@ -156,8 +156,8 @@ struct mlx5dr_definer_conv_data {
 	X(SET,		source_qp,		v->queue,		mlx5_rte_flow_item_sq) \
 	X(SET,		tag,			v->data,		rte_flow_item_tag) \
 	X(SET,		metadata,		v->data,		rte_flow_item_meta) \
-	X(SET_BE16,	gre_c_ver,		v->c_rsvd0_ver,		rte_flow_item_gre) \
-	X(SET_BE16,	gre_protocol_type,	v->protocol,		rte_flow_item_gre) \
+	X(SET_BE16,	gre_c_ver,		v->hdr.c_rsvd0_ver,	rte_flow_item_gre) \
+	X(SET_BE16,	gre_protocol_type,	v->hdr.proto,		rte_flow_item_gre) \
 	X(SET,		ipv4_protocol_gre,	IPPROTO_GRE,		rte_flow_item_gre) \
 	X(SET_BE32,	gre_opt_key,		v->key.key,		rte_flow_item_gre_opt) \
 	X(SET_BE32,	gre_opt_seq,		v->sequence.sequence,	rte_flow_item_gre_opt) \
@@ -1210,7 +1210,7 @@ mlx5dr_definer_conv_item_gre(struct mlx5dr_definer_conv_data *cd,
 	if (!m)
 		return 0;
 
-	if (m->c_rsvd0_ver) {
+	if (m->hdr.c_rsvd0_ver) {
 		fc = &cd->fc[MLX5DR_DEFINER_FNAME_GRE_C_VER];
 		fc->item_idx = item_idx;
 		fc->tag_set = &mlx5dr_definer_gre_c_ver_set;
@@ -1219,7 +1219,7 @@ mlx5dr_definer_conv_item_gre(struct mlx5dr_definer_conv_data *cd,
 		fc->bit_off = __mlx5_dw_bit_off(header_gre, c_rsvd0_ver);
 	}
 
-	if (m->protocol) {
+	if (m->hdr.proto) {
 		fc = &cd->fc[MLX5DR_DEFINER_FNAME_GRE_PROTOCOL];
 		fc->item_idx = item_idx;
 		fc->tag_set = &mlx5dr_definer_gre_protocol_type_set;
diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c
index ff08a629e2c6..7b19c5f03f5d 100644
--- a/drivers/net/mlx5/mlx5_flow.c
+++ b/drivers/net/mlx5/mlx5_flow.c
@@ -329,7 +329,7 @@ mlx5_flow_expand_rss_item_complete(const struct rte_flow_item *item)
 		ret = mlx5_ethertype_to_item_type(spec, mask, true);
 		break;
 	case RTE_FLOW_ITEM_TYPE_GRE:
-		MLX5_XSET_ITEM_MASK_SPEC(gre, protocol);
+		MLX5_XSET_ITEM_MASK_SPEC(gre, hdr.proto);
 		ret = mlx5_ethertype_to_item_type(spec, mask, true);
 		break;
 	case RTE_FLOW_ITEM_TYPE_VXLAN_GPE:
@@ -3089,8 +3089,7 @@ mlx5_flow_validate_item_gre_key(const struct rte_flow_item *item,
 	if (!gre_mask)
 		gre_mask = &rte_flow_item_gre_mask;
 	gre_spec = gre_item->spec;
-	if (gre_spec && (gre_mask->c_rsvd0_ver & RTE_BE16(0x2000)) &&
-			 !(gre_spec->c_rsvd0_ver & RTE_BE16(0x2000)))
+	if (gre_spec && (gre_mask->hdr.k) && !(gre_spec->hdr.k))
 		return rte_flow_error_set(error, EINVAL,
 					  RTE_FLOW_ERROR_TYPE_ITEM, item,
 					  "Key bit must be on");
@@ -3165,21 +3164,18 @@ mlx5_flow_validate_item_gre_option(struct rte_eth_dev *dev,
 	if (!gre_mask)
 		gre_mask = &rte_flow_item_gre_mask;
 	if (mask->checksum_rsvd.checksum)
-		if (gre_spec && (gre_mask->c_rsvd0_ver & RTE_BE16(0x8000)) &&
-				 !(gre_spec->c_rsvd0_ver & RTE_BE16(0x8000)))
+		if (gre_spec && (gre_mask->hdr.c) && !(gre_spec->hdr.c))
 			return rte_flow_error_set(error, EINVAL,
 						  RTE_FLOW_ERROR_TYPE_ITEM,
 						  item,
 						  "Checksum bit must be on");
 	if (mask->key.key)
-		if (gre_spec && (gre_mask->c_rsvd0_ver & RTE_BE16(0x2000)) &&
-				 !(gre_spec->c_rsvd0_ver & RTE_BE16(0x2000)))
+		if (gre_spec && (gre_mask->hdr.k) && !(gre_spec->hdr.k))
 			return rte_flow_error_set(error, EINVAL,
 						  RTE_FLOW_ERROR_TYPE_ITEM,
 						  item, "Key bit must be on");
 	if (mask->sequence.sequence)
-		if (gre_spec && (gre_mask->c_rsvd0_ver & RTE_BE16(0x1000)) &&
-				 !(gre_spec->c_rsvd0_ver & RTE_BE16(0x1000)))
+		if (gre_spec && (gre_mask->hdr.s) && !(gre_spec->hdr.s))
 			return rte_flow_error_set(error, EINVAL,
 						  RTE_FLOW_ERROR_TYPE_ITEM,
 						  item,
@@ -3230,8 +3226,10 @@ mlx5_flow_validate_item_gre(const struct rte_flow_item *item,
 	const struct rte_flow_item_gre *mask = item->mask;
 	int ret;
 	const struct rte_flow_item_gre nic_mask = {
-		.c_rsvd0_ver = RTE_BE16(0xB000),
-		.protocol = RTE_BE16(UINT16_MAX),
+		.hdr.c = 1,
+		.hdr.k = 1,
+		.hdr.s = 1,
+		.hdr.proto = RTE_BE16(UINT16_MAX),
 	};
 
 	if (target_protocol != 0xff && target_protocol != IPPROTO_GRE)
@@ -3259,7 +3257,7 @@ mlx5_flow_validate_item_gre(const struct rte_flow_item *item,
 		return ret;
 #ifndef HAVE_MLX5DV_DR
 #ifndef HAVE_IBV_DEVICE_MPLS_SUPPORT
-	if (spec && (spec->protocol & mask->protocol))
+	if (spec && (spec->hdr.proto & mask->hdr.proto))
 		return rte_flow_error_set(error, ENOTSUP,
 					  RTE_FLOW_ERROR_TYPE_ITEM, item,
 					  "without MPLS support the"
diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c
index 261c60a5c33a..2b9c2ba6a4b5 100644
--- a/drivers/net/mlx5/mlx5_flow_dv.c
+++ b/drivers/net/mlx5/mlx5_flow_dv.c
@@ -8984,7 +8984,7 @@ static void
 flow_dv_translate_item_gre(void *key, const struct rte_flow_item *item,
 			   uint64_t pattern_flags, uint32_t key_type)
 {
-	static const struct rte_flow_item_gre empty_gre = {0,};
+	static const struct rte_flow_item_gre empty_gre = {{{0}}};
 	const struct rte_flow_item_gre *gre_m = item->mask;
 	const struct rte_flow_item_gre *gre_v = item->spec;
 	void *headers_v = MLX5_ADDR_OF(fte_match_param, key, outer_headers);
@@ -9021,8 +9021,8 @@ flow_dv_translate_item_gre(void *key, const struct rte_flow_item *item,
 		gre_v = gre_m;
 	else if (key_type == MLX5_SET_MATCHER_HS_V)
 		gre_m = gre_v;
-	gre_crks_rsvd0_ver_m.value = rte_be_to_cpu_16(gre_m->c_rsvd0_ver);
-	gre_crks_rsvd0_ver_v.value = rte_be_to_cpu_16(gre_v->c_rsvd0_ver);
+	gre_crks_rsvd0_ver_m.value = rte_be_to_cpu_16(gre_m->hdr.c_rsvd0_ver);
+	gre_crks_rsvd0_ver_v.value = rte_be_to_cpu_16(gre_v->hdr.c_rsvd0_ver);
 	MLX5_SET(fte_match_set_misc, misc_v, gre_c_present,
 		 gre_crks_rsvd0_ver_v.c_present &
 		 gre_crks_rsvd0_ver_m.c_present);
@@ -9032,8 +9032,8 @@ flow_dv_translate_item_gre(void *key, const struct rte_flow_item *item,
 	MLX5_SET(fte_match_set_misc, misc_v, gre_s_present,
 		 gre_crks_rsvd0_ver_v.s_present &
 		 gre_crks_rsvd0_ver_m.s_present);
-	protocol_m = rte_be_to_cpu_16(gre_m->protocol);
-	protocol_v = rte_be_to_cpu_16(gre_v->protocol);
+	protocol_m = rte_be_to_cpu_16(gre_m->hdr.proto);
+	protocol_v = rte_be_to_cpu_16(gre_v->hdr.proto);
 	if (!protocol_m) {
 		/* Force next protocol to prevent matchers duplication */
 		protocol_v = mlx5_translate_tunnel_etypes(pattern_flags);
@@ -9072,7 +9072,7 @@ flow_dv_translate_item_gre_option(void *key,
 	const struct rte_flow_item_gre_opt *option_v = item->spec;
 	const struct rte_flow_item_gre *gre_m = gre_item->mask;
 	const struct rte_flow_item_gre *gre_v = gre_item->spec;
-	static const struct rte_flow_item_gre empty_gre = {0};
+	static const struct rte_flow_item_gre empty_gre = {{{0}}};
 	struct rte_flow_item gre_key_item;
 	uint16_t c_rsvd0_ver_m, c_rsvd0_ver_v;
 	uint16_t protocol_m, protocol_v;
@@ -9097,8 +9097,8 @@ flow_dv_translate_item_gre_option(void *key,
 		if (!gre_m)
 			gre_m = &rte_flow_item_gre_mask;
 	}
-	protocol_v = gre_v->protocol;
-	protocol_m = gre_m->protocol;
+	protocol_v = gre_v->hdr.proto;
+	protocol_m = gre_m->hdr.proto;
 	if (!protocol_m) {
 		/* Force next protocol to prevent matchers duplication */
 		uint16_t ether_type =
@@ -9108,8 +9108,8 @@ flow_dv_translate_item_gre_option(void *key,
 			protocol_m = UINT16_MAX;
 		}
 	}
-	c_rsvd0_ver_v = gre_v->c_rsvd0_ver;
-	c_rsvd0_ver_m = gre_m->c_rsvd0_ver;
+	c_rsvd0_ver_v = gre_v->hdr.c_rsvd0_ver;
+	c_rsvd0_ver_m = gre_m->hdr.c_rsvd0_ver;
 	if (option_m->sequence.sequence) {
 		c_rsvd0_ver_v |= RTE_BE16(0x1000);
 		c_rsvd0_ver_m |= RTE_BE16(0x1000);
@@ -9171,12 +9171,14 @@ flow_dv_translate_item_nvgre(void *key, const struct rte_flow_item *item,
 
 	/* For NVGRE, GRE header fields must be set with defined values. */
 	const struct rte_flow_item_gre gre_spec = {
-		.c_rsvd0_ver = RTE_BE16(0x2000),
-		.protocol = RTE_BE16(RTE_ETHER_TYPE_TEB)
+		.hdr.k = 1,
+		.hdr.proto = RTE_BE16(RTE_ETHER_TYPE_TEB)
 	};
 	const struct rte_flow_item_gre gre_mask = {
-		.c_rsvd0_ver = RTE_BE16(0xB000),
-		.protocol = RTE_BE16(UINT16_MAX),
+		.hdr.c = 1,
+		.hdr.k = 1,
+		.hdr.s = 1,
+		.hdr.proto = RTE_BE16(UINT16_MAX),
 	};
 	const struct rte_flow_item gre_item = {
 		.spec = &gre_spec,
diff --git a/drivers/net/mlx5/mlx5_flow_verbs.c b/drivers/net/mlx5/mlx5_flow_verbs.c
index 4ef4f3044515..291369d437d4 100644
--- a/drivers/net/mlx5/mlx5_flow_verbs.c
+++ b/drivers/net/mlx5/mlx5_flow_verbs.c
@@ -930,7 +930,7 @@ flow_verbs_translate_item_gre(struct mlx5_flow *dev_flow,
 		.size = size,
 	};
 #else
-	static const struct rte_flow_item_gre empty_gre = {0,};
+	static const struct rte_flow_item_gre empty_gre = {{{0}}};
 	const struct rte_flow_item_gre *spec = item->spec;
 	const struct rte_flow_item_gre *mask = item->mask;
 	unsigned int size = sizeof(struct ibv_flow_spec_gre);
@@ -946,10 +946,10 @@ flow_verbs_translate_item_gre(struct mlx5_flow *dev_flow,
 		if (!mask)
 			mask = &rte_flow_item_gre_mask;
 	}
-	tunnel.val.c_ks_res0_ver = spec->c_rsvd0_ver;
-	tunnel.val.protocol = spec->protocol;
-	tunnel.mask.c_ks_res0_ver = mask->c_rsvd0_ver;
-	tunnel.mask.protocol = mask->protocol;
+	tunnel.val.c_ks_res0_ver = spec->hdr.c_rsvd0_ver;
+	tunnel.val.protocol = spec->hdr.proto;
+	tunnel.mask.c_ks_res0_ver = mask->hdr.c_rsvd0_ver;
+	tunnel.mask.protocol = mask->hdr.proto;
 	/* Remove unwanted bits from values. */
 	tunnel.val.c_ks_res0_ver &= tunnel.mask.c_ks_res0_ver;
 	tunnel.val.key &= tunnel.mask.key;
diff --git a/drivers/net/nfp/nfp_flow.c b/drivers/net/nfp/nfp_flow.c
index bd3a8d2a3b2f..0994fdeeb49f 100644
--- a/drivers/net/nfp/nfp_flow.c
+++ b/drivers/net/nfp/nfp_flow.c
@@ -1812,8 +1812,9 @@ static const struct nfp_flow_item_proc nfp_flow_item_proc_list[] = {
 	[RTE_FLOW_ITEM_TYPE_GRE] = {
 		.next_item = NEXT_ITEM(RTE_FLOW_ITEM_TYPE_GRE_KEY),
 		.mask_support = &(const struct rte_flow_item_gre){
-			.c_rsvd0_ver = RTE_BE16(0xa000),
-			.protocol = RTE_BE16(0xffff),
+			.hdr.c = 1,
+			.hdr.k = 1,
+			.hdr.proto = RTE_BE16(0xffff),
 		},
 		.mask_default = &rte_flow_item_gre_mask,
 		.mask_sz = sizeof(struct rte_flow_item_gre),
@@ -3144,7 +3145,7 @@ nfp_flow_action_nvgre_encap_v4(struct nfp_app_fw_flower *app_fw_flower,
 	memset(set_tun, 0, act_set_size);
 	nfp_flow_set_tun_process(set_tun, NFP_FL_TUN_GRE, 0,
 			ipv4->hdr.time_to_live, ipv4->hdr.type_of_service);
-	set_tun->tun_proto = gre->protocol;
+	set_tun->tun_proto = gre->hdr.proto;
 
 	/* Send the tunnel neighbor cmsg to fw */
 	return nfp_flower_add_tun_neigh_v4_encap(app_fw_flower, nfp_flow_meta,
@@ -3181,7 +3182,7 @@ nfp_flow_action_nvgre_encap_v6(struct nfp_app_fw_flower *app_fw_flower,
 	tos = (ipv6->hdr.vtc_flow >> RTE_IPV6_HDR_TC_SHIFT) & 0xff;
 	nfp_flow_set_tun_process(set_tun, NFP_FL_TUN_GRE, 0,
 			ipv6->hdr.hop_limits, tos);
-	set_tun->tun_proto = gre->protocol;
+	set_tun->tun_proto = gre->hdr.proto;
 
 	/* Send the tunnel neighbor cmsg to fw */
 	return nfp_flower_add_tun_neigh_v6_encap(app_fw_flower, nfp_flow_meta,
diff --git a/lib/ethdev/rte_flow.h b/lib/ethdev/rte_flow.h
index e2364823d622..3ae89e367c16 100644
--- a/lib/ethdev/rte_flow.h
+++ b/lib/ethdev/rte_flow.h
@@ -1070,19 +1070,29 @@ static const struct rte_flow_item_mpls rte_flow_item_mpls_mask = {
  *
  * Matches a GRE header.
  */
+RTE_STD_C11
 struct rte_flow_item_gre {
-	/**
-	 * Checksum (1b), reserved 0 (12b), version (3b).
-	 * Refer to RFC 2784.
-	 */
-	rte_be16_t c_rsvd0_ver;
-	rte_be16_t protocol; /**< Protocol type. */
+	union {
+		struct {
+			/*
+			 * These are old fields kept for compatibility.
+			 * Please prefer hdr field below.
+			 */
+			/**
+			 * Checksum (1b), reserved 0 (12b), version (3b).
+			 * Refer to RFC 2784.
+			 */
+			rte_be16_t c_rsvd0_ver;
+			rte_be16_t protocol; /**< Protocol type. */
+		};
+		struct rte_gre_hdr hdr; /**< GRE header definition. */
+	};
 };
 
 /** Default mask for RTE_FLOW_ITEM_TYPE_GRE. */
 #ifndef __cplusplus
 static const struct rte_flow_item_gre rte_flow_item_gre_mask = {
-	.protocol = RTE_BE16(0xffff),
+	.hdr.proto = RTE_BE16(UINT16_MAX),
 };
 #endif
 
diff --git a/lib/net/rte_gre.h b/lib/net/rte_gre.h
index 6c6aef6fcaa0..210b81c99018 100644
--- a/lib/net/rte_gre.h
+++ b/lib/net/rte_gre.h
@@ -28,6 +28,8 @@ extern "C" {
  */
 __extension__
 struct rte_gre_hdr {
+	union {
+		struct {
 #if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
 	uint16_t res2:4; /**< Reserved */
 	uint16_t s:1;    /**< Sequence Number Present bit */
@@ -45,6 +47,9 @@ struct rte_gre_hdr {
 	uint16_t res3:5; /**< Reserved */
 	uint16_t ver:3;  /**< Version Number */
 #endif
+		};
+		rte_be16_t c_rsvd0_ver;
+	};
 	uint16_t proto;  /**< Protocol Type */
 } __rte_packed;
 
-- 
2.34.1


  parent reply	other threads:[~2023-02-02 12:45 UTC|newest]

Thread overview: 90+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-10-25 21:44 [PATCH 0/8] start cleanup of rte_flow_item_* Thomas Monjalon
2022-10-25 21:44 ` [PATCH 1/8] ethdev: use Ethernet protocol struct for flow matching Thomas Monjalon
2022-10-25 21:44 ` [PATCH 2/8] net: add smaller fields for VXLAN Thomas Monjalon
2022-10-25 21:44 ` [PATCH 3/8] ethdev: use VXLAN protocol struct for flow matching Thomas Monjalon
2022-10-25 21:44 ` [PATCH 4/8] ethdev: use GRE " Thomas Monjalon
2022-10-26  8:45   ` David Marchand
2023-01-20 17:21     ` Ferruh Yigit
2022-10-25 21:44 ` [PATCH 5/8] ethdev: use GTP " Thomas Monjalon
2022-10-25 21:44 ` [PATCH 6/8] ethdev: use ARP " Thomas Monjalon
2022-10-25 21:44 ` [PATCH 7/8] doc: fix description of L2TPV2 flow item Thomas Monjalon
2022-10-25 21:44 ` [PATCH 8/8] net: mark all big endian types Thomas Monjalon
2022-10-26  8:41   ` David Marchand
2023-01-20 17:18 ` [PATCH v2 0/8] start cleanup of rte_flow_item_* Ferruh Yigit
2023-01-20 17:18   ` [PATCH v2 1/8] ethdev: use Ethernet protocol struct for flow matching Ferruh Yigit
2023-01-20 17:18   ` [PATCH v2 2/8] net: add smaller fields for VXLAN Ferruh Yigit
2023-01-20 17:18   ` [PATCH v2 3/8] ethdev: use VXLAN protocol struct for flow matching Ferruh Yigit
2023-01-20 17:18   ` [PATCH v2 4/8] ethdev: use GRE " Ferruh Yigit
2023-01-20 17:18   ` [PATCH v2 5/8] ethdev: use GTP " Ferruh Yigit
2023-01-20 17:19   ` [PATCH v2 6/8] ethdev: use ARP " Ferruh Yigit
2023-01-20 17:19   ` [PATCH v2 7/8] doc: fix description of L2TPV2 flow item Ferruh Yigit
2023-01-20 17:19   ` [PATCH v2 8/8] net: mark all big endian types Ferruh Yigit
2023-01-22 10:52   ` [PATCH v2 0/8] start cleanup of rte_flow_item_* David Marchand
2023-01-24  9:07     ` Ferruh Yigit
2023-01-24  9:02 ` [PATCH v3 " Ferruh Yigit
2023-01-24  9:02   ` [PATCH v3 1/8] ethdev: use Ethernet protocol struct for flow matching Ferruh Yigit
2023-01-24  9:02   ` [PATCH v3 2/8] net: add smaller fields for VXLAN Ferruh Yigit
2023-01-24  9:02   ` [PATCH v3 3/8] ethdev: use VXLAN protocol struct for flow matching Ferruh Yigit
2023-01-24  9:02   ` [PATCH v3 4/8] ethdev: use GRE " Ferruh Yigit
2023-01-24  9:02   ` [PATCH v3 5/8] ethdev: use GTP " Ferruh Yigit
2023-01-24  9:02   ` [PATCH v3 6/8] ethdev: use ARP " Ferruh Yigit
2023-01-24  9:02   ` [PATCH v3 7/8] doc: fix description of L2TPV2 flow item Ferruh Yigit
2023-01-24  9:03   ` [PATCH v3 8/8] net: mark all big endian types Ferruh Yigit
2023-01-26 13:17 ` [PATCH v4 0/8] start cleanup of rte_flow_item_* Ferruh Yigit
2023-01-26 13:17   ` [PATCH v4 1/8] ethdev: use Ethernet protocol struct for flow matching Ferruh Yigit
2023-01-26 13:17   ` [PATCH v4 2/8] net: add smaller fields for VXLAN Ferruh Yigit
2023-01-26 13:17   ` [PATCH v4 3/8] ethdev: use VXLAN protocol struct for flow matching Ferruh Yigit
2023-01-26 13:17   ` [PATCH v4 4/8] ethdev: use GRE " Ferruh Yigit
2023-01-26 13:17   ` [PATCH v4 5/8] ethdev: use GTP " Ferruh Yigit
2023-01-26 13:17   ` [PATCH v4 6/8] ethdev: use ARP " Ferruh Yigit
2023-01-26 13:17   ` [PATCH v4 7/8] doc: fix description of L2TPV2 flow item Ferruh Yigit
2023-01-26 13:17   ` [PATCH v4 8/8] net: mark all big endian types Ferruh Yigit
2023-01-26 16:18 ` [PATCH v5 0/8] start cleanup of rte_flow_item_* Ferruh Yigit
2023-01-26 16:18   ` [PATCH v5 1/8] ethdev: use Ethernet protocol struct for flow matching Ferruh Yigit
2023-01-27 14:33     ` Niklas Söderlund
2023-02-01 17:34     ` Ori Kam
2023-02-02  9:51     ` Andrew Rybchenko
2023-01-26 16:18   ` [PATCH v5 2/8] net: add smaller fields for VXLAN Ferruh Yigit
2023-01-26 16:18   ` [PATCH v5 3/8] ethdev: use VXLAN protocol struct for flow matching Ferruh Yigit
2023-02-01 17:41     ` Ori Kam
2023-02-02  9:52     ` Andrew Rybchenko
2023-01-26 16:19   ` [PATCH v5 4/8] ethdev: use GRE " Ferruh Yigit
2023-01-27 14:34     ` Niklas Söderlund
2023-02-01 17:44     ` Ori Kam
2023-02-02  9:53     ` Andrew Rybchenko
2023-01-26 16:19   ` [PATCH v5 5/8] ethdev: use GTP " Ferruh Yigit
2023-02-02  9:54     ` Andrew Rybchenko
2023-01-26 16:19   ` [PATCH v5 6/8] ethdev: use ARP " Ferruh Yigit
2023-02-01 17:46     ` Ori Kam
2023-02-02  9:55     ` Andrew Rybchenko
2023-01-26 16:19   ` [PATCH v5 7/8] doc: fix description of L2TPV2 flow item Ferruh Yigit
2023-02-02  9:56     ` Andrew Rybchenko
2023-01-26 16:19   ` [PATCH v5 8/8] net: mark all big endian types Ferruh Yigit
2023-02-02 10:01     ` Andrew Rybchenko
2023-02-02 11:11       ` Ferruh Yigit
2023-02-02 12:44 ` [PATCH v6 0/8] start cleanup of rte_flow_item_* Ferruh Yigit
2023-02-02 12:44   ` [PATCH v6 1/8] ethdev: use Ethernet protocol struct for flow matching Ferruh Yigit
2023-02-02 12:44   ` [PATCH v6 2/8] net: add smaller fields for VXLAN Ferruh Yigit
2023-02-02 12:44   ` [PATCH v6 3/8] ethdev: use VXLAN protocol struct for flow matching Ferruh Yigit
2023-02-02 12:44   ` Ferruh Yigit [this message]
2023-02-02 17:16     ` [PATCH v6 4/8] ethdev: use GRE " Thomas Monjalon
2023-02-03 15:02       ` Ferruh Yigit
2023-02-03 15:12         ` Thomas Monjalon
2023-02-03 15:16           ` Ferruh Yigit
2023-02-02 12:44   ` [PATCH v6 5/8] ethdev: use GTP " Ferruh Yigit
2023-02-02 12:44   ` [PATCH v6 6/8] ethdev: use ARP " Ferruh Yigit
2023-02-02 12:44   ` [PATCH v6 7/8] doc: fix description of L2TPV2 flow item Ferruh Yigit
2023-02-02 12:45   ` [PATCH v6 8/8] net: mark all big endian types Ferruh Yigit
2023-02-02 17:20     ` Thomas Monjalon
2023-02-03 15:03       ` Ferruh Yigit
2023-02-03 16:48 ` [PATCH v7 0/7] start cleanup of rte_flow_item_* Ferruh Yigit
2023-02-03 16:48   ` [PATCH v7 1/7] ethdev: use Ethernet protocol struct for flow matching Ferruh Yigit
2023-02-03 16:48   ` [PATCH v7 2/7] net: add smaller fields for VXLAN Ferruh Yigit
2023-02-03 16:48   ` [PATCH v7 3/7] ethdev: use VXLAN protocol struct for flow matching Ferruh Yigit
2023-02-03 16:48   ` [PATCH v7 4/7] ethdev: use GTP " Ferruh Yigit
2023-02-03 16:48   ` [PATCH v7 5/7] ethdev: use ARP " Ferruh Yigit
2023-02-03 16:48   ` [PATCH v7 6/7] doc: fix description of L2TPV2 flow item Ferruh Yigit
2023-02-03 16:48   ` [PATCH v7 7/7] net: mark all big endian types Ferruh Yigit
2023-02-06  2:35   ` [PATCH v7 0/7] start cleanup of rte_flow_item_* fengchengwen
2023-02-07 14:58   ` Thomas Monjalon
2023-02-07 16:33     ` 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=20230202124500.2578857-5-ferruh.yigit@amd.com \
    --to=ferruh.yigit@amd.com \
    --cc=ajit.khaparde@broadcom.com \
    --cc=aman.deep.singh@intel.com \
    --cc=andrew.rybchenko@oktetlabs.ru \
    --cc=chaoyong.he@corigine.com \
    --cc=david.marchand@redhat.com \
    --cc=dev@dpdk.org \
    --cc=hemant.agrawal@nxp.com \
    --cc=matan@nvidia.com \
    --cc=niklas.soderlund@corigine.com \
    --cc=olivier.matz@6wind.com \
    --cc=orika@nvidia.com \
    --cc=sachin.saxena@nxp.com \
    --cc=somnath.kotur@broadcom.com \
    --cc=thomas@monjalon.net \
    --cc=viacheslavo@nvidia.com \
    --cc=wisamm@nvidia.com \
    --cc=yuying.zhang@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).