IB/core: Introduce drop flow specification
authorSlava Shwartsman <slavash@mellanox.com>
Mon, 3 Apr 2017 10:13:51 +0000 (13:13 +0300)
committerDoug Ledford <dledford@redhat.com>
Fri, 21 Apr 2017 16:26:05 +0000 (12:26 -0400)
This flow steering specification identifies flow for drop by the HW.
If user create a flow only with the drop specification,
then all the packets that hit this flow will be dropped, otherwise the HW
will drop only the packets that match the other L2/L3/L4 specifications.

Signed-off-by: Slava Shwartsman <slavash@mellanox.com>
Reviewed-by: Maor Gottlieb <maorg@mellanox.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/core/uverbs.h
drivers/infiniband/core/uverbs_cmd.c
include/rdma/ib_verbs.h
include/uapi/rdma/ib_user_verbs.h

index a3230b6..64d494a 100644 (file)
@@ -233,6 +233,7 @@ struct ib_uverbs_flow_spec {
                struct ib_uverbs_flow_spec_tcp_udp tcp_udp;
                struct ib_uverbs_flow_spec_ipv6    ipv6;
                struct ib_uverbs_flow_spec_action_tag   flow_tag;
+               struct ib_uverbs_flow_spec_action_drop  drop;
        };
 };
 
index e2fee04..562184e 100644 (file)
@@ -2689,6 +2689,13 @@ static int kern_spec_to_ib_spec_action(struct ib_uverbs_flow_spec *kern_spec,
                ib_spec->flow_tag.size = sizeof(struct ib_flow_spec_action_tag);
                ib_spec->flow_tag.tag_id = kern_spec->flow_tag.tag_id;
                break;
+       case IB_FLOW_SPEC_ACTION_DROP:
+               if (kern_spec->drop.size !=
+                   sizeof(struct ib_uverbs_flow_spec_action_drop))
+                       return -EINVAL;
+
+               ib_spec->drop.size = sizeof(struct ib_flow_spec_action_drop);
+               break;
        default:
                return -EINVAL;
        }
index 16f15ea..56fa31e 100644 (file)
@@ -1679,6 +1679,7 @@ enum ib_flow_spec_type {
        IB_FLOW_SPEC_INNER              = 0x100,
        /* Actions */
        IB_FLOW_SPEC_ACTION_TAG         = 0x1000,
+       IB_FLOW_SPEC_ACTION_DROP        = 0x1001,
 };
 #define IB_FLOW_SPEC_LAYER_MASK        0xF0
 #define IB_FLOW_SPEC_SUPPORT_LAYERS 8
@@ -1807,6 +1808,11 @@ struct ib_flow_spec_action_tag {
        u32                           tag_id;
 };
 
+struct ib_flow_spec_action_drop {
+       enum ib_flow_spec_type        type;
+       u16                           size;
+};
+
 union ib_flow_spec {
        struct {
                u32                     type;
@@ -1819,6 +1825,7 @@ union ib_flow_spec {
        struct ib_flow_spec_ipv6        ipv6;
        struct ib_flow_spec_tunnel      tunnel;
        struct ib_flow_spec_action_tag  flow_tag;
+       struct ib_flow_spec_action_drop drop;
 };
 
 struct ib_flow_attr {
index 997f904..477d629 100644 (file)
@@ -947,6 +947,17 @@ struct ib_uverbs_flow_spec_action_tag {
        __u32                         reserved1;
 };
 
+struct ib_uverbs_flow_spec_action_drop {
+       union {
+               struct ib_uverbs_flow_spec_hdr hdr;
+               struct {
+                       __u32 type;
+                       __u16 size;
+                       __u16 reserved;
+               };
+       };
+};
+
 struct ib_uverbs_flow_tunnel_filter {
        __be32 tunnel_id;
 };