net/mlx5e: Add sample and ptype to tc_action infra
authorRoi Dayan <roid@nvidia.com>
Wed, 27 Oct 2021 06:52:36 +0000 (09:52 +0300)
committerSaeed Mahameed <saeedm@nvidia.com>
Wed, 15 Dec 2021 05:29:44 +0000 (21:29 -0800)
Add parsing support by implementing struct mlx5e_tc_act
for this action.

Signed-off-by: Roi Dayan <roid@nvidia.com>
Reviewed-by: Oz Shlomo <ozsh@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/Makefile
drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/act.c
drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/act.h
drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/ptype.c [new file with mode: 0644]
drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/sample.c [new file with mode: 0644]
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c

index 5f2258275ff6638ffcd59ff5ab2ec70fcd84fac5..83f2b4d69e4fa7c8a7a391b321d39c99a49f90d6 100644 (file)
@@ -52,7 +52,7 @@ mlx5_core-$(CONFIG_MLX5_CLS_ACT)     += en/tc/act/act.o en/tc/act/drop.o en/tc/a
                                        en/tc/act/tun.o en/tc/act/csum.o en/tc/act/pedit.o \
                                        en/tc/act/vlan.o en/tc/act/vlan_mangle.o en/tc/act/mpls.o \
                                        en/tc/act/mirred.o en/tc/act/mirred_nic.o \
-                                       en/tc/act/ct.o
+                                       en/tc/act/ct.o en/tc/act/sample.o en/tc/act/ptype.o
 
 mlx5_core-$(CONFIG_MLX5_TC_CT)      += en/tc_ct.o
 mlx5_core-$(CONFIG_MLX5_TC_SAMPLE)   += en/tc/sample.o
