net/mlx5: fix match information in meter
As meter flows are split into three subflows each, the prefix subflow with meter action color the packet, the meter subflow filters out the colored packets, the suffix subflow applies all the remaining actions to the passed packets. Currently, all the user defined items are matched in the prefix flow. Flow id tag match item is the only item added to the meter suffix subflow. Some of the remaining actions to be applied in the suffix subflow require more information in the match item, or the suffix subflow will not be created successfully. Actions require the L3/L4 type in the match items as below: RTE_FLOW_ACTION_TYPE_SET_TP_SRC RTE_FLOW_ACTION_TYPE_SET_TP_DST RTE_FLOW_ACTION_TYPE_DEC_TTL RTE_FLOW_ACTION_TYPE_SET_TTL RTE_FLOW_ACTION_TYPE_RSS RTE_FLOW_ACTION_TYPE_QUEUE Inherit the match item flags from meter prefix subflow to make actions in suffix subflow get sufficient information. Fixes: 9ea9b049a960 ("net/mlx5: split meter flow") Cc: stable@dpdk.org Signed-off-by: Suanming Mou <suanmingm@mellanox.com> Acked-by: Matan Azrad <matan@mellanox.com>
This commit is contained in:
parent
bc42413bb9
commit
6e77151286
@ -3778,6 +3778,8 @@ flow_mreg_tx_copy_prep(struct rte_eth_dev *dev,
|
||||
* Pointer to Ethernet device.
|
||||
* @param[in] flow
|
||||
* Parent flow structure pointer.
|
||||
* @param[in] prefix_layers
|
||||
* Prefix flow layer flags.
|
||||
* @param[in] attr
|
||||
* Flow rule attributes.
|
||||
* @param[in] items
|
||||
@ -3794,6 +3796,7 @@ flow_mreg_tx_copy_prep(struct rte_eth_dev *dev,
|
||||
static int
|
||||
flow_create_split_metadata(struct rte_eth_dev *dev,
|
||||
struct rte_flow *flow,
|
||||
uint64_t prefix_layers,
|
||||
const struct rte_flow_attr *attr,
|
||||
const struct rte_flow_item items[],
|
||||
const struct rte_flow_action actions[],
|
||||
@ -3814,7 +3817,7 @@ flow_create_split_metadata(struct rte_eth_dev *dev,
|
||||
if (!config->dv_flow_en ||
|
||||
config->dv_xmeta_en == MLX5_XMETA_MODE_LEGACY ||
|
||||
!mlx5_flow_ext_mreg_supported(dev))
|
||||
return flow_create_split_inner(dev, flow, NULL, 0,
|
||||
return flow_create_split_inner(dev, flow, NULL, prefix_layers,
|
||||
attr, items, actions, external,
|
||||
error);
|
||||
actions_n = flow_parse_qrss_action(actions, &qrss);
|
||||
@ -3897,7 +3900,7 @@ flow_create_split_metadata(struct rte_eth_dev *dev,
|
||||
goto exit;
|
||||
}
|
||||
/* Add the unmodified original or prefix subflow. */
|
||||
ret = flow_create_split_inner(dev, flow, &dev_flow, 0, attr,
|
||||
ret = flow_create_split_inner(dev, flow, &dev_flow, prefix_layers, attr,
|
||||
items, ext_actions ? ext_actions :
|
||||
actions, external, error);
|
||||
if (ret < 0)
|
||||
@ -4092,7 +4095,9 @@ flow_create_split_meter(struct rte_eth_dev *dev,
|
||||
MLX5_FLOW_TABLE_LEVEL_SUFFIX;
|
||||
}
|
||||
/* Add the prefix subflow. */
|
||||
ret = flow_create_split_metadata(dev, flow, &sfx_attr,
|
||||
ret = flow_create_split_metadata(dev, flow, dev_flow ?
|
||||
flow_get_prefix_layer_flags(dev_flow) :
|
||||
0, &sfx_attr,
|
||||
sfx_items ? sfx_items : items,
|
||||
sfx_actions ? sfx_actions : actions,
|
||||
external, error);
|
||||
|
@ -85,16 +85,35 @@ union flow_dv_attr {
|
||||
* Pointer to item specification.
|
||||
* @param[out] attr
|
||||
* Pointer to flow attributes structure.
|
||||
* @param[in] dev_flow
|
||||
* Pointer to the sub flow.
|
||||
* @param[in] tunnel_decap
|
||||
* Whether action is after tunnel decapsulation.
|
||||
*/
|
||||
static void
|
||||
flow_dv_attr_init(const struct rte_flow_item *item, union flow_dv_attr *attr,
|
||||
bool tunnel_decap)
|
||||
struct mlx5_flow *dev_flow, bool tunnel_decap)
|
||||
{
|
||||
/*
|
||||
* If layers is already initialized, it means this dev_flow is the
|
||||
* suffix flow, the layers flags is set by the prefix flow. Need to
|
||||
* use the layer flags from prefix flow as the suffix flow may not
|
||||
* have the user defined items as the flow is split.
|
||||
*/
|
||||
if (dev_flow->layers) {
|
||||
if (dev_flow->layers & MLX5_FLOW_LAYER_OUTER_L3_IPV4)
|
||||
attr->ipv4 = 1;
|
||||
else if (dev_flow->layers & MLX5_FLOW_LAYER_OUTER_L3_IPV6)
|
||||
attr->ipv6 = 1;
|
||||
if (dev_flow->layers & MLX5_FLOW_LAYER_OUTER_L4_TCP)
|
||||
attr->tcp = 1;
|
||||
else if (dev_flow->layers & MLX5_FLOW_LAYER_OUTER_L4_UDP)
|
||||
attr->udp = 1;
|
||||
attr->valid = 1;
|
||||
return;
|
||||
}
|
||||
for (; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {
|
||||
uint8_t next_protocol = 0xff;
|
||||
|
||||
switch (item->type) {
|
||||
case RTE_FLOW_ITEM_TYPE_GRE:
|
||||
case RTE_FLOW_ITEM_TYPE_NVGRE:
|
||||
@ -640,6 +659,8 @@ flow_dv_convert_action_modify_vlan_vid
|
||||
* Pointer to rte_flow_item objects list.
|
||||
* @param[in] attr
|
||||
* Pointer to flow attributes structure.
|
||||
* @param[in] dev_flow
|
||||
* Pointer to the sub flow.
|
||||
* @param[in] tunnel_decap
|
||||
* Whether action is after tunnel decapsulation.
|
||||
* @param[out] error
|
||||
@ -653,8 +674,8 @@ flow_dv_convert_action_modify_tp
|
||||
(struct mlx5_flow_dv_modify_hdr_resource *resource,
|
||||
const struct rte_flow_action *action,
|
||||
const struct rte_flow_item *items,
|
||||
union flow_dv_attr *attr, bool tunnel_decap,
|
||||
struct rte_flow_error *error)
|
||||
union flow_dv_attr *attr, struct mlx5_flow *dev_flow,
|
||||
bool tunnel_decap, struct rte_flow_error *error)
|
||||
{
|
||||
const struct rte_flow_action_set_tp *conf =
|
||||
(const struct rte_flow_action_set_tp *)(action->conf);
|
||||
@ -666,7 +687,7 @@ flow_dv_convert_action_modify_tp
|
||||
struct field_modify_info *field;
|
||||
|
||||
if (!attr->valid)
|
||||
flow_dv_attr_init(items, attr, tunnel_decap);
|
||||
flow_dv_attr_init(items, attr, dev_flow, tunnel_decap);
|
||||
if (attr->udp) {
|
||||
memset(&udp, 0, sizeof(udp));
|
||||
memset(&udp_mask, 0, sizeof(udp_mask));
|
||||
@ -716,6 +737,8 @@ flow_dv_convert_action_modify_tp
|
||||
* Pointer to rte_flow_item objects list.
|
||||
* @param[in] attr
|
||||
* Pointer to flow attributes structure.
|
||||
* @param[in] dev_flow
|
||||
* Pointer to the sub flow.
|
||||
* @param[in] tunnel_decap
|
||||
* Whether action is after tunnel decapsulation.
|
||||
* @param[out] error
|
||||
@ -729,8 +752,8 @@ flow_dv_convert_action_modify_ttl
|
||||
(struct mlx5_flow_dv_modify_hdr_resource *resource,
|
||||
const struct rte_flow_action *action,
|
||||
const struct rte_flow_item *items,
|
||||
union flow_dv_attr *attr, bool tunnel_decap,
|
||||
struct rte_flow_error *error)
|
||||
union flow_dv_attr *attr, struct mlx5_flow *dev_flow,
|
||||
bool tunnel_decap, struct rte_flow_error *error)
|
||||
{
|
||||
const struct rte_flow_action_set_ttl *conf =
|
||||
(const struct rte_flow_action_set_ttl *)(action->conf);
|
||||
@ -742,7 +765,7 @@ flow_dv_convert_action_modify_ttl
|
||||
struct field_modify_info *field;
|
||||
|
||||
if (!attr->valid)
|
||||
flow_dv_attr_init(items, attr, tunnel_decap);
|
||||
flow_dv_attr_init(items, attr, dev_flow, tunnel_decap);
|
||||
if (attr->ipv4) {
|
||||
memset(&ipv4, 0, sizeof(ipv4));
|
||||
memset(&ipv4_mask, 0, sizeof(ipv4_mask));
|
||||
@ -778,6 +801,8 @@ flow_dv_convert_action_modify_ttl
|
||||
* Pointer to rte_flow_item objects list.
|
||||
* @param[in] attr
|
||||
* Pointer to flow attributes structure.
|
||||
* @param[in] dev_flow
|
||||
* Pointer to the sub flow.
|
||||
* @param[in] tunnel_decap
|
||||
* Whether action is after tunnel decapsulation.
|
||||
* @param[out] error
|
||||
@ -790,8 +815,8 @@ static int
|
||||
flow_dv_convert_action_modify_dec_ttl
|
||||
(struct mlx5_flow_dv_modify_hdr_resource *resource,
|
||||
const struct rte_flow_item *items,
|
||||
union flow_dv_attr *attr, bool tunnel_decap,
|
||||
struct rte_flow_error *error)
|
||||
union flow_dv_attr *attr, struct mlx5_flow *dev_flow,
|
||||
bool tunnel_decap, struct rte_flow_error *error)
|
||||
{
|
||||
struct rte_flow_item item;
|
||||
struct rte_flow_item_ipv4 ipv4;
|
||||
@ -801,7 +826,7 @@ flow_dv_convert_action_modify_dec_ttl
|
||||
struct field_modify_info *field;
|
||||
|
||||
if (!attr->valid)
|
||||
flow_dv_attr_init(items, attr, tunnel_decap);
|
||||
flow_dv_attr_init(items, attr, dev_flow, tunnel_decap);
|
||||
if (attr->ipv4) {
|
||||
memset(&ipv4, 0, sizeof(ipv4));
|
||||
memset(&ipv4_mask, 0, sizeof(ipv4_mask));
|
||||
@ -7505,7 +7530,7 @@ cnt_err:
|
||||
case RTE_FLOW_ACTION_TYPE_SET_TP_DST:
|
||||
if (flow_dv_convert_action_modify_tp
|
||||
(mhdr_res, actions, items,
|
||||
&flow_attr, !!(action_flags &
|
||||
&flow_attr, dev_flow, !!(action_flags &
|
||||
MLX5_FLOW_ACTION_DECAP), error))
|
||||
return -rte_errno;
|
||||
action_flags |= actions->type ==
|
||||
@ -7515,7 +7540,7 @@ cnt_err:
|
||||
break;
|
||||
case RTE_FLOW_ACTION_TYPE_DEC_TTL:
|
||||
if (flow_dv_convert_action_modify_dec_ttl
|
||||
(mhdr_res, items, &flow_attr,
|
||||
(mhdr_res, items, &flow_attr, dev_flow,
|
||||
!!(action_flags &
|
||||
MLX5_FLOW_ACTION_DECAP), error))
|
||||
return -rte_errno;
|
||||
@ -7524,7 +7549,7 @@ cnt_err:
|
||||
case RTE_FLOW_ACTION_TYPE_SET_TTL:
|
||||
if (flow_dv_convert_action_modify_ttl
|
||||
(mhdr_res, actions, items, &flow_attr,
|
||||
!!(action_flags &
|
||||
dev_flow, !!(action_flags &
|
||||
MLX5_FLOW_ACTION_DECAP), error))
|
||||
return -rte_errno;
|
||||
action_flags |= MLX5_FLOW_ACTION_SET_TTL;
|
||||
|
Loading…
x
Reference in New Issue
Block a user