IB/uverbs: Introduce a GRE steering match filter
authorAriel Levkovich <lariel@mellanox.com>
Sun, 13 May 2018 11:33:30 +0000 (14:33 +0300)
committerJason Gunthorpe <jgg@mellanox.com>
Thu, 17 May 2018 03:32:54 +0000 (21:32 -0600)
Adding a new GRE steering match filter that can match against
key and protocol fields.

Reviewed-by: Mark Bloch <markb@mellanox.com>
Signed-off-by: Ariel Levkovich <lariel@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/core/uverbs_cmd.c
include/rdma/ib_verbs.h

index 21a887c9523bc3a08fb7992a958cdfc4e4d9b3ad..82c8c8b3e10bb245d338a7228be91ba3f0fb03d5 100644 (file)
@@ -2948,6 +2948,17 @@ int ib_uverbs_kern_spec_to_ib_spec_filter(enum ib_flow_spec_type type,
                memcpy(&ib_spec->esp.val, kern_spec_val, actual_filter_sz);
                memcpy(&ib_spec->esp.mask, kern_spec_mask, actual_filter_sz);
                break;
+       case IB_FLOW_SPEC_GRE:
+               ib_filter_sz = offsetof(struct ib_flow_gre_filter, real_sz);
+               actual_filter_sz = spec_filter_size(kern_spec_mask,
+                                                   kern_filter_sz,
+                                                   ib_filter_sz);
+               if (actual_filter_sz <= 0)
+                       return -EINVAL;
+               ib_spec->gre.size = sizeof(struct ib_flow_spec_gre);
+               memcpy(&ib_spec->gre.val, kern_spec_val, actual_filter_sz);
+               memcpy(&ib_spec->gre.mask, kern_spec_mask, actual_filter_sz);
+               break;
        default:
                return -EINVAL;
        }
index 9fc8a825aa28c33a77b324d4c437824133dcf40a..e3ec61fe6060c183c5ac968aa14cd76be573819e 100644 (file)
@@ -1852,6 +1852,7 @@ enum ib_flow_spec_type {
        IB_FLOW_SPEC_TCP                = 0x40,
        IB_FLOW_SPEC_UDP                = 0x41,
        IB_FLOW_SPEC_VXLAN_TUNNEL       = 0x50,
+       IB_FLOW_SPEC_GRE                = 0x51,
        IB_FLOW_SPEC_INNER              = 0x100,
        /* Actions */
        IB_FLOW_SPEC_ACTION_TAG         = 0x1000,
@@ -1994,6 +1995,21 @@ struct ib_flow_spec_esp {
        struct ib_flow_esp_filter     mask;
 };
 
+struct ib_flow_gre_filter {
+       __be16 c_ks_res0_ver;
+       __be16 protocol;
+       __be32 key;
+       /* Must be last */
+       u8      real_sz[0];
+};
+
+struct ib_flow_spec_gre {
+       u32                           type;
+       u16                           size;
+       struct ib_flow_gre_filter     val;
+       struct ib_flow_gre_filter     mask;
+};
+
 struct ib_flow_spec_action_tag {
        enum ib_flow_spec_type        type;
        u16                           size;
@@ -2023,6 +2039,7 @@ union ib_flow_spec {
        struct ib_flow_spec_ipv6        ipv6;
        struct ib_flow_spec_tunnel      tunnel;
        struct ib_flow_spec_esp         esp;
+       struct ib_flow_spec_gre         gre;
        struct ib_flow_spec_action_tag  flow_tag;
        struct ib_flow_spec_action_drop drop;
        struct ib_flow_spec_action_handle action;