net/mlx5: Add empty egress namespace to flow steering core
authorAviad Yehezkel <aviadye@mellanox.com>
Sun, 18 Feb 2018 11:17:17 +0000 (13:17 +0200)
committerSaeed Mahameed <saeedm@mellanox.com>
Wed, 7 Mar 2018 06:20:13 +0000 (22:20 -0800)
Currently, we don't support egress flow steering namespace in mlx5
flow steering core implementation. However, when we want to encrypt
a packet, we model it as a flow steering rule in the egress path.
To overcome this, we add an empty egress namespace to flow steering.
This namespace is initialized only when ipsec support exists.
In the future, this will grow to a full blown full steering
implementation, resembling the ingress path.

Signed-off-by: Matan Barak <matanb@mellanox.com>
Signed-off-by: Aviad Yehezkel <aviadye@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/diag/fs_tracepoint.c
drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
drivers/net/ethernet/mellanox/mlx5/core/fs_core.h
include/linux/mlx5/fs.h
include/linux/mlx5/mlx5_ifc.h

index 0be4575b58a27261084ee25058ed56039611e31b..3816b4506561e0bcc1b85b33beb4f3272fd3e393 100644 (file)
@@ -246,6 +246,9 @@ const char *parse_fs_dst(struct trace_seq *p,
        case MLX5_FLOW_DESTINATION_TYPE_COUNTER:
                trace_seq_printf(p, "counter_id=%u\n", counter_id);
                break;
+       case MLX5_FLOW_DESTINATION_TYPE_PORT:
+               trace_seq_printf(p, "port\n");
+               break;
        }
 
        trace_seq_putc(p, 0);
index c3eaddb43e57888c4abee176e9b04e7214fd1236..ed3ea80a24be7953cf0e2ffc3b5f215707440c99 100644 (file)
@@ -731,6 +731,7 @@ const struct mlx5_flow_cmds *mlx5_fs_cmd_get_default(enum fs_flow_table_type typ
        case FS_FT_SNIFFER_RX:
        case FS_FT_SNIFFER_TX:
                return mlx5_fs_cmd_get_fw_cmds();
+       case FS_FT_NIC_TX:
        default:
                return mlx5_fs_cmd_get_stub_cmds();
        }
index f3a654b96b98d5422cdfa4f8bcf525454c385d84..5c111186d103146d7fc9b37c8273599f92fcb4d3 100644 (file)
@@ -37,6 +37,7 @@
 #include "fs_core.h"
 #include "fs_cmd.h"
 #include "diag/fs_tracepoint.h"
+#include "accel/ipsec.h"
 
 #define INIT_TREE_NODE_ARRAY_SIZE(...) (sizeof((struct init_tree_node[]){__VA_ARGS__}) /\
                                         sizeof(struct init_tree_node))
@@ -2049,6 +2050,11 @@ struct mlx5_flow_namespace *mlx5_get_flow_namespace(struct mlx5_core_dev *dev,
                        return &steering->sniffer_tx_root_ns->ns;
                else
                        return NULL;
+       case MLX5_FLOW_NAMESPACE_EGRESS:
+               if (steering->egress_root_ns)
+                       return &steering->egress_root_ns->ns;
+               else
+                       return NULL;
        default:
                return NULL;
        }
@@ -2413,6 +2419,7 @@ void mlx5_cleanup_fs(struct mlx5_core_dev *dev)
        cleanup_root_ns(steering->fdb_root_ns);
        cleanup_root_ns(steering->sniffer_rx_root_ns);
        cleanup_root_ns(steering->sniffer_tx_root_ns);
+       cleanup_root_ns(steering->egress_root_ns);
        mlx5_cleanup_fc_stats(dev);
        kmem_cache_destroy(steering->ftes_cache);
        kmem_cache_destroy(steering->fgs_cache);
@@ -2558,6 +2565,20 @@ cleanup_root_ns:
        return err;
 }
 
+static int init_egress_root_ns(struct mlx5_flow_steering *steering)
+{
+       struct fs_prio *prio;
+
+       steering->egress_root_ns = create_root_ns(steering,
+                                                 FS_FT_NIC_TX);
+       if (!steering->egress_root_ns)
+               return -ENOMEM;
+
+       /* create 1 prio*/
+       prio = fs_create_prio(&steering->egress_root_ns->ns, 0, 1);
+       return PTR_ERR_OR_ZERO(prio);
+}
+
 int mlx5_init_fs(struct mlx5_core_dev *dev)
 {
        struct mlx5_flow_steering *steering;
@@ -2623,6 +2644,13 @@ int mlx5_init_fs(struct mlx5_core_dev *dev)
                        goto err;
        }
 
+       if (mlx5_accel_ipsec_device_caps(steering->dev) &
+           MLX5_ACCEL_IPSEC_DEVICE) {
+               err = init_egress_root_ns(steering);
+               if (err)
+                       goto err;
+       }
+
        return 0;
 err:
        mlx5_cleanup_fs(dev);
index 45791c79229637f0a732d669f317866c16daae7e..8586af9ce514102b8248007209211a89c0f77639 100644 (file)
@@ -48,6 +48,7 @@ enum fs_node_type {
 
 enum fs_flow_table_type {
        FS_FT_NIC_RX          = 0x0,
+       FS_FT_NIC_TX          = 0x1,
        FS_FT_ESW_EGRESS_ACL  = 0x2,
        FS_FT_ESW_INGRESS_ACL = 0x3,
        FS_FT_FDB             = 0X4,
@@ -75,6 +76,7 @@ struct mlx5_flow_steering {
        struct mlx5_flow_root_namespace **esw_ingress_root_ns;
        struct mlx5_flow_root_namespace *sniffer_tx_root_ns;
        struct mlx5_flow_root_namespace *sniffer_rx_root_ns;
+       struct mlx5_flow_root_namespace *egress_root_ns;
 };
 
 struct fs_node {
index f580bc4c2443ab0b493febfac35851b3e49ed330..744ea228acead8c6073be2920878642bc250bee5 100644 (file)
@@ -69,6 +69,7 @@ enum mlx5_flow_namespace_type {
        MLX5_FLOW_NAMESPACE_ESW_INGRESS,
        MLX5_FLOW_NAMESPACE_SNIFFER_RX,
        MLX5_FLOW_NAMESPACE_SNIFFER_TX,
+       MLX5_FLOW_NAMESPACE_EGRESS,
 };
 
 struct mlx5_flow_table;
index f4e417686f620cb2926461631d313d4aef868a54..9bc4ea0cf5a99e000d9cd9c0ffad317147668fbb 100644 (file)
@@ -1091,6 +1091,7 @@ enum mlx5_flow_destination_type {
        MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE   = 0x1,
        MLX5_FLOW_DESTINATION_TYPE_TIR          = 0x2,
 
+       MLX5_FLOW_DESTINATION_TYPE_PORT         = 0x99,
        MLX5_FLOW_DESTINATION_TYPE_COUNTER      = 0x100,
 };