Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -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;
	};
	};
};
};


+9 −0
Original line number Original line Diff line number Diff line
@@ -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);
+14 −0
Original line number Original line Diff line number Diff line
@@ -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 {
	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 {
	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 {
+18 −0
Original line number Original line Diff line number Diff line
@@ -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;