RDMA/mlx5: Add NIC TX steering support
Just like ingress steering, allow a user to create steering rules that match egress vport traffic. We expose the same number of priorities as the bypass (NIC RX) steering. Signed-off-by: Mark Bloch <markb@mellanox.com> Signed-off-by: Leon Romanovsky <leonro@mellanox.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
This commit is contained in:
parent
eb93c82ed8
commit
78dd0c430f
@ -2891,7 +2891,7 @@ is_valid_esp_aes_gcm(struct mlx5_core_dev *mdev,
|
|||||||
* rules would be supported, always return VALID_SPEC_NA.
|
* rules would be supported, always return VALID_SPEC_NA.
|
||||||
*/
|
*/
|
||||||
if (!is_crypto)
|
if (!is_crypto)
|
||||||
return egress ? VALID_SPEC_INVALID : VALID_SPEC_NA;
|
return VALID_SPEC_NA;
|
||||||
|
|
||||||
return is_crypto && is_ipsec &&
|
return is_crypto && is_ipsec &&
|
||||||
(!egress || (!is_drop && !flow_act->has_flow_tag)) ?
|
(!egress || (!is_drop && !flow_act->has_flow_tag)) ?
|
||||||
@ -3066,21 +3066,27 @@ static struct mlx5_ib_flow_prio *get_flow_table(struct mlx5_ib_dev *dev,
|
|||||||
max_table_size = BIT(MLX5_CAP_FLOWTABLE_NIC_RX(dev->mdev,
|
max_table_size = BIT(MLX5_CAP_FLOWTABLE_NIC_RX(dev->mdev,
|
||||||
log_max_ft_size));
|
log_max_ft_size));
|
||||||
if (flow_attr->type == IB_FLOW_ATTR_NORMAL) {
|
if (flow_attr->type == IB_FLOW_ATTR_NORMAL) {
|
||||||
if (ft_type == MLX5_IB_FT_TX)
|
enum mlx5_flow_namespace_type fn_type;
|
||||||
priority = 0;
|
|
||||||
else if (flow_is_multicast_only(flow_attr) &&
|
if (flow_is_multicast_only(flow_attr) &&
|
||||||
!dont_trap)
|
!dont_trap)
|
||||||
priority = MLX5_IB_FLOW_MCAST_PRIO;
|
priority = MLX5_IB_FLOW_MCAST_PRIO;
|
||||||
else
|
else
|
||||||
priority = ib_prio_to_core_prio(flow_attr->priority,
|
priority = ib_prio_to_core_prio(flow_attr->priority,
|
||||||
dont_trap);
|
dont_trap);
|
||||||
ns = mlx5_get_flow_namespace(dev->mdev,
|
if (ft_type == MLX5_IB_FT_RX) {
|
||||||
ft_type == MLX5_IB_FT_TX ?
|
fn_type = MLX5_FLOW_NAMESPACE_BYPASS;
|
||||||
MLX5_FLOW_NAMESPACE_EGRESS :
|
prio = &dev->flow_db->prios[priority];
|
||||||
MLX5_FLOW_NAMESPACE_BYPASS);
|
} else {
|
||||||
|
max_table_size =
|
||||||
|
BIT(MLX5_CAP_FLOWTABLE_NIC_TX(dev->mdev,
|
||||||
|
log_max_ft_size));
|
||||||
|
fn_type = MLX5_FLOW_NAMESPACE_EGRESS;
|
||||||
|
prio = &dev->flow_db->egress_prios[priority];
|
||||||
|
}
|
||||||
|
ns = mlx5_get_flow_namespace(dev->mdev, fn_type);
|
||||||
num_entries = MLX5_FS_MAX_ENTRIES;
|
num_entries = MLX5_FS_MAX_ENTRIES;
|
||||||
num_groups = MLX5_FS_MAX_TYPES;
|
num_groups = MLX5_FS_MAX_TYPES;
|
||||||
prio = &dev->flow_db->prios[priority];
|
|
||||||
} else if (flow_attr->type == IB_FLOW_ATTR_ALL_DEFAULT ||
|
} else if (flow_attr->type == IB_FLOW_ATTR_ALL_DEFAULT ||
|
||||||
flow_attr->type == IB_FLOW_ATTR_MC_DEFAULT) {
|
flow_attr->type == IB_FLOW_ATTR_MC_DEFAULT) {
|
||||||
ns = mlx5_get_flow_namespace(dev->mdev,
|
ns = mlx5_get_flow_namespace(dev->mdev,
|
||||||
@ -3279,6 +3285,9 @@ static struct mlx5_ib_flow_handler *_create_flow_rule(struct mlx5_ib_dev *dev,
|
|||||||
if (!is_valid_attr(dev->mdev, flow_attr))
|
if (!is_valid_attr(dev->mdev, flow_attr))
|
||||||
return ERR_PTR(-EINVAL);
|
return ERR_PTR(-EINVAL);
|
||||||
|
|
||||||
|
if (dev->rep && is_egress)
|
||||||
|
return ERR_PTR(-EINVAL);
|
||||||
|
|
||||||
spec = kvzalloc(sizeof(*spec), GFP_KERNEL);
|
spec = kvzalloc(sizeof(*spec), GFP_KERNEL);
|
||||||
handler = kzalloc(sizeof(*handler), GFP_KERNEL);
|
handler = kzalloc(sizeof(*handler), GFP_KERNEL);
|
||||||
if (!handler || !spec) {
|
if (!handler || !spec) {
|
||||||
|
@ -196,6 +196,7 @@ struct mlx5_ib_flow_matcher {
|
|||||||
|
|
||||||
struct mlx5_ib_flow_db {
|
struct mlx5_ib_flow_db {
|
||||||
struct mlx5_ib_flow_prio prios[MLX5_IB_NUM_FLOW_FT];
|
struct mlx5_ib_flow_prio prios[MLX5_IB_NUM_FLOW_FT];
|
||||||
|
struct mlx5_ib_flow_prio egress_prios[MLX5_IB_NUM_FLOW_FT];
|
||||||
struct mlx5_ib_flow_prio sniffer[MLX5_IB_NUM_SNIFFER_FTS];
|
struct mlx5_ib_flow_prio sniffer[MLX5_IB_NUM_SNIFFER_FTS];
|
||||||
struct mlx5_ib_flow_prio egress[MLX5_IB_NUM_EGRESS_FTS];
|
struct mlx5_ib_flow_prio egress[MLX5_IB_NUM_EGRESS_FTS];
|
||||||
struct mlx5_flow_table *lag_demux_ft;
|
struct mlx5_flow_table *lag_demux_ft;
|
||||||
|
Loading…
Reference in New Issue
Block a user