1ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#ifndef _IPV6_H
2ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define _IPV6_H
3ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
4ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#include <linux/types.h>
5ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#include <linux/in6.h>
6ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#include <asm/byteorder.h>
7ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
8ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson/* The latest drafts declared increase in minimal mtu up to 1280. */
9ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
10ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define IPV6_MIN_MTU	1280
11ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
12ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson/*
13ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson *	Advanced API
14ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson *	source interface/address selection, source routing, etc...
15ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson *	*under construction*
16ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson */
17ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
18ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
19ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct in6_pktinfo {
20ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct in6_addr	ipi6_addr;
21ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	int		ipi6_ifindex;
22ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson};
23ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
24ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct ip6_mtuinfo {
25ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct sockaddr_in6	ip6m_addr;
26ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u32			ip6m_mtu;
27ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson};
28ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
29ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct in6_ifreq {
30ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct in6_addr	ifr6_addr;
31ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u32		ifr6_prefixlen;
32ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	int		ifr6_ifindex;
33ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson};
34ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
35ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define IPV6_SRCRT_STRICT	0x01	/* Deprecated; will be removed */
36ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define IPV6_SRCRT_TYPE_0	0	/* Deprecated; will be removed */
37ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define IPV6_SRCRT_TYPE_2	2	/* IPv6 type 2 Routing Header	*/
38ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
39ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson/*
40ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson *	routing header
41ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson */
42ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct ipv6_rt_hdr {
43ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u8		nexthdr;
44ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u8		hdrlen;
45ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u8		type;
46ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u8		segments_left;
47ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
48ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	/*
49ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	 *	type specific data
50ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	 *	variable length field
51ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	 */
52ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson};
53ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
54ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
55ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct ipv6_opt_hdr {
56ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u8 		nexthdr;
57ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u8 		hdrlen;
58ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	/*
59ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	 * TLV encoded option data follows.
60ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	 */
61ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson} __attribute__((packed));	/* required for some archs */
62ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
63ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define ipv6_destopt_hdr ipv6_opt_hdr
64ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define ipv6_hopopt_hdr  ipv6_opt_hdr
65ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
66ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#ifdef __KERNEL__
67ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define ipv6_optlen(p)  (((p)->hdrlen+1) << 3)
68ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#endif
69ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
70ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson/*
71ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson *	routing header type 0 (used in cmsghdr struct)
72ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson */
73ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
74ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct rt0_hdr {
75ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct ipv6_rt_hdr	rt_hdr;
76ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u32			reserved;
77ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct in6_addr		addr[0];
78ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
79ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define rt0_type		rt_hdr.type
80ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson};
81ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
82ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson/*
83ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson *	routing header type 2
84ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson */
85ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
86ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct rt2_hdr {
87ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct ipv6_rt_hdr	rt_hdr;
88ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u32			reserved;
89ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct in6_addr		addr;
90ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
91ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define rt2_type		rt_hdr.type
92ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson};
93ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
94ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson/*
95ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson *	home address option in destination options header
96ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson */
97ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
98ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct ipv6_destopt_hao {
99ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u8			type;
100ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u8			length;
101ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct in6_addr		addr;
102ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson} __attribute__((packed));
103ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
104ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson/*
105ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson *	IPv6 fixed header
106ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson *
107ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson *	BEWARE, it is incorrect. The first 4 bits of flow_lbl
108ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson *	are glued to priority now, forming "class".
109ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson */
110ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
111ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct ipv6hdr {
112ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#if defined(__LITTLE_ENDIAN_BITFIELD)
113ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u8			priority:4,
114ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson				version:4;
115ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#elif defined(__BIG_ENDIAN_BITFIELD)
116ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u8			version:4,
117ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson				priority:4;
118ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#else
119ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#error	"Please fix <asm/byteorder.h>"
120ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#endif
121ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u8			flow_lbl[3];
122ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
123ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__be16			payload_len;
124ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u8			nexthdr;
125ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u8			hop_limit;
126ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
127ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct	in6_addr	saddr;
128ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct	in6_addr	daddr;
129ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson};
130ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
131ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#ifdef __KERNEL__
132ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson/*
133ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson * This structure contains configuration options per IPv6 link.
134ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson */
135ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct ipv6_devconf {
136ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s32		forwarding;
137ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s32		hop_limit;
138ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s32		mtu6;
139ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s32		accept_ra;
140ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s32		accept_redirects;
141ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s32		autoconf;
142ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s32		dad_transmits;
143ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s32		rtr_solicits;
144ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s32		rtr_solicit_interval;
145ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s32		rtr_solicit_delay;
146ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s32		force_mld_version;
147ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#ifdef CONFIG_IPV6_PRIVACY
148ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s32		use_tempaddr;
149ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s32		temp_valid_lft;
150ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s32		temp_prefered_lft;
151ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s32		regen_max_retry;
152ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s32		max_desync_factor;
153ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#endif
154ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s32		max_addresses;
155ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s32		accept_ra_defrtr;
156ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s32		accept_ra_pinfo;
157ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#ifdef CONFIG_IPV6_ROUTER_PREF
158ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s32		accept_ra_rtr_pref;
159ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s32		rtr_probe_interval;
160ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#ifdef CONFIG_IPV6_ROUTE_INFO
161ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s32		accept_ra_rt_info_max_plen;
162ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#endif
163ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#endif
164ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s32		proxy_ndp;
165ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s32		accept_source_route;
166ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#ifdef CONFIG_IPV6_OPTIMISTIC_DAD
167ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s32		optimistic_dad;
168ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#endif
169ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#ifdef CONFIG_IPV6_MROUTE
170ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s32		mc_forwarding;
171ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#endif
172ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s32		disable_ipv6;
173ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s32		accept_dad;
174ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s32		force_tllao;
175ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	void		*sysctl;
176ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson};
177ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
178ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct ipv6_params {
179ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s32 disable_ipv6;
180ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s32 autoconf;
181ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson};
182ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonextern struct ipv6_params ipv6_defaults;
183ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#endif
184ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
185ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson/* index values for the variables in ipv6_devconf */
186ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonenum {
187ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	DEVCONF_FORWARDING = 0,
188ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	DEVCONF_HOPLIMIT,
189ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	DEVCONF_MTU6,
190ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	DEVCONF_ACCEPT_RA,
191ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	DEVCONF_ACCEPT_REDIRECTS,
192ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	DEVCONF_AUTOCONF,
193ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	DEVCONF_DAD_TRANSMITS,
194ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	DEVCONF_RTR_SOLICITS,
195ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	DEVCONF_RTR_SOLICIT_INTERVAL,
196ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	DEVCONF_RTR_SOLICIT_DELAY,
197ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	DEVCONF_USE_TEMPADDR,
198ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	DEVCONF_TEMP_VALID_LFT,
199ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	DEVCONF_TEMP_PREFERED_LFT,
200ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	DEVCONF_REGEN_MAX_RETRY,
201ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	DEVCONF_MAX_DESYNC_FACTOR,
202ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	DEVCONF_MAX_ADDRESSES,
203ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	DEVCONF_FORCE_MLD_VERSION,
204ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	DEVCONF_ACCEPT_RA_DEFRTR,
205ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	DEVCONF_ACCEPT_RA_PINFO,
206ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	DEVCONF_ACCEPT_RA_RTR_PREF,
207ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	DEVCONF_RTR_PROBE_INTERVAL,
208ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN,
209ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	DEVCONF_PROXY_NDP,
210ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	DEVCONF_OPTIMISTIC_DAD,
211ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	DEVCONF_ACCEPT_SOURCE_ROUTE,
212ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	DEVCONF_MC_FORWARDING,
213ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	DEVCONF_DISABLE_IPV6,
214ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	DEVCONF_ACCEPT_DAD,
215ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	DEVCONF_FORCE_TLLAO,
216ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	DEVCONF_MAX
217ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson};
218ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
219ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#ifdef __KERNEL__
220ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#include <linux/icmpv6.h>
221ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#include <linux/tcp.h>
222ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#include <linux/udp.h>
223ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
224ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#include <net/inet_sock.h>
225ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
226ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline struct ipv6hdr *ipv6_hdr(const struct sk_buff *skb)
227ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{
228ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	return (struct ipv6hdr *)skb_network_header(skb);
229ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}
230ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
231ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline struct ipv6hdr *ipipv6_hdr(const struct sk_buff *skb)
232ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{
233ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	return (struct ipv6hdr *)skb_transport_header(skb);
234ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}
235ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
236ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson/*
237ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson   This structure contains results of exthdrs parsing
238ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson   as offsets from skb->nh.
239ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson */
240ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
241ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct inet6_skb_parm {
242ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	int			iif;
243ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u16			ra;
244ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u16			hop;
245ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u16			dst0;
246ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u16			srcrt;
247ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u16			dst1;
248ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u16			lastopt;
249ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u16			nhoff;
250ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u16			flags;
251ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE)
252ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u16			dsthao;
253ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#endif
254ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
255ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define IP6SKB_XFRM_TRANSFORMED	1
256ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define IP6SKB_FORWARDED	2
257ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define IP6SKB_REROUTED		4
258ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson};
259ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
260ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define IP6CB(skb)	((struct inet6_skb_parm*)((skb)->cb))
261ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define IP6CBMTU(skb)	((struct ip6_mtuinfo *)((skb)->cb))
262ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
263ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline int inet6_iif(const struct sk_buff *skb)
264ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{
265ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	return IP6CB(skb)->iif;
266ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}
267ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
268ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct inet6_request_sock {
269ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct in6_addr		loc_addr;
270ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct in6_addr		rmt_addr;
271ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct sk_buff		*pktopts;
272ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	int			iif;
273ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson};
274ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
275ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct tcp6_request_sock {
276ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct tcp_request_sock	  tcp6rsk_tcp;
277ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct inet6_request_sock tcp6rsk_inet6;
278ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson};
279ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
280ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct ipv6_mc_socklist;
281ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct ipv6_ac_socklist;
282ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct ipv6_fl_socklist;
283ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
284ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson/**
285ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson * struct ipv6_pinfo - ipv6 private area
286ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson *
287ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson * In the struct sock hierarchy (tcp6_sock, upd6_sock, etc)
288ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson * this _must_ be the last member, so that inet6_sk_generic
289ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson * is able to calculate its offset from the base struct sock
290ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson * by using the struct proto->slab_obj_size member. -acme
291ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson */
292ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct ipv6_pinfo {
293ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct in6_addr 	saddr;
294ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct in6_addr 	rcv_saddr;
295ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct in6_addr		daddr;
296ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct in6_pktinfo	sticky_pktinfo;
297ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct in6_addr		*daddr_cache;
298ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#ifdef CONFIG_IPV6_SUBTREES
299ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct in6_addr		*saddr_cache;
300ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#endif
301ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
302ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__be32			flow_label;
303ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u32			frag_size;
304ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
305ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	/*
306ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	 * Packed in 16bits.
307ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	 * Omit one shift by by putting the signed field at MSB.
308ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	 */
309ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#if defined(__BIG_ENDIAN_BITFIELD)
310ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s16			hop_limit:9;
311ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u16			__unused_1:7;
312ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#else
313ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u16			__unused_1:7;
314ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s16			hop_limit:9;
315ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#endif
316ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
317ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#if defined(__BIG_ENDIAN_BITFIELD)
318ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	/* Packed in 16bits. */
319ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s16			mcast_hops:9;
320ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u16			__unused_2:6,
321ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson				mc_loop:1;
322ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#else
323ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u16			mc_loop:1,
324ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson				__unused_2:6;
325ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__s16			mcast_hops:9;
326ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#endif
327ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	int			mcast_oif;
328ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
329ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	/* pktoption flags */
330ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	union {
331ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson		struct {
332ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson			__u16	srcrt:1,
333ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson				osrcrt:1,
334ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson			        rxinfo:1,
335ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson			        rxoinfo:1,
336ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson				rxhlim:1,
337ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson				rxohlim:1,
338ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson				hopopts:1,
339ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson				ohopopts:1,
340ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson				dstopts:1,
341ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson				odstopts:1,
342ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson                                rxflow:1,
343ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson				rxtclass:1,
344ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson				rxpmtu:1,
345ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson				rxorigdstaddr:1;
346ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson				/* 2 bits hole */
347ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson		} bits;
348ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson		__u16		all;
349ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	} rxopt;
350ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
351ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	/* sockopt flags */
352ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u16			recverr:1,
353ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	                        sndflow:1,
354ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson				pmtudisc:2,
355ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson				ipv6only:1,
356ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson				srcprefs:3,	/* 001: prefer temporary address
357ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson						 * 010: prefer public address
358ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson						 * 100: prefer care-of address
359ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson						 */
360ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson				dontfrag:1;
361ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u8			min_hopcount;
362ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u8			tclass;
363ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u8			padding;
364ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
365ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u32			dst_cookie;
366ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
367ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct ipv6_mc_socklist	*ipv6_mc_list;
368ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct ipv6_ac_socklist	*ipv6_ac_list;
369ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct ipv6_fl_socklist *ipv6_fl_list;
370ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
371ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct ipv6_txoptions	*opt;
372ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct sk_buff		*pktoptions;
373ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct sk_buff		*rxpmtu;
374ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct {
375ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson		struct ipv6_txoptions *opt;
376ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson		u8 hop_limit;
377ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson		u8 tclass;
378ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	} cork;
379ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson};
380ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
381ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson/* WARNING: don't change the layout of the members in {raw,udp,tcp}6_sock! */
382ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct raw6_sock {
383ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	/* inet_sock has to be the first member of raw6_sock */
384ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct inet_sock	inet;
385ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u32			checksum;	/* perform checksum */
386ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u32			offset;		/* checksum offset  */
387ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct icmp6_filter	filter;
388ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__u32			ip6mr_table;
389ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	/* ipv6_pinfo has to be the last member of raw6_sock, see inet6_sk_generic */
390ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct ipv6_pinfo	inet6;
391ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson};
392ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
393ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct udp6_sock {
394ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct udp_sock	  udp;
395ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	/* ipv6_pinfo has to be the last member of udp6_sock, see inet6_sk_generic */
396ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct ipv6_pinfo inet6;
397ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson};
398ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
399ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct tcp6_sock {
400ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct tcp_sock	  tcp;
401ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	/* ipv6_pinfo has to be the last member of tcp6_sock, see inet6_sk_generic */
402ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct ipv6_pinfo inet6;
403ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson};
404ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
405ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonextern int inet6_sk_rebuild_header(struct sock *sk);
406ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
407ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
408ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk)
409ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{
410ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	return inet_sk(__sk)->pinet6;
411ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}
412ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
413ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline struct inet6_request_sock *
414ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson			inet6_rsk(const struct request_sock *rsk)
415ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{
416ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	return (struct inet6_request_sock *)(((u8 *)rsk) +
417ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson					     inet_rsk(rsk)->inet6_rsk_offset);
418ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}
419ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
420ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline u32 inet6_rsk_offset(struct request_sock *rsk)
421ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{
422ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	return rsk->rsk_ops->obj_size - sizeof(struct inet6_request_sock);
423ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}
424ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
425ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline struct request_sock *inet6_reqsk_alloc(struct request_sock_ops *ops)
426ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{
427ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct request_sock *req = reqsk_alloc(ops);
428ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
429ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	if (req != NULL) {
430ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson		inet_rsk(req)->inet6_rsk_offset = inet6_rsk_offset(req);
431ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson		inet6_rsk(req)->pktopts = NULL;
432ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	}
433ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
434ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	return req;
435ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}
436ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
437ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline struct raw6_sock *raw6_sk(const struct sock *sk)
438ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{
439ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	return (struct raw6_sock *)sk;
440ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}
441ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
442ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline void inet_sk_copy_descendant(struct sock *sk_to,
443ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson					   const struct sock *sk_from)
444ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{
445ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	int ancestor_size = sizeof(struct inet_sock);
446ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
447ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	if (sk_from->sk_family == PF_INET6)
448ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson		ancestor_size += sizeof(struct ipv6_pinfo);
449ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
450ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	__inet_sk_copy_descendant(sk_to, sk_from, ancestor_size);
451ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}
452ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
453ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define __ipv6_only_sock(sk)	(inet6_sk(sk)->ipv6only)
454ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define ipv6_only_sock(sk)	((sk)->sk_family == PF_INET6 && __ipv6_only_sock(sk))
455ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
456ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct inet6_timewait_sock {
457ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct in6_addr tw_v6_daddr;
458ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct in6_addr	tw_v6_rcv_saddr;
459ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson};
460ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
461ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct tcp6_timewait_sock {
462ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct tcp_timewait_sock   tcp6tw_tcp;
463ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	struct inet6_timewait_sock tcp6tw_inet6;
464ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson};
465ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
466ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline u16 inet6_tw_offset(const struct proto *prot)
467ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{
468ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	return prot->twsk_prot->twsk_obj_size -
469ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson			sizeof(struct inet6_timewait_sock);
470ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}
471ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
472ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline struct inet6_timewait_sock *inet6_twsk(const struct sock *sk)
473ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{
474ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	return (struct inet6_timewait_sock *)(((u8 *)sk) +
475ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson					      inet_twsk(sk)->tw_ipv6_offset);
476ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}
477ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
478ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline struct in6_addr *__inet6_rcv_saddr(const struct sock *sk)
479ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{
480ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	return likely(sk->sk_state != TCP_TIME_WAIT) ?
481ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson		&inet6_sk(sk)->rcv_saddr : &inet6_twsk(sk)->tw_v6_rcv_saddr;
482ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}
483ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
484ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline struct in6_addr *inet6_rcv_saddr(const struct sock *sk)
485ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{
486ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	return sk->sk_family == AF_INET6 ? __inet6_rcv_saddr(sk) : NULL;
487ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}
488ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
489ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline int inet_v6_ipv6only(const struct sock *sk)
490ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{
491ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	return likely(sk->sk_state != TCP_TIME_WAIT) ?
492ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson		ipv6_only_sock(sk) : inet_twsk(sk)->tw_ipv6only;
493ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}
494ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#else
495ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define __ipv6_only_sock(sk)	0
496ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define ipv6_only_sock(sk)	0
497ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
498ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk)
499ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{
500ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	return NULL;
501ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}
502ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
503ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline struct inet6_request_sock *
504ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson			inet6_rsk(const struct request_sock *rsk)
505ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{
506ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	return NULL;
507ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}
508ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
509ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline struct raw6_sock *raw6_sk(const struct sock *sk)
510ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{
511ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	return NULL;
512ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}
513ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
514ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define __inet6_rcv_saddr(__sk)	NULL
515ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define inet6_rcv_saddr(__sk)	NULL
516ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define tcp_twsk_ipv6only(__sk)		0
517ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define inet_v6_ipv6only(__sk)		0
518ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#endif /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */
519ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
520ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define INET6_MATCH(__sk, __net, __hash, __saddr, __daddr, __ports, __dif)\
521ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	(((__sk)->sk_hash == (__hash)) && sock_net((__sk)) == (__net)	&& \
522ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	 ((*((__portpair *)&(inet_sk(__sk)->inet_dport))) == (__ports)) && \
523ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	 ((__sk)->sk_family		== AF_INET6)		&& \
524ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	 ipv6_addr_equal(&inet6_sk(__sk)->daddr, (__saddr))	&& \
525ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	 ipv6_addr_equal(&inet6_sk(__sk)->rcv_saddr, (__daddr))	&& \
526ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	 (!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif))))
527ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
528ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define INET6_TW_MATCH(__sk, __net, __hash, __saddr, __daddr, __ports, __dif) \
529ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	(((__sk)->sk_hash == (__hash)) && sock_net((__sk)) == (__net)	&& \
530ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	 (*((__portpair *)&(inet_twsk(__sk)->tw_dport)) == (__ports))	&& \
531ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	 ((__sk)->sk_family	       == PF_INET6)			&& \
532ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	 (ipv6_addr_equal(&inet6_twsk(__sk)->tw_v6_daddr, (__saddr)))	&& \
533ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	 (ipv6_addr_equal(&inet6_twsk(__sk)->tw_v6_rcv_saddr, (__daddr))) && \
534ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson	 (!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif))))
535ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
536ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#endif /* __KERNEL__ */
537ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson
538ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#endif /* _IPV6_H */
539