From: Ariel Levkovich <lariel@xxxxxxxxxxxx> Allow verbs applications packet steering of GRE tunneled traffic. Adding GRE flow specification based on RFC 2890. GRE consists of flags, protocol and key fields. IPv4 protocol 47 (IPPROTO_GRE) can be used when GRE packets are encapsulated in IPv4. Signed-off-by: Ariel Levkovich <lariel@xxxxxxxxxxxx> Signed-off-by: Yishai Hadas <yishaih@xxxxxxxxxxxx> --- libibverbs/cmd.c | 7 +++++++ libibverbs/kern-abi.h | 1 + libibverbs/man/ibv_create_flow.3 | 1 + libibverbs/verbs.h | 24 ++++++++++++++++++++++++ 4 files changed, 33 insertions(+) diff --git a/libibverbs/cmd.c b/libibverbs/cmd.c index 0f102b4..8d4865d 100644 --- a/libibverbs/cmd.c +++ b/libibverbs/cmd.c @@ -1766,6 +1766,13 @@ static int ib_spec_to_kern_spec(struct ibv_flow_spec *ib_spec, memcpy(&kern_spec->tcp_udp.mask, &ib_spec->tcp_udp.mask, sizeof(struct ibv_flow_tcp_udp_filter)); break; + case IBV_FLOW_SPEC_GRE: + kern_spec->gre.size = sizeof(struct ib_uverbs_flow_spec_gre); + memcpy(&kern_spec->gre.val, &ib_spec->gre.val, + sizeof(struct ibv_flow_gre_filter)); + memcpy(&kern_spec->gre.mask, &ib_spec->gre.mask, + sizeof(struct ibv_flow_gre_filter)); + break; case IBV_FLOW_SPEC_VXLAN_TUNNEL: ret = get_filters_size(ib_spec, kern_spec, &ib_filter_size, &kern_filter_size, diff --git a/libibverbs/kern-abi.h b/libibverbs/kern-abi.h index 23dd104..d8e5987 100644 --- a/libibverbs/kern-abi.h +++ b/libibverbs/kern-abi.h @@ -267,6 +267,7 @@ struct ibv_kern_spec { 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_gre gre; struct ib_uverbs_flow_spec_tunnel tunnel; struct ib_uverbs_flow_spec_action_tag flow_tag; struct ib_uverbs_flow_spec_action_drop drop; diff --git a/libibverbs/man/ibv_create_flow.3 b/libibverbs/man/ibv_create_flow.3 index 65de08b..f1737ca 100644 --- a/libibverbs/man/ibv_create_flow.3 +++ b/libibverbs/man/ibv_create_flow.3 @@ -69,6 +69,7 @@ IBV_FLOW_SPEC_ESP = 0x34, /* Flow specification of ESP ( IBV_FLOW_SPEC_TCP = 0x40, /* Flow specification of TCP header */ IBV_FLOW_SPEC_UDP = 0x41, /* Flow specification of UDP header */ IBV_FLOW_SPEC_VXLAN_TUNNEL = 0x50, /* Flow specification of VXLAN header */ +IBV_FLOW_SPEC_GRE = 0x51, /* Flow specification of GRE header */ IBV_FLOW_SPEC_INNER = 0x100, /* Flag making L2/L3/L4 specifications to be applied on the inner header */ IBV_FLOW_SPEC_ACTION_TAG = 0x1000, /* Action tagging matched packet */ IBV_FLOW_SPEC_ACTION_DROP = 0x1001, /* Action dropping matched packet */ diff --git a/libibverbs/verbs.h b/libibverbs/verbs.h index eb57824..d4d621f 100644 --- a/libibverbs/verbs.h +++ b/libibverbs/verbs.h @@ -1400,6 +1400,7 @@ enum ibv_flow_spec_type { IBV_FLOW_SPEC_TCP = 0x40, IBV_FLOW_SPEC_UDP = 0x41, IBV_FLOW_SPEC_VXLAN_TUNNEL = 0x50, + IBV_FLOW_SPEC_GRE = 0x51, IBV_FLOW_SPEC_INNER = 0x100, IBV_FLOW_SPEC_ACTION_TAG = 0x1000, IBV_FLOW_SPEC_ACTION_DROP = 0x1001, @@ -1491,6 +1492,28 @@ struct ibv_flow_spec_tcp_udp { struct ibv_flow_tcp_udp_filter mask; }; +struct ibv_flow_gre_filter { + /* c_ks_res0_ver field is bits 0-15 in offset 0 of a standard GRE header: + * bit 0 - checksum present bit. + * bit 1 - reserved. set to 0. + * bit 2 - key present bit. + * bit 3 - sequence number present bit. + * bits 4:12 - reserved. set to 0. + * bits 13:15 - GRE version. + */ + uint16_t c_ks_res0_ver; + uint16_t protocol; + uint32_t key; +}; + +struct ibv_flow_spec_gre { + enum ibv_flow_spec_type type; + uint16_t size; + struct ibv_flow_gre_filter val; + struct ibv_flow_gre_filter mask; +}; + + struct ibv_flow_tunnel_filter { uint32_t tunnel_id; }; @@ -1532,6 +1555,7 @@ struct ibv_flow_spec { struct ibv_flow_spec_ipv6 ipv6; struct ibv_flow_spec_esp esp; struct ibv_flow_spec_tunnel tunnel; + struct ibv_flow_spec_gre gre; struct ibv_flow_spec_action_tag flow_tag; struct ibv_flow_spec_action_drop drop; struct ibv_flow_spec_action_handle handle; -- 1.8.3.1 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html