index 9813a6321a9ef04af736dae0800fd926e75d0892..de25444464fb7d0e83d99380bfa27b72fff8e153 100644 (file)
@@ -24,11 +24,11 @@ static struct mlx5e_tc_act *tc_acts_fdb[NUM_FLOW_ACTIONS] = {
        &mlx5e_tc_act_pedit,
        &mlx5e_tc_act_csum,
        NULL, /* FLOW_ACTION_MARK, */
-       NULL, /* FLOW_ACTION_PTYPE, */
+       &mlx5e_tc_act_ptype,
        NULL, /* FLOW_ACTION_PRIORITY, */
        NULL, /* FLOW_ACTION_WAKE, */
        NULL, /* FLOW_ACTION_QUEUE, */
-       NULL, /* FLOW_ACTION_SAMPLE, */
+       &mlx5e_tc_act_sample,
        NULL, /* FLOW_ACTION_POLICE, */
        &mlx5e_tc_act_ct,
        NULL, /* FLOW_ACTION_CT_METADATA, */
index 5b92ffbf4819e71ad1ec58c01ce53278b23613fa..2f92248091ac74794c519d247167d608050b60a0 100644 (file)
@@ -19,11 +19,13 @@ struct mlx5e_tc_act_parse_state {
        bool encap;
        bool decap;
        bool mpls_push;
+       bool ptype_host;
        const struct ip_tunnel_info *tun_info;
        struct pedit_headers_action hdrs[__PEDIT_CMD_MAX];
        int ifindexes[MLX5_MAX_FLOW_FWD_VPORTS];
        int if_count;
        struct mlx5_tc_ct_priv *ct_priv;
+       struct mlx5e_sample_attr sample_attr;
 };
 
 struct mlx5e_tc_act {
@@ -53,6 +55,8 @@ extern struct mlx5e_tc_act mlx5e_tc_act_mpls_pop;
 extern struct mlx5e_tc_act mlx5e_tc_act_mirred;
 extern struct mlx5e_tc_act mlx5e_tc_act_mirred_nic;
 extern struct mlx5e_tc_act mlx5e_tc_act_ct;
+extern struct mlx5e_tc_act mlx5e_tc_act_sample;
+extern struct mlx5e_tc_act mlx5e_tc_act_ptype;
 
 struct mlx5e_tc_act *
 mlx5e_tc_act_get(enum flow_action_id act_id,
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/ptype.c b/drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/ptype.c
new file mode 100644 (file)
index 0000000..0819110
--- /dev/null
@@ -0,0 +1,35 @@
+// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
+// Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+
+#include "act.h"
+#include "en/tc_priv.h"
+
+static bool
+tc_act_can_offload_ptype(struct mlx5e_tc_act_parse_state *parse_state,
+                        const struct flow_action_entry *act,
+                        int act_index)
+{
+       return true;
+}
+
+static int
+tc_act_parse_ptype(struct mlx5e_tc_act_parse_state *parse_state,
+                  const struct flow_action_entry *act,
+                  struct mlx5e_priv *priv,
+                  struct mlx5_flow_attr *attr)
+{
+       struct netlink_ext_ack *extack = parse_state->extack;
+
+       if (act->ptype != PACKET_HOST) {
+               NL_SET_ERR_MSG_MOD(extack, "skbedit ptype is only supported with type host");
+               return -EOPNOTSUPP;
+       }
+
+       parse_state->ptype_host = true;
+       return 0;
+}
+
+struct mlx5e_tc_act mlx5e_tc_act_ptype = {
+       .can_offload = tc_act_can_offload_ptype,
+       .parse_action = tc_act_parse_ptype,
+};
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/sample.c b/drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/sample.c
new file mode 100644 (file)
index 0000000..0d37fb0
--- /dev/null
@@ -0,0 +1,46 @@
+// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
+// Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+
+#include <net/psample.h>
+#include "act.h"
+#include "en/tc_priv.h"
+
+static bool
+tc_act_can_offload_sample(struct mlx5e_tc_act_parse_state *parse_state,
+                         const struct flow_action_entry *act,
+                         int act_index)
+{
+       struct netlink_ext_ack *extack = parse_state->extack;
+
+       if (flow_flag_test(parse_state->flow, CT)) {
+               NL_SET_ERR_MSG_MOD(extack,
+                                  "Sample action with connection tracking is not supported");
+               return false;
+       }
+
+       return true;
+}
+
+static int
+tc_act_parse_sample(struct mlx5e_tc_act_parse_state *parse_state,
+                   const struct flow_action_entry *act,
+                   struct mlx5e_priv *priv,
+                   struct mlx5_flow_attr *attr)
+{
+       struct mlx5e_sample_attr *sample_attr = &parse_state->sample_attr;
+
+       sample_attr->rate = act->sample.rate;
+       sample_attr->group_num = act->sample.psample_group->group_num;
+
+       if (act->sample.truncate)
+               sample_attr->trunc_size = act->sample.trunc_size;
+
+       flow_flag_set(parse_state->flow, SAMPLE);
+
+       return 0;
+}
+
+struct mlx5e_tc_act mlx5e_tc_act_sample = {
+       .can_offload = tc_act_can_offload_sample,
+       .parse_action = tc_act_parse_sample,
+};
index 03ae519bfa4c9bb0cfe6e977658a10bf9d2b2284..039284964e201a84418bf67e50110fd06e2dcd4a 100644 (file)
@@ -39,7 +39,6 @@
 #include <linux/rhashtable.h>
 #include <linux/refcount.h>
 #include <linux/completion.h>
-#include <net/psample.h>
 #include <net/arp.h>
 #include <net/ipv6_stubs.h>
 #include <net/bareudp.h>
@@ -3346,14 +3345,12 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv,
        struct mlx5_eswitch *esw = priv->mdev->priv.eswitch;
        struct mlx5e_tc_act_parse_state *parse_state;
        struct mlx5e_tc_flow_parse_attr *parse_attr;
-       struct mlx5e_sample_attr sample_attr = {};
        struct mlx5_flow_attr *attr = flow->attr;
        enum mlx5_flow_namespace_type ns_type;
        const struct flow_action_entry *act;
        struct mlx5_esw_flow_attr *esw_attr;
        struct pedit_headers_action *hdrs;
        struct mlx5e_tc_act *tc_act;
-       bool ptype_host = false;
        int err, i;
 
        err = flow_action_supported(flow_action, extack);
@@ -3370,15 +3367,6 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv,
 
        flow_action_for_each(i, act, flow_action) {
                switch (act->id) {
-               case FLOW_ACTION_PTYPE:
-                       if (act->ptype != PACKET_HOST) {
-                               NL_SET_ERR_MSG_MOD(extack,
-                                                  "skbedit ptype is only supported with type host");
-                               return -EOPNOTSUPP;
-                       }
-
-                       ptype_host = true;
-                       break;
                case FLOW_ACTION_REDIRECT_INGRESS: {
                        struct net_device *out_dev;
 
@@ -3398,7 +3386,7 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv,
                                return -EOPNOTSUPP;
                        }
 
-                       if (!ptype_host) {
+                       if (!parse_state->ptype_host) {
                                NL_SET_ERR_MSG_MOD(extack,
                                                   "redirect to int port ingress requires ptype=host action");
                                return -EOPNOTSUPP;
@@ -3423,17 +3411,6 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv,
 
                        break;
                }
-               case FLOW_ACTION_SAMPLE:
-                       if (flow_flag_test(flow, CT)) {
-                               NL_SET_ERR_MSG_MOD(extack, "Sample action with connection tracking is not supported");
-                               return -EOPNOTSUPP;
-                       }
-                       sample_attr.rate = act->sample.rate;
-                       sample_attr.group_num = act->sample.psample_group->group_num;
-                       if (act->sample.truncate)
-                               sample_attr.trunc_size = act->sample.trunc_size;
-                       flow_flag_set(flow, SAMPLE);
-                       break;
                default:
                        break;
                }
@@ -3500,7 +3477,7 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv,
                attr->sample_attr = kzalloc(sizeof(*attr->sample_attr), GFP_KERNEL);
                if (!attr->sample_attr)
                        return -ENOMEM;
-               *attr->sample_attr = sample_attr;
+               *attr->sample_attr = parse_state->sample_attr;
        }
 
        return 0;