Blame view
include/net/addrconf.h
7.79 KB
1da177e4c
|
1 2 |
#ifndef _ADDRCONF_H #define _ADDRCONF_H |
1da177e4c
|
3 4 5 6 7 8 9 |
#define MAX_RTR_SOLICITATIONS 3 #define RTR_SOLICITATION_INTERVAL (4*HZ) #define MIN_VALID_LIFETIME (2*3600) /* 2 hours */ #define TEMP_VALID_LIFETIME (7*86400) #define TEMP_PREFERRED_LIFETIME (86400) |
76f793e3a
|
10 |
#define REGEN_MAX_RETRY (3) |
1da177e4c
|
11 12 13 14 15 |
#define MAX_DESYNC_FACTOR (600) #define ADDR_CHECK_FREQUENCY (120*HZ) #define IPV6_MAX_ADDRESSES 16 |
c7dc89c0a
|
16 |
#include <linux/in.h> |
6a800d456
|
17 |
#include <linux/in6.h> |
1da177e4c
|
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
struct prefix_info { __u8 type; __u8 length; __u8 prefix_len; #if defined(__BIG_ENDIAN_BITFIELD) __u8 onlink : 1, autoconf : 1, reserved : 6; #elif defined(__LITTLE_ENDIAN_BITFIELD) __u8 reserved : 6, autoconf : 1, onlink : 1; #else #error "Please fix <asm/byteorder.h>" #endif |
e69a4adc6
|
34 35 36 |
__be32 valid; __be32 prefered; __be32 reserved2; |
1da177e4c
|
37 38 39 |
struct in6_addr prefix; }; |
1da177e4c
|
40 41 |
#include <linux/netdevice.h> #include <net/if_inet6.h> |
e4553edda
|
42 |
#include <net/ipv6.h> |
1da177e4c
|
43 44 45 46 47 |
#define IN6_ADDR_HSIZE 16 extern int addrconf_init(void); extern void addrconf_cleanup(void); |
af2849377
|
48 49 50 51 52 53 |
extern int addrconf_add_ifaddr(struct net *net, void __user *arg); extern int addrconf_del_ifaddr(struct net *net, void __user *arg); extern int addrconf_set_dstaddr(struct net *net, void __user *arg); |
1da177e4c
|
54 |
|
bfeade087
|
55 |
extern int ipv6_chk_addr(struct net *net, |
b71d1d426
|
56 |
const struct in6_addr *addr, |
1da177e4c
|
57 58 |
struct net_device *dev, int strict); |
bfeade087
|
59 |
|
59fbb3a61
|
60 |
#if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) |
389f66122
|
61 |
extern int ipv6_chk_home_addr(struct net *net, |
b71d1d426
|
62 |
const struct in6_addr *addr); |
65d4ed922
|
63 |
#endif |
52eeeb848
|
64 |
|
b71d1d426
|
65 |
extern int ipv6_chk_prefix(const struct in6_addr *addr, |
52eeeb848
|
66 |
struct net_device *dev); |
1cab3da6b
|
67 |
extern struct inet6_ifaddr *ipv6_get_ifaddr(struct net *net, |
9acd9f3ae
|
68 |
const struct in6_addr *addr, |
1cab3da6b
|
69 70 |
struct net_device *dev, int strict); |
191cd5825
|
71 72 |
extern int ipv6_dev_get_saddr(struct net *net, struct net_device *dev, |
9acd9f3ae
|
73 |
const struct in6_addr *daddr, |
7cbca67c0
|
74 |
unsigned int srcprefs, |
1da177e4c
|
75 |
struct in6_addr *saddr); |
95c385b4d
|
76 77 78 |
extern int ipv6_get_lladdr(struct net_device *dev, struct in6_addr *addr, unsigned char banned_flags); |
b2f5e7cd3
|
79 80 |
extern int ipv6_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2); |
1da177e4c
|
81 |
extern void addrconf_join_solict(struct net_device *dev, |
b71d1d426
|
82 |
const struct in6_addr *addr); |
1da177e4c
|
83 |
extern void addrconf_leave_solict(struct inet6_dev *idev, |
b71d1d426
|
84 |
const struct in6_addr *addr); |
1da177e4c
|
85 |
|
4bed72e4f
|
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
static inline unsigned long addrconf_timeout_fixup(u32 timeout, unsigned unit) { if (timeout == 0xffffffff) return ~0UL; /* * Avoid arithmetic overflow. * Assuming unit is constant and non-zero, this "if" statement * will go away on 64bit archs. */ if (0xfffffffe > LONG_MAX / unit && timeout > LONG_MAX / unit) return LONG_MAX / unit; return timeout; } static inline int addrconf_finite_timeout(unsigned long timeout) { return ~timeout; } |
1da177e4c
|
107 |
/* |
2a8cc6c89
|
108 109 110 |
* IPv6 Address Label subsystem (addrlabel.c) */ extern int ipv6_addr_label_init(void); |
2cc6d2bf3
|
111 |
extern void ipv6_addr_label_cleanup(void); |
2a8cc6c89
|
112 |
extern void ipv6_addr_label_rtnl_register(void); |
3de232554
|
113 114 |
extern u32 ipv6_addr_label(struct net *net, const struct in6_addr *addr, |
2a8cc6c89
|
115 116 117 |
int type, int ifindex); /* |
1da177e4c
|
118 119 |
* multicast prototypes (mcast.c) */ |
9acd9f3ae
|
120 121 122 123 |
extern int ipv6_sock_mc_join(struct sock *sk, int ifindex, const struct in6_addr *addr); extern int ipv6_sock_mc_drop(struct sock *sk, int ifindex, const struct in6_addr *addr); |
1da177e4c
|
124 |
extern void ipv6_sock_mc_close(struct sock *sk); |
9acd9f3ae
|
125 126 127 |
extern int inet6_mc_check(struct sock *sk, const struct in6_addr *mc_addr, const struct in6_addr *src_addr); |
1da177e4c
|
128 |
|
9acd9f3ae
|
129 130 131 |
extern int ipv6_dev_mc_inc(struct net_device *dev, const struct in6_addr *addr); extern int __ipv6_dev_mc_dec(struct inet6_dev *idev, const struct in6_addr *addr); extern int ipv6_dev_mc_dec(struct net_device *dev, const struct in6_addr *addr); |
1da177e4c
|
132 133 |
extern void ipv6_mc_up(struct inet6_dev *idev); extern void ipv6_mc_down(struct inet6_dev *idev); |
75c78500d
|
134 135 |
extern void ipv6_mc_unmap(struct inet6_dev *idev); extern void ipv6_mc_remap(struct inet6_dev *idev); |
1da177e4c
|
136 137 138 |
extern void ipv6_mc_init_dev(struct inet6_dev *idev); extern void ipv6_mc_destroy_dev(struct inet6_dev *idev); extern void addrconf_dad_failure(struct inet6_ifaddr *ifp); |
9acd9f3ae
|
139 140 141 |
extern int ipv6_chk_mcast_addr(struct net_device *dev, const struct in6_addr *group, const struct in6_addr *src_addr); |
1da177e4c
|
142 |
extern int ipv6_is_mld(struct sk_buff *skb, int nexthdr); |
e6bff995f
|
143 144 |
extern void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len, bool sllao); |
1da177e4c
|
145 |
|
1da177e4c
|
146 147 148 |
/* * anycast prototypes (anycast.c) */ |
b71d1d426
|
149 150 |
extern int ipv6_sock_ac_join(struct sock *sk,int ifindex, const struct in6_addr *addr); extern int ipv6_sock_ac_drop(struct sock *sk,int ifindex, const struct in6_addr *addr); |
1da177e4c
|
151 |
extern void ipv6_sock_ac_close(struct sock *sk); |
b71d1d426
|
152 |
extern int inet6_ac_check(struct sock *sk, const struct in6_addr *addr, int ifindex); |
1da177e4c
|
153 |
|
b71d1d426
|
154 155 |
extern int ipv6_dev_ac_inc(struct net_device *dev, const struct in6_addr *addr); extern int __ipv6_dev_ac_dec(struct inet6_dev *idev, const struct in6_addr *addr); |
6ab57e7e7
|
156 |
extern int ipv6_chk_acast_addr(struct net *net, struct net_device *dev, |
b71d1d426
|
157 |
const struct in6_addr *addr); |
1da177e4c
|
158 159 160 161 162 |
/* Device notifier */ extern int register_inet6addr_notifier(struct notifier_block *nb); extern int unregister_inet6addr_notifier(struct notifier_block *nb); |
48daa3bb8
|
163 164 165 166 167 168 169 170 |
/** * __in6_dev_get - get inet6_dev pointer from netdevice * @dev: network device * * Caller must hold rcu_read_lock or RTNL, because this function * does not take a reference on the inet6_dev. */ static inline struct inet6_dev *__in6_dev_get(const struct net_device *dev) |
1da177e4c
|
171 |
{ |
48daa3bb8
|
172 |
return rcu_dereference_rtnl(dev->ip6_ptr); |
1da177e4c
|
173 |
} |
48daa3bb8
|
174 175 176 177 178 179 180 181 182 |
/** * in6_dev_get - get inet6_dev pointer from netdevice * @dev: network device * * This version can be used in any context, and takes a reference * on the inet6_dev. Callers must use in6_dev_put() later to * release this reference. */ static inline struct inet6_dev *in6_dev_get(const struct net_device *dev) |
1da177e4c
|
183 |
{ |
48daa3bb8
|
184 |
struct inet6_dev *idev; |
8814c4b53
|
185 |
rcu_read_lock(); |
48daa3bb8
|
186 |
idev = rcu_dereference(dev->ip6_ptr); |
1da177e4c
|
187 188 |
if (idev) atomic_inc(&idev->refcnt); |
8814c4b53
|
189 |
rcu_read_unlock(); |
1da177e4c
|
190 191 192 193 |
return idev; } extern void in6_dev_finish_destroy(struct inet6_dev *idev); |
48daa3bb8
|
194 |
static inline void in6_dev_put(struct inet6_dev *idev) |
1da177e4c
|
195 196 197 198 |
{ if (atomic_dec_and_test(&idev->refcnt)) in6_dev_finish_destroy(idev); } |
48daa3bb8
|
199 200 201 202 |
static inline void __in6_dev_put(struct inet6_dev *idev) { atomic_dec(&idev->refcnt); } |
1da177e4c
|
203 |
|
48daa3bb8
|
204 205 206 207 |
static inline void in6_dev_hold(struct inet6_dev *idev) { atomic_inc(&idev->refcnt); } |
1da177e4c
|
208 209 210 211 212 213 214 215 |
extern void inet6_ifa_finish_destroy(struct inet6_ifaddr *ifp); static inline void in6_ifa_put(struct inet6_ifaddr *ifp) { if (atomic_dec_and_test(&ifp->refcnt)) inet6_ifa_finish_destroy(ifp); } |
48daa3bb8
|
216 217 218 219 |
static inline void __in6_ifa_put(struct inet6_ifaddr *ifp) { atomic_dec(&ifp->refcnt); } |
1da177e4c
|
220 |
|
48daa3bb8
|
221 222 223 224 |
static inline void in6_ifa_hold(struct inet6_ifaddr *ifp) { atomic_inc(&ifp->refcnt); } |
1da177e4c
|
225 |
|
1da177e4c
|
226 227 228 229 230 231 232 233 234 |
/* * compute link-local solicited-node multicast address */ static inline void addrconf_addr_solict_mult(const struct in6_addr *addr, struct in6_addr *solicited) { ipv6_addr_set(solicited, |
0e7b8dcd1
|
235 236 237 |
htonl(0xFF020000), 0, htonl(0x1), htonl(0xFF000000) | addr->s6_addr32[3]); |
1da177e4c
|
238 |
} |
1da177e4c
|
239 240 |
static inline int ipv6_addr_is_multicast(const struct in6_addr *addr) { |
0e7b8dcd1
|
241 |
return (addr->s6_addr32[0] & htonl(0xFF000000)) == htonl(0xFF000000); |
1da177e4c
|
242 243 244 245 |
} static inline int ipv6_addr_is_ll_all_nodes(const struct in6_addr *addr) { |
48daa3bb8
|
246 |
return ((addr->s6_addr32[0] ^ htonl(0xff020000)) | |
fed85383a
|
247 |
addr->s6_addr32[1] | addr->s6_addr32[2] | |
48daa3bb8
|
248 |
(addr->s6_addr32[3] ^ htonl(0x00000001))) == 0; |
1da177e4c
|
249 250 251 252 |
} static inline int ipv6_addr_is_ll_all_routers(const struct in6_addr *addr) { |
48daa3bb8
|
253 |
return ((addr->s6_addr32[0] ^ htonl(0xff020000)) | |
fed85383a
|
254 |
addr->s6_addr32[1] | addr->s6_addr32[2] | |
48daa3bb8
|
255 |
(addr->s6_addr32[3] ^ htonl(0x00000002))) == 0; |
1da177e4c
|
256 |
} |
c7dc89c0a
|
257 258 |
static inline int ipv6_addr_is_isatap(const struct in6_addr *addr) { |
48daa3bb8
|
259 |
return (addr->s6_addr32[2] | htonl(0x02000000)) == htonl(0x02005EFE); |
c7dc89c0a
|
260 |
} |
20380731b
|
261 262 263 264 |
#ifdef CONFIG_PROC_FS extern int if6_proc_init(void); extern void if6_proc_exit(void); #endif |
1da177e4c
|
265 |
#endif |