IB/uverbs: Introduce ESP steering match filter
authorMatan Barak <matanb@mellanox.com>
Wed, 28 Mar 2018 06:27:49 +0000 (09:27 +0300)
committerJason Gunthorpe <jgg@mellanox.com>
Wed, 4 Apr 2018 18:06:26 +0000 (12:06 -0600)
Adding a new ESP steering match filter that could match against
spi and seq used in IPSec protocol.

Reviewed-by: Yishai Hadas <yishaih@mellanox.com>
Signed-off-by: Matan Barak <matanb@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.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 1bac0b51686a873e34393460c350154aadf3257c..3229e87d03cb6d84db5278295910edf9c037bb25 100644 (file)
@@ -257,6 +257,7 @@ struct ib_uverbs_flow_spec {
                };
                struct ib_uverbs_flow_spec_eth     eth;
                struct ib_uverbs_flow_spec_ipv4    ipv4;
+               struct ib_uverbs_flow_spec_esp     esp;
                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;
index 69050dd77421cbe58d7f792ffde7eb5449a2d225..f38600490fd166b30435d47c269775af9c6d3f76 100644 (file)
@@ -2931,6 +2931,17 @@ int ib_uverbs_kern_spec_to_ib_spec_filter(enum ib_flow_spec_type type,
                    (ntohl(ib_spec->tunnel.val.tunnel_id)) >= BIT(24))
                        return -EINVAL;
                break;
+       case IB_FLOW_SPEC_ESP:
+               ib_filter_sz = offsetof(struct ib_flow_esp_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->esp.size = sizeof(struct ib_flow_spec_esp);
+               memcpy(&ib_spec->esp.val, kern_spec_val, actual_filter_sz);
+               memcpy(&ib_spec->esp.mask, kern_spec_mask, actual_filter_sz);
+               break;
        default:
                return -EINVAL;
        }
index 8c3ca073016d788a48e253103725aa372f9374c0..a6dba77c1b28cf903a453aee2d2b873e3efd51da 100644 (file)
@@ -1828,6 +1828,7 @@ enum ib_flow_spec_type {
        /* L3 header*/
        IB_FLOW_SPEC_IPV4               = 0x30,
        IB_FLOW_SPEC_IPV6               = 0x31,
+       IB_FLOW_SPEC_ESP                = 0x34,
        /* L4 headers*/
        IB_FLOW_SPEC_TCP                = 0x40,
        IB_FLOW_SPEC_UDP                = 0x41,
@@ -1960,6 +1961,20 @@ struct ib_flow_spec_tunnel {
        struct ib_flow_tunnel_filter  mask;
 };
 
+struct ib_flow_esp_filter {
+       __be32  spi;
+       __be32  seq;
+       /* Must be last */
+       u8      real_sz[0];
+};
+
+struct ib_flow_spec_esp {
+       u32                           type;
+       u16                           size;
+       struct ib_flow_esp_filter     val;
+       struct ib_flow_esp_filter     mask;
+};
+
 struct ib_flow_spec_action_tag {
        enum ib_flow_spec_type        type;
        u16                           size;
@@ -1988,6 +2003,7 @@ union ib_flow_spec {
        struct ib_flow_spec_tcp_udp     tcp_udp;
        struct ib_flow_spec_ipv6        ipv6;
        struct ib_flow_spec_tunnel      tunnel;
+       struct ib_flow_spec_esp         esp;
        struct ib_flow_spec_action_tag  flow_tag;
        struct ib_flow_spec_action_drop drop;
        struct ib_flow_spec_action_handle action;
index ac41ce23418698459943c8315c99231b3fd60f27..df5d339952fe5d9d7599af9195979f9ba2be162e 100644 (file)
@@ -1014,6 +1014,24 @@ struct ib_uverbs_flow_spec_tunnel {
        struct ib_uverbs_flow_tunnel_filter mask;
 };
 
+struct ib_uverbs_flow_spec_esp_filter {
+       __u32 spi;
+       __u32 seq;
+};
+
+struct ib_uverbs_flow_spec_esp {
+       union {
+               struct ib_uverbs_flow_spec_hdr hdr;
+               struct {
+                       __u32 type;
+                       __u16 size;
+                       __u16 reserved;
+               };
+       };
+       struct ib_uverbs_flow_spec_esp_filter val;
+       struct ib_uverbs_flow_spec_esp_filter mask;
+};
+
 struct ib_uverbs_flow_attr {
        __u32 type;
        __u16 size;