diff options
Diffstat (limited to 'include/linux/ipv6.h')
-rw-r--r-- | include/linux/ipv6.h | 316 |
1 files changed, 316 insertions, 0 deletions
diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h new file mode 100644 index 000000000000..ab0d0efbf240 --- /dev/null +++ b/include/linux/ipv6.h | |||
@@ -0,0 +1,316 @@ | |||
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 | /* The latest drafts declared increase in minimal mtu up to 1280. */ | ||
9 | |||
10 | #define IPV6_MIN_MTU 1280 | ||
11 | |||
12 | /* | ||
13 | * Advanced API | ||
14 | * source interface/address selection, source routing, etc... | ||
15 | * *under construction* | ||
16 | */ | ||
17 | |||
18 | |||
19 | struct in6_pktinfo { | ||
20 | struct in6_addr ipi6_addr; | ||
21 | int ipi6_ifindex; | ||
22 | }; | ||
23 | |||
24 | |||
25 | struct in6_ifreq { | ||
26 | struct in6_addr ifr6_addr; | ||
27 | __u32 ifr6_prefixlen; | ||
28 | int ifr6_ifindex; | ||
29 | }; | ||
30 | |||
31 | #define IPV6_SRCRT_STRICT 0x01 /* this hop must be a neighbor */ | ||
32 | #define IPV6_SRCRT_TYPE_0 0 /* IPv6 type 0 Routing Header */ | ||
33 | |||
34 | /* | ||
35 | * routing header | ||
36 | */ | ||
37 | struct ipv6_rt_hdr { | ||
38 | __u8 nexthdr; | ||
39 | __u8 hdrlen; | ||
40 | __u8 type; | ||
41 | __u8 segments_left; | ||
42 | |||
43 | /* | ||
44 | * type specific data | ||
45 | * variable length field | ||
46 | */ | ||
47 | }; | ||
48 | |||
49 | |||
50 | struct ipv6_opt_hdr { | ||
51 | __u8 nexthdr; | ||
52 | __u8 hdrlen; | ||
53 | /* | ||
54 | * TLV encoded option data follows. | ||
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 | * routing header type 0 (used in cmsghdr struct) | ||
67 | */ | ||
68 | |||
69 | struct rt0_hdr { | ||
70 | struct ipv6_rt_hdr rt_hdr; | ||
71 | __u32 bitmap; /* strict/loose bit map */ | ||
72 | struct in6_addr addr[0]; | ||
73 | |||
74 | #define rt0_type rt_hdr.type | ||
75 | }; | ||
76 | |||
77 | struct ipv6_auth_hdr { | ||
78 | __u8 nexthdr; | ||
79 | __u8 hdrlen; /* This one is measured in 32 bit units! */ | ||
80 | __u16 reserved; | ||
81 | __u32 spi; | ||
82 | __u32 seq_no; /* Sequence number */ | ||
83 | __u8 auth_data[0]; /* Length variable but >=4. Mind the 64 bit alignment! */ | ||
84 | }; | ||
85 | |||
86 | struct ipv6_esp_hdr { | ||
87 | __u32 spi; | ||
88 | __u32 seq_no; /* Sequence number */ | ||
89 | __u8 enc_data[0]; /* Length variable but >=8. Mind the 64 bit alignment! */ | ||
90 | }; | ||
91 | |||
92 | struct ipv6_comp_hdr { | ||
93 | __u8 nexthdr; | ||
94 | __u8 flags; | ||
95 | __u16 cpi; | ||
96 | }; | ||
97 | |||
98 | /* | ||
99 | * IPv6 fixed header | ||
100 | * | ||
101 | * BEWARE, it is incorrect. The first 4 bits of flow_lbl | ||
102 | * are glued to priority now, forming "class". | ||
103 | */ | ||
104 | |||
105 | struct 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 | * This structure contains configuration options per IPv6 link. | ||
127 | */ | ||
128 | struct 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 | /* index values for the variables in ipv6_devconf */ | ||
152 | enum { | ||
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> /* struct sockaddr_in6 */ | ||
175 | #include <linux/icmpv6.h> | ||
176 | #include <net/if_inet6.h> /* struct ipv6_mc_socklist */ | ||
177 | #include <linux/tcp.h> | ||
178 | #include <linux/udp.h> | ||
179 | |||
180 | /* | ||
181 | This structure contains results of exthdrs parsing | ||
182 | as offsets from skb->nh. | ||
183 | */ | ||
184 | |||
185 | struct inet6_skb_parm { | ||
186 | int iif; | ||
187 | __u16 ra; | ||
188 | __u16 hop; | ||
189 | __u16 dst0; | ||
190 | __u16 srcrt; | ||
191 | __u16 dst1; | ||
192 | }; | ||
193 | |||
194 | #define IP6CB(skb) ((struct inet6_skb_parm*)((skb)->cb)) | ||
195 | |||
196 | /** | ||
197 | * struct ipv6_pinfo - ipv6 private area | ||
198 | * | ||
199 | * In the struct sock hierarchy (tcp6_sock, upd6_sock, etc) | ||
200 | * this _must_ be the last member, so that inet6_sk_generic | ||
201 | * is able to calculate its offset from the base struct sock | ||
202 | * by using the struct proto->slab_obj_size member. -acme | ||
203 | */ | ||
204 | struct ipv6_pinfo { | ||
205 | struct in6_addr saddr; | ||
206 | struct in6_addr rcv_saddr; | ||
207 | struct in6_addr daddr; | ||
208 | struct in6_addr *daddr_cache; | ||
209 | |||
210 | __u32 flow_label; | ||
211 | __u32 frag_size; | ||
212 | __s16 hop_limit; | ||
213 | __s16 mcast_hops; | ||
214 | int mcast_oif; | ||
215 | |||
216 | /* pktoption flags */ | ||
217 | union { | ||
218 | struct { | ||
219 | __u8 srcrt:2, | ||
220 | rxinfo:1, | ||
221 | rxhlim:1, | ||
222 | hopopts:1, | ||
223 | dstopts:1, | ||
224 | rxflow:1; | ||
225 | } bits; | ||
226 | __u8 all; | ||
227 | } rxopt; | ||
228 | |||
229 | /* sockopt flags */ | ||
230 | __u8 mc_loop:1, | ||
231 | recverr:1, | ||
232 | sndflow:1, | ||
233 | pmtudisc:2, | ||
234 | ipv6only:1; | ||
235 | |||
236 | __u32 dst_cookie; | ||
237 | |||
238 | struct ipv6_mc_socklist *ipv6_mc_list; | ||
239 | struct ipv6_ac_socklist *ipv6_ac_list; | ||
240 | struct ipv6_fl_socklist *ipv6_fl_list; | ||
241 | |||
242 | struct ipv6_txoptions *opt; | ||
243 | struct sk_buff *pktoptions; | ||
244 | struct { | ||
245 | struct ipv6_txoptions *opt; | ||
246 | struct rt6_info *rt; | ||
247 | int hop_limit; | ||
248 | } cork; | ||
249 | }; | ||
250 | |||
251 | /* WARNING: don't change the layout of the members in {raw,udp,tcp}6_sock! */ | ||
252 | struct raw6_sock { | ||
253 | /* inet_sock has to be the first member of raw6_sock */ | ||
254 | struct inet_sock inet; | ||
255 | __u32 checksum; /* perform checksum */ | ||
256 | __u32 offset; /* checksum offset */ | ||
257 | struct icmp6_filter filter; | ||
258 | /* ipv6_pinfo has to be the last member of raw6_sock, see inet6_sk_generic */ | ||
259 | struct ipv6_pinfo inet6; | ||
260 | }; | ||
261 | |||
262 | struct udp6_sock { | ||
263 | struct udp_sock udp; | ||
264 | /* ipv6_pinfo has to be the last member of udp6_sock, see inet6_sk_generic */ | ||
265 | struct ipv6_pinfo inet6; | ||
266 | }; | ||
267 | |||
268 | struct tcp6_sock { | ||
269 | struct tcp_sock tcp; | ||
270 | /* ipv6_pinfo has to be the last member of tcp6_sock, see inet6_sk_generic */ | ||
271 | struct ipv6_pinfo inet6; | ||
272 | }; | ||
273 | |||
274 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | ||
275 | static inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk) | ||
276 | { | ||
277 | return inet_sk(__sk)->pinet6; | ||
278 | } | ||
279 | |||
280 | static inline struct raw6_sock *raw6_sk(const struct sock *sk) | ||
281 | { | ||
282 | return (struct raw6_sock *)sk; | ||
283 | } | ||
284 | |||
285 | static inline void inet_sk_copy_descendant(struct sock *sk_to, | ||
286 | const struct sock *sk_from) | ||
287 | { | ||
288 | int ancestor_size = sizeof(struct inet_sock); | ||
289 | |||
290 | if (sk_from->sk_family == PF_INET6) | ||
291 | ancestor_size += sizeof(struct ipv6_pinfo); | ||
292 | |||
293 | __inet_sk_copy_descendant(sk_to, sk_from, ancestor_size); | ||
294 | } | ||
295 | |||
296 | #define __ipv6_only_sock(sk) (inet6_sk(sk)->ipv6only) | ||
297 | #define ipv6_only_sock(sk) ((sk)->sk_family == PF_INET6 && __ipv6_only_sock(sk)) | ||
298 | #else | ||
299 | #define __ipv6_only_sock(sk) 0 | ||
300 | #define ipv6_only_sock(sk) 0 | ||
301 | |||
302 | static inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk) | ||
303 | { | ||
304 | return NULL; | ||
305 | } | ||
306 | |||
307 | static inline struct raw6_sock *raw6_sk(const struct sock *sk) | ||
308 | { | ||
309 | return NULL; | ||
310 | } | ||
311 | |||
312 | #endif | ||
313 | |||
314 | #endif | ||
315 | |||
316 | #endif | ||