@@ -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;
@@ -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;
@@ -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
@@ -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``
@@ -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 */
@@ -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(
@@ -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;
@@ -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"
@@ -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,
@@ -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;
@@ -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,
@@ -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
@@ -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;