net/mlx5e: Refactor tc vlan push/pop actions offloading
authorJianbo Liu <jianbol@mellanox.com>
Tue, 3 Jul 2018 05:46:13 +0000 (05:46 +0000)
committerSaeed Mahameed <saeedm@mellanox.com>
Mon, 23 Jul 2018 22:01:11 +0000 (15:01 -0700)
Extract actions offloading code to a new function, and also extend data
structures for double vlan actions.

Signed-off-by: Jianbo Liu <jianbol@mellanox.com>
Reviewed-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c

index dcb8c4993811173781ba56bbecffd6d0f438860a..35b3e135ae1dd63467ab154620d7d0396bc01504 100644 (file)
@@ -2578,6 +2578,32 @@ out_err:
        return err;
 }
 
        return err;
 }
 
+static int parse_tc_vlan_action(struct mlx5e_priv *priv,
+                               const struct tc_action *a,
+                               struct mlx5_esw_flow_attr *attr,
+                               u32 *action)
+{
+       if (tcf_vlan_action(a) == TCA_VLAN_ACT_POP) {
+               *action |= MLX5_FLOW_CONTEXT_ACTION_VLAN_POP;
+       } else if (tcf_vlan_action(a) == TCA_VLAN_ACT_PUSH) {
+               *action |= MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH;
+               attr->vlan_vid[0] = tcf_vlan_push_vid(a);
+               if (mlx5_eswitch_vlan_actions_supported(priv->mdev)) {
+                       attr->vlan_prio[0] = tcf_vlan_push_prio(a);
+                       attr->vlan_proto[0] = tcf_vlan_push_proto(a);
+                       if (!attr->vlan_proto[0])
+                               attr->vlan_proto[0] = htons(ETH_P_8021Q);
+               } else if (tcf_vlan_push_proto(a) != htons(ETH_P_8021Q) ||
+                          tcf_vlan_push_prio(a)) {
+                       return -EOPNOTSUPP;
+               }
+       } else { /* action is TCA_VLAN_ACT_MODIFY */
+               return -EOPNOTSUPP;
+       }
+
+       return 0;
+}
+
 static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
                                struct mlx5e_tc_flow_parse_attr *parse_attr,
                                struct mlx5e_tc_flow *flow)
 static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
                                struct mlx5e_tc_flow_parse_attr *parse_attr,
                                struct mlx5e_tc_flow *flow)
@@ -2589,6 +2615,7 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
        LIST_HEAD(actions);
        bool encap = false;
        u32 action = 0;
        LIST_HEAD(actions);
        bool encap = false;
        u32 action = 0;
+       int err;
 
        if (!tcf_exts_has_actions(exts))
                return -EINVAL;
 
        if (!tcf_exts_has_actions(exts))
                return -EINVAL;
@@ -2605,8 +2632,6 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
                }
 
                if (is_tcf_pedit(a)) {
                }
 
                if (is_tcf_pedit(a)) {
-                       int err;
-
                        err = parse_tc_pedit_action(priv, a, MLX5_FLOW_NAMESPACE_FDB,
                                                    parse_attr);
                        if (err)
                        err = parse_tc_pedit_action(priv, a, MLX5_FLOW_NAMESPACE_FDB,
                                                    parse_attr);
                        if (err)
@@ -2673,23 +2698,11 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
                }
 
                if (is_tcf_vlan(a)) {
                }
 
                if (is_tcf_vlan(a)) {
-                       if (tcf_vlan_action(a) == TCA_VLAN_ACT_POP) {
-                               action |= MLX5_FLOW_CONTEXT_ACTION_VLAN_POP;
-                       } else if (tcf_vlan_action(a) == TCA_VLAN_ACT_PUSH) {
-                               action |= MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH;
-                               attr->vlan_vid = tcf_vlan_push_vid(a);
-                               if (mlx5_eswitch_vlan_actions_supported(priv->mdev)) {
-                                       attr->vlan_prio = tcf_vlan_push_prio(a);
-                                       attr->vlan_proto = tcf_vlan_push_proto(a);
-                                       if (!attr->vlan_proto)
-                                               attr->vlan_proto = htons(ETH_P_8021Q);
-                               } else if (tcf_vlan_push_proto(a) != htons(ETH_P_8021Q) ||
-                                          tcf_vlan_push_prio(a)) {
-                                       return -EOPNOTSUPP;
-                               }
-                       } else { /* action is TCA_VLAN_ACT_MODIFY */
-                               return -EOPNOTSUPP;
-                       }
+                       err = parse_tc_vlan_action(priv, a, attr, &action);
+
+                       if (err)
+                               return err;
+
                        attr->mirror_count = attr->out_count;
                        continue;
                }
                        attr->mirror_count = attr->out_count;
                        continue;
                }
