]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
net/mlx5: Add core support for vlan push/pop steering action
authorOr Gerlitz <ogerlitz@mellanox.com>
Sun, 28 Jan 2018 18:14:20 +0000 (20:14 +0200)
committerSaeed Mahameed <saeedm@mellanox.com>
Mon, 26 Mar 2018 20:47:13 +0000 (13:47 -0700)
Newer NICs (ConnectX-5 and onward) can apply vlan pop or push as an
action taking place during flow steering. Add the core bits for that.

Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Reviewed-by: Mark Bloch <markb@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/diag/fs_tracepoint.h
drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
include/linux/mlx5/fs.h
include/linux/mlx5/mlx5_ifc.h

index a6ba57fbb4146a6af9eebba079333b88a297702e..09f178a3fcabb4082229a4f4985fc47295482d7f 100644 (file)
@@ -136,6 +136,8 @@ TRACE_EVENT(mlx5_fs_del_fg,
        {MLX5_FLOW_CONTEXT_ACTION_ENCAP,         "ENCAP"},\
        {MLX5_FLOW_CONTEXT_ACTION_DECAP,         "DECAP"},\
        {MLX5_FLOW_CONTEXT_ACTION_MOD_HDR,       "MOD_HDR"},\
+       {MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH,     "VLAN_PUSH"},\
+       {MLX5_FLOW_CONTEXT_ACTION_VLAN_POP,      "VLAN_POP"},\
        {MLX5_FLOW_CONTEXT_ACTION_FWD_NEXT_PRIO, "NEXT_PRIO"}
 
 TRACE_EVENT(mlx5_fs_set_fte,
index 98d2177d0806244f2d40acdee26359b74a3832b2..a435eb7971c6eca751d2cbe6be466cf446358858 100644 (file)
@@ -227,9 +227,6 @@ enum {
        SET_VLAN_INSERT = BIT(1)
 };
 
-#define MLX5_FLOW_CONTEXT_ACTION_VLAN_POP  0x4000
-#define MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH 0x8000
-
 struct mlx5_esw_flow_attr {
        struct mlx5_eswitch_rep *in_rep;
        struct mlx5_eswitch_rep *out_rep;
index 645f83cac34d7d1ea28315d844cce22bb35bab6e..ef5afd7c93259f5beaaec8f7255d5f7a4c14a3ea 100644 (file)
@@ -317,7 +317,7 @@ static int mlx5_cmd_set_fte(struct mlx5_core_dev *dev,
                fte->dests_size * MLX5_ST_SZ_BYTES(dest_format_struct);
        u32 out[MLX5_ST_SZ_DW(set_fte_out)] = {0};
        struct mlx5_flow_rule *dst;
-       void *in_flow_context;
+       void *in_flow_context, *vlan;
        void *in_match_value;
        void *in_dests;
        u32 *in;
@@ -340,11 +340,19 @@ static int mlx5_cmd_set_fte(struct mlx5_core_dev *dev,
 
        in_flow_context = MLX5_ADDR_OF(set_fte_in, in, flow_context);
        MLX5_SET(flow_context, in_flow_context, group_id, group_id);
+
        MLX5_SET(flow_context, in_flow_context, flow_tag, fte->action.flow_tag);
        MLX5_SET(flow_context, in_flow_context, action, fte->action.action);
        MLX5_SET(flow_context, in_flow_context, encap_id, fte->action.encap_id);
        MLX5_SET(flow_context, in_flow_context, modify_header_id,
                 fte->action.modify_id);
+
+       vlan = MLX5_ADDR_OF(flow_context, in_flow_context, push_vlan);
+
+       MLX5_SET(vlan, vlan, ethtype, fte->action.vlan.ethtype);
+       MLX5_SET(vlan, vlan, vid, fte->action.vlan.vid);
+       MLX5_SET(vlan, vlan, prio, fte->action.vlan.prio);
+
        in_match_value = MLX5_ADDR_OF(flow_context, in_flow_context,
                                      match_value);
        memcpy(in_match_value, &fte->val, sizeof(fte->val));
index 3ba07c7096ef7996713a592dcf5761f8b90a9c84..de51e7c39bc8b8ae02ea236afc9286b6e768cce5 100644 (file)
@@ -1439,7 +1439,9 @@ static bool check_conflicting_actions(u32 action1, u32 action2)
        if (xored_actions & (MLX5_FLOW_CONTEXT_ACTION_DROP  |
                             MLX5_FLOW_CONTEXT_ACTION_ENCAP |
                             MLX5_FLOW_CONTEXT_ACTION_DECAP |
-                            MLX5_FLOW_CONTEXT_ACTION_MOD_HDR))
+                            MLX5_FLOW_CONTEXT_ACTION_MOD_HDR  |
+                            MLX5_FLOW_CONTEXT_ACTION_VLAN_POP |
+                            MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH))
                return true;
 
        return false;
index b957e52434f8f7ceb78d7b8aecafc5ad2d563476..47aecc4fa8c2b9e4f00e6fccd2c08c759f486695 100644 (file)
@@ -142,6 +142,12 @@ struct mlx5_flow_group *
 mlx5_create_flow_group(struct mlx5_flow_table *ft, u32 *in);
 void mlx5_destroy_flow_group(struct mlx5_flow_group *fg);
 
+struct mlx5_fs_vlan {
+        u16 ethtype;
+        u16 vid;
+        u8  prio;
+};
+
 struct mlx5_flow_act {
        u32 action;
        bool has_flow_tag;
@@ -149,6 +155,7 @@ struct mlx5_flow_act {
        u32 encap_id;
        u32 modify_id;
        uintptr_t esp_id;
+       struct mlx5_fs_vlan vlan;
 };
 
 #define MLX5_DECLARE_FLOW_ACT(name) \
index 1f3483d40055f84b0b063d2503bc521db540412c..c19e611d27826165695aa5017d2bfa1e187651ba 100644 (file)
@@ -314,7 +314,10 @@ struct mlx5_ifc_flow_table_prop_layout_bits {
        u8         flow_table_modify[0x1];
        u8         encap[0x1];
        u8         decap[0x1];
-       u8         reserved_at_9[0x17];
+       u8         reserved_at_9[0x1];
+       u8         pop_vlan[0x1];
+       u8         push_vlan[0x1];
+       u8         reserved_at_c[0x14];
 
        u8         reserved_at_20[0x2];
        u8         log_max_ft_size[0x6];
@@ -2311,10 +2314,19 @@ enum {
        MLX5_FLOW_CONTEXT_ACTION_ENCAP     = 0x10,
        MLX5_FLOW_CONTEXT_ACTION_DECAP     = 0x20,
        MLX5_FLOW_CONTEXT_ACTION_MOD_HDR   = 0x40,
+       MLX5_FLOW_CONTEXT_ACTION_VLAN_POP  = 0x80,
+       MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH = 0x100,
+};
+
+struct mlx5_ifc_vlan_bits {
+       u8         ethtype[0x10];
+       u8         prio[0x3];
+       u8         cfi[0x1];
+       u8         vid[0xc];
 };
 
 struct mlx5_ifc_flow_context_bits {
-       u8         reserved_at_0[0x20];
+       struct mlx5_ifc_vlan_bits push_vlan;
 
        u8         group_id[0x20];