RDMA/mlx5: Don't overwrite action if already set
authorMark Bloch <markb@mellanox.com>
Thu, 6 Sep 2018 14:27:04 +0000 (17:27 +0300)
committerJason Gunthorpe <jgg@mellanox.com>
Tue, 11 Sep 2018 15:28:06 +0000 (09:28 -0600)
We support only a single action type per flow rule, in case the user passes
the same type of flow actions fail the flow creation.

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

index 50e5ebd..0ab8a33 100644 (file)
@@ -2467,6 +2467,9 @@ int parse_flow_flow_action(struct mlx5_ib_flow_action *maction,
 
        switch (maction->ib_action.type) {
        case IB_FLOW_ACTION_ESP:
+               if (action->action & (MLX5_FLOW_CONTEXT_ACTION_ENCRYPT |
+                                     MLX5_FLOW_CONTEXT_ACTION_DECRYPT))
+                       return -EINVAL;
                /* Currently only AES_GCM keymat is supported by the driver */
                action->esp_id = (uintptr_t)maction->esp_aes_gcm.ctx;
                action->action |= is_egress ?
@@ -2476,17 +2479,24 @@ int parse_flow_flow_action(struct mlx5_ib_flow_action *maction,
        case IB_FLOW_ACTION_UNSPECIFIED:
                if (maction->flow_action_raw.sub_type ==
                    MLX5_IB_FLOW_ACTION_MODIFY_HEADER) {
+                       if (action->action & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR)
+                               return -EINVAL;
                        action->action |= MLX5_FLOW_CONTEXT_ACTION_MOD_HDR;
                        action->modify_id = maction->flow_action_raw.action_id;
                        return 0;
                }
                if (maction->flow_action_raw.sub_type ==
                    MLX5_IB_FLOW_ACTION_DECAP) {
+                       if (action->action & MLX5_FLOW_CONTEXT_ACTION_DECAP)
+                               return -EINVAL;
                        action->action |= MLX5_FLOW_CONTEXT_ACTION_DECAP;
                        return 0;
                }
                if (maction->flow_action_raw.sub_type ==
                    MLX5_IB_FLOW_ACTION_PACKET_REFORMAT) {
+                       if (action->action &
+                           MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT)
+                               return -EINVAL;
                        action->action |=
                                MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT;
                        action->reformat_id =