Blame view
include/net/ipv6.h
18.6 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 3 4 5 6 |
/* * Linux INET6 implementation * * Authors: * Pedro Roque <roque@di.fc.ul.pt> * |
1da177e4c Linux-2.6.12-rc2 |
7 8 9 10 11 12 13 14 15 16 17 |
* This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. */ #ifndef _NET_IPV6_H #define _NET_IPV6_H #include <linux/ipv6.h> #include <linux/hardirq.h> |
20283d84c [IPV6]: Remove ci... |
18 |
#include <net/if_inet6.h> |
1da177e4c Linux-2.6.12-rc2 |
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
#include <net/ndisc.h> #include <net/flow.h> #include <net/snmp.h> #define SIN6_LEN_RFC2133 24 #define IPV6_MAXPLEN 65535 /* * NextHeader field of IPv6 header */ #define NEXTHDR_HOP 0 /* Hop-by-hop option header. */ #define NEXTHDR_TCP 6 /* TCP segment. */ #define NEXTHDR_UDP 17 /* UDP message. */ #define NEXTHDR_IPV6 41 /* IPv6 in IPv6 */ #define NEXTHDR_ROUTING 43 /* Routing header. */ #define NEXTHDR_FRAGMENT 44 /* Fragmentation/reassembly header. */ #define NEXTHDR_ESP 50 /* Encapsulating security payload. */ #define NEXTHDR_AUTH 51 /* Authentication header. */ #define NEXTHDR_ICMP 58 /* ICMP for IPv6. */ #define NEXTHDR_NONE 59 /* No next header */ #define NEXTHDR_DEST 60 /* Destination options header. */ |
2b741653b [IPV6] MIP6: Add ... |
42 |
#define NEXTHDR_MOBILITY 135 /* Mobility header. */ |
1da177e4c Linux-2.6.12-rc2 |
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
#define NEXTHDR_MAX 255 #define IPV6_DEFAULT_HOPLIMIT 64 #define IPV6_DEFAULT_MCASTHOPS 1 /* * Addr type * * type - unicast | multicast * scope - local | site | global * v4 - compat * v4mapped * any * loopback */ #define IPV6_ADDR_ANY 0x0000U #define IPV6_ADDR_UNICAST 0x0001U #define IPV6_ADDR_MULTICAST 0x0002U #define IPV6_ADDR_LOOPBACK 0x0010U #define IPV6_ADDR_LINKLOCAL 0x0020U #define IPV6_ADDR_SITELOCAL 0x0040U #define IPV6_ADDR_COMPATv4 0x0080U #define IPV6_ADDR_SCOPE_MASK 0x00f0U #define IPV6_ADDR_MAPPED 0x1000U |
1da177e4c Linux-2.6.12-rc2 |
76 77 78 79 |
/* * Addr scopes */ |
1da177e4c Linux-2.6.12-rc2 |
80 81 82 |
#define IPV6_ADDR_MC_SCOPE(a) \ ((a)->s6_addr[1] & 0x0f) /* nonstandard */ #define __IPV6_ADDR_SCOPE_INVALID -1 |
1da177e4c Linux-2.6.12-rc2 |
83 84 85 86 87 88 89 |
#define IPV6_ADDR_SCOPE_NODELOCAL 0x01 #define IPV6_ADDR_SCOPE_LINKLOCAL 0x02 #define IPV6_ADDR_SCOPE_SITELOCAL 0x05 #define IPV6_ADDR_SCOPE_ORGLOCAL 0x08 #define IPV6_ADDR_SCOPE_GLOBAL 0x0e /* |
5ced13396 ipv6: Add IPv6 mu... |
90 91 |
* Addr flags */ |
5ced13396 ipv6: Add IPv6 mu... |
92 93 94 95 96 97 |
#define IPV6_ADDR_MC_FLAG_TRANSIENT(a) \ ((a)->s6_addr[1] & 0x10) #define IPV6_ADDR_MC_FLAG_PREFIX(a) \ ((a)->s6_addr[1] & 0x20) #define IPV6_ADDR_MC_FLAG_RENDEZVOUS(a) \ ((a)->s6_addr[1] & 0x40) |
5ced13396 ipv6: Add IPv6 mu... |
98 99 |
/* |
1da177e4c Linux-2.6.12-rc2 |
100 101 102 103 |
* fragmentation header */ struct frag_hdr { |
44473a6b2 [IPV6]: annotate ... |
104 105 106 107 |
__u8 nexthdr; __u8 reserved; __be16 frag_off; __be32 identification; |
1da177e4c Linux-2.6.12-rc2 |
108 109 110 |
}; #define IP6_MF 0x0001 |
1da177e4c Linux-2.6.12-rc2 |
111 112 113 |
#include <net/sock.h> /* sysctls */ |
1da177e4c Linux-2.6.12-rc2 |
114 |
extern int sysctl_mld_max_msf; |
3d7cc2ba6 [NETFILTER]: Swit... |
115 |
extern struct ctl_path net_ipv6_ctl_path[]; |
087fe2403 ipv6: added net a... |
116 |
#define _DEVINC(net, statname, modifier, idev, field) \ |
14878f75a [IPV6]: Add ICMPM... |
117 |
({ \ |
a11d206d0 [IPV6]: Per-inter... |
118 119 |
struct inet6_dev *_idev = (idev); \ if (likely(_idev != NULL)) \ |
14878f75a [IPV6]: Add ICMPM... |
120 |
SNMP_INC_STATS##modifier((_idev)->stats.statname, (field)); \ |
9261e5370 ipv6: making ip a... |
121 |
SNMP_INC_STATS##modifier((net)->mib.statname##_statistics, (field));\ |
a11d206d0 [IPV6]: Per-inter... |
122 |
}) |
14878f75a [IPV6]: Add ICMPM... |
123 |
|
be281e554 ipv6: reduce per ... |
124 125 126 127 128 129 130 131 |
/* per device counters are atomic_long_t */ #define _DEVINCATOMIC(net, statname, modifier, idev, field) \ ({ \ struct inet6_dev *_idev = (idev); \ if (likely(_idev != NULL)) \ SNMP_INC_STATS_ATOMIC_LONG((_idev)->stats.statname##dev, (field)); \ SNMP_INC_STATS##modifier((net)->mib.statname##_statistics, (field));\ }) |
087fe2403 ipv6: added net a... |
132 |
#define _DEVADD(net, statname, modifier, idev, field, val) \ |
8e7999c44 [INET]: Consolida... |
133 134 135 136 |
({ \ struct inet6_dev *_idev = (idev); \ if (likely(_idev != NULL)) \ SNMP_ADD_STATS##modifier((_idev)->stats.statname, (field), (val)); \ |
9261e5370 ipv6: making ip a... |
137 |
SNMP_ADD_STATS##modifier((net)->mib.statname##_statistics, (field), (val));\ |
8e7999c44 [INET]: Consolida... |
138 |
}) |
edf391ff1 snmp: add missing... |
139 140 141 142 143 144 145 |
#define _DEVUPD(net, statname, modifier, idev, field, val) \ ({ \ struct inet6_dev *_idev = (idev); \ if (likely(_idev != NULL)) \ SNMP_UPD_PO_STATS##modifier((_idev)->stats.statname, field, (val)); \ SNMP_UPD_PO_STATS##modifier((net)->mib.statname##_statistics, field, (val));\ }) |
14878f75a [IPV6]: Add ICMPM... |
146 |
/* MIBs */ |
14878f75a [IPV6]: Add ICMPM... |
147 |
|
087fe2403 ipv6: added net a... |
148 |
#define IP6_INC_STATS(net, idev,field) \ |
4ce3c183f snmp: 64bit ipsta... |
149 |
_DEVINC(net, ipv6, 64, idev, field) |
087fe2403 ipv6: added net a... |
150 |
#define IP6_INC_STATS_BH(net, idev,field) \ |
4ce3c183f snmp: 64bit ipsta... |
151 |
_DEVINC(net, ipv6, 64_BH, idev, field) |
edf391ff1 snmp: add missing... |
152 |
#define IP6_ADD_STATS(net, idev,field,val) \ |
4ce3c183f snmp: 64bit ipsta... |
153 |
_DEVADD(net, ipv6, 64, idev, field, val) |
087fe2403 ipv6: added net a... |
154 |
#define IP6_ADD_STATS_BH(net, idev,field,val) \ |
4ce3c183f snmp: 64bit ipsta... |
155 |
_DEVADD(net, ipv6, 64_BH, idev, field, val) |
edf391ff1 snmp: add missing... |
156 |
#define IP6_UPD_PO_STATS(net, idev,field,val) \ |
4ce3c183f snmp: 64bit ipsta... |
157 |
_DEVUPD(net, ipv6, 64, idev, field, val) |
edf391ff1 snmp: add missing... |
158 |
#define IP6_UPD_PO_STATS_BH(net, idev,field,val) \ |
4ce3c183f snmp: 64bit ipsta... |
159 |
_DEVUPD(net, ipv6, 64_BH, idev, field, val) |
087fe2403 ipv6: added net a... |
160 |
#define ICMP6_INC_STATS(net, idev, field) \ |
be281e554 ipv6: reduce per ... |
161 |
_DEVINCATOMIC(net, icmpv6, , idev, field) |
087fe2403 ipv6: added net a... |
162 |
#define ICMP6_INC_STATS_BH(net, idev, field) \ |
be281e554 ipv6: reduce per ... |
163 |
_DEVINCATOMIC(net, icmpv6, _BH, idev, field) |
087fe2403 ipv6: added net a... |
164 165 |
#define ICMP6MSGOUT_INC_STATS(net, idev, field) \ |
be281e554 ipv6: reduce per ... |
166 |
_DEVINCATOMIC(net, icmpv6msg, , idev, field +256) |
087fe2403 ipv6: added net a... |
167 |
#define ICMP6MSGOUT_INC_STATS_BH(net, idev, field) \ |
be281e554 ipv6: reduce per ... |
168 |
_DEVINCATOMIC(net, icmpv6msg, _BH, idev, field +256) |
087fe2403 ipv6: added net a... |
169 |
#define ICMP6MSGIN_INC_STATS_BH(net, idev, field) \ |
be281e554 ipv6: reduce per ... |
170 |
_DEVINCATOMIC(net, icmpv6msg, _BH, idev, field) |
14878f75a [IPV6]: Add ICMPM... |
171 |
|
fd2c3ef76 net: cleanup incl... |
172 |
struct ip6_ra_chain { |
1da177e4c Linux-2.6.12-rc2 |
173 174 175 176 177 178 179 180 181 182 183 184 185 |
struct ip6_ra_chain *next; struct sock *sk; int sel; void (*destructor)(struct sock *); }; extern struct ip6_ra_chain *ip6_ra_chain; extern rwlock_t ip6_ra_lock; /* This structure is prepared by protocol, when parsing ancillary data and passed to IPv6. */ |
fd2c3ef76 net: cleanup incl... |
186 |
struct ipv6_txoptions { |
1da177e4c Linux-2.6.12-rc2 |
187 188 189 190 191 192 193 194 195 196 197 |
/* Length of this structure */ int tot_len; /* length of extension headers */ __u16 opt_flen; /* after fragment hdr */ __u16 opt_nflen; /* before fragment hdr */ struct ipv6_opt_hdr *hopopt; struct ipv6_opt_hdr *dst0opt; struct ipv6_rt_hdr *srcrt; /* Routing Header */ |
1da177e4c Linux-2.6.12-rc2 |
198 199 200 201 |
struct ipv6_opt_hdr *dst1opt; /* Option buffer, as read by IPV6_PKTOPTIONS, starts here. */ }; |
fd2c3ef76 net: cleanup incl... |
202 |
struct ip6_flowlabel { |
1da177e4c Linux-2.6.12-rc2 |
203 |
struct ip6_flowlabel *next; |
90bcaf7b4 [IPV6]: flowlabel... |
204 |
__be32 label; |
db3459d1a [IPV6]: Some clea... |
205 |
atomic_t users; |
1da177e4c Linux-2.6.12-rc2 |
206 207 |
struct in6_addr dst; struct ipv6_txoptions *opt; |
1da177e4c Linux-2.6.12-rc2 |
208 209 210 211 212 |
unsigned long linger; u8 share; u32 owner; unsigned long lastuse; unsigned long expires; |
60e8fbc4c [NETNS][IPV6] flo... |
213 |
struct net *fl_net; |
1da177e4c Linux-2.6.12-rc2 |
214 |
}; |
f3a7c66b5 net: replace __co... |
215 216 |
#define IPV6_FLOWINFO_MASK cpu_to_be32(0x0FFFFFFF) #define IPV6_FLOWLABEL_MASK cpu_to_be32(0x000FFFFF) |
1da177e4c Linux-2.6.12-rc2 |
217 |
|
fd2c3ef76 net: cleanup incl... |
218 |
struct ipv6_fl_socklist { |
1da177e4c Linux-2.6.12-rc2 |
219 220 221 |
struct ipv6_fl_socklist *next; struct ip6_flowlabel *fl; }; |
90bcaf7b4 [IPV6]: flowlabel... |
222 |
extern struct ip6_flowlabel *fl6_sock_lookup(struct sock *sk, __be32 label); |
1da177e4c Linux-2.6.12-rc2 |
223 224 225 226 227 |
extern struct ipv6_txoptions *fl6_merge_options(struct ipv6_txoptions * opt_space, struct ip6_flowlabel * fl, struct ipv6_txoptions * fopt); extern void fl6_free_socklist(struct sock *sk); extern int ipv6_flowlabel_opt(struct sock *sk, char __user *optval, int optlen); |
0a3e78ac2 [IPV6]: make flow... |
228 |
extern int ip6_flowlabel_init(void); |
1da177e4c Linux-2.6.12-rc2 |
229 230 231 232 233 234 235 |
extern void ip6_flowlabel_cleanup(void); static inline void fl6_sock_release(struct ip6_flowlabel *fl) { if (fl) atomic_dec(&fl->users); } |
725a8ff04 ipv6: remove unus... |
236 |
extern int ip6_ra_control(struct sock *sk, int sel); |
1da177e4c Linux-2.6.12-rc2 |
237 |
|
e5bbef20e [IPV6]: Replace s... |
238 |
extern int ipv6_parse_hopopts(struct sk_buff *skb); |
1da177e4c Linux-2.6.12-rc2 |
239 240 |
extern struct ipv6_txoptions * ipv6_dup_options(struct sock *sk, struct ipv6_txoptions *opt); |
333fad536 [IPV6]: Support s... |
241 242 243 244 |
extern struct ipv6_txoptions * ipv6_renew_options(struct sock *sk, struct ipv6_txoptions *opt, int newtype, struct ipv6_opt_hdr __user *newopt, int newoptlen); |
df9890c31 [IPV6]: Fix sendi... |
245 246 |
struct ipv6_txoptions *ipv6_fixup_options(struct ipv6_txoptions *opt_space, struct ipv6_txoptions *opt); |
1da177e4c Linux-2.6.12-rc2 |
247 |
|
399c07def [IPV6]: Export ip... |
248 |
extern int ipv6_opt_accepted(struct sock *sk, struct sk_buff *skb); |
e5a2bb842 [NETNS][FRAGS]: M... |
249 |
int ip6_frag_nqueues(struct net *net); |
6ddc08222 [NETNS][FRAGS]: M... |
250 |
int ip6_frag_mem(struct net *net); |
1da177e4c Linux-2.6.12-rc2 |
251 |
|
9874c41cd ipv6.h: reassembl... |
252 253 254 |
#define IPV6_FRAG_HIGH_THRESH (256 * 1024) /* 262144 */ #define IPV6_FRAG_LOW_THRESH (192 * 1024) /* 196608 */ #define IPV6_FRAG_TIMEOUT (60 * HZ) /* 60 seconds */ |
1da177e4c Linux-2.6.12-rc2 |
255 |
|
b1cacb682 [IPV6]: Make ipv6... |
256 257 258 259 260 |
extern int __ipv6_addr_type(const struct in6_addr *addr); static inline int ipv6_addr_type(const struct in6_addr *addr) { return __ipv6_addr_type(addr) & 0xffff; } |
1da177e4c Linux-2.6.12-rc2 |
261 262 263 |
static inline int ipv6_addr_scope(const struct in6_addr *addr) { |
b1cacb682 [IPV6]: Make ipv6... |
264 265 266 267 268 |
return __ipv6_addr_type(addr) & IPV6_ADDR_SCOPE_MASK; } static inline int __ipv6_addr_src_scope(int type) { |
a02cec215 net: return opera... |
269 |
return (type == IPV6_ADDR_ANY) ? __IPV6_ADDR_SCOPE_INVALID : (type >> 16); |
b1cacb682 [IPV6]: Make ipv6... |
270 271 272 273 274 |
} static inline int ipv6_addr_src_scope(const struct in6_addr *addr) { return __ipv6_addr_src_scope(__ipv6_addr_type(addr)); |
1da177e4c Linux-2.6.12-rc2 |
275 276 277 278 |
} static inline int ipv6_addr_cmp(const struct in6_addr *a1, const struct in6_addr *a2) { |
db3459d1a [IPV6]: Some clea... |
279 |
return memcmp(a1, a2, sizeof(struct in6_addr)); |
1da177e4c Linux-2.6.12-rc2 |
280 |
} |
f2ffd9eed [NETFILTER]: Move... |
281 282 283 284 |
static inline int ipv6_masked_addr_cmp(const struct in6_addr *a1, const struct in6_addr *m, const struct in6_addr *a2) { |
a02cec215 net: return opera... |
285 286 287 288 |
return !!(((a1->s6_addr32[0] ^ a2->s6_addr32[0]) & m->s6_addr32[0]) | ((a1->s6_addr32[1] ^ a2->s6_addr32[1]) & m->s6_addr32[1]) | ((a1->s6_addr32[2] ^ a2->s6_addr32[2]) & m->s6_addr32[2]) | ((a1->s6_addr32[3] ^ a2->s6_addr32[3]) & m->s6_addr32[3])); |
f2ffd9eed [NETFILTER]: Move... |
289 |
} |
1da177e4c Linux-2.6.12-rc2 |
290 291 |
static inline void ipv6_addr_copy(struct in6_addr *a1, const struct in6_addr *a2) { |
db3459d1a [IPV6]: Some clea... |
292 |
memcpy(a1, a2, sizeof(struct in6_addr)); |
1da177e4c Linux-2.6.12-rc2 |
293 294 295 296 297 298 299 300 301 |
} static inline void ipv6_addr_prefix(struct in6_addr *pfx, const struct in6_addr *addr, int plen) { /* caller must guarantee 0 <= plen <= 128 */ int o = plen >> 3, b = plen & 0x7; |
db3459d1a [IPV6]: Some clea... |
302 |
memset(pfx->s6_addr, 0, sizeof(pfx->s6_addr)); |
1da177e4c Linux-2.6.12-rc2 |
303 |
memcpy(pfx->s6_addr, addr, o); |
db3459d1a [IPV6]: Some clea... |
304 |
if (b != 0) |
1da177e4c Linux-2.6.12-rc2 |
305 |
pfx->s6_addr[o] = addr->s6_addr[o] & (0xff00 >> b); |
1da177e4c Linux-2.6.12-rc2 |
306 |
} |
1da177e4c Linux-2.6.12-rc2 |
307 |
static inline void ipv6_addr_set(struct in6_addr *addr, |
48818f822 [IPV6]: struct in... |
308 309 |
__be32 w1, __be32 w2, __be32 w3, __be32 w4) |
1da177e4c Linux-2.6.12-rc2 |
310 311 312 313 314 315 |
{ addr->s6_addr32[0] = w1; addr->s6_addr32[1] = w2; addr->s6_addr32[2] = w3; addr->s6_addr32[3] = w4; } |
1da177e4c Linux-2.6.12-rc2 |
316 317 318 319 |
static inline int ipv6_addr_equal(const struct in6_addr *a1, const struct in6_addr *a2) { |
a02cec215 net: return opera... |
320 321 322 323 |
return ((a1->s6_addr32[0] ^ a2->s6_addr32[0]) | (a1->s6_addr32[1] ^ a2->s6_addr32[1]) | (a1->s6_addr32[2] ^ a2->s6_addr32[2]) | (a1->s6_addr32[3] ^ a2->s6_addr32[3])) == 0; |
1da177e4c Linux-2.6.12-rc2 |
324 |
} |
48818f822 [IPV6]: struct in... |
325 |
static inline int __ipv6_prefix_equal(const __be32 *a1, const __be32 *a2, |
1da177e4c Linux-2.6.12-rc2 |
326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 |
unsigned int prefixlen) { unsigned pdw, pbi; /* check complete u32 in prefix */ pdw = prefixlen >> 5; if (pdw && memcmp(a1, a2, pdw << 2)) return 0; /* check incomplete u32 in prefix */ pbi = prefixlen & 0x1f; if (pbi && ((a1[pdw] ^ a2[pdw]) & htonl((0xffffffff) << (32 - pbi)))) return 0; return 1; } static inline int ipv6_prefix_equal(const struct in6_addr *a1, const struct in6_addr *a2, unsigned int prefixlen) { return __ipv6_prefix_equal(a1->s6_addr32, a2->s6_addr32, prefixlen); } |
2588fe1d7 [INET]: Consolida... |
350 |
struct inet_frag_queue; |
2588fe1d7 [INET]: Consolida... |
351 |
|
0b5ccb2ee ipv6: reassembly:... |
352 353 354 |
enum ip6_defrag_users { IP6_DEFRAG_LOCAL_DELIVER, IP6_DEFRAG_CONNTRACK_IN, |
4be929be3 kernel-wide: repl... |
355 |
__IP6_DEFRAG_CONNTRACK_IN = IP6_DEFRAG_CONNTRACK_IN + USHRT_MAX, |
0b5ccb2ee ipv6: reassembly:... |
356 |
IP6_DEFRAG_CONNTRACK_OUT, |
4be929be3 kernel-wide: repl... |
357 |
__IP6_DEFRAG_CONNTRACK_OUT = IP6_DEFRAG_CONNTRACK_OUT + USHRT_MAX, |
8fa9ff684 netfilter: fix cr... |
358 |
IP6_DEFRAG_CONNTRACK_BRIDGE_IN, |
4be929be3 kernel-wide: repl... |
359 |
__IP6_DEFRAG_CONNTRACK_BRIDGE_IN = IP6_DEFRAG_CONNTRACK_BRIDGE_IN + USHRT_MAX, |
0b5ccb2ee ipv6: reassembly:... |
360 |
}; |
c6fda2822 [INET]: Consolida... |
361 362 |
struct ip6_create_arg { __be32 id; |
0b5ccb2ee ipv6: reassembly:... |
363 |
u32 user; |
b71d1d426 inet: constify ip... |
364 365 |
const struct in6_addr *src; const struct in6_addr *dst; |
c6fda2822 [INET]: Consolida... |
366 367 368 |
}; void ip6_frag_init(struct inet_frag_queue *q, void *a); |
abd6523d1 [INET]: Consolida... |
369 |
int ip6_frag_match(struct inet_frag_queue *q, void *a); |
c6fda2822 [INET]: Consolida... |
370 |
|
1da177e4c Linux-2.6.12-rc2 |
371 372 |
static inline int ipv6_addr_any(const struct in6_addr *a) { |
a02cec215 net: return opera... |
373 374 |
return (a->s6_addr32[0] | a->s6_addr32[1] | a->s6_addr32[2] | a->s6_addr32[3]) == 0; |
1da177e4c Linux-2.6.12-rc2 |
375 |
} |
f630e43a2 ipv6: Drop packet... |
376 377 |
static inline int ipv6_addr_loopback(const struct in6_addr *a) { |
a02cec215 net: return opera... |
378 379 |
return (a->s6_addr32[0] | a->s6_addr32[1] | a->s6_addr32[2] | (a->s6_addr32[3] ^ htonl(1))) == 0; |
f630e43a2 ipv6: Drop packet... |
380 |
} |
e773e4faa [IPV6]: Add v4map... |
381 382 |
static inline int ipv6_addr_v4mapped(const struct in6_addr *a) { |
a02cec215 net: return opera... |
383 384 |
return (a->s6_addr32[0] | a->s6_addr32[1] | (a->s6_addr32[2] ^ htonl(0x0000ffff))) == 0; |
e773e4faa [IPV6]: Add v4map... |
385 |
} |
1da177e4c Linux-2.6.12-rc2 |
386 |
/* |
99cd07a53 [IPV6]: Fix sourc... |
387 388 389 390 391 |
* Check for a RFC 4843 ORCHID address * (Overlay Routable Cryptographic Hash Identifiers) */ static inline int ipv6_addr_orchid(const struct in6_addr *a) { |
a02cec215 net: return opera... |
392 |
return (a->s6_addr32[0] & htonl(0xfffffff0)) == htonl(0x20010010); |
99cd07a53 [IPV6]: Fix sourc... |
393 |
} |
f15364bd4 IPv6 support for ... |
394 395 396 397 398 399 400 401 |
static inline void ipv6_addr_set_v4mapped(const __be32 addr, struct in6_addr *v4mapped) { ipv6_addr_set(v4mapped, 0, 0, htonl(0x0000FFFF), addr); } |
99cd07a53 [IPV6]: Fix sourc... |
402 |
/* |
971f359dd [IPV6]: Put addr_... |
403 404 405 406 407 |
* find the first different bit between two addresses * length of address must be a multiple of 32bits */ static inline int __ipv6_addr_diff(const void *token1, const void *token2, int addrlen) { |
ef296f56f [IPV6]: __ipv6_ad... |
408 |
const __be32 *a1 = token1, *a2 = token2; |
971f359dd [IPV6]: Put addr_... |
409 410 411 412 413 |
int i; addrlen >>= 2; for (i = 0; i < addrlen; i++) { |
ef296f56f [IPV6]: __ipv6_ad... |
414 415 |
__be32 xb = a1[i] ^ a2[i]; if (xb) |
d57b8fb8a ipv6: Use __fls()... |
416 |
return i * 32 + 31 - __fls(ntohl(xb)); |
971f359dd [IPV6]: Put addr_... |
417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 |
} /* * we should *never* get to this point since that * would mean the addrs are equal * * However, we do get to it 8) And exacly, when * addresses are equal 8) * * ip route add 1111::/128 via ... * ip route add 1111::/64 via ... * and we are here. * * Ideally, this function should stop comparison * at prefix length. It does not, but it is still OK, * if returned value is greater than prefix length. * --ANK (980803) */ |
a02cec215 net: return opera... |
435 |
return addrlen << 5; |
971f359dd [IPV6]: Put addr_... |
436 437 438 439 440 441 |
} static inline int ipv6_addr_diff(const struct in6_addr *a1, const struct in6_addr *a2) { return __ipv6_addr_diff(a1, a2, sizeof(struct in6_addr)); } |
87c48fa3b ipv6: make fragme... |
442 |
extern void ipv6_select_ident(struct frag_hdr *fhdr, struct rt6_info *rt); |
7ea2f2c5a udpv6: Remove unu... |
443 |
|
971f359dd [IPV6]: Put addr_... |
444 |
/* |
1da177e4c Linux-2.6.12-rc2 |
445 446 447 448 449 450 451 452 453 |
* Prototypes exported by ipv6 */ /* * rcv function (called from netdevice level) */ extern int ipv6_rcv(struct sk_buff *skb, struct net_device *dev, |
f2ccd8fa0 [NET]: Kill skb->... |
454 455 |
struct packet_type *pt, struct net_device *orig_dev); |
1da177e4c Linux-2.6.12-rc2 |
456 |
|
b05e10669 [IPV4/6]: Netfilt... |
457 |
extern int ip6_rcv_finish(struct sk_buff *skb); |
1da177e4c Linux-2.6.12-rc2 |
458 459 460 461 462 |
/* * upper-layer output functions */ extern int ip6_xmit(struct sock *sk, struct sk_buff *skb, |
4c9483b2f ipv6: Convert to ... |
463 |
struct flowi6 *fl6, |
b903d324b ipv6: tcp: fix TC... |
464 465 |
struct ipv6_txoptions *opt, int tclass); |
1da177e4c Linux-2.6.12-rc2 |
466 467 468 469 |
extern int ip6_nd_hdr(struct sock *sk, struct sk_buff *skb, struct net_device *dev, |
9acd9f3ae [IPV6]: Make addr... |
470 471 |
const struct in6_addr *saddr, const struct in6_addr *daddr, |
1da177e4c Linux-2.6.12-rc2 |
472 473 474 475 476 477 478 479 480 481 |
int proto, int len); extern int ip6_find_1stfragopt(struct sk_buff *skb, u8 **nexthdr); extern int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb), void *from, int length, int transhdrlen, int hlimit, |
41a1f8ea4 [IPV6]: Support I... |
482 |
int tclass, |
1da177e4c Linux-2.6.12-rc2 |
483 |
struct ipv6_txoptions *opt, |
4c9483b2f ipv6: Convert to ... |
484 |
struct flowi6 *fl6, |
1da177e4c Linux-2.6.12-rc2 |
485 |
struct rt6_info *rt, |
13b52cd44 IPv6: Add dontfra... |
486 487 |
unsigned int flags, int dontfrag); |
1da177e4c Linux-2.6.12-rc2 |
488 489 490 491 492 493 494 |
extern int ip6_push_pending_frames(struct sock *sk); extern void ip6_flush_pending_frames(struct sock *sk); extern int ip6_dst_lookup(struct sock *sk, struct dst_entry **dst, |
4c9483b2f ipv6: Convert to ... |
495 |
struct flowi6 *fl6); |
68d0c6d34 ipv6: Consolidate... |
496 |
extern struct dst_entry * ip6_dst_lookup_flow(struct sock *sk, |
4c9483b2f ipv6: Convert to ... |
497 |
struct flowi6 *fl6, |
68d0c6d34 ipv6: Consolidate... |
498 |
const struct in6_addr *final_dst, |
a1414715f ipv6: Change fina... |
499 |
bool can_sleep); |
68d0c6d34 ipv6: Consolidate... |
500 |
extern struct dst_entry * ip6_sk_dst_lookup_flow(struct sock *sk, |
4c9483b2f ipv6: Convert to ... |
501 |
struct flowi6 *fl6, |
68d0c6d34 ipv6: Consolidate... |
502 |
const struct in6_addr *final_dst, |
a1414715f ipv6: Change fina... |
503 |
bool can_sleep); |
2774c131b xfrm: Handle blac... |
504 505 |
extern struct dst_entry * ip6_blackhole_route(struct net *net, struct dst_entry *orig_dst); |
1da177e4c Linux-2.6.12-rc2 |
506 507 508 509 510 511 512 513 514 |
/* * skb processing functions */ extern int ip6_output(struct sk_buff *skb); extern int ip6_forward(struct sk_buff *skb); extern int ip6_input(struct sk_buff *skb); extern int ip6_mc_input(struct sk_buff *skb); |
ef76bc23e [IPV6]: Add ip6_l... |
515 516 |
extern int __ip6_local_out(struct sk_buff *skb); extern int ip6_local_out(struct sk_buff *skb); |
1da177e4c Linux-2.6.12-rc2 |
517 518 519 |
/* * Extension header (options) processing */ |
1da177e4c Linux-2.6.12-rc2 |
520 521 522 523 524 525 526 527 528 |
extern void ipv6_push_nfrag_opts(struct sk_buff *skb, struct ipv6_txoptions *opt, u8 *proto, struct in6_addr **daddr_p); extern void ipv6_push_frag_opts(struct sk_buff *skb, struct ipv6_txoptions *opt, u8 *proto); extern int ipv6_skip_exthdr(const struct sk_buff *, int start, |
0d3d077cd [SELINUX]: Fix ip... |
529 |
u8 *nexthdrp); |
1da177e4c Linux-2.6.12-rc2 |
530 531 |
extern int ipv6_ext_hdr(u8 nexthdr); |
c61a40432 [IPV6]: Find opti... |
532 |
extern int ipv6_find_tlv(struct sk_buff *skb, int offset, int type); |
4c9483b2f ipv6: Convert to ... |
533 |
extern struct in6_addr *fl6_update_dst(struct flowi6 *fl6, |
20c59de2e ipv6: Refactor up... |
534 535 |
const struct ipv6_txoptions *opt, struct in6_addr *orig); |
1da177e4c Linux-2.6.12-rc2 |
536 537 538 539 540 541 542 |
/* * socket options (ipv6_sockglue.c) */ extern int ipv6_setsockopt(struct sock *sk, int level, int optname, char __user *optval, |
b7058842c net: Make setsock... |
543 |
unsigned int optlen); |
1da177e4c Linux-2.6.12-rc2 |
544 545 546 547 |
extern int ipv6_getsockopt(struct sock *sk, int level, int optname, char __user *optval, int __user *optlen); |
3fdadf7d2 [NET]: {get|set}s... |
548 549 550 551 |
extern int compat_ipv6_setsockopt(struct sock *sk, int level, int optname, char __user *optval, |
b7058842c net: Make setsock... |
552 |
unsigned int optlen); |
3fdadf7d2 [NET]: {get|set}s... |
553 554 555 556 557 |
extern int compat_ipv6_getsockopt(struct sock *sk, int level, int optname, char __user *optval, int __user *optlen); |
1da177e4c Linux-2.6.12-rc2 |
558 |
|
1da177e4c Linux-2.6.12-rc2 |
559 560 561 562 |
extern int ip6_datagram_connect(struct sock *sk, struct sockaddr *addr, int addr_len); extern int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len); |
4b340ae20 IPv6: Complete IP... |
563 |
extern int ipv6_recv_rxpmtu(struct sock *sk, struct msghdr *msg, int len); |
e69a4adc6 [IPV6]: Misc endi... |
564 |
extern void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err, __be16 port, |
1da177e4c Linux-2.6.12-rc2 |
565 |
u32 info, u8 *payload); |
4c9483b2f ipv6: Convert to ... |
566 567 |
extern void ipv6_local_error(struct sock *sk, int err, struct flowi6 *fl6, u32 info); extern void ipv6_local_rxpmtu(struct sock *sk, struct flowi6 *fl6, u32 mtu); |
1da177e4c Linux-2.6.12-rc2 |
568 569 570 571 572 573 574 575 |
extern int inet6_release(struct socket *sock); extern int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len); extern int inet6_getname(struct socket *sock, struct sockaddr *uaddr, int *uaddr_len, int peer); extern int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); |
d8313f5ca [INET6]: Generali... |
576 577 |
extern int inet6_hash_connect(struct inet_timewait_death_row *death_row, struct sock *sk); |
1da177e4c Linux-2.6.12-rc2 |
578 579 580 |
/* * reassembly.c */ |
90ddc4f04 [NET]: move struc... |
581 582 |
extern const struct proto_ops inet6_stream_ops; extern const struct proto_ops inet6_dgram_ops; |
20380731b [NET]: Fix sparse... |
583 |
|
14c850212 [INET_SOCK]: Move... |
584 585 |
struct group_source_req; struct group_filter; |
20380731b [NET]: Fix sparse... |
586 587 588 589 590 591 |
extern int ip6_mc_source(int add, int omode, struct sock *sk, struct group_source_req *pgsr); extern int ip6_mc_msfilter(struct sock *sk, struct group_filter *gsf); extern int ip6_mc_msfget(struct sock *sk, struct group_filter *gsf, struct group_filter __user *optval, int __user *optlen); |
93c8b90f0 ipv6: almost iden... |
592 593 |
extern unsigned int inet6_hash_frag(__be32 id, const struct in6_addr *saddr, const struct in6_addr *daddr, u32 rnd); |
20380731b [NET]: Fix sparse... |
594 595 |
#ifdef CONFIG_PROC_FS |
6ab57e7e7 [NETNS][IPV6] any... |
596 597 |
extern int ac6_proc_init(struct net *net); extern void ac6_proc_exit(struct net *net); |
20380731b [NET]: Fix sparse... |
598 599 |
extern int raw6_proc_init(void); extern void raw6_proc_exit(void); |
6f8b13bcb [NETNS][IPV6] tcp... |
600 601 |
extern int tcp6_proc_init(struct net *net); extern void tcp6_proc_exit(struct net *net); |
0c96d8c50 [NETNS][IPV6] udp... |
602 603 |
extern int udp6_proc_init(struct net *net); extern void udp6_proc_exit(struct net *net); |
ba4e58eca [NET]: Supporting... |
604 605 |
extern int udplite6_proc_init(void); extern void udplite6_proc_exit(void); |
20380731b [NET]: Fix sparse... |
606 607 |
extern int ipv6_misc_proc_init(void); extern void ipv6_misc_proc_exit(void); |
7f7d9a6b9 [IPV6]: Consolida... |
608 609 |
extern int snmp6_register_dev(struct inet6_dev *idev); extern int snmp6_unregister_dev(struct inet6_dev *idev); |
20380731b [NET]: Fix sparse... |
610 |
|
7f7d9a6b9 [IPV6]: Consolida... |
611 |
#else |
6ab57e7e7 [NETNS][IPV6] any... |
612 613 614 615 |
static inline int ac6_proc_init(struct net *net) { return 0; } static inline void ac6_proc_exit(struct net *net) { } static inline int snmp6_register_dev(struct inet6_dev *idev) { return 0; } static inline int snmp6_unregister_dev(struct inet6_dev *idev) { return 0; } |
20380731b [NET]: Fix sparse... |
616 |
#endif |
1da177e4c Linux-2.6.12-rc2 |
617 |
|
20380731b [NET]: Fix sparse... |
618 |
#ifdef CONFIG_SYSCTL |
760f2d018 [NETNS][IPV6]: Ma... |
619 620 |
extern ctl_table ipv6_route_table_template[]; extern ctl_table ipv6_icmp_table_template[]; |
1da177e4c Linux-2.6.12-rc2 |
621 |
|
6de1a9104 [IPV6]: Fix sysct... |
622 623 |
extern struct ctl_table *ipv6_icmp_sysctl_init(struct net *net); extern struct ctl_table *ipv6_route_sysctl_init(struct net *net); |
291480c09 [NETNS][IPV6]: Ma... |
624 |
extern int ipv6_sysctl_register(void); |
20380731b [NET]: Fix sparse... |
625 |
extern void ipv6_sysctl_unregister(void); |
eeb61f719 missing bits of n... |
626 627 |
extern int ipv6_static_sysctl_register(void); extern void ipv6_static_sysctl_unregister(void); |
20380731b [NET]: Fix sparse... |
628 |
#endif |
1da177e4c Linux-2.6.12-rc2 |
629 |
|
20380731b [NET]: Fix sparse... |
630 |
#endif /* _NET_IPV6_H */ |