|
@@ -1427,6 +1427,16 @@ struct mlx5_flow_namespace *mlx5_get_flow_namespace(struct mlx5_core_dev *dev,
|
|
|
return &steering->esw_ingress_root_ns->ns;
|
|
|
else
|
|
|
return NULL;
|
|
|
+ case MLX5_FLOW_NAMESPACE_SNIFFER_RX:
|
|
|
+ if (steering->sniffer_rx_root_ns)
|
|
|
+ return &steering->sniffer_rx_root_ns->ns;
|
|
|
+ else
|
|
|
+ return NULL;
|
|
|
+ case MLX5_FLOW_NAMESPACE_SNIFFER_TX:
|
|
|
+ if (steering->sniffer_tx_root_ns)
|
|
|
+ return &steering->sniffer_tx_root_ns->ns;
|
|
|
+ else
|
|
|
+ return NULL;
|
|
|
default:
|
|
|
return NULL;
|
|
|
}
|
|
@@ -1726,10 +1736,46 @@ void mlx5_cleanup_fs(struct mlx5_core_dev *dev)
|
|
|
cleanup_root_ns(steering->esw_egress_root_ns);
|
|
|
cleanup_root_ns(steering->esw_ingress_root_ns);
|
|
|
cleanup_root_ns(steering->fdb_root_ns);
|
|
|
+ cleanup_root_ns(steering->sniffer_rx_root_ns);
|
|
|
+ cleanup_root_ns(steering->sniffer_tx_root_ns);
|
|
|
mlx5_cleanup_fc_stats(dev);
|
|
|
kfree(steering);
|
|
|
}
|
|
|
|
|
|
+static int init_sniffer_tx_root_ns(struct mlx5_flow_steering *steering)
|
|
|
+{
|
|
|
+ struct fs_prio *prio;
|
|
|
+
|
|
|
+ steering->sniffer_tx_root_ns = create_root_ns(steering, FS_FT_SNIFFER_TX);
|
|
|
+ if (!steering->sniffer_tx_root_ns)
|
|
|
+ return -ENOMEM;
|
|
|
+
|
|
|
+ /* Create single prio */
|
|
|
+ prio = fs_create_prio(&steering->sniffer_tx_root_ns->ns, 0, 1);
|
|
|
+ if (IS_ERR(prio)) {
|
|
|
+ cleanup_root_ns(steering->sniffer_tx_root_ns);
|
|
|
+ return PTR_ERR(prio);
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int init_sniffer_rx_root_ns(struct mlx5_flow_steering *steering)
|
|
|
+{
|
|
|
+ struct fs_prio *prio;
|
|
|
+
|
|
|
+ steering->sniffer_rx_root_ns = create_root_ns(steering, FS_FT_SNIFFER_RX);
|
|
|
+ if (!steering->sniffer_rx_root_ns)
|
|
|
+ return -ENOMEM;
|
|
|
+
|
|
|
+ /* Create single prio */
|
|
|
+ prio = fs_create_prio(&steering->sniffer_rx_root_ns->ns, 0, 1);
|
|
|
+ if (IS_ERR(prio)) {
|
|
|
+ cleanup_root_ns(steering->sniffer_rx_root_ns);
|
|
|
+ return PTR_ERR(prio);
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int init_fdb_root_ns(struct mlx5_flow_steering *steering)
|
|
|
{
|
|
|
struct fs_prio *prio;
|
|
@@ -1826,6 +1872,18 @@ int mlx5_init_fs(struct mlx5_core_dev *dev)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ if (MLX5_CAP_FLOWTABLE_SNIFFER_RX(dev, ft_support)) {
|
|
|
+ err = init_sniffer_rx_root_ns(steering);
|
|
|
+ if (err)
|
|
|
+ goto err;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (MLX5_CAP_FLOWTABLE_SNIFFER_TX(dev, ft_support)) {
|
|
|
+ err = init_sniffer_tx_root_ns(steering);
|
|
|
+ if (err)
|
|
|
+ goto err;
|
|
|
+ }
|
|
|
+
|
|
|
return 0;
|
|
|
err:
|
|
|
mlx5_cleanup_fs(dev);
|