Blame view
include/net/ipv6.h
29.1 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> |
08dcdbf6a ipv6: use a stron... |
18 |
#include <linux/jhash.h> |
0aeea21ad net, ipv6: conver... |
19 |
#include <linux/refcount.h> |
20283d84c [IPV6]: Remove ci... |
20 |
#include <net/if_inet6.h> |
1da177e4c Linux-2.6.12-rc2 |
21 22 |
#include <net/ndisc.h> #include <net/flow.h> |
1bd758eb1 net: change name ... |
23 |
#include <net/flow_dissector.h> |
1da177e4c Linux-2.6.12-rc2 |
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
#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. */ |
c12b395a4 gre: Support GRE ... |
40 |
#define NEXTHDR_GRE 47 /* GRE header. */ |
1da177e4c Linux-2.6.12-rc2 |
41 42 43 44 45 |
#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. */ |
280c571e1 net: Add NEXTHDR_... |
46 |
#define NEXTHDR_SCTP 132 /* SCTP message. */ |
2b741653b [IPV6] MIP6: Add ... |
47 |
#define NEXTHDR_MOBILITY 135 /* Mobility header. */ |
1da177e4c Linux-2.6.12-rc2 |
48 49 |
#define NEXTHDR_MAX 255 |
1da177e4c Linux-2.6.12-rc2 |
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 76 77 |
#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 |
78 79 80 81 |
/* * Addr scopes */ |
1da177e4c Linux-2.6.12-rc2 |
82 83 84 |
#define IPV6_ADDR_MC_SCOPE(a) \ ((a)->s6_addr[1] & 0x0f) /* nonstandard */ #define __IPV6_ADDR_SCOPE_INVALID -1 |
1da177e4c Linux-2.6.12-rc2 |
85 86 87 88 89 90 91 |
#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... |
92 93 |
* Addr flags */ |
5ced13396 ipv6: Add IPv6 mu... |
94 95 96 97 98 99 |
#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... |
100 101 |
/* |
1da177e4c Linux-2.6.12-rc2 |
102 103 104 105 |
* fragmentation header */ struct frag_hdr { |
44473a6b2 [IPV6]: annotate ... |
106 107 108 109 |
__u8 nexthdr; __u8 reserved; __be16 frag_off; __be32 identification; |
1da177e4c Linux-2.6.12-rc2 |
110 |
}; |
1431fb31e xen-netback: fix ... |
111 112 |
#define IP6_MF 0x0001 #define IP6_OFFSET 0xFFF8 |
1da177e4c Linux-2.6.12-rc2 |
113 |
|
e110861f8 net: add a sysctl... |
114 115 |
#define IP6_REPLY_MARK(net, mark) \ ((net)->ipv6.sysctl.fwmark_reflect ? (mark) : 0) |
1da177e4c Linux-2.6.12-rc2 |
116 117 118 |
#include <net/sock.h> /* sysctls */ |
1da177e4c Linux-2.6.12-rc2 |
119 |
extern int sysctl_mld_max_msf; |
2f711939d ipv6: add sysctl_... |
120 |
extern int sysctl_mld_qrv; |
3d7cc2ba6 [NETFILTER]: Swit... |
121 |
|
13415e46c net: snmp: kill S... |
122 |
#define _DEVINC(net, statname, mod, idev, field) \ |
14878f75a [IPV6]: Add ICMPM... |
123 |
({ \ |
a11d206d0 [IPV6]: Per-inter... |
124 125 |
struct inet6_dev *_idev = (idev); \ if (likely(_idev != NULL)) \ |
13415e46c net: snmp: kill S... |
126 127 |
mod##SNMP_INC_STATS64((_idev)->stats.statname, (field));\ mod##SNMP_INC_STATS64((net)->mib.statname##_statistics, (field));\ |
a11d206d0 [IPV6]: Per-inter... |
128 |
}) |
14878f75a [IPV6]: Add ICMPM... |
129 |
|
be281e554 ipv6: reduce per ... |
130 |
/* per device counters are atomic_long_t */ |
13415e46c net: snmp: kill S... |
131 |
#define _DEVINCATOMIC(net, statname, mod, idev, field) \ |
be281e554 ipv6: reduce per ... |
132 133 134 135 |
({ \ struct inet6_dev *_idev = (idev); \ if (likely(_idev != NULL)) \ SNMP_INC_STATS_ATOMIC_LONG((_idev)->stats.statname##dev, (field)); \ |
13415e46c net: snmp: kill S... |
136 |
mod##SNMP_INC_STATS((net)->mib.statname##_statistics, (field));\ |
be281e554 ipv6: reduce per ... |
137 |
}) |
2a24444f8 ipv6: reduce perc... |
138 139 140 141 142 143 144 145 |
/* per device and per net counters are atomic_long_t */ #define _DEVINC_ATOMIC_ATOMIC(net, statname, idev, field) \ ({ \ struct inet6_dev *_idev = (idev); \ if (likely(_idev != NULL)) \ SNMP_INC_STATS_ATOMIC_LONG((_idev)->stats.statname##dev, (field)); \ SNMP_INC_STATS_ATOMIC_LONG((net)->mib.statname##_statistics, (field));\ }) |
13415e46c net: snmp: kill S... |
146 |
#define _DEVADD(net, statname, mod, idev, field, val) \ |
8e7999c44 [INET]: Consolida... |
147 148 149 |
({ \ struct inet6_dev *_idev = (idev); \ if (likely(_idev != NULL)) \ |
13415e46c net: snmp: kill S... |
150 151 |
mod##SNMP_ADD_STATS((_idev)->stats.statname, (field), (val)); \ mod##SNMP_ADD_STATS((net)->mib.statname##_statistics, (field), (val));\ |
8e7999c44 [INET]: Consolida... |
152 |
}) |
13415e46c net: snmp: kill S... |
153 |
#define _DEVUPD(net, statname, mod, idev, field, val) \ |
edf391ff1 snmp: add missing... |
154 155 156 |
({ \ struct inet6_dev *_idev = (idev); \ if (likely(_idev != NULL)) \ |
13415e46c net: snmp: kill S... |
157 158 |
mod##SNMP_UPD_PO_STATS((_idev)->stats.statname, field, (val)); \ mod##SNMP_UPD_PO_STATS((net)->mib.statname##_statistics, field, (val));\ |
edf391ff1 snmp: add missing... |
159 |
}) |
14878f75a [IPV6]: Add ICMPM... |
160 |
/* MIBs */ |
14878f75a [IPV6]: Add ICMPM... |
161 |
|
087fe2403 ipv6: added net a... |
162 |
#define IP6_INC_STATS(net, idev,field) \ |
13415e46c net: snmp: kill S... |
163 |
_DEVINC(net, ipv6, , idev, field) |
1d0155035 ipv6: rename IP6_... |
164 |
#define __IP6_INC_STATS(net, idev,field) \ |
13415e46c net: snmp: kill S... |
165 |
_DEVINC(net, ipv6, __, idev, field) |
edf391ff1 snmp: add missing... |
166 |
#define IP6_ADD_STATS(net, idev,field,val) \ |
13415e46c net: snmp: kill S... |
167 |
_DEVADD(net, ipv6, , idev, field, val) |
1d0155035 ipv6: rename IP6_... |
168 |
#define __IP6_ADD_STATS(net, idev,field,val) \ |
13415e46c net: snmp: kill S... |
169 |
_DEVADD(net, ipv6, __, idev, field, val) |
edf391ff1 snmp: add missing... |
170 |
#define IP6_UPD_PO_STATS(net, idev,field,val) \ |
13415e46c net: snmp: kill S... |
171 |
_DEVUPD(net, ipv6, , idev, field, val) |
c2005eb01 ipv6: rename IP6_... |
172 |
#define __IP6_UPD_PO_STATS(net, idev,field,val) \ |
13415e46c net: snmp: kill S... |
173 |
_DEVUPD(net, ipv6, __, idev, field, val) |
087fe2403 ipv6: added net a... |
174 |
#define ICMP6_INC_STATS(net, idev, field) \ |
be281e554 ipv6: reduce per ... |
175 |
_DEVINCATOMIC(net, icmpv6, , idev, field) |
a16292a0f net: rename ICMP6... |
176 |
#define __ICMP6_INC_STATS(net, idev, field) \ |
13415e46c net: snmp: kill S... |
177 |
_DEVINCATOMIC(net, icmpv6, __, idev, field) |
087fe2403 ipv6: added net a... |
178 179 |
#define ICMP6MSGOUT_INC_STATS(net, idev, field) \ |
2a24444f8 ipv6: reduce perc... |
180 |
_DEVINC_ATOMIC_ATOMIC(net, icmpv6msg, idev, field +256) |
f3832ed2c ipv6: kill ICMP6M... |
181 |
#define ICMP6MSGIN_INC_STATS(net, idev, field) \ |
2a24444f8 ipv6: reduce perc... |
182 |
_DEVINC_ATOMIC_ATOMIC(net, icmpv6msg, idev, field) |
14878f75a [IPV6]: Add ICMPM... |
183 |
|
fd2c3ef76 net: cleanup incl... |
184 |
struct ip6_ra_chain { |
1da177e4c Linux-2.6.12-rc2 |
185 186 187 188 189 190 191 192 193 194 195 196 197 |
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... |
198 |
struct ipv6_txoptions { |
0aeea21ad net, ipv6: conver... |
199 |
refcount_t refcnt; |
1da177e4c Linux-2.6.12-rc2 |
200 201 202 203 204 205 206 207 208 209 210 |
/* 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 |
211 |
struct ipv6_opt_hdr *dst1opt; |
45f6fad84 ipv6: add complet... |
212 |
struct rcu_head rcu; |
1da177e4c Linux-2.6.12-rc2 |
213 214 |
/* Option buffer, as read by IPV6_PKTOPTIONS, starts here. */ }; |
fd2c3ef76 net: cleanup incl... |
215 |
struct ip6_flowlabel { |
7f0e44ac9 ipv6 flowlabel: a... |
216 |
struct ip6_flowlabel __rcu *next; |
90bcaf7b4 [IPV6]: flowlabel... |
217 |
__be32 label; |
db3459d1a [IPV6]: Some clea... |
218 |
atomic_t users; |
1da177e4c Linux-2.6.12-rc2 |
219 220 |
struct in6_addr dst; struct ipv6_txoptions *opt; |
1da177e4c Linux-2.6.12-rc2 |
221 |
unsigned long linger; |
d3aedd5eb ipv6 flowlabel: C... |
222 |
struct rcu_head rcu; |
1da177e4c Linux-2.6.12-rc2 |
223 |
u8 share; |
4f82f4573 net ip6 flowlabel... |
224 225 226 227 |
union { struct pid *pid; kuid_t uid; } owner; |
1da177e4c Linux-2.6.12-rc2 |
228 229 |
unsigned long lastuse; unsigned long expires; |
60e8fbc4c [NETNS][IPV6] flo... |
230 |
struct net *fl_net; |
1da177e4c Linux-2.6.12-rc2 |
231 |
}; |
82a584b7c ipv6: Flow label ... |
232 233 234 |
#define IPV6_FLOWINFO_MASK cpu_to_be32(0x0FFFFFFF) #define IPV6_FLOWLABEL_MASK cpu_to_be32(0x000FFFFF) #define IPV6_FLOWLABEL_STATELESS_FLAG cpu_to_be32(0x00080000) |
37cfee909 ipv6: move IPV6_T... |
235 |
#define IPV6_TCLASS_MASK (IPV6_FLOWINFO_MASK & ~IPV6_FLOWLABEL_MASK) |
d76ed22b2 ipv6: move IPV6_T... |
236 |
#define IPV6_TCLASS_SHIFT 20 |
1da177e4c Linux-2.6.12-rc2 |
237 |
|
fd2c3ef76 net: cleanup incl... |
238 |
struct ipv6_fl_socklist { |
7f0e44ac9 ipv6 flowlabel: a... |
239 240 241 |
struct ipv6_fl_socklist __rcu *next; struct ip6_flowlabel *fl; struct rcu_head rcu; |
1da177e4c Linux-2.6.12-rc2 |
242 |
}; |
26879da58 ipv6: add new str... |
243 244 245 246 247 248 |
struct ipcm6_cookie { __s16 hlimit; __s16 tclass; __s8 dontfrag; struct ipv6_txoptions *opt; }; |
45f6fad84 ipv6: add complet... |
249 250 251 252 253 254 |
static inline struct ipv6_txoptions *txopt_get(const struct ipv6_pinfo *np) { struct ipv6_txoptions *opt; rcu_read_lock(); opt = rcu_dereference(np->opt); |
e550785c3 ipv6: Annotate ch... |
255 |
if (opt) { |
0aeea21ad net, ipv6: conver... |
256 |
if (!refcount_inc_not_zero(&opt->refcnt)) |
e550785c3 ipv6: Annotate ch... |
257 258 259 260 |
opt = NULL; else opt = rcu_pointer_handoff(opt); } |
45f6fad84 ipv6: add complet... |
261 262 263 264 265 266 |
rcu_read_unlock(); return opt; } static inline void txopt_put(struct ipv6_txoptions *opt) { |
0aeea21ad net, ipv6: conver... |
267 |
if (opt && refcount_dec_and_test(&opt->refcnt)) |
45f6fad84 ipv6: add complet... |
268 269 |
kfree_rcu(opt, rcu); } |
5c3a0fd7d ip*.h: Remove ext... |
270 271 272 273 274 275 |
struct ip6_flowlabel *fl6_sock_lookup(struct sock *sk, __be32 label); struct ipv6_txoptions *fl6_merge_options(struct ipv6_txoptions *opt_space, struct ip6_flowlabel *fl, struct ipv6_txoptions *fopt); void fl6_free_socklist(struct sock *sk); int ipv6_flowlabel_opt(struct sock *sk, char __user *optval, int optlen); |
46e5f4017 ipv6: add a flag ... |
276 277 |
int ipv6_flowlabel_opt_get(struct sock *sk, struct in6_flowlabel_req *freq, int flags); |
5c3a0fd7d ip*.h: Remove ext... |
278 279 |
int ip6_flowlabel_init(void); void ip6_flowlabel_cleanup(void); |
2295b3dd5 ipv6: Fix getsock... |
280 |
bool ip6_autoflowlabel(struct net *net, const struct ipv6_pinfo *np); |
1da177e4c Linux-2.6.12-rc2 |
281 282 283 284 285 286 |
static inline void fl6_sock_release(struct ip6_flowlabel *fl) { if (fl) atomic_dec(&fl->users); } |
5c3a0fd7d ip*.h: Remove ext... |
287 |
void icmpv6_notify(struct sk_buff *skb, u8 type, u8 code, __be32 info); |
b94f1c090 ipv6: Use icmpv6_... |
288 |
|
6d0bfe226 net: ipv6: Add IP... |
289 290 |
int icmpv6_push_pending_frames(struct sock *sk, struct flowi6 *fl6, struct icmp6hdr *thdr, int len); |
5c3a0fd7d ip*.h: Remove ext... |
291 |
int ip6_ra_control(struct sock *sk, int sel); |
1da177e4c Linux-2.6.12-rc2 |
292 |
|
5c3a0fd7d ip*.h: Remove ext... |
293 |
int ipv6_parse_hopopts(struct sk_buff *skb); |
1da177e4c Linux-2.6.12-rc2 |
294 |
|
5c3a0fd7d ip*.h: Remove ext... |
295 296 297 298 299 |
struct ipv6_txoptions *ipv6_dup_options(struct sock *sk, struct ipv6_txoptions *opt); struct ipv6_txoptions *ipv6_renew_options(struct sock *sk, struct ipv6_txoptions *opt, int newtype, |
8e39e96f2 ipv6: make ipv6_r... |
300 |
struct ipv6_opt_hdr *newopt); |
df9890c31 [IPV6]: Fix sendi... |
301 302 |
struct ipv6_txoptions *ipv6_fixup_options(struct ipv6_txoptions *opt_space, struct ipv6_txoptions *opt); |
1da177e4c Linux-2.6.12-rc2 |
303 |
|
a224772db ipv6: add a struc... |
304 305 |
bool ipv6_opt_accepted(const struct sock *sk, const struct sk_buff *skb, const struct inet6_skb_parm *opt); |
ceba1832b calipso: Set the ... |
306 307 |
struct ipv6_txoptions *ipv6_update_options(struct sock *sk, struct ipv6_txoptions *opt); |
399c07def [IPV6]: Export ip... |
308 |
|
aeaf6e9d2 ipv6: unify logic... |
309 310 311 312 313 314 315 316 |
static inline bool ipv6_accept_ra(struct inet6_dev *idev) { /* If forwarding is enabled, RA are not accepted unless the special * hybrid mode (accept_ra=2) is enabled. */ return idev->cnf.forwarding ? idev->cnf.accept_ra == 2 : idev->cnf.accept_ra; } |
c2a936600 net: increase fra... |
317 318 |
#define IPV6_FRAG_HIGH_THRESH (4 * 1024*1024) /* 4194304 */ #define IPV6_FRAG_LOW_THRESH (3 * 1024*1024) /* 3145728 */ |
9874c41cd ipv6.h: reassembl... |
319 |
#define IPV6_FRAG_TIMEOUT (60 * HZ) /* 60 seconds */ |
1da177e4c Linux-2.6.12-rc2 |
320 |
|
5c3a0fd7d ip*.h: Remove ext... |
321 |
int __ipv6_addr_type(const struct in6_addr *addr); |
b1cacb682 [IPV6]: Make ipv6... |
322 323 324 325 |
static inline int ipv6_addr_type(const struct in6_addr *addr) { return __ipv6_addr_type(addr) & 0xffff; } |
1da177e4c Linux-2.6.12-rc2 |
326 327 328 |
static inline int ipv6_addr_scope(const struct in6_addr *addr) { |
b1cacb682 [IPV6]: Make ipv6... |
329 330 331 332 333 |
return __ipv6_addr_type(addr) & IPV6_ADDR_SCOPE_MASK; } static inline int __ipv6_addr_src_scope(int type) { |
a02cec215 net: return opera... |
334 |
return (type == IPV6_ADDR_ANY) ? __IPV6_ADDR_SCOPE_INVALID : (type >> 16); |
b1cacb682 [IPV6]: Make ipv6... |
335 336 337 338 339 |
} 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 |
340 |
} |
b7ef213ef ipv6: introdcue _... |
341 342 343 344 345 346 347 348 349 350 351 |
static inline bool __ipv6_addr_needs_scope_id(int type) { return type & IPV6_ADDR_LINKLOCAL || (type & IPV6_ADDR_MULTICAST && (type & (IPV6_ADDR_LOOPBACK|IPV6_ADDR_LINKLOCAL))); } static inline __u32 ipv6_iface_scope_id(const struct in6_addr *addr, int iface) { return __ipv6_addr_needs_scope_id(__ipv6_addr_type(addr)) ? iface : 0; } |
1da177e4c Linux-2.6.12-rc2 |
352 353 |
static inline int ipv6_addr_cmp(const struct in6_addr *a1, const struct in6_addr *a2) { |
db3459d1a [IPV6]: Some clea... |
354 |
return memcmp(a1, a2, sizeof(struct in6_addr)); |
1da177e4c Linux-2.6.12-rc2 |
355 |
} |
1a203cb33 ipv6: optimize ip... |
356 |
static inline bool |
f2ffd9eed [NETFILTER]: Move... |
357 358 359 |
ipv6_masked_addr_cmp(const struct in6_addr *a1, const struct in6_addr *m, const struct in6_addr *a2) { |
1a203cb33 ipv6: optimize ip... |
360 361 362 363 364 365 366 367 |
#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64 const unsigned long *ul1 = (const unsigned long *)a1; const unsigned long *ulm = (const unsigned long *)m; const unsigned long *ul2 = (const unsigned long *)a2; return !!(((ul1[0] ^ ul2[0]) & ulm[0]) | ((ul1[1] ^ ul2[1]) & ulm[1])); #else |
a02cec215 net: return opera... |
368 369 370 371 |
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])); |
1a203cb33 ipv6: optimize ip... |
372 |
#endif |
f2ffd9eed [NETFILTER]: Move... |
373 |
} |
1da177e4c Linux-2.6.12-rc2 |
374 375 376 377 378 379 380 |
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... |
381 |
memset(pfx->s6_addr, 0, sizeof(pfx->s6_addr)); |
1da177e4c Linux-2.6.12-rc2 |
382 |
memcpy(pfx->s6_addr, addr, o); |
db3459d1a [IPV6]: Some clea... |
383 |
if (b != 0) |
1da177e4c Linux-2.6.12-rc2 |
384 |
pfx->s6_addr[o] = addr->s6_addr[o] & (0xff00 >> b); |
1da177e4c Linux-2.6.12-rc2 |
385 |
} |
818f1f3e7 ipv6: add ipv6_ad... |
386 387 388 389 390 391 392 393 394 395 396 397 398 399 |
static inline void ipv6_addr_prefix_copy(struct in6_addr *addr, const struct in6_addr *pfx, int plen) { /* caller must guarantee 0 <= plen <= 128 */ int o = plen >> 3, b = plen & 0x7; memcpy(addr->s6_addr, pfx, o); if (b != 0) { addr->s6_addr[o] &= ~(0xff00 >> b); addr->s6_addr[o] |= (pfx->s6_addr[o] & (0xff00 >> b)); } } |
5206c579d ipv6: 64bit versi... |
400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 |
static inline void __ipv6_addr_set_half(__be32 *addr, __be32 wh, __be32 wl) { #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64 #if defined(__BIG_ENDIAN) if (__builtin_constant_p(wh) && __builtin_constant_p(wl)) { *(__force u64 *)addr = ((__force u64)(wh) << 32 | (__force u64)(wl)); return; } #elif defined(__LITTLE_ENDIAN) if (__builtin_constant_p(wl) && __builtin_constant_p(wh)) { *(__force u64 *)addr = ((__force u64)(wl) << 32 | (__force u64)(wh)); return; } #endif #endif addr[0] = wh; addr[1] = wl; } |
1da177e4c Linux-2.6.12-rc2 |
419 |
static inline void ipv6_addr_set(struct in6_addr *addr, |
48818f822 [IPV6]: struct in... |
420 421 |
__be32 w1, __be32 w2, __be32 w3, __be32 w4) |
1da177e4c Linux-2.6.12-rc2 |
422 |
{ |
5206c579d ipv6: 64bit versi... |
423 424 |
__ipv6_addr_set_half(&addr->s6_addr32[0], w1, w2); __ipv6_addr_set_half(&addr->s6_addr32[2], w3, w4); |
1da177e4c Linux-2.6.12-rc2 |
425 |
} |
1da177e4c Linux-2.6.12-rc2 |
426 |
|
92113bfde ipv6: bool conver... |
427 428 |
static inline bool ipv6_addr_equal(const struct in6_addr *a1, const struct in6_addr *a2) |
1da177e4c Linux-2.6.12-rc2 |
429 |
{ |
1a203cb33 ipv6: optimize ip... |
430 431 432 433 434 435 |
#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64 const unsigned long *ul1 = (const unsigned long *)a1; const unsigned long *ul2 = (const unsigned long *)a2; return ((ul1[0] ^ ul2[0]) | (ul1[1] ^ ul2[1])) == 0UL; #else |
a02cec215 net: return opera... |
436 437 438 439 |
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; |
1a203cb33 ipv6: optimize ip... |
440 |
#endif |
1da177e4c Linux-2.6.12-rc2 |
441 |
} |
38675170e ipv6: 64bit versi... |
442 443 444 445 446 |
#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64 static inline bool __ipv6_prefix_equal64_half(const __be64 *a1, const __be64 *a2, unsigned int len) { |
512613d7d ipv6: fix ipv6_pr... |
447 |
if (len && ((*a1 ^ *a2) & cpu_to_be64((~0UL) << (64 - len)))) |
38675170e ipv6: 64bit versi... |
448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 |
return false; return true; } static inline bool ipv6_prefix_equal(const struct in6_addr *addr1, const struct in6_addr *addr2, unsigned int prefixlen) { const __be64 *a1 = (const __be64 *)addr1; const __be64 *a2 = (const __be64 *)addr2; if (prefixlen >= 64) { if (a1[0] ^ a2[0]) return false; return __ipv6_prefix_equal64_half(a1 + 1, a2 + 1, prefixlen - 64); } return __ipv6_prefix_equal64_half(a1, a2, prefixlen); } #else |
2ef973320 ipv6: Remove __ip... |
467 468 469 |
static inline bool ipv6_prefix_equal(const struct in6_addr *addr1, const struct in6_addr *addr2, unsigned int prefixlen) |
1da177e4c Linux-2.6.12-rc2 |
470 |
{ |
2ef973320 ipv6: Remove __ip... |
471 472 |
const __be32 *a1 = addr1->s6_addr32; const __be32 *a2 = addr2->s6_addr32; |
95c961747 net: cleanup unsi... |
473 |
unsigned int pdw, pbi; |
1da177e4c Linux-2.6.12-rc2 |
474 475 476 477 |
/* check complete u32 in prefix */ pdw = prefixlen >> 5; if (pdw && memcmp(a1, a2, pdw << 2)) |
92113bfde ipv6: bool conver... |
478 |
return false; |
1da177e4c Linux-2.6.12-rc2 |
479 480 481 482 |
/* check incomplete u32 in prefix */ pbi = prefixlen & 0x1f; if (pbi && ((a1[pdw] ^ a2[pdw]) & htonl((0xffffffff) << (32 - pbi)))) |
92113bfde ipv6: bool conver... |
483 |
return false; |
1da177e4c Linux-2.6.12-rc2 |
484 |
|
92113bfde ipv6: bool conver... |
485 |
return true; |
1da177e4c Linux-2.6.12-rc2 |
486 |
} |
38675170e ipv6: 64bit versi... |
487 |
#endif |
1da177e4c Linux-2.6.12-rc2 |
488 |
|
2588fe1d7 [INET]: Consolida... |
489 |
struct inet_frag_queue; |
2588fe1d7 [INET]: Consolida... |
490 |
|
0b5ccb2ee ipv6: reassembly:... |
491 492 493 |
enum ip6_defrag_users { IP6_DEFRAG_LOCAL_DELIVER, IP6_DEFRAG_CONNTRACK_IN, |
4be929be3 kernel-wide: repl... |
494 |
__IP6_DEFRAG_CONNTRACK_IN = IP6_DEFRAG_CONNTRACK_IN + USHRT_MAX, |
0b5ccb2ee ipv6: reassembly:... |
495 |
IP6_DEFRAG_CONNTRACK_OUT, |
4be929be3 kernel-wide: repl... |
496 |
__IP6_DEFRAG_CONNTRACK_OUT = IP6_DEFRAG_CONNTRACK_OUT + USHRT_MAX, |
8fa9ff684 netfilter: fix cr... |
497 |
IP6_DEFRAG_CONNTRACK_BRIDGE_IN, |
4be929be3 kernel-wide: repl... |
498 |
__IP6_DEFRAG_CONNTRACK_BRIDGE_IN = IP6_DEFRAG_CONNTRACK_BRIDGE_IN + USHRT_MAX, |
0b5ccb2ee ipv6: reassembly:... |
499 |
}; |
36c777821 inet: frag: const... |
500 |
void ip6_frag_init(struct inet_frag_queue *q, const void *a); |
9aee41eff inet: frags: use ... |
501 |
extern const struct rhashtable_params ip6_rhash_params; |
c6fda2822 [INET]: Consolida... |
502 |
|
b836c99fd ipv6: unify connt... |
503 504 505 506 507 |
/* * Equivalent of ipv4 struct ip */ struct frag_queue { struct inet_frag_queue q; |
b836c99fd ipv6: unify connt... |
508 509 510 |
int iif; unsigned int csum; __u16 nhoffset; |
eec2e6185 ipv6: implement R... |
511 |
u8 ecn; |
b836c99fd ipv6: unify connt... |
512 |
}; |
673220d64 inet: frags: add ... |
513 |
void ip6_expire_frag_queue(struct net *net, struct frag_queue *fq); |
b836c99fd ipv6: unify connt... |
514 |
|
92113bfde ipv6: bool conver... |
515 |
static inline bool ipv6_addr_any(const struct in6_addr *a) |
1da177e4c Linux-2.6.12-rc2 |
516 |
{ |
1a203cb33 ipv6: optimize ip... |
517 518 519 520 521 |
#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64 const unsigned long *ul = (const unsigned long *)a; return (ul[0] | ul[1]) == 0UL; #else |
a02cec215 net: return opera... |
522 523 |
return (a->s6_addr32[0] | a->s6_addr32[1] | a->s6_addr32[2] | a->s6_addr32[3]) == 0; |
1a203cb33 ipv6: optimize ip... |
524 |
#endif |
1da177e4c Linux-2.6.12-rc2 |
525 |
} |
ddbe50320 ipv6: add ipv6_ad... |
526 527 528 529 530 531 532 533 534 535 536 537 |
static inline u32 ipv6_addr_hash(const struct in6_addr *a) { #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64 const unsigned long *ul = (const unsigned long *)a; unsigned long x = ul[0] ^ ul[1]; return (u32)(x ^ (x >> 32)); #else return (__force u32)(a->s6_addr32[0] ^ a->s6_addr32[1] ^ a->s6_addr32[2] ^ a->s6_addr32[3]); #endif } |
08dcdbf6a ipv6: use a stron... |
538 |
/* more secured version of ipv6_addr_hash() */ |
b50026b5a ipv6: split inet6... |
539 |
static inline u32 __ipv6_addr_jhash(const struct in6_addr *a, const u32 initval) |
08dcdbf6a ipv6: use a stron... |
540 541 542 543 544 545 |
{ u32 v = (__force u32)a->s6_addr32[0] ^ (__force u32)a->s6_addr32[1]; return jhash_3words(v, (__force u32)a->s6_addr32[2], (__force u32)a->s6_addr32[3], |
b50026b5a ipv6: split inet6... |
546 |
initval); |
08dcdbf6a ipv6: use a stron... |
547 |
} |
92113bfde ipv6: bool conver... |
548 |
static inline bool ipv6_addr_loopback(const struct in6_addr *a) |
f630e43a2 ipv6: Drop packet... |
549 |
{ |
e287656b3 ipv6: 64bit versi... |
550 |
#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64 |
1373a7739 net: clean up som... |
551 |
const __be64 *be = (const __be64 *)a; |
e287656b3 ipv6: 64bit versi... |
552 |
|
1373a7739 net: clean up som... |
553 |
return (be[0] | (be[1] ^ cpu_to_be64(1))) == 0UL; |
e287656b3 ipv6: 64bit versi... |
554 |
#else |
a02cec215 net: return opera... |
555 |
return (a->s6_addr32[0] | a->s6_addr32[1] | |
1373a7739 net: clean up som... |
556 |
a->s6_addr32[2] | (a->s6_addr32[3] ^ cpu_to_be32(1))) == 0; |
e287656b3 ipv6: 64bit versi... |
557 |
#endif |
f630e43a2 ipv6: Drop packet... |
558 |
} |
1373a7739 net: clean up som... |
559 560 561 562 |
/* * Note that we must __force cast these to unsigned long to make sparse happy, * since all of the endian-annotated types are fixed size regardless of arch. */ |
92113bfde ipv6: bool conver... |
563 |
static inline bool ipv6_addr_v4mapped(const struct in6_addr *a) |
e773e4faa [IPV6]: Add v4map... |
564 |
{ |
a04d40b89 ipv6: 64bit versi... |
565 566 |
return ( #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64 |
1373a7739 net: clean up som... |
567 |
*(unsigned long *)a | |
a04d40b89 ipv6: 64bit versi... |
568 |
#else |
1373a7739 net: clean up som... |
569 |
(__force unsigned long)(a->s6_addr32[0] | a->s6_addr32[1]) | |
a04d40b89 ipv6: 64bit versi... |
570 |
#endif |
1373a7739 net: clean up som... |
571 572 |
(__force unsigned long)(a->s6_addr32[2] ^ cpu_to_be32(0x0000ffff))) == 0UL; |
e773e4faa [IPV6]: Add v4map... |
573 |
} |
1da177e4c Linux-2.6.12-rc2 |
574 |
/* |
99cd07a53 [IPV6]: Fix sourc... |
575 576 577 |
* Check for a RFC 4843 ORCHID address * (Overlay Routable Cryptographic Hash Identifiers) */ |
92113bfde ipv6: bool conver... |
578 |
static inline bool ipv6_addr_orchid(const struct in6_addr *a) |
99cd07a53 [IPV6]: Fix sourc... |
579 |
{ |
a02cec215 net: return opera... |
580 |
return (a->s6_addr32[0] & htonl(0xfffffff0)) == htonl(0x20010010); |
99cd07a53 [IPV6]: Fix sourc... |
581 |
} |
5c98631cc net: ipv6: Introd... |
582 583 584 585 |
static inline bool ipv6_addr_is_multicast(const struct in6_addr *addr) { return (addr->s6_addr32[0] & htonl(0xFF000000)) == htonl(0xFF000000); } |
f15364bd4 IPv6 support for ... |
586 587 588 589 590 591 592 593 |
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... |
594 |
/* |
971f359dd [IPV6]: Put addr_... |
595 596 597 |
* find the first different bit between two addresses * length of address must be a multiple of 32bits */ |
9f2e73345 ipv6: 64bit versi... |
598 |
static inline int __ipv6_addr_diff32(const void *token1, const void *token2, int addrlen) |
971f359dd [IPV6]: Put addr_... |
599 |
{ |
ef296f56f [IPV6]: __ipv6_ad... |
600 |
const __be32 *a1 = token1, *a2 = token2; |
971f359dd [IPV6]: Put addr_... |
601 602 603 604 605 |
int i; addrlen >>= 2; for (i = 0; i < addrlen; i++) { |
ef296f56f [IPV6]: __ipv6_ad... |
606 607 |
__be32 xb = a1[i] ^ a2[i]; if (xb) |
d57b8fb8a ipv6: Use __fls()... |
608 |
return i * 32 + 31 - __fls(ntohl(xb)); |
971f359dd [IPV6]: Put addr_... |
609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 |
} /* * 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... |
627 |
return addrlen << 5; |
971f359dd [IPV6]: Put addr_... |
628 |
} |
9f2e73345 ipv6: 64bit versi... |
629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 |
#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64 static inline int __ipv6_addr_diff64(const void *token1, const void *token2, int addrlen) { const __be64 *a1 = token1, *a2 = token2; int i; addrlen >>= 3; for (i = 0; i < addrlen; i++) { __be64 xb = a1[i] ^ a2[i]; if (xb) return i * 64 + 63 - __fls(be64_to_cpu(xb)); } return addrlen << 6; } #endif static inline int __ipv6_addr_diff(const void *token1, const void *token2, int addrlen) { #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64 if (__builtin_constant_p(addrlen) && !(addrlen & 7)) return __ipv6_addr_diff64(token1, token2, addrlen); #endif return __ipv6_addr_diff32(token1, token2, addrlen); } |
971f359dd [IPV6]: Put addr_... |
655 656 657 658 |
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)); } |
7f1598678 ipv6: ipv6_select... |
659 660 661 |
__be32 ipv6_select_ident(struct net *net, const struct in6_addr *daddr, const struct in6_addr *saddr); |
60335608e net: accept UFO d... |
662 |
__be32 ipv6_proxy_select_ident(struct net *net, struct sk_buff *skb); |
5188cd44c drivers/net, ipv6... |
663 |
|
5c3a0fd7d ip*.h: Remove ext... |
664 |
int ip6_dst_hoplimit(struct dst_entry *dst); |
3ce9b35ff ipv6: move ip6_ds... |
665 |
|
5c98631cc net: ipv6: Introd... |
666 667 668 669 670 671 672 673 674 675 676 677 678 |
static inline int ip6_sk_dst_hoplimit(struct ipv6_pinfo *np, struct flowi6 *fl6, struct dst_entry *dst) { int hlimit; if (ipv6_addr_is_multicast(&fl6->daddr)) hlimit = np->mcast_hops; else hlimit = np->hop_limit; if (hlimit < 0) hlimit = ip6_dst_hoplimit(dst); return hlimit; } |
c3f832418 net: Add full IPv... |
679 680 681 682 683 684 685 686 687 688 689 690 691 |
/* copy IPv6 saddr & daddr to flow_keys, possibly using 64bit load/store * Equivalent to : flow->v6addrs.src = iph->saddr; * flow->v6addrs.dst = iph->daddr; */ static inline void iph_to_flow_copy_v6addrs(struct flow_keys *flow, const struct ipv6hdr *iph) { BUILD_BUG_ON(offsetof(typeof(flow->addrs), v6addrs.dst) != offsetof(typeof(flow->addrs), v6addrs.src) + sizeof(flow->addrs.v6addrs.src)); memcpy(&flow->addrs.v6addrs, &iph->saddr, sizeof(flow->addrs.v6addrs)); flow->control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS; } |
a37934fc0 net: provide stub... |
692 |
#if IS_ENABLED(CONFIG_IPV6) |
42240901f ipv6: Implement d... |
693 694 695 696 697 698 699 700 |
/* Sysctl settings for net ipv6.auto_flowlabels */ #define IP6_AUTO_FLOW_LABEL_OFF 0 #define IP6_AUTO_FLOW_LABEL_OPTOUT 1 #define IP6_AUTO_FLOW_LABEL_OPTIN 2 #define IP6_AUTO_FLOW_LABEL_FORCED 3 #define IP6_AUTO_FLOW_LABEL_MAX IP6_AUTO_FLOW_LABEL_FORCED |
b56774163 ipv6: Enable auto... |
701 |
#define IP6_DEFAULT_AUTO_FLOW_LABELS IP6_AUTO_FLOW_LABEL_OPTOUT |
42240901f ipv6: Implement d... |
702 |
|
cb1ce2ef3 ipv6: Implement a... |
703 |
static inline __be32 ip6_make_flowlabel(struct net *net, struct sk_buff *skb, |
67800f9b1 ipv6: Call skb_ge... |
704 705 |
__be32 flowlabel, bool autolabel, struct flowi6 *fl6) |
cb1ce2ef3 ipv6: Implement a... |
706 |
{ |
42240901f ipv6: Implement d... |
707 |
u32 hash; |
cb1ce2ef3 ipv6: Implement a... |
708 |
|
90427ef5d ipv6: fix flow la... |
709 710 711 712 |
/* @flowlabel may include more than a flow label, eg, the traffic class. * Here we want only the flow label value. */ flowlabel &= IPV6_FLOWLABEL_MASK; |
42240901f ipv6: Implement d... |
713 714 715 716 717 |
if (flowlabel || net->ipv6.sysctl.auto_flowlabels == IP6_AUTO_FLOW_LABEL_OFF || (!autolabel && net->ipv6.sysctl.auto_flowlabels != IP6_AUTO_FLOW_LABEL_FORCED)) return flowlabel; |
cb1ce2ef3 ipv6: Implement a... |
718 |
|
42240901f ipv6: Implement d... |
719 |
hash = skb_get_hash_flowi6(skb, fl6); |
cb1ce2ef3 ipv6: Implement a... |
720 |
|
42240901f ipv6: Implement d... |
721 722 723 724 |
/* Since this is being sent on the wire obfuscate hash a bit * to minimize possbility that any useful information to an * attacker is leaked. Only lower 20 bits are relevant. */ |
a5d33d38b ipv6: fix useless... |
725 |
hash = rol32(hash, 16); |
82a584b7c ipv6: Flow label ... |
726 |
|
42240901f ipv6: Implement d... |
727 728 729 730 |
flowlabel = (__force __be32)hash & IPV6_FLOWLABEL_MASK; if (net->ipv6.sysctl.flowlabel_state_ranges) flowlabel |= IPV6_FLOWLABEL_STATELESS_FLAG; |
cb1ce2ef3 ipv6: Implement a... |
731 732 733 |
return flowlabel; } |
42240901f ipv6: Implement d... |
734 735 736 737 738 739 740 741 742 743 744 745 746 |
static inline int ip6_default_np_autolabel(struct net *net) { switch (net->ipv6.sysctl.auto_flowlabels) { case IP6_AUTO_FLOW_LABEL_OFF: case IP6_AUTO_FLOW_LABEL_OPTIN: default: return 0; case IP6_AUTO_FLOW_LABEL_OPTOUT: case IP6_AUTO_FLOW_LABEL_FORCED: return 1; } } |
a37934fc0 net: provide stub... |
747 748 749 |
#else static inline void ip6_set_txhash(struct sock *sk) { } static inline __be32 ip6_make_flowlabel(struct net *net, struct sk_buff *skb, |
42240901f ipv6: Implement d... |
750 751 |
__be32 flowlabel, bool autolabel, struct flowi6 *fl6) |
a37934fc0 net: provide stub... |
752 753 754 |
{ return flowlabel; } |
42240901f ipv6: Implement d... |
755 756 757 758 |
static inline int ip6_default_np_autolabel(struct net *net) { return 0; } |
a37934fc0 net: provide stub... |
759 |
#endif |
cb1ce2ef3 ipv6: Implement a... |
760 |
|
971f359dd [IPV6]: Put addr_... |
761 |
/* |
3e4e4c1f2 ipv6: Introduce i... |
762 763 764 765 766 |
* Header manipulation */ static inline void ip6_flow_hdr(struct ipv6hdr *hdr, unsigned int tclass, __be32 flowlabel) { |
07f623d3b ipv6: Fix endiane... |
767 |
*(__be32 *)hdr = htonl(0x60000000 | (tclass << 20)) | flowlabel; |
3e4e4c1f2 ipv6: Introduce i... |
768 |
} |
6502ca527 ipv6: Introduce i... |
769 770 771 772 |
static inline __be32 ip6_flowinfo(const struct ipv6hdr *hdr) { return *(__be32 *)hdr & IPV6_FLOWINFO_MASK; } |
3308de2b8 ipv6: add ip6_flo... |
773 774 775 776 |
static inline __be32 ip6_flowlabel(const struct ipv6hdr *hdr) { return *(__be32 *)hdr & IPV6_FLOWLABEL_MASK; } |
d76ed22b2 ipv6: move IPV6_T... |
777 778 779 780 |
static inline u8 ip6_tclass(__be32 flowinfo) { return ntohl(flowinfo & IPV6_TCLASS_MASK) >> IPV6_TCLASS_SHIFT; } |
eaa93bf4c vxlan: fix popula... |
781 782 783 784 785 |
static inline __be32 ip6_make_flowinfo(unsigned int tclass, __be32 flowlabel) { return htonl(tclass << IPV6_TCLASS_SHIFT) | flowlabel; } |
3f8f52c5f ipv6: omit traffi... |
786 787 788 789 |
static inline __be32 flowi6_get_flowlabel(const struct flowi6 *fl6) { return fl6->flowlabel & IPV6_FLOWLABEL_MASK; } |
3e4e4c1f2 ipv6: Introduce i... |
790 |
/* |
1da177e4c Linux-2.6.12-rc2 |
791 792 793 794 795 796 |
* Prototypes exported by ipv6 */ /* * rcv function (called from netdevice level) */ |
5c3a0fd7d ip*.h: Remove ext... |
797 798 |
int ipv6_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev); |
1da177e4c Linux-2.6.12-rc2 |
799 |
|
0c4b51f00 netfilter: Pass n... |
800 |
int ip6_rcv_finish(struct net *net, struct sock *sk, struct sk_buff *skb); |
b05e10669 [IPV4/6]: Netfilt... |
801 |
|
1da177e4c Linux-2.6.12-rc2 |
802 803 804 |
/* * upper-layer output functions */ |
1c1e9d2b6 ipv6: constify ip... |
805 |
int ip6_xmit(const struct sock *sk, struct sk_buff *skb, struct flowi6 *fl6, |
92e55f412 tcp: don't annota... |
806 |
__u32 mark, struct ipv6_txoptions *opt, int tclass); |
5c3a0fd7d ip*.h: Remove ext... |
807 808 809 810 811 812 |
int ip6_find_1stfragopt(struct sk_buff *skb, u8 **nexthdr); int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb), |
26879da58 ipv6: add new str... |
813 814 815 |
void *from, int length, int transhdrlen, struct ipcm6_cookie *ipc6, struct flowi6 *fl6, struct rt6_info *rt, unsigned int flags, |
c14ac9451 sock: enable time... |
816 |
const struct sockcm_cookie *sockc); |
5c3a0fd7d ip*.h: Remove ext... |
817 818 819 820 |
int ip6_push_pending_frames(struct sock *sk); void ip6_flush_pending_frames(struct sock *sk); |
6422398c2 ipv6: introduce i... |
821 822 823 824 825 826 827 828 829 |
int ip6_send_skb(struct sk_buff *skb); struct sk_buff *__ip6_make_skb(struct sock *sk, struct sk_buff_head *queue, struct inet_cork_full *cork, struct inet6_cork *v6_cork); struct sk_buff *ip6_make_skb(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, |
26879da58 ipv6: add new str... |
830 831 |
struct ipcm6_cookie *ipc6, struct flowi6 *fl6, struct rt6_info *rt, unsigned int flags, |
c14ac9451 sock: enable time... |
832 |
const struct sockcm_cookie *sockc); |
6422398c2 ipv6: introduce i... |
833 834 835 836 837 838 |
static inline struct sk_buff *ip6_finish_skb(struct sock *sk) { return __ip6_make_skb(sk, &sk->sk_write_queue, &inet_sk(sk)->cork, &inet6_sk(sk)->cork); } |
343d60aad ipv6: change ipv6... |
839 840 |
int ip6_dst_lookup(struct net *net, struct sock *sk, struct dst_entry **dst, struct flowi6 *fl6); |
3aef934f4 ipv6: constify ip... |
841 |
struct dst_entry *ip6_dst_lookup_flow(const struct sock *sk, struct flowi6 *fl6, |
0e0d44ab4 net: Remove FLOWI... |
842 |
const struct in6_addr *final_dst); |
5c3a0fd7d ip*.h: Remove ext... |
843 |
struct dst_entry *ip6_sk_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6, |
0e0d44ab4 net: Remove FLOWI... |
844 |
const struct in6_addr *final_dst); |
5c3a0fd7d ip*.h: Remove ext... |
845 846 |
struct dst_entry *ip6_blackhole_route(struct net *net, struct dst_entry *orig_dst); |
1da177e4c Linux-2.6.12-rc2 |
847 848 849 850 |
/* * skb processing functions */ |
ede2059db dst: Pass net int... |
851 |
int ip6_output(struct net *net, struct sock *sk, struct sk_buff *skb); |
5c3a0fd7d ip*.h: Remove ext... |
852 853 854 |
int ip6_forward(struct sk_buff *skb); int ip6_input(struct sk_buff *skb); int ip6_mc_input(struct sk_buff *skb); |
1da177e4c Linux-2.6.12-rc2 |
855 |
|
cf91a99da ipv4, ipv6: Pass ... |
856 |
int __ip6_local_out(struct net *net, struct sock *sk, struct sk_buff *skb); |
33224b16f ipv4, ipv6: Pass ... |
857 |
int ip6_local_out(struct net *net, struct sock *sk, struct sk_buff *skb); |
ef76bc23e [IPV6]: Add ip6_l... |
858 |
|
1da177e4c Linux-2.6.12-rc2 |
859 860 861 |
/* * Extension header (options) processing */ |
5c3a0fd7d ip*.h: Remove ext... |
862 |
void ipv6_push_nfrag_opts(struct sk_buff *skb, struct ipv6_txoptions *opt, |
613fa3ca9 ipv6: add source ... |
863 864 |
u8 *proto, struct in6_addr **daddr_p, struct in6_addr *saddr); |
5c3a0fd7d ip*.h: Remove ext... |
865 866 |
void ipv6_push_frag_opts(struct sk_buff *skb, struct ipv6_txoptions *opt, u8 *proto); |
1da177e4c Linux-2.6.12-rc2 |
867 |
|
5c3a0fd7d ip*.h: Remove ext... |
868 869 |
int ipv6_skip_exthdr(const struct sk_buff *, int start, u8 *nexthdrp, __be16 *frag_offp); |
1da177e4c Linux-2.6.12-rc2 |
870 |
|
5c3a0fd7d ip*.h: Remove ext... |
871 |
bool ipv6_ext_hdr(u8 nexthdr); |
1da177e4c Linux-2.6.12-rc2 |
872 |
|
f8f626754 ipv6: Move ipv6_f... |
873 |
enum { |
9195bb8e3 ipv6: improve ipv... |
874 875 876 |
IP6_FH_F_FRAG = (1 << 0), IP6_FH_F_AUTH = (1 << 1), IP6_FH_F_SKIP_RH = (1 << 2), |
f8f626754 ipv6: Move ipv6_f... |
877 878 879 |
}; /* find specified header and get offset to it */ |
5c3a0fd7d ip*.h: Remove ext... |
880 881 |
int ipv6_find_hdr(const struct sk_buff *skb, unsigned int *offset, int target, unsigned short *fragoff, int *fragflg); |
f8f626754 ipv6: Move ipv6_f... |
882 |
|
0868383b8 ipv6: constify th... |
883 |
int ipv6_find_tlv(const struct sk_buff *skb, int offset, int type); |
c61a40432 [IPV6]: Find opti... |
884 |
|
5c3a0fd7d ip*.h: Remove ext... |
885 886 887 |
struct in6_addr *fl6_update_dst(struct flowi6 *fl6, const struct ipv6_txoptions *opt, struct in6_addr *orig); |
20c59de2e ipv6: Refactor up... |
888 |
|
1da177e4c Linux-2.6.12-rc2 |
889 890 891 |
/* * socket options (ipv6_sockglue.c) */ |
5c3a0fd7d ip*.h: Remove ext... |
892 893 894 895 896 897 898 899 |
int ipv6_setsockopt(struct sock *sk, int level, int optname, char __user *optval, unsigned int optlen); int ipv6_getsockopt(struct sock *sk, int level, int optname, char __user *optval, int __user *optlen); int compat_ipv6_setsockopt(struct sock *sk, int level, int optname, char __user *optval, unsigned int optlen); int compat_ipv6_getsockopt(struct sock *sk, int level, int optname, char __user *optval, int __user *optlen); |
0382a25af l2tp: lock socket... |
900 901 |
int __ip6_datagram_connect(struct sock *sk, struct sockaddr *addr, int addr_len); |
5c3a0fd7d ip*.h: Remove ext... |
902 |
int ip6_datagram_connect(struct sock *sk, struct sockaddr *addr, int addr_len); |
82b276cd2 ipv6: protect pro... |
903 904 |
int ip6_datagram_connect_v6_only(struct sock *sk, struct sockaddr *addr, int addr_len); |
33c162a98 ipv6: datagram: U... |
905 |
int ip6_datagram_dst_update(struct sock *sk, bool fix_sk_saddr); |
e646b657f ipv6: udp: Do a r... |
906 |
void ip6_datagram_release_cb(struct sock *sk); |
5c3a0fd7d ip*.h: Remove ext... |
907 |
|
85fbaa750 inet: fix addr_le... |
908 909 910 911 |
int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len); int ipv6_recv_rxpmtu(struct sock *sk, struct msghdr *msg, int len, int *addr_len); |
5c3a0fd7d ip*.h: Remove ext... |
912 913 914 915 916 917 918 919 920 921 922 923 |
void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err, __be16 port, u32 info, u8 *payload); void ipv6_local_error(struct sock *sk, int err, struct flowi6 *fl6, u32 info); void ipv6_local_rxpmtu(struct sock *sk, struct flowi6 *fl6, u32 mtu); int inet6_release(struct socket *sock); int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len); int inet6_getname(struct socket *sock, struct sockaddr *uaddr, int *uaddr_len, int peer); int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); int inet6_hash_connect(struct inet_timewait_death_row *death_row, |
d8313f5ca [INET6]: Generali... |
924 |
struct sock *sk); |
1da177e4c Linux-2.6.12-rc2 |
925 926 927 |
/* * reassembly.c */ |
90ddc4f04 [NET]: move struc... |
928 929 |
extern const struct proto_ops inet6_stream_ops; extern const struct proto_ops inet6_dgram_ops; |
77d4b1d36 net: ping: do not... |
930 |
extern const struct proto_ops inet6_sockraw_ops; |
20380731b [NET]: Fix sparse... |
931 |
|
14c850212 [INET_SOCK]: Move... |
932 933 |
struct group_source_req; struct group_filter; |
5c3a0fd7d ip*.h: Remove ext... |
934 935 936 937 938 |
int ip6_mc_source(int add, int omode, struct sock *sk, struct group_source_req *pgsr); int ip6_mc_msfilter(struct sock *sk, struct group_filter *gsf); int ip6_mc_msfget(struct sock *sk, struct group_filter *gsf, struct group_filter __user *optval, int __user *optlen); |
20380731b [NET]: Fix sparse... |
939 940 |
#ifdef CONFIG_PROC_FS |
5c3a0fd7d ip*.h: Remove ext... |
941 942 943 944 945 946 947 948 949 950 951 952 953 954 |
int ac6_proc_init(struct net *net); void ac6_proc_exit(struct net *net); int raw6_proc_init(void); void raw6_proc_exit(void); int tcp6_proc_init(struct net *net); void tcp6_proc_exit(struct net *net); int udp6_proc_init(struct net *net); void udp6_proc_exit(struct net *net); int udplite6_proc_init(void); void udplite6_proc_exit(void); int ipv6_misc_proc_init(void); void ipv6_misc_proc_exit(void); int snmp6_register_dev(struct inet6_dev *idev); int snmp6_unregister_dev(struct inet6_dev *idev); |
20380731b [NET]: Fix sparse... |
955 |
|
7f7d9a6b9 [IPV6]: Consolida... |
956 |
#else |
6ab57e7e7 [NETNS][IPV6] any... |
957 958 959 960 |
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... |
961 |
#endif |
1da177e4c Linux-2.6.12-rc2 |
962 |
|
20380731b [NET]: Fix sparse... |
963 |
#ifdef CONFIG_SYSCTL |
9e8cda3ba ipv6: Convert use... |
964 |
extern struct ctl_table ipv6_route_table_template[]; |
1da177e4c Linux-2.6.12-rc2 |
965 |
|
5c3a0fd7d ip*.h: Remove ext... |
966 967 968 969 |
struct ctl_table *ipv6_icmp_sysctl_init(struct net *net); struct ctl_table *ipv6_route_sysctl_init(struct net *net); int ipv6_sysctl_register(void); void ipv6_sysctl_unregister(void); |
20380731b [NET]: Fix sparse... |
970 |
#endif |
1da177e4c Linux-2.6.12-rc2 |
971 |
|
46a4dee07 igmp v6: add __ip... |
972 973 |
int ipv6_sock_mc_join(struct sock *sk, int ifindex, const struct in6_addr *addr); |
46a4dee07 igmp v6: add __ip... |
974 975 |
int ipv6_sock_mc_drop(struct sock *sk, int ifindex, const struct in6_addr *addr); |
20380731b [NET]: Fix sparse... |
976 |
#endif /* _NET_IPV6_H */ |