net/mlx5: E-Switch, Add offloads table
authorOr Gerlitz <ogerlitz@mellanox.com>
Fri, 1 Jul 2016 11:50:59 +0000 (14:50 +0300)
committerDavid S. Miller <davem@davemloft.net>
Sat, 2 Jul 2016 18:40:40 +0000 (14:40 -0400)
Belongs to the NIC offloads name-space, and to be used as part of the
SRIOV offloads logic to steer packets that hit the e-switch miss rule
to the TIR of the relevant VF representor.

Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c

index b7fabd1..32db37a 100644 (file)
@@ -155,6 +155,10 @@ enum {
        SRIOV_OFFLOADS
 };
 
+struct mlx5_esw_offload {
+       struct mlx5_flow_table *ft_offloads;
+};
+
 struct mlx5_eswitch {
        struct mlx5_core_dev    *dev;
        struct mlx5_l2_table    l2_table;
@@ -169,6 +173,7 @@ struct mlx5_eswitch {
         */
        struct mutex            state_lock;
        struct esw_mc_addr      *mc_promisc;
+       struct mlx5_esw_offload offloads;
        int                     mode;
 };
 
index 8964f71..e895c6f 100644 (file)
@@ -212,3 +212,34 @@ void esw_destroy_offloads_fdb_table(struct mlx5_eswitch *esw)
 
        mlx5_destroy_flow_table(esw->fdb_table.fdb);
 }
+
+static int esw_create_offloads_table(struct mlx5_eswitch *esw)
+{
+       struct mlx5_flow_namespace *ns;
+       struct mlx5_flow_table *ft_offloads;
+       struct mlx5_core_dev *dev = esw->dev;
+       int err = 0;
+
+       ns = mlx5_get_flow_namespace(dev, MLX5_FLOW_NAMESPACE_OFFLOADS);
+       if (!ns) {
+               esw_warn(esw->dev, "Failed to get offloads flow namespace\n");
+               return -ENOMEM;
+       }
+
+       ft_offloads = mlx5_create_flow_table(ns, 0, dev->priv.sriov.num_vfs + 2, 0);
+       if (IS_ERR(ft_offloads)) {
+               err = PTR_ERR(ft_offloads);
+               esw_warn(esw->dev, "Failed to create offloads table, err %d\n", err);
+               return err;
+       }
+
+       esw->offloads.ft_offloads = ft_offloads;
+       return 0;
+}
+
+static void esw_destroy_offloads_table(struct mlx5_eswitch *esw)
+{
+       struct mlx5_esw_offload *offloads = &esw->offloads;
+
+       mlx5_destroy_flow_table(offloads->ft_offloads);
+}