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:
parent
028b2a28c3
commit
0fe3f18f78
@ -2804,6 +2804,29 @@ flow_dv_matcher_register(struct rte_eth_dev *dev,
|
|||||||
return 0;
|
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.
|
* 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;
|
dev_flow->dv.actions_n = actions_n;
|
||||||
flow->actions = action_flags;
|
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++) {
|
for (; items->type != RTE_FLOW_ITEM_TYPE_END; items++) {
|
||||||
int tunnel = !!(item_flags & MLX5_FLOW_LAYER_TUNNEL);
|
int tunnel = !!(item_flags & MLX5_FLOW_LAYER_TUNNEL);
|
||||||
void *match_mask = matcher.mask.buf;
|
void *match_mask = matcher.mask.buf;
|
||||||
|
Loading…
Reference in New Issue
Block a user