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
22  struct in6_pktinfo {
23  	struct in6_addr	ipi6_addr;
24  	int		ipi6_ifindex;
25  };
26  #endif
27  
28  #if __UAPI_DEF_IP6_MTUINFO
29  struct ip6_mtuinfo {
30  	struct sockaddr_in6	ip6m_addr;
31  	__u32			ip6m_mtu;
32  };
33  #endif
34  
35  struct 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   */
50  struct 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  
63  struct 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  
81  struct 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  
93  struct 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  
105  struct 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  
118  struct 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 */
142  enum {
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