net/mlx5: add source vport match to the ingress rules

For E-Switch configurations over multiport Infiniband devices
we should add source vport match to correctly distribute
traffic between representors.

Signed-off-by: Viacheslav Ovsiienko <viacheslavo@mellanox.com>
Acked-by: Shahaf Shuler <shahafs@mellanox.com>
This commit is contained in:
Viacheslav Ovsiienko 2019-03-27 13:15:47 +00:00 committed by Ferruh Yigit
parent 028b2a28c3
commit 0fe3f18f78

View File

@ -2804,6 +2804,29 @@ flow_dv_matcher_register(struct rte_eth_dev *dev,
return 0;
}
/**
* Add source vport match to the specified matcher.
*
* @param[in, out] matcher
* Flow matcher.
* @param[in, out] key
* Flow matcher value.
* @param[in] port
* Source vport value to match
* @param[in] mask
* Mask
*/
static void
flow_dv_translate_source_vport(void *matcher, void *key,
int16_t port, uint16_t mask)
{
void *misc_m = MLX5_ADDR_OF(fte_match_param, matcher, misc_parameters);
void *misc_v = MLX5_ADDR_OF(fte_match_param, key, misc_parameters);
MLX5_SET(fte_match_set_misc, misc_m, source_port, mask);
MLX5_SET(fte_match_set_misc, misc_v, source_port, port);
}
/**
* Fill the flow with DV spec.
*
@ -3088,6 +3111,19 @@ flow_dv_translate(struct rte_eth_dev *dev,
}
dev_flow->dv.actions_n = actions_n;
flow->actions = action_flags;
if (attr->ingress && !attr->transfer &&
(priv->representor || priv->master)) {
/* It was validated - we support unidirection flows only. */
assert(!attr->egress);
/*
* Add matching on source vport index only
* for ingress rules in E-Switch configurations.
*/
flow_dv_translate_source_vport(matcher.mask.buf,
dev_flow->dv.value.buf,
priv->vport_id,
0xffff);
}
for (; items->type != RTE_FLOW_ITEM_TYPE_END; items++) {
int tunnel = !!(item_flags & MLX5_FLOW_LAYER_TUNNEL);
void *match_mask = matcher.mask.buf;