@@ -213,10 +213,10 @@ add_gtp(struct rte_flow_item *items,
__rte_unused struct additional_para para)
{
static struct rte_flow_item_gtp gtp_spec = {
- .teid = RTE_BE32(TEID_VALUE),
+ .hdr.teid = RTE_BE32(TEID_VALUE),
};
static struct rte_flow_item_gtp gtp_mask = {
- .teid = RTE_BE32(0xffffffff),
+ .hdr.teid = RTE_BE32(0xffffffff),
};
items[items_counter].type = RTE_FLOW_ITEM_TYPE_GTP;
@@ -4103,19 +4103,19 @@ static const struct token token_list[] = {
.help = "GTP flags",
.next = NEXT(item_gtp, NEXT_ENTRY(COMMON_UNSIGNED), item_param),
.args = ARGS(ARGS_ENTRY(struct rte_flow_item_gtp,
- v_pt_rsv_flags)),
+ hdr.gtp_hdr_info)),
},
[ITEM_GTP_MSG_TYPE] = {
.name = "msg_type",
.help = "GTP message type",
.next = NEXT(item_gtp, NEXT_ENTRY(COMMON_UNSIGNED), item_param),
- .args = ARGS(ARGS_ENTRY(struct rte_flow_item_gtp, msg_type)),
+ .args = ARGS(ARGS_ENTRY(struct rte_flow_item_gtp, hdr.msg_type)),
},
[ITEM_GTP_TEID] = {
.name = "teid",
.help = "tunnel endpoint identifier",
.next = NEXT(item_gtp, NEXT_ENTRY(COMMON_UNSIGNED), item_param),
- .args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_gtp, teid)),
+ .args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_gtp, hdr.teid)),
},
[ITEM_GTPC] = {
.name = "gtpc",
@@ -11135,7 +11135,7 @@ cmd_set_raw_parsed(const struct buffer *in)
goto error;
}
gtp = item->spec;
- if ((gtp->v_pt_rsv_flags & 0x07) != 0x04) {
+ if (gtp->hdr.s == 1 || gtp->hdr.pn == 1) {
/* Only E flag should be set. */
fprintf(stderr,
"Error - GTP unsupported flags\n");
@@ -1064,12 +1064,7 @@ Note: GTP, GTPC and GTPU use the same structure. GTPC and GTPU item
are defined for a user-friendly API when creating GTP-C and GTP-U
flow rules.
-- ``v_pt_rsv_flags``: version (3b), protocol type (1b), reserved (1b),
- extension header flag (1b), sequence number flag (1b), N-PDU number
- flag (1b).
-- ``msg_type``: message type.
-- ``msg_len``: message length.
-- ``teid``: tunnel endpoint identifier.
+- ``hdr``: header definition (``rte_gtp.h``).
- Default ``mask`` matches teid only.
Item: ``ESP``
@@ -1235,8 +1230,7 @@ Item: ``GTP_PSC``
Matches a GTP PDU extension header with type 0x85.
-- ``pdu_type``: PDU type.
-- ``qfi``: QoS flow identifier.
+- ``hdr``: header definition (``rte_gtp.h``).
- Default ``mask`` matches QFI only.
Item: ``PPPOES``, ``PPPOED``
@@ -70,7 +70,6 @@ Deprecation Notices
- ``rte_flow_item_e_tag``
- ``rte_flow_item_geneve``
- ``rte_flow_item_geneve_opt``
- - ``rte_flow_item_gtp``
- ``rte_flow_item_icmp6``
- ``rte_flow_item_icmp6_nd_na``
- ``rte_flow_item_icmp6_nd_ns``
@@ -761,26 +761,26 @@ i40e_flow_fdir_construct_pkt(struct i40e_pf *pf,
gtp = (struct rte_flow_item_gtp *)
((unsigned char *)udp +
sizeof(struct rte_udp_hdr));
- gtp->msg_len =
+ gtp->hdr.plen =
rte_cpu_to_be_16(I40E_FDIR_GTP_DEFAULT_LEN);
- gtp->teid = fdir_input->flow.gtp_flow.teid;
- gtp->msg_type = I40E_FDIR_GTP_MSG_TYPE_0X01;
+ gtp->hdr.teid = fdir_input->flow.gtp_flow.teid;
+ gtp->hdr.msg_type = I40E_FDIR_GTP_MSG_TYPE_0X01;
/* GTP-C message type is not supported. */
if (cus_pctype->index == I40E_CUSTOMIZED_GTPC) {
udp->dst_port =
rte_cpu_to_be_16(I40E_FDIR_GTPC_DST_PORT);
- gtp->v_pt_rsv_flags =
+ gtp->hdr.gtp_hdr_info =
I40E_FDIR_GTP_VER_FLAG_0X32;
} else {
udp->dst_port =
rte_cpu_to_be_16(I40E_FDIR_GTPU_DST_PORT);
- gtp->v_pt_rsv_flags =
+ gtp->hdr.gtp_hdr_info =
I40E_FDIR_GTP_VER_FLAG_0X30;
}
if (cus_pctype->index == I40E_CUSTOMIZED_GTPU_IPV4) {
- gtp->msg_type = I40E_FDIR_GTP_MSG_TYPE_0XFF;
+ gtp->hdr.msg_type = I40E_FDIR_GTP_MSG_TYPE_0XFF;
gtp_ipv4 = (struct rte_ipv4_hdr *)
((unsigned char *)gtp +
sizeof(struct rte_flow_item_gtp));
@@ -794,7 +794,7 @@ i40e_flow_fdir_construct_pkt(struct i40e_pf *pf,
sizeof(struct rte_ipv4_hdr);
} else if (cus_pctype->index ==
I40E_CUSTOMIZED_GTPU_IPV6) {
- gtp->msg_type = I40E_FDIR_GTP_MSG_TYPE_0XFF;
+ gtp->hdr.msg_type = I40E_FDIR_GTP_MSG_TYPE_0XFF;
gtp_ipv6 = (struct rte_ipv6_hdr *)
((unsigned char *)gtp +
sizeof(struct rte_flow_item_gtp));
@@ -2135,10 +2135,10 @@ i40e_flow_parse_fdir_pattern(struct rte_eth_dev *dev,
gtp_mask = item->mask;
if (gtp_spec && gtp_mask) {
- if (gtp_mask->v_pt_rsv_flags ||
- gtp_mask->msg_type ||
- gtp_mask->msg_len ||
- gtp_mask->teid != UINT32_MAX) {
+ if (gtp_mask->hdr.gtp_hdr_info ||
+ gtp_mask->hdr.msg_type ||
+ gtp_mask->hdr.plen ||
+ gtp_mask->hdr.teid != UINT32_MAX) {
rte_flow_error_set(error, EINVAL,
RTE_FLOW_ERROR_TYPE_ITEM,
item,
@@ -2147,7 +2147,7 @@ i40e_flow_parse_fdir_pattern(struct rte_eth_dev *dev,
}
filter->input.flow.gtp_flow.teid =
- gtp_spec->teid;
+ gtp_spec->hdr.teid;
filter->input.flow_ext.customized_pctype = true;
cus_proto = item_type;
}
@@ -3570,10 +3570,10 @@ i40e_flow_parse_gtp_pattern(struct rte_eth_dev *dev,
return -rte_errno;
}
- if (gtp_mask->v_pt_rsv_flags ||
- gtp_mask->msg_type ||
- gtp_mask->msg_len ||
- gtp_mask->teid != UINT32_MAX) {
+ if (gtp_mask->hdr.gtp_hdr_info ||
+ gtp_mask->hdr.msg_type ||
+ gtp_mask->hdr.plen ||
+ gtp_mask->hdr.teid != UINT32_MAX) {
rte_flow_error_set(error, EINVAL,
RTE_FLOW_ERROR_TYPE_ITEM,
item,
@@ -3586,7 +3586,7 @@ i40e_flow_parse_gtp_pattern(struct rte_eth_dev *dev,
else if (item_type == RTE_FLOW_ITEM_TYPE_GTPU)
filter->tunnel_type = I40E_TUNNEL_TYPE_GTPU;
- filter->tenant_id = rte_be_to_cpu_32(gtp_spec->teid);
+ filter->tenant_id = rte_be_to_cpu_32(gtp_spec->hdr.teid);
break;
default:
@@ -1277,16 +1277,16 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter *ad,
VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, GTPU_IP);
if (gtp_spec && gtp_mask) {
- if (gtp_mask->v_pt_rsv_flags ||
- gtp_mask->msg_type ||
- gtp_mask->msg_len) {
+ if (gtp_mask->hdr.gtp_hdr_info ||
+ gtp_mask->hdr.msg_type ||
+ gtp_mask->hdr.plen) {
rte_flow_error_set(error, EINVAL,
RTE_FLOW_ERROR_TYPE_ITEM,
item, "Invalid GTP mask");
return -rte_errno;
}
- if (gtp_mask->teid == UINT32_MAX) {
+ if (gtp_mask->hdr.teid == UINT32_MAX) {
input_set |= IAVF_INSET_GTPU_TEID;
VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr, GTPU_IP, TEID);
}
@@ -2341,9 +2341,9 @@ ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad,
if (!(gtp_spec && gtp_mask))
break;
- if (gtp_mask->v_pt_rsv_flags ||
- gtp_mask->msg_type ||
- gtp_mask->msg_len) {
+ if (gtp_mask->hdr.gtp_hdr_info ||
+ gtp_mask->hdr.msg_type ||
+ gtp_mask->hdr.plen) {
rte_flow_error_set(error, EINVAL,
RTE_FLOW_ERROR_TYPE_ITEM,
item,
@@ -2351,10 +2351,10 @@ ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad,
return -rte_errno;
}
- if (gtp_mask->teid == UINT32_MAX)
+ if (gtp_mask->hdr.teid == UINT32_MAX)
input_set_o |= ICE_INSET_GTPU_TEID;
- filter->input.gtpu_data.teid = gtp_spec->teid;
+ filter->input.gtpu_data.teid = gtp_spec->hdr.teid;
break;
case RTE_FLOW_ITEM_TYPE_GTP_PSC:
tunnel_type = ICE_FDIR_TUNNEL_TYPE_GTPU_EH;
@@ -1405,9 +1405,9 @@ ice_switch_parse_pattern(const struct rte_flow_item pattern[],
return false;
}
if (gtp_spec && gtp_mask) {
- if (gtp_mask->v_pt_rsv_flags ||
- gtp_mask->msg_type ||
- gtp_mask->msg_len) {
+ if (gtp_mask->hdr.gtp_hdr_info ||
+ gtp_mask->hdr.msg_type ||
+ gtp_mask->hdr.plen) {
rte_flow_error_set(error, EINVAL,
RTE_FLOW_ERROR_TYPE_ITEM,
item,
@@ -1415,13 +1415,13 @@ ice_switch_parse_pattern(const struct rte_flow_item pattern[],
return false;
}
input = &outer_input_set;
- if (gtp_mask->teid)
+ if (gtp_mask->hdr.teid)
*input |= ICE_INSET_GTPU_TEID;
list[t].type = ICE_GTP;
list[t].h_u.gtp_hdr.teid =
- gtp_spec->teid;
+ gtp_spec->hdr.teid;
list[t].m_u.gtp_hdr.teid =
- gtp_mask->teid;
+ gtp_mask->hdr.teid;
input_set_byte += 4;
t++;
}
@@ -2391,9 +2391,9 @@ flow_dv_validate_item_gtp(struct rte_eth_dev *dev,
const struct rte_flow_item_gtp *spec = item->spec;
const struct rte_flow_item_gtp *mask = item->mask;
const struct rte_flow_item_gtp nic_mask = {
- .v_pt_rsv_flags = MLX5_GTP_FLAGS_MASK,
- .msg_type = 0xff,
- .teid = RTE_BE32(0xffffffff),
+ .hdr.gtp_hdr_info = MLX5_GTP_FLAGS_MASK,
+ .hdr.msg_type = 0xff,
+ .hdr.teid = RTE_BE32(0xffffffff),
};
if (!priv->sh->cdev->config.hca_attr.tunnel_stateless_gtp)
@@ -2411,7 +2411,7 @@ flow_dv_validate_item_gtp(struct rte_eth_dev *dev,
"no outer UDP layer found");
if (!mask)
mask = &rte_flow_item_gtp_mask;
- if (spec && spec->v_pt_rsv_flags & ~MLX5_GTP_FLAGS_MASK)
+ if (spec && spec->hdr.gtp_hdr_info & ~MLX5_GTP_FLAGS_MASK)
return rte_flow_error_set(error, ENOTSUP,
RTE_FLOW_ERROR_TYPE_ITEM, item,
"Match is supported for GTP"
@@ -2462,8 +2462,8 @@ flow_dv_validate_item_gtp_psc(const struct rte_flow_item *item,
gtp_mask = gtp_item->mask ? gtp_item->mask : &rte_flow_item_gtp_mask;
/* GTP spec and E flag is requested to match zero. */
if (gtp_spec &&
- (gtp_mask->v_pt_rsv_flags &
- ~gtp_spec->v_pt_rsv_flags & MLX5_GTP_EXT_HEADER_FLAG))
+ (gtp_mask->hdr.gtp_hdr_info &
+ ~gtp_spec->hdr.gtp_hdr_info & MLX5_GTP_EXT_HEADER_FLAG))
return rte_flow_error_set
(error, ENOTSUP, RTE_FLOW_ERROR_TYPE_ITEM, item,
"GTP E flag must be 1 to match GTP PSC");
@@ -10298,16 +10298,16 @@ flow_dv_translate_item_gtp(void *matcher, void *key,
if (!gtp_m)
gtp_m = &rte_flow_item_gtp_mask;
MLX5_SET(fte_match_set_misc3, misc3_m, gtpu_msg_flags,
- gtp_m->v_pt_rsv_flags);
+ gtp_m->hdr.gtp_hdr_info);
MLX5_SET(fte_match_set_misc3, misc3_v, gtpu_msg_flags,
- gtp_v->v_pt_rsv_flags & gtp_m->v_pt_rsv_flags);
- MLX5_SET(fte_match_set_misc3, misc3_m, gtpu_msg_type, gtp_m->msg_type);
+ gtp_v->hdr.gtp_hdr_info & gtp_m->hdr.gtp_hdr_info);
+ MLX5_SET(fte_match_set_misc3, misc3_m, gtpu_msg_type, gtp_m->hdr.msg_type);
MLX5_SET(fte_match_set_misc3, misc3_v, gtpu_msg_type,
- gtp_v->msg_type & gtp_m->msg_type);
+ gtp_v->hdr.msg_type & gtp_m->hdr.msg_type);
MLX5_SET(fte_match_set_misc3, misc3_m, gtpu_teid,
- rte_be_to_cpu_32(gtp_m->teid));
+ rte_be_to_cpu_32(gtp_m->hdr.teid));
MLX5_SET(fte_match_set_misc3, misc3_v, gtpu_teid,
- rte_be_to_cpu_32(gtp_v->teid & gtp_m->teid));
+ rte_be_to_cpu_32(gtp_v->hdr.teid & gtp_m->hdr.teid));
}
/**
@@ -1148,23 +1148,33 @@ static const struct rte_flow_item_fuzzy rte_flow_item_fuzzy_mask = {
*
* Matches a GTPv1 header.
*/
+RTE_STD_C11
struct rte_flow_item_gtp {
- /**
- * Version (3b), protocol type (1b), reserved (1b),
- * Extension header flag (1b),
- * Sequence number flag (1b),
- * N-PDU number flag (1b).
- */
- uint8_t v_pt_rsv_flags;
- uint8_t msg_type; /**< Message type. */
- rte_be16_t msg_len; /**< Message length. */
- rte_be32_t teid; /**< Tunnel endpoint identifier. */
+ union {
+ struct {
+ /*
+ * These are old fields kept for compatibility.
+ * Please prefer hdr field below.
+ */
+ /**
+ * Version (3b), protocol type (1b), reserved (1b),
+ * Extension header flag (1b),
+ * Sequence number flag (1b),
+ * N-PDU number flag (1b).
+ */
+ uint8_t v_pt_rsv_flags;
+ uint8_t msg_type; /**< Message type. */
+ rte_be16_t msg_len; /**< Message length. */
+ rte_be32_t teid; /**< Tunnel endpoint identifier. */
+ };
+ struct rte_gtp_hdr hdr; /**< GTP header definition. */
+ };
};
/** Default mask for RTE_FLOW_ITEM_TYPE_GTP. */
#ifndef __cplusplus
static const struct rte_flow_item_gtp rte_flow_item_gtp_mask = {
- .teid = RTE_BE32(0xffffffff),
+ .hdr.teid = RTE_BE32(UINT32_MAX),
};
#endif