Commit 4c2aae71 authored by Maor Gottlieb's avatar Maor Gottlieb Committed by Doug Ledford

IB/core: Add IPv6 support to flow steering

Add IPv6 flow specification support.
Signed-off-by: default avatarMaor Gottlieb <maorg@mellanox.com>
Signed-off-by: default avatarLeon Romanovsky <leon@kernel.org>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent 89ea94a7
...@@ -226,6 +226,7 @@ struct ib_uverbs_flow_spec { ...@@ -226,6 +226,7 @@ struct ib_uverbs_flow_spec {
struct ib_uverbs_flow_spec_eth eth; struct ib_uverbs_flow_spec_eth eth;
struct ib_uverbs_flow_spec_ipv4 ipv4; struct ib_uverbs_flow_spec_ipv4 ipv4;
struct ib_uverbs_flow_spec_tcp_udp tcp_udp; struct ib_uverbs_flow_spec_tcp_udp tcp_udp;
struct ib_uverbs_flow_spec_ipv6 ipv6;
}; };
}; };
......
...@@ -3105,6 +3105,15 @@ static int kern_spec_to_ib_spec(struct ib_uverbs_flow_spec *kern_spec, ...@@ -3105,6 +3105,15 @@ static int kern_spec_to_ib_spec(struct ib_uverbs_flow_spec *kern_spec,
memcpy(&ib_spec->ipv4.mask, &kern_spec->ipv4.mask, memcpy(&ib_spec->ipv4.mask, &kern_spec->ipv4.mask,
sizeof(struct ib_flow_ipv4_filter)); sizeof(struct ib_flow_ipv4_filter));
break; break;
case IB_FLOW_SPEC_IPV6:
ib_spec->ipv6.size = sizeof(struct ib_flow_spec_ipv6);
if (ib_spec->ipv6.size != kern_spec->ipv6.size)
return -EINVAL;
memcpy(&ib_spec->ipv6.val, &kern_spec->ipv6.val,
sizeof(struct ib_flow_ipv6_filter));
memcpy(&ib_spec->ipv6.mask, &kern_spec->ipv6.mask,
sizeof(struct ib_flow_ipv6_filter));
break;
case IB_FLOW_SPEC_TCP: case IB_FLOW_SPEC_TCP:
case IB_FLOW_SPEC_UDP: case IB_FLOW_SPEC_UDP:
ib_spec->tcp_udp.size = sizeof(struct ib_flow_spec_tcp_udp); ib_spec->tcp_udp.size = sizeof(struct ib_flow_spec_tcp_udp);
......
...@@ -1569,6 +1569,7 @@ enum ib_flow_spec_type { ...@@ -1569,6 +1569,7 @@ enum ib_flow_spec_type {
IB_FLOW_SPEC_IB = 0x22, IB_FLOW_SPEC_IB = 0x22,
/* L3 header*/ /* L3 header*/
IB_FLOW_SPEC_IPV4 = 0x30, IB_FLOW_SPEC_IPV4 = 0x30,
IB_FLOW_SPEC_IPV6 = 0x31,
/* L4 headers*/ /* L4 headers*/
IB_FLOW_SPEC_TCP = 0x40, IB_FLOW_SPEC_TCP = 0x40,
IB_FLOW_SPEC_UDP = 0x41 IB_FLOW_SPEC_UDP = 0x41
...@@ -1630,6 +1631,18 @@ struct ib_flow_spec_ipv4 { ...@@ -1630,6 +1631,18 @@ struct ib_flow_spec_ipv4 {
struct ib_flow_ipv4_filter mask; struct ib_flow_ipv4_filter mask;
}; };
struct ib_flow_ipv6_filter {
u8 src_ip[16];
u8 dst_ip[16];
};
struct ib_flow_spec_ipv6 {
enum ib_flow_spec_type type;
u16 size;
struct ib_flow_ipv6_filter val;
struct ib_flow_ipv6_filter mask;
};
struct ib_flow_tcp_udp_filter { struct ib_flow_tcp_udp_filter {
__be16 dst_port; __be16 dst_port;
__be16 src_port; __be16 src_port;
...@@ -1651,6 +1664,7 @@ union ib_flow_spec { ...@@ -1651,6 +1664,7 @@ union ib_flow_spec {
struct ib_flow_spec_ib ib; struct ib_flow_spec_ib ib;
struct ib_flow_spec_ipv4 ipv4; struct ib_flow_spec_ipv4 ipv4;
struct ib_flow_spec_tcp_udp tcp_udp; struct ib_flow_spec_tcp_udp tcp_udp;
struct ib_flow_spec_ipv6 ipv6;
}; };
struct ib_flow_attr { struct ib_flow_attr {
......
...@@ -867,6 +867,24 @@ struct ib_uverbs_flow_spec_tcp_udp { ...@@ -867,6 +867,24 @@ struct ib_uverbs_flow_spec_tcp_udp {
struct ib_uverbs_flow_tcp_udp_filter mask; struct ib_uverbs_flow_tcp_udp_filter mask;
}; };
struct ib_uverbs_flow_ipv6_filter {
__u8 src_ip[16];
__u8 dst_ip[16];
};
struct ib_uverbs_flow_spec_ipv6 {
union {
struct ib_uverbs_flow_spec_hdr hdr;
struct {
__u32 type;
__u16 size;
__u16 reserved;
};
};
struct ib_uverbs_flow_ipv6_filter val;
struct ib_uverbs_flow_ipv6_filter mask;
};
struct ib_uverbs_flow_attr { struct ib_uverbs_flow_attr {
__u32 type; __u32 type;
__u16 size; __u16 size;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment