Commit 78dd0c43 authored by Mark Bloch's avatar Mark Bloch Committed by Jason Gunthorpe

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: default avatarMark Bloch <markb@mellanox.com>
Signed-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
parent eb93c82e
...@@ -2891,7 +2891,7 @@ is_valid_esp_aes_gcm(struct mlx5_core_dev *mdev, ...@@ -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, ...@@ -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, ...@@ -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 { ...@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment