1/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2#ifndef _UAPI_IPV6_H
3#define _UAPI_IPV6_H
4
5#include <linux/libc-compat.h>
6#include <linux/types.h>
7#include <linux/stddef.h>
8#include <linux/in6.h>
9#include <asm/byteorder.h>
10
11/* The latest drafts declared increase in minimal mtu up to 1280. */
12
13#define IPV6_MIN_MTU	1280
14
15/*
16 *	Advanced API
17 *	source interface/address selection, source routing, etc...
18 *	*under construction*
19 */
20
21#if __UAPI_DEF_IN6_PKTINFO
22struct in6_pktinfo {
23	struct in6_addr	ipi6_addr;
24	int		ipi6_ifindex;
25};
26#endif
27
28#if __UAPI_DEF_IP6_MTUINFO
29struct ip6_mtuinfo {
30	struct sockaddr_in6	ip6m_addr;
31	__u32			ip6m_mtu;
32};
33#endif
34
35struct in6_ifreq {
36	struct in6_addr	ifr6_addr;
37	__u32		ifr6_prefixlen;
38	int		ifr6_ifindex;
39};
40
41#define IPV6_SRCRT_STRICT	0x01	/* Deprecated; will be removed */
42#define IPV6_SRCRT_TYPE_0	0	/* Deprecated; will be removed */
43#define IPV6_SRCRT_TYPE_2	2	/* IPv6 type 2 Routing Header	*/
44#define IPV6_SRCRT_TYPE_3	3	/* RPL Segment Routing with IPv6 */
45#define IPV6_SRCRT_TYPE_4	4	/* Segment Routing with IPv6 */
46
47/*
48 *	routing header
49 */
50struct ipv6_rt_hdr {
51	__u8		nexthdr;
52	__u8		hdrlen;
53	__u8		type;
54	__u8		segments_left;
55
56	/*
57	 *	type specific data
58	 *	variable length field
59	 */
60};
61
62
63struct ipv6_opt_hdr {
64	__u8 		nexthdr;
65	__u8 		hdrlen;
66	/*
67	 * TLV encoded option data follows.
68	 */
69} __attribute__((packed));	/* required for some archs */
70
71#define ipv6_destopt_hdr ipv6_opt_hdr
72#define ipv6_hopopt_hdr  ipv6_opt_hdr
73
74/* Router Alert option values (RFC2711) */
75#define IPV6_OPT_ROUTERALERT_MLD	0x0000	/* MLD(RFC2710) */
76
77/*
78 *	routing header type 0 (used in cmsghdr struct)
79 */
80
81struct rt0_hdr {
82	struct ipv6_rt_hdr	rt_hdr;
83	__u32			reserved;
84	struct in6_addr		addr[];
85
86#define rt0_type		rt_hdr.type
87};
88
89/*
90 *	routing header type 2
91 */
92
93struct rt2_hdr {
94	struct ipv6_rt_hdr	rt_hdr;
95	__u32			reserved;
96	struct in6_addr		addr;
97
98#define rt2_type		rt_hdr.type
99};
100
101/*
102 *	home address option in destination options header
103 */
104
105struct ipv6_destopt_hao {
106	__u8			type;
107	__u8			length;
108	struct in6_addr		addr;
109} __attribute__((packed));
110
111/*
112 *	IPv6 fixed header
113 *
114 *	BEWARE, it is incorrect. The first 4 bits of flow_lbl
115 *	are glued to priority now, forming "class".
116 */
117
118struct ipv6hdr {
119#if defined(__LITTLE_ENDIAN_BITFIELD)
120	__u8			priority:4,
121				version:4;
122#elif defined(__BIG_ENDIAN_BITFIELD)
123	__u8			version:4,
124				priority:4;
125#else
126#error	"Please fix <asm/byteorder.h>"
127#endif
128	__u8			flow_lbl[3];
129
130	__be16			payload_len;
131	__u8			nexthdr;
132	__u8			hop_limit;
133
134	__struct_group(/* no tag */, addrs, /* no attrs */,
135		struct	in6_addr	saddr;
136		struct	in6_addr	daddr;
137	);
138};
139
140
141/* index values for the variables in ipv6_devconf */
142enum {
143	DEVCONF_FORWARDING = 0,
144	DEVCONF_HOPLIMIT,
145	DEVCONF_MTU6,
146	DEVCONF_ACCEPT_RA,
147	DEVCONF_ACCEPT_REDIRECTS,
148	DEVCONF_AUTOCONF,
149	DEVCONF_DAD_TRANSMITS,
150	DEVCONF_RTR_SOLICITS,
151	DEVCONF_RTR_SOLICIT_INTERVAL,
152	DEVCONF_RTR_SOLICIT_DELAY,
153	DEVCONF_USE_TEMPADDR,
154	DEVCONF_TEMP_VALID_LFT,
155	DEVCONF_TEMP_PREFERED_LFT,
156	DEVCONF_REGEN_MAX_RETRY,
157	DEVCONF_MAX_DESYNC_FACTOR,
158	DEVCONF_MAX_ADDRESSES,
159	DEVCONF_FORCE_MLD_VERSION,
160	DEVCONF_ACCEPT_RA_DEFRTR,
161	DEVCONF_ACCEPT_RA_PINFO,
162	DEVCONF_ACCEPT_RA_RTR_PREF,
163	DEVCONF_RTR_PROBE_INTERVAL,
164	DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN,
165	DEVCONF_PROXY_NDP,
166	DEVCONF_OPTIMISTIC_DAD,
167	DEVCONF_ACCEPT_SOURCE_ROUTE,
168	DEVCONF_MC_FORWARDING,
169	DEVCONF_DISABLE_IPV6,
170	DEVCONF_ACCEPT_DAD,
171	DEVCONF_FORCE_TLLAO,
172	DEVCONF_NDISC_NOTIFY,
173	DEVCONF_MLDV1_UNSOLICITED_REPORT_INTERVAL,
174	DEVCONF_MLDV2_UNSOLICITED_REPORT_INTERVAL,
175	DEVCONF_SUPPRESS_FRAG_NDISC,
176	DEVCONF_ACCEPT_RA_FROM_LOCAL,
177	DEVCONF_USE_OPTIMISTIC,
178	DEVCONF_ACCEPT_RA_MTU,
179	DEVCONF_STABLE_SECRET,
180	DEVCONF_USE_OIF_ADDRS_ONLY,
181	DEVCONF_ACCEPT_RA_MIN_HOP_LIMIT,
182	DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN,
183	DEVCONF_DROP_UNICAST_IN_L2_MULTICAST,
184	DEVCONF_DROP_UNSOLICITED_NA,
185	DEVCONF_KEEP_ADDR_ON_DOWN,
186	DEVCONF_RTR_SOLICIT_MAX_INTERVAL,
187	DEVCONF_SEG6_ENABLED,
188	DEVCONF_SEG6_REQUIRE_HMAC,
189	DEVCONF_ENHANCED_DAD,
190	DEVCONF_ADDR_GEN_MODE,
191	DEVCONF_DISABLE_POLICY,
192	DEVCONF_ACCEPT_RA_RT_INFO_MIN_PLEN,
193	DEVCONF_NDISC_TCLASS,
194	DEVCONF_RPL_SEG_ENABLED,
195	DEVCONF_RA_DEFRTR_METRIC,
196	DEVCONF_IOAM6_ENABLED,
197	DEVCONF_IOAM6_ID,
198	DEVCONF_IOAM6_ID_WIDE,
199	DEVCONF_NDISC_EVICT_NOCARRIER,
200	DEVCONF_ACCEPT_UNTRACKED_NA,
201	DEVCONF_ACCEPT_RA_MIN_LFT,
202	DEVCONF_MAX
203};
204
205
206#endif /* _UAPI_IPV6_H */
207