]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
net/mlx5e: Replace TC VLAN pop with VLAN 0 rewrite in prio tag mode
authorEli Britstein <elibr@mellanox.com>
Mon, 4 Mar 2019 13:50:38 +0000 (13:50 +0000)
committerSaeed Mahameed <saeedm@mellanox.com>
Wed, 1 May 2019 21:39:15 +0000 (14:39 -0700)
Current ConnectX HW is unable to perform VLAN pop in TX path and VLAN
push on RX path. To workaround that limitation untagged packets are
tagged with VLAN ID 0x000 (priority tag) and pop/push actions are
replaced by VLAN re-write actions (which are supported by the HW).
Replace TC VLAN pop action with a VLAN priority tag header rewrite.

Signed-off-by: Eli Britstein <elibr@mellanox.com>
Reviewed-by: Oz Shlomo <ozsh@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c

index 72891cc7f32afc812be348108539a544e68e6553..c79db55f8a761b87cd9c995f5accad5a98668c81 100644 (file)
@@ -2436,6 +2436,30 @@ static int add_vlan_rewrite_action(struct mlx5e_priv *priv, int namespace,
        return err;
 }
 
+static int
+add_vlan_prio_tag_rewrite_action(struct mlx5e_priv *priv,
+                                struct mlx5e_tc_flow_parse_attr *parse_attr,
+                                struct pedit_headers_action *hdrs,
+                                u32 *action, struct netlink_ext_ack *extack)
+{
+       const struct flow_action_entry prio_tag_act = {
+               .vlan.vid = 0,
+               .vlan.prio =
+                       MLX5_GET(fte_match_set_lyr_2_4,
+                                get_match_headers_value(*action,
+                                                        &parse_attr->spec),
+                                first_prio) &
+                       MLX5_GET(fte_match_set_lyr_2_4,
+                                get_match_headers_criteria(*action,
+                                                           &parse_attr->spec),
+                                first_prio),
+       };
+
+       return add_vlan_rewrite_action(priv, MLX5_FLOW_NAMESPACE_FDB,
+                                      &prio_tag_act, parse_attr, hdrs, action,
+                                      extack);
+}
+
 static int parse_tc_nic_actions(struct mlx5e_priv *priv,
                                struct flow_action *flow_action,
                                struct mlx5e_tc_flow_parse_attr *parse_attr,
@@ -2947,6 +2971,18 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv,
                }
        }
 
+       if (MLX5_CAP_GEN(esw->dev, prio_tag_required) &&
+           action & MLX5_FLOW_CONTEXT_ACTION_VLAN_POP) {
+               /* For prio tag mode, replace vlan pop with rewrite vlan prio
+                * tag rewrite.
+                */
+               action &= ~MLX5_FLOW_CONTEXT_ACTION_VLAN_POP;
+               err = add_vlan_prio_tag_rewrite_action(priv, parse_attr, hdrs,
+                                                      &action, extack);
+               if (err)
+                       return err;
+       }
+
        if (hdrs[TCA_PEDIT_KEY_EX_CMD_SET].pedits ||
            hdrs[TCA_PEDIT_KEY_EX_CMD_ADD].pedits) {
                err = alloc_tc_pedit_action(priv, MLX5_FLOW_NAMESPACE_FDB,