1#ifndef _IPV6_H
2#define _IPV6_H
3
4#include <linux/config.h>
5#include <linux/in6.h>
6#include <asm/byteorder.h>
7
8
9
10#define IPV6_MIN_MTU 1280
11
12
13
14
15
16
17
18
19struct in6_pktinfo {
20 struct in6_addr ipi6_addr;
21 int ipi6_ifindex;
22};
23
24
25struct in6_ifreq {
26 struct in6_addr ifr6_addr;
27 __u32 ifr6_prefixlen;
28 int ifr6_ifindex;
29};
30
31#define IPV6_SRCRT_STRICT 0x01
32#define IPV6_SRCRT_TYPE_0 0
33
34
35
36
37struct ipv6_rt_hdr {
38 __u8 nexthdr;
39 __u8 hdrlen;
40 __u8 type;
41 __u8 segments_left;
42
43
44
45
46
47};
48
49
50struct ipv6_opt_hdr {
51 __u8 nexthdr;
52 __u8 hdrlen;
53
54
55
56};
57
58#define ipv6_destopt_hdr ipv6_opt_hdr
59#define ipv6_hopopt_hdr ipv6_opt_hdr
60
61#ifdef __KERNEL__
62#define ipv6_optlen(p) (((p)->hdrlen+1) << 3)
63#endif
64
65
66
67
68
69struct rt0_hdr {
70 struct ipv6_rt_hdr rt_hdr;
71 __u32 bitmap;
72 struct in6_addr addr[0];
73
74#define rt0_type rt_hdr.type
75};
76
77struct ipv6_auth_hdr {
78 __u8 nexthdr;
79 __u8 hdrlen;
80 __u16 reserved;
81 __u32 spi;
82 __u32 seq_no;
83 __u8 auth_data[0];
84};
85
86struct ipv6_esp_hdr {
87 __u32 spi;
88 __u32 seq_no;
89 __u8 enc_data[0];
90};
91
92struct ipv6_comp_hdr {
93 __u8 nexthdr;
94 __u8 flags;
95 __u16 cpi;
96};
97
98
99
100
101
102
103
104
105struct ipv6hdr {
106#if defined(__LITTLE_ENDIAN_BITFIELD)
107 __u8 priority:4,
108 version:4;
109#elif defined(__BIG_ENDIAN_BITFIELD)
110 __u8 version:4,
111 priority:4;
112#else
113#error "Please fix <asm/byteorder.h>"
114#endif
115 __u8 flow_lbl[3];
116
117 __u16 payload_len;
118 __u8 nexthdr;
119 __u8 hop_limit;
120
121 struct in6_addr saddr;
122 struct in6_addr daddr;
123};
124
125
126
127
128struct ipv6_devconf {
129 __s32 forwarding;
130 __s32 hop_limit;
131 __s32 mtu6;
132 __s32 accept_ra;
133 __s32 accept_redirects;
134 __s32 autoconf;
135 __s32 dad_transmits;
136 __s32 rtr_solicits;
137 __s32 rtr_solicit_interval;
138 __s32 rtr_solicit_delay;
139 __s32 force_mld_version;
140#ifdef CONFIG_IPV6_PRIVACY
141 __s32 use_tempaddr;
142 __s32 temp_valid_lft;
143 __s32 temp_prefered_lft;
144 __s32 regen_max_retry;
145 __s32 max_desync_factor;
146#endif
147 __s32 max_addresses;
148 void *sysctl;
149};
150
151
152enum {
153 DEVCONF_FORWARDING = 0,
154 DEVCONF_HOPLIMIT,
155 DEVCONF_MTU6,
156 DEVCONF_ACCEPT_RA,
157 DEVCONF_ACCEPT_REDIRECTS,
158 DEVCONF_AUTOCONF,
159 DEVCONF_DAD_TRANSMITS,
160 DEVCONF_RTR_SOLICITS,
161 DEVCONF_RTR_SOLICIT_INTERVAL,
162 DEVCONF_RTR_SOLICIT_DELAY,
163 DEVCONF_USE_TEMPADDR,
164 DEVCONF_TEMP_VALID_LFT,
165 DEVCONF_TEMP_PREFERED_LFT,
166 DEVCONF_REGEN_MAX_RETRY,
167 DEVCONF_MAX_DESYNC_FACTOR,
168 DEVCONF_MAX_ADDRESSES,
169 DEVCONF_FORCE_MLD_VERSION,
170 DEVCONF_MAX
171};
172
173#ifdef __KERNEL__
174#include <linux/in6.h>
175#include <linux/icmpv6.h>
176#include <net/if_inet6.h>
177#include <linux/tcp.h>
178#include <linux/udp.h>
179
180
181
182
183
184
185struct inet6_skb_parm
186{
187 int iif;
188 __u16 ra;
189 __u16 hop;
190 __u16 dst0;
191 __u16 srcrt;
192 __u16 dst1;
193};
194
195#define IP6CB(skb) ((struct inet6_skb_parm*)((skb)->cb))
196
197struct ipv6_pinfo {
198 struct in6_addr saddr;
199 struct in6_addr rcv_saddr;
200 struct in6_addr daddr;
201 struct in6_addr *daddr_cache;
202
203 __u32 flow_label;
204 __u32 frag_size;
205 int hop_limit;
206 int mcast_hops;
207 int mcast_oif;
208
209
210 union {
211 struct {
212 __u8 srcrt:2,
213 rxinfo:1,
214 rxhlim:1,
215 hopopts:1,
216 dstopts:1,
217 rxflow:1;
218 } bits;
219 __u8 all;
220 } rxopt;
221
222
223 __u8 mc_loop:1,
224 recverr:1,
225 sndflow:1,
226 pmtudisc:2,
227 ipv6only:1;
228
229 struct ipv6_mc_socklist *ipv6_mc_list;
230 struct ipv6_ac_socklist *ipv6_ac_list;
231 struct ipv6_fl_socklist *ipv6_fl_list;
232 __u32 dst_cookie;
233
234 struct ipv6_txoptions *opt;
235 struct sk_buff *pktoptions;
236 struct {
237 struct ipv6_txoptions *opt;
238 struct rt6_info *rt;
239 int hop_limit;
240 } cork;
241};
242
243struct raw6_opt {
244 __u32 checksum;
245 __u32 offset;
246
247 struct icmp6_filter filter;
248};
249
250
251struct raw6_sock {
252 struct sock sk;
253 struct ipv6_pinfo *pinet6;
254 struct inet_opt inet;
255 struct raw6_opt raw6;
256 struct ipv6_pinfo inet6;
257};
258
259struct udp6_sock {
260 struct sock sk;
261 struct ipv6_pinfo *pinet6;
262 struct inet_opt inet;
263 struct udp_opt udp;
264 struct ipv6_pinfo inet6;
265};
266
267struct tcp6_sock {
268 struct sock sk;
269 struct ipv6_pinfo *pinet6;
270 struct inet_opt inet;
271 struct tcp_opt tcp;
272 struct ipv6_pinfo inet6;
273};
274
275static inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk)
276{
277 return ((struct raw6_sock *)__sk)->pinet6;
278}
279
280static inline struct raw6_opt * raw6_sk(const struct sock *__sk)
281{
282 return &((struct raw6_sock *)__sk)->raw6;
283}
284
285#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
286#define __ipv6_only_sock(sk) (inet6_sk(sk)->ipv6only)
287#define ipv6_only_sock(sk) ((sk)->sk_family == PF_INET6 && __ipv6_only_sock(sk))
288#else
289#define __ipv6_only_sock(sk) 0
290#define ipv6_only_sock(sk) 0
291#endif
292
293#endif
294
295#endif
296