net/mlx5e: TC, Pass attr to tc_act can_offload()
authorRoi Dayan <roid@nvidia.com>
Wed, 24 Nov 2021 12:31:46 +0000 (14:31 +0200)
committerSaeed Mahameed <saeedm@nvidia.com>
Thu, 27 Jan 2022 20:37:32 +0000 (12:37 -0800)
In later commit we are going to instantiate multiple attr instances
for flow instead of single attr.
Make sure the parsing using correct attr and not flow->attr.

Signed-off-by: Roi Dayan <roid@nvidia.com>
Reviewed-by: Oz Shlomo <ozsh@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
19 files changed:
drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/accept.c
drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/act.h
drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/csum.c
drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/ct.c
drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/drop.c
drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/goto.c
drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/mark.c
drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/mirred.c
drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/mirred_nic.c
drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/mpls.c
drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/pedit.c
drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/ptype.c
drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/redirect_ingress.c
drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/sample.c
drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/trap.c
drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/tun.c
drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/vlan.c
drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/vlan_mangle.c
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c

index b0de6b999675e236569c385037292ad0dd0be644..84c1e8719d3413eb1f01b41cccb22bae96b7f49c 100644 (file)
@@ -7,7 +7,8 @@
 static bool
 tc_act_can_offload_accept(struct mlx5e_tc_act_parse_state *parse_state,
                          const struct flow_action_entry *act,
-                         int act_index)
+                         int act_index,
+                         struct mlx5_flow_attr *attr)
 {
        return true;
 }
