diff options
| author | Hiroki Shirokura <slank.dev@gmail.com> | 2020-01-06 09:52:39 +0900 | 
|---|---|---|
| committer | Hiroki Shirokura <slank.dev@gmail.com> | 2020-01-09 09:53:04 +0900 | 
| commit | 63d02478b557011b8606668f1e3c2edbf263794d (patch) | |
| tree | 7be95b681b689acde139aa6720cca171dfc42fce /include | |
| parent | 94d7dc50f3d4bd15393b7a1d7c42e76862d04193 (diff) | |
include: add kernel header for seg6/seg6local
The linux kernel is adding support for seg6/seg6local
lwtunnel type to support SRv6 feature.
This commit update our includes to reflect new types
and structs we should be listening for from the kernel
Signed-off-by: Hiroki Shirokura <slank.dev@gmail.com>
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/seg6.h | 55 | ||||
| -rw-r--r-- | include/linux/seg6_genl.h | 33 | ||||
| -rw-r--r-- | include/linux/seg6_hmac.h | 23 | ||||
| -rw-r--r-- | include/linux/seg6_iptunnel.h | 41 | ||||
| -rw-r--r-- | include/linux/seg6_local.h | 80 | ||||
| -rw-r--r-- | include/subdir.am | 5 | 
6 files changed, 237 insertions, 0 deletions
diff --git a/include/linux/seg6.h b/include/linux/seg6.h new file mode 100644 index 0000000000..329163e4a0 --- /dev/null +++ b/include/linux/seg6.h @@ -0,0 +1,55 @@ +/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ +/* + *  SR-IPv6 implementation + * + *  Author: + *  David Lebrun <david.lebrun@uclouvain.be> + * + * + *  This program is free software; you can redistribute it and/or + *      modify it under the terms of the GNU General Public License + *      as published by the Free Software Foundation; either version + *      2 of the License, or (at your option) any later version. + */ + +#ifndef _LINUX_SEG6_H +#define _LINUX_SEG6_H + +#include <linux/types.h> +#include <linux/in6.h>		/* For struct in6_addr. */ + +/* + * SRH + */ +struct ipv6_sr_hdr { +	__u8	nexthdr; +	__u8	hdrlen; +	__u8	type; +	__u8	segments_left; +	__u8	first_segment; /* Represents the last_entry field of SRH */ +	__u8	flags; +	__u16	tag; + +	struct in6_addr segments[0]; +}; + +#define SR6_FLAG1_PROTECTED	(1 << 6) +#define SR6_FLAG1_OAM		(1 << 5) +#define SR6_FLAG1_ALERT		(1 << 4) +#define SR6_FLAG1_HMAC		(1 << 3) + +#define SR6_TLV_INGRESS		1 +#define SR6_TLV_EGRESS		2 +#define SR6_TLV_OPAQUE		3 +#define SR6_TLV_PADDING		4 +#define SR6_TLV_HMAC		5 + +#define sr_has_hmac(srh) ((srh)->flags & SR6_FLAG1_HMAC) + +struct sr6_tlv { +	__u8 type; +	__u8 len; +	__u8 data[0]; +}; + +#endif diff --git a/include/linux/seg6_genl.h b/include/linux/seg6_genl.h new file mode 100644 index 0000000000..0c230524e0 --- /dev/null +++ b/include/linux/seg6_genl.h @@ -0,0 +1,33 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _LINUX_SEG6_GENL_H +#define _LINUX_SEG6_GENL_H + +#define SEG6_GENL_NAME		"SEG6" +#define SEG6_GENL_VERSION	0x1 + +enum { +	SEG6_ATTR_UNSPEC, +	SEG6_ATTR_DST, +	SEG6_ATTR_DSTLEN, +	SEG6_ATTR_HMACKEYID, +	SEG6_ATTR_SECRET, +	SEG6_ATTR_SECRETLEN, +	SEG6_ATTR_ALGID, +	SEG6_ATTR_HMACINFO, +	__SEG6_ATTR_MAX, +}; + +#define SEG6_ATTR_MAX (__SEG6_ATTR_MAX - 1) + +enum { +	SEG6_CMD_UNSPEC, +	SEG6_CMD_SETHMAC, +	SEG6_CMD_DUMPHMAC, +	SEG6_CMD_SET_TUNSRC, +	SEG6_CMD_GET_TUNSRC, +	__SEG6_CMD_MAX, +}; + +#define SEG6_CMD_MAX (__SEG6_CMD_MAX - 1) + +#endif diff --git a/include/linux/seg6_hmac.h b/include/linux/seg6_hmac.h new file mode 100644 index 0000000000..3fb3412e1e --- /dev/null +++ b/include/linux/seg6_hmac.h @@ -0,0 +1,23 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _LINUX_SEG6_HMAC_H +#define _LINUX_SEG6_HMAC_H + +#include <linux/types.h> +#include <linux/seg6.h> + +#define SEG6_HMAC_SECRET_LEN	64 +#define SEG6_HMAC_FIELD_LEN	32 + +struct sr6_tlv_hmac { +	struct sr6_tlv tlvhdr; +	__u16 reserved; +	__be32 hmackeyid; +	__u8 hmac[SEG6_HMAC_FIELD_LEN]; +}; + +enum { +	SEG6_HMAC_ALGO_SHA1 = 1, +	SEG6_HMAC_ALGO_SHA256 = 2, +}; + +#endif diff --git a/include/linux/seg6_iptunnel.h b/include/linux/seg6_iptunnel.h new file mode 100644 index 0000000000..3004e982c2 --- /dev/null +++ b/include/linux/seg6_iptunnel.h @@ -0,0 +1,41 @@ +/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ +/* + *  SR-IPv6 implementation + * + *  Author: + *  David Lebrun <david.lebrun@uclouvain.be> + * + * + *  This program is free software; you can redistribute it and/or + *      modify it under the terms of the GNU General Public License + *      as published by the Free Software Foundation; either version + *      2 of the License, or (at your option) any later version. + */ + +#ifndef _LINUX_SEG6_IPTUNNEL_H +#define _LINUX_SEG6_IPTUNNEL_H + +#include <linux/seg6.h>		/* For struct ipv6_sr_hdr. */ + +enum { +	SEG6_IPTUNNEL_UNSPEC, +	SEG6_IPTUNNEL_SRH, +	__SEG6_IPTUNNEL_MAX, +}; +#define SEG6_IPTUNNEL_MAX (__SEG6_IPTUNNEL_MAX - 1) + +struct seg6_iptunnel_encap { +	int mode; +	struct ipv6_sr_hdr srh[0]; +}; + +#define SEG6_IPTUN_ENCAP_SIZE(x) ((sizeof(*x)) + (((x)->srh->hdrlen + 1) << 3)) + +enum { +	SEG6_IPTUN_MODE_INLINE, +	SEG6_IPTUN_MODE_ENCAP, +	SEG6_IPTUN_MODE_L2ENCAP, +}; + + +#endif diff --git a/include/linux/seg6_local.h b/include/linux/seg6_local.h new file mode 100644 index 0000000000..5312de80bc --- /dev/null +++ b/include/linux/seg6_local.h @@ -0,0 +1,80 @@ +/* + *  SR-IPv6 implementation + * + *  Author: + *  David Lebrun <david.lebrun@uclouvain.be> + * + * + *  This program is free software; you can redistribute it and/or + *      modify it under the terms of the GNU General Public License + *      as published by the Free Software Foundation; either version + *      2 of the License, or (at your option) any later version. + */ + +#ifndef _LINUX_SEG6_LOCAL_H +#define _LINUX_SEG6_LOCAL_H + +#include <linux/seg6.h> + +enum { +	SEG6_LOCAL_UNSPEC, +	SEG6_LOCAL_ACTION, +	SEG6_LOCAL_SRH, +	SEG6_LOCAL_TABLE, +	SEG6_LOCAL_NH4, +	SEG6_LOCAL_NH6, +	SEG6_LOCAL_IIF, +	SEG6_LOCAL_OIF, +	SEG6_LOCAL_BPF, +	__SEG6_LOCAL_MAX, +}; +#define SEG6_LOCAL_MAX (__SEG6_LOCAL_MAX - 1) + +enum { +	SEG6_LOCAL_ACTION_UNSPEC	= 0, +	/* node segment */ +	SEG6_LOCAL_ACTION_END		= 1, +	/* adjacency segment (IPv6 cross-connect) */ +	SEG6_LOCAL_ACTION_END_X		= 2, +	/* lookup of next seg NH in table */ +	SEG6_LOCAL_ACTION_END_T		= 3, +	/* decap and L2 cross-connect */ +	SEG6_LOCAL_ACTION_END_DX2	= 4, +	/* decap and IPv6 cross-connect */ +	SEG6_LOCAL_ACTION_END_DX6	= 5, +	/* decap and IPv4 cross-connect */ +	SEG6_LOCAL_ACTION_END_DX4	= 6, +	/* decap and lookup of DA in v6 table */ +	SEG6_LOCAL_ACTION_END_DT6	= 7, +	/* decap and lookup of DA in v4 table */ +	SEG6_LOCAL_ACTION_END_DT4	= 8, +	/* binding segment with insertion */ +	SEG6_LOCAL_ACTION_END_B6	= 9, +	/* binding segment with encapsulation */ +	SEG6_LOCAL_ACTION_END_B6_ENCAP	= 10, +	/* binding segment with MPLS encap */ +	SEG6_LOCAL_ACTION_END_BM	= 11, +	/* lookup last seg in table */ +	SEG6_LOCAL_ACTION_END_S		= 12, +	/* forward to SR-unaware VNF with static proxy */ +	SEG6_LOCAL_ACTION_END_AS	= 13, +	/* forward to SR-unaware VNF with masquerading */ +	SEG6_LOCAL_ACTION_END_AM	= 14, +	/* custom BPF action */ +	SEG6_LOCAL_ACTION_END_BPF	= 15, + +	__SEG6_LOCAL_ACTION_MAX, +}; + +#define SEG6_LOCAL_ACTION_MAX (__SEG6_LOCAL_ACTION_MAX - 1) + +enum { +	SEG6_LOCAL_BPF_PROG_UNSPEC, +	SEG6_LOCAL_BPF_PROG, +	SEG6_LOCAL_BPF_PROG_NAME, +	__SEG6_LOCAL_BPF_PROG_MAX, +}; + +#define SEG6_LOCAL_BPF_PROG_MAX (__SEG6_LOCAL_BPF_PROG_MAX - 1) + +#endif diff --git a/include/subdir.am b/include/subdir.am index b1ca1be54f..86129c4d68 100644 --- a/include/subdir.am +++ b/include/subdir.am @@ -11,4 +11,9 @@ noinst_HEADERS += \  	include/linux/socket.h \  	include/linux/net_namespace.h \  	include/linux/fib_rules.h \ +	include/linux/seg6.h \ +	include/linux/seg6_genl.h \ +	include/linux/seg6_hmac.h \ +	include/linux/seg6_iptunnel.h \ +	include/linux/seg6_local.h \  	# end  | 