index b174da2884c56b96805c007f002b6b86cb97fd8f..befa0011efee4f1620d0bd64c0feaf604afc2b30 100644 (file)
@@ -256,9 +256,9 @@ struct mlx5_esw_flow_attr {
        int out_count;
 
        int     action;
        int out_count;
 
        int     action;
-       __be16  vlan_proto;
-       u16     vlan_vid;
-       u8      vlan_prio;
+       __be16  vlan_proto[1];
+       u16     vlan_vid[1];
+       u8      vlan_prio[1];
        bool    vlan_handled;
        u32     encap_id;
        u32     mod_hdr_id;
        bool    vlan_handled;
        u32     encap_id;
        u32     mod_hdr_id;
index f32e69170b30e60bb8ec9c915d4d2e2e46b5851f..552954d7184e9b99cb6d6af1824f21ed87221430 100644 (file)
@@ -70,9 +70,9 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
                flow_act.action &= ~(MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH |
                                     MLX5_FLOW_CONTEXT_ACTION_VLAN_POP);
        else if (flow_act.action & MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH) {
                flow_act.action &= ~(MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH |
                                     MLX5_FLOW_CONTEXT_ACTION_VLAN_POP);
        else if (flow_act.action & MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH) {
-               flow_act.vlan[0].ethtype = ntohs(attr->vlan_proto);
-               flow_act.vlan[0].vid = attr->vlan_vid;
-               flow_act.vlan[0].prio = attr->vlan_prio;
+               flow_act.vlan[0].ethtype = ntohs(attr->vlan_proto[0]);
+               flow_act.vlan[0].vid = attr->vlan_vid[0];
+               flow_act.vlan[0].prio = attr->vlan_prio[0];
        }
 
        if (flow_act.action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST) {
        }
 
        if (flow_act.action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST) {
@@ -266,7 +266,7 @@ static int esw_add_vlan_action_check(struct mlx5_esw_flow_attr *attr,
        /* protects against (1) setting rules with different vlans to push and
         * (2) setting rules w.o vlans (attr->vlan = 0) && w. vlans to push (!= 0)
         */
        /* protects against (1) setting rules with different vlans to push and
         * (2) setting rules w.o vlans (attr->vlan = 0) && w. vlans to push (!= 0)
         */
-       if (push && in_rep->vlan_refcount && (in_rep->vlan != attr->vlan_vid))
+       if (push && in_rep->vlan_refcount && (in_rep->vlan != attr->vlan_vid[0]))
                goto out_notsupp;
 
        return 0;
                goto out_notsupp;
 
        return 0;
@@ -324,11 +324,11 @@ int mlx5_eswitch_add_vlan_action(struct mlx5_eswitch *esw,
                if (vport->vlan_refcount)
                        goto skip_set_push;
 
                if (vport->vlan_refcount)
                        goto skip_set_push;
 
-               err = __mlx5_eswitch_set_vport_vlan(esw, vport->vport, attr->vlan_vid, 0,
+               err = __mlx5_eswitch_set_vport_vlan(esw, vport->vport, attr->vlan_vid[0], 0,
                                                    SET_VLAN_INSERT | SET_VLAN_STRIP);
                if (err)
                        goto out;
                                                    SET_VLAN_INSERT | SET_VLAN_STRIP);
                if (err)
                        goto out;
-               vport->vlan = attr->vlan_vid;
+               vport->vlan = attr->vlan_vid[0];
 skip_set_push:
                vport->vlan_refcount++;
        }
 skip_set_push:
                vport->vlan_refcount++;
        }