index 48c06a20aecff9c0074a0ff3ce34374061c07b99..04734e59bbc4f88d2519b3dd150350b6e817a50e 100644 (file)
@@ -29,7 +29,8 @@ struct mlx5e_tc_act_parse_state {
 struct mlx5e_tc_act {
        bool (*can_offload)(struct mlx5e_tc_act_parse_state *parse_state,
                            const struct flow_action_entry *act,
-                           int act_index);
+                           int act_index,
+                           struct mlx5_flow_attr *attr);
 
        int (*parse_action)(struct mlx5e_tc_act_parse_state *parse_state,
                            const struct flow_action_entry *act,
index 29920ef0180a2509d78d0bf90b22db124b7ab12d..c0f08ae6a57f1ee98d3ef77cb9e48918ed6930df 100644 (file)
@@ -38,11 +38,12 @@ csum_offload_supported(struct mlx5e_priv *priv,
 static bool
 tc_act_can_offload_csum(struct mlx5e_tc_act_parse_state *parse_state,
                        const struct flow_action_entry *act,
-                       int act_index)
+                       int act_index,
+                       struct mlx5_flow_attr *attr)
 {
        struct mlx5e_tc_flow *flow = parse_state->flow;
 
-       return csum_offload_supported(flow->priv, flow->attr->action,
+       return csum_offload_supported(flow->priv, attr->action,
                                      act->csum_flags, parse_state->extack);
 }
 
index 06ec30cdb269e2c9815400fa0ef7eb418d7a05d7..0d08cc35ea6f5f175d0f7933aa4767c6fc6452ba 100644 (file)
@@ -8,7 +8,8 @@
 static bool
 tc_act_can_offload_ct(struct mlx5e_tc_act_parse_state *parse_state,
                      const struct flow_action_entry *act,
-                     int act_index)
+                     int act_index,
+                     struct mlx5_flow_attr *attr)
 {
        struct netlink_ext_ack *extack = parse_state->extack;
 
index 2e29a23bed12b4045740ebcab1901ac5672c172c..3d5f23636a02f0dffa3a41f7c5573efb4cd26ad3 100644 (file)
@@ -7,7 +7,8 @@
 static bool
 tc_act_can_offload_drop(struct mlx5e_tc_act_parse_state *parse_state,
                        const struct flow_action_entry *act,
-                       int act_index)
+                       int act_index,
+                       struct mlx5_flow_attr *attr)
 {
        return true;
 }
index f44515061228ea05d9a97faa4aedc5f230e19b65..fb1be822ad25805e8ddf1fcb87792eabf888bac8 100644 (file)
@@ -8,6 +8,7 @@
 static int
 validate_goto_chain(struct mlx5e_priv *priv,
                    struct mlx5e_tc_flow *flow,
+                   struct mlx5_flow_attr *attr,
                    const struct flow_action_entry *act,
                    struct netlink_ext_ack *extack)
 {
@@ -32,7 +33,7 @@ validate_goto_chain(struct mlx5e_priv *priv,
        }
 
        if (!mlx5_chains_backwards_supported(chains) &&
-           dest_chain <= flow->attr->chain) {
+           dest_chain <= attr->chain) {
                NL_SET_ERR_MSG_MOD(extack, "Goto lower numbered chain isn't supported");
                return -EOPNOTSUPP;
        }
@@ -43,8 +44,8 @@ validate_goto_chain(struct mlx5e_priv *priv,
                return -EOPNOTSUPP;
        }
 
-       if (flow->attr->action & (MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT |
-                                 MLX5_FLOW_CONTEXT_ACTION_DECAP) &&
+       if (attr->action & (MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT |
+                           MLX5_FLOW_CONTEXT_ACTION_DECAP) &&
            !reformat_and_fwd) {
                NL_SET_ERR_MSG_MOD(extack,
                                   "Goto chain is not allowed if action has reformat or decap");
@@ -57,12 +58,13 @@ validate_goto_chain(struct mlx5e_priv *priv,
 static bool
 tc_act_can_offload_goto(struct mlx5e_tc_act_parse_state *parse_state,
                        const struct flow_action_entry *act,
-                       int act_index)
+                       int act_index,
+                       struct mlx5_flow_attr *attr)
 {
        struct netlink_ext_ack *extack = parse_state->extack;
        struct mlx5e_tc_flow *flow = parse_state->flow;
 
-       if (validate_goto_chain(flow->priv, flow, act, extack))
+       if (validate_goto_chain(flow->priv, flow, attr, act, extack))
                return false;
 
        return true;
index d775c3d9edf34afd4a92a1a20ec79e8f0e5c0ebf..e8d227595b3ea7eccdb180edcca980b4243a741a 100644 (file)
@@ -7,7 +7,8 @@
 static bool
 tc_act_can_offload_mark(struct mlx5e_tc_act_parse_state *parse_state,
                        const struct flow_action_entry *act,
-                       int act_index)
+                       int act_index,
+                       struct mlx5_flow_attr *attr)
 {
        if (act->mark & ~MLX5E_TC_FLOW_ID_MASK) {
                NL_SET_ERR_MSG_MOD(parse_state->extack, "Bad flow mark, only 16 bit supported");
index c614fc7fdc9c9f632471a4eb22673962a53a925f..99fb98b3e71be0fbf720a659de92a96925403401 100644 (file)
@@ -99,7 +99,8 @@ get_fdb_out_dev(struct net_device *uplink_dev, struct net_device *out_dev)
 static bool
 tc_act_can_offload_mirred(struct mlx5e_tc_act_parse_state *parse_state,
                          const struct flow_action_entry *act,
-                         int act_index)
+                         int act_index,
+                         struct mlx5_flow_attr *attr)
 {
        struct netlink_ext_ack *extack = parse_state->extack;
        struct mlx5e_tc_flow *flow = parse_state->flow;
@@ -108,8 +109,8 @@ tc_act_can_offload_mirred(struct mlx5e_tc_act_parse_state *parse_state,
        struct mlx5e_priv *priv = flow->priv;
        struct mlx5_esw_flow_attr *esw_attr;
 
-       parse_attr = flow->attr->parse_attr;
-       esw_attr = flow->attr->esw_attr;
+       parse_attr = attr->parse_attr;
+       esw_attr = attr->esw_attr;
 
        if (!out_dev) {
                /* out_dev is NULL when filters with
index 2c74567b6d2568f13e82aa11fc2bbc8fb7d02d95..16681cf6e93eb1679f4914104ac9795974c9a94f 100644 (file)
@@ -7,7 +7,8 @@
 static bool
 tc_act_can_offload_mirred_nic(struct mlx5e_tc_act_parse_state *parse_state,
                              const struct flow_action_entry *act,
-                             int act_index)
+                             int act_index,
+                             struct mlx5_flow_attr *attr)
 {
        struct netlink_ext_ack *extack = parse_state->extack;
        struct mlx5e_tc_flow *flow = parse_state->flow;
index 784fc4f68b1e41c7ee64f43fe88a0f515a2a20de..40332949509ad590d5f6de9f5d7b37b37b587b69 100644 (file)
@@ -8,7 +8,8 @@
 static bool
 tc_act_can_offload_mpls_push(struct mlx5e_tc_act_parse_state *parse_state,
                             const struct flow_action_entry *act,
-                            int act_index)
+                            int act_index,
+                            struct mlx5_flow_attr *attr)
 {
        struct netlink_ext_ack *extack = parse_state->extack;
        struct mlx5e_priv *priv = parse_state->flow->priv;
@@ -36,13 +37,13 @@ tc_act_parse_mpls_push(struct mlx5e_tc_act_parse_state *parse_state,
 static bool
 tc_act_can_offload_mpls_pop(struct mlx5e_tc_act_parse_state *parse_state,
                            const struct flow_action_entry *act,
-                           int act_index)
+                           int act_index,
+                           struct mlx5_flow_attr *attr)
 {
        struct netlink_ext_ack *extack = parse_state->extack;
-       struct mlx5e_tc_flow *flow = parse_state->flow;
        struct net_device *filter_dev;
 
-       filter_dev = flow->attr->parse_attr->filter_dev;
+       filter_dev = attr->parse_attr->filter_dev;
 
        /* we only support mpls pop if it is the first action
         * and the filter net device is bareudp. Subsequent
index a70460c1b98db0474268467f563ac8c692aa750d..39f8f71bed9edd706f8ee4d08d37e53cb389c796 100644 (file)
@@ -122,7 +122,8 @@ mlx5e_tc_act_pedit_parse_action(struct mlx5e_priv *priv,
 static bool
 tc_act_can_offload_pedit(struct mlx5e_tc_act_parse_state *parse_state,
                         const struct flow_action_entry *act,
-                        int act_index)
+                        int act_index,
+                        struct mlx5_flow_attr *attr)
 {
        return true;
 }
index 0819110193dc6a2a0a70aa4c384ee08fb8a3247e..6454b031ff7ac38df5b53aad972c2a2abdebc6d2 100644 (file)
@@ -7,7 +7,8 @@
 static bool
 tc_act_can_offload_ptype(struct mlx5e_tc_act_parse_state *parse_state,
                         const struct flow_action_entry *act,
-                        int act_index)
+                        int act_index,
+                        struct mlx5_flow_attr *attr)
 {
        return true;
 }
index 1c32e24e528ddc9198572c1e4a5dd99d427d5fd4..9dd244147385e68fec4de31ce13894b15eb7b860 100644 (file)
@@ -7,16 +7,16 @@
 static bool
 tc_act_can_offload_redirect_ingress(struct mlx5e_tc_act_parse_state *parse_state,
                                    const struct flow_action_entry *act,
-                                   int act_index)
+                                   int act_index,
+                                   struct mlx5_flow_attr *attr)
 {
        struct netlink_ext_ack *extack = parse_state->extack;
-       struct mlx5e_tc_flow *flow = parse_state->flow;
        struct mlx5e_tc_flow_parse_attr *parse_attr;
        struct net_device *out_dev = act->dev;
        struct mlx5_esw_flow_attr *esw_attr;
 
-       parse_attr = flow->attr->parse_attr;
-       esw_attr = flow->attr->esw_attr;
+       parse_attr = attr->parse_attr;
+       esw_attr = attr->esw_attr;
 
        if (!out_dev)
                return false;
index 6699bdf5cf0120c5d710f62f6e8cee5e6746092a..0d71e97f4eb98fa5de3e45bdbe04d5b256ee122e 100644 (file)
@@ -8,7 +8,8 @@
 static bool
 tc_act_can_offload_sample(struct mlx5e_tc_act_parse_state *parse_state,
                          const struct flow_action_entry *act,
-                         int act_index)
+                         int act_index,
+                         struct mlx5_flow_attr *attr)
 {
        struct netlink_ext_ack *extack = parse_state->extack;
 
index 046b64c2cec4f609471ba8eaf35989d96f6c8ef1..72811e0430c197db01349f2c36d69f03964c724b 100644 (file)
@@ -7,7 +7,8 @@
 static bool
 tc_act_can_offload_trap(struct mlx5e_tc_act_parse_state *parse_state,
                        const struct flow_action_entry *act,
-                       int act_index)
+                       int act_index,
+                       struct mlx5_flow_attr *attr)
 {
        struct netlink_ext_ack *extack = parse_state->extack;
 
index 6f4a2cf46afd843770a552fec1f76752281bb20f..b4fa2de9711d730836bfa4d14c7a38444f906336 100644 (file)
@@ -8,7 +8,8 @@
 static bool
 tc_act_can_offload_tun_encap(struct mlx5e_tc_act_parse_state *parse_state,
                             const struct flow_action_entry *act,
-                            int act_index)
+                            int act_index,
+                            struct mlx5_flow_attr *attr)
 {
        if (!act->tunnel) {
                NL_SET_ERR_MSG_MOD(parse_state->extack,
@@ -34,7 +35,8 @@ tc_act_parse_tun_encap(struct mlx5e_tc_act_parse_state *parse_state,
 static bool
 tc_act_can_offload_tun_decap(struct mlx5e_tc_act_parse_state *parse_state,
                             const struct flow_action_entry *act,
-                            int act_index)
+                            int act_index,
+                            struct mlx5_flow_attr *attr)
 {
        return true;
 }
index f4659254f8f31f49fa805f04278a8ede47adbc3f..6378b7558ba2ced044e80ac4ad848f7a9d8d5697 100644 (file)
@@ -150,7 +150,8 @@ mlx5e_tc_act_vlan_add_pop_action(struct mlx5e_priv *priv,
 static bool
 tc_act_can_offload_vlan(struct mlx5e_tc_act_parse_state *parse_state,
                        const struct flow_action_entry *act,
-                       int act_index)
+                       int act_index,
+                       struct mlx5_flow_attr *attr)
 {
        return true;
 }
index 396b32e4b6e206c64ffd90abf5c4b626a7d6bb19..28444d4ffd7336cc1d9c6f2d070b6355ddaffccc 100644 (file)
@@ -53,7 +53,8 @@ mlx5e_tc_act_vlan_add_rewrite_action(struct mlx5e_priv *priv, int namespace,
 static bool
 tc_act_can_offload_vlan_mangle(struct mlx5e_tc_act_parse_state *parse_state,
                               const struct flow_action_entry *act,
-                              int act_index)
+                              int act_index,
+                              struct mlx5_flow_attr *attr)
 {
        return true;
 }
index 5eb5f6ec2f0d9e3a6f3856f2ffb06e48523d4ff9..de07ccd6ac7b0e645c17e5826770d585e54535dd 100644 (file)
@@ -3302,7 +3302,7 @@ parse_tc_actions(struct mlx5e_tc_act_parse_state *parse_state,
                        return -EOPNOTSUPP;
                }
 
-               if (!tc_act->can_offload(parse_state, act, i))
+               if (!tc_act->can_offload(parse_state, act, i, attr))
                        return -EOPNOTSUPP;
 
                err = tc_act->parse_action(parse_state, act, priv, attr);
@@ -3313,7 +3313,7 @@ parse_tc_actions(struct mlx5e_tc_act_parse_state *parse_state,
        flow_action_for_each(i, act, flow_action) {
                tc_act = mlx5e_tc_act_get(act->id, ns_type);
                if (!tc_act || !tc_act->post_parse ||
-                   !tc_act->can_offload(parse_state, act, i))
+                   !tc_act->can_offload(parse_state, act, i, attr))
                        continue;
 
                err = tc_act->post_parse(parse_state, priv, attr);