RDMA/mlx5: Refactor flow action parsing to be more generic
authorMark Bloch <markb@mellanox.com>
Thu, 6 Sep 2018 14:27:03 +0000 (17:27 +0300)
committerJason Gunthorpe <jgg@mellanox.com>
Tue, 11 Sep 2018 15:28:06 +0000 (09:28 -0600)
Make the parsing of flow actions more generic so it could be used by
mlx5 raw create flow.

Signed-off-by: Mark Bloch <markb@mellanox.com>
Reviewed-by: Yishai Hadas <yishaih@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/hw/mlx5/main.c
drivers/infiniband/hw/mlx5/mlx5_ib.h

index 65fce84135f326e9dd37d780a6925777f87f762f..50e5ebd1614f55a4fe3859bb284c6f29aefe4784 100644 (file)
@@ -2460,17 +2460,16 @@ static int check_mpls_supp_fields(u32 field_support, const __be32 *set_mask)
                   offsetof(typeof(filter), field) -\
                   sizeof(filter.field))
 
-static int parse_flow_flow_action(const union ib_flow_spec *ib_spec,
-                                 const struct ib_flow_attr *flow_attr,
-                                 struct mlx5_flow_act *action)
+int parse_flow_flow_action(struct mlx5_ib_flow_action *maction,
+                          bool is_egress,
+                          struct mlx5_flow_act *action)
 {
-       struct mlx5_ib_flow_action *maction = to_mflow_act(ib_spec->action.act);
 
        switch (maction->ib_action.type) {
        case IB_FLOW_ACTION_ESP:
                /* Currently only AES_GCM keymat is supported by the driver */
                action->esp_id = (uintptr_t)maction->esp_aes_gcm.ctx;
-               action->action |= flow_attr->flags & IB_FLOW_ATTR_FLAGS_EGRESS ?
+               action->action |= is_egress ?
                        MLX5_FLOW_CONTEXT_ACTION_ENCRYPT :
                        MLX5_FLOW_CONTEXT_ACTION_DECRYPT;
                return 0;
@@ -2831,7 +2830,8 @@ static int parse_flow_attr(struct mlx5_core_dev *mdev, u32 *match_c,
                action->action |= MLX5_FLOW_CONTEXT_ACTION_DROP;
                break;
        case IB_FLOW_SPEC_ACTION_HANDLE:
-               ret = parse_flow_flow_action(ib_spec, flow_attr, action);
+               ret = parse_flow_flow_action(to_mflow_act(ib_spec->action.act),
+                       flow_attr->flags & IB_FLOW_ATTR_FLAGS_EGRESS, action);
                if (ret)
                        return ret;
                break;
index a3ade16937b460e1538bf8c23a7078e9fabc67cd..0e831e48047a566b1d42440adcb430f2626da1be 100644 (file)
@@ -41,6 +41,7 @@
 #include <linux/mlx5/cq.h>
 #include <linux/mlx5/qp.h>
 #include <linux/mlx5/srq.h>
+#include <linux/mlx5/fs.h>
 #include <linux/types.h>
 #include <linux/mlx5/transobj.h>
 #include <rdma/ib_user_verbs.h>
@@ -872,6 +873,9 @@ to_mcounters(struct ib_counters *ibcntrs)
        return container_of(ibcntrs, struct mlx5_ib_mcounters, ibcntrs);
 }
 
+int parse_flow_flow_action(struct mlx5_ib_flow_action *maction,
+                          bool is_egress,
+                          struct mlx5_flow_act *action);
 struct mlx5_ib_dev {
        struct ib_device                ib_dev;
        const struct uverbs_object_tree_def *driver_trees[7];