diff options
Diffstat (limited to 'net/ipv6/addrconf.c')
-rw-r--r-- | net/ipv6/addrconf.c | 68 |
1 files changed, 0 insertions, 68 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 569a37d698f7..524bffe62499 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -211,74 +211,6 @@ const struct in6_addr in6addr_any = IN6ADDR_ANY_INIT; | |||
211 | #endif | 211 | #endif |
212 | const struct in6_addr in6addr_loopback = IN6ADDR_LOOPBACK_INIT; | 212 | const struct in6_addr in6addr_loopback = IN6ADDR_LOOPBACK_INIT; |
213 | 213 | ||
214 | #define IPV6_ADDR_SCOPE_TYPE(scope) ((scope) << 16) | ||
215 | |||
216 | static inline unsigned ipv6_addr_scope2type(unsigned scope) | ||
217 | { | ||
218 | switch(scope) { | ||
219 | case IPV6_ADDR_SCOPE_NODELOCAL: | ||
220 | return (IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_NODELOCAL) | | ||
221 | IPV6_ADDR_LOOPBACK); | ||
222 | case IPV6_ADDR_SCOPE_LINKLOCAL: | ||
223 | return (IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_LINKLOCAL) | | ||
224 | IPV6_ADDR_LINKLOCAL); | ||
225 | case IPV6_ADDR_SCOPE_SITELOCAL: | ||
226 | return (IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_SITELOCAL) | | ||
227 | IPV6_ADDR_SITELOCAL); | ||
228 | } | ||
229 | return IPV6_ADDR_SCOPE_TYPE(scope); | ||
230 | } | ||
231 | |||
232 | int __ipv6_addr_type(const struct in6_addr *addr) | ||
233 | { | ||
234 | __be32 st; | ||
235 | |||
236 | st = addr->s6_addr32[0]; | ||
237 | |||
238 | /* Consider all addresses with the first three bits different of | ||
239 | 000 and 111 as unicasts. | ||
240 | */ | ||
241 | if ((st & htonl(0xE0000000)) != htonl(0x00000000) && | ||
242 | (st & htonl(0xE0000000)) != htonl(0xE0000000)) | ||
243 | return (IPV6_ADDR_UNICAST | | ||
244 | IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_GLOBAL)); | ||
245 | |||
246 | if ((st & htonl(0xFF000000)) == htonl(0xFF000000)) { | ||
247 | /* multicast */ | ||
248 | /* addr-select 3.1 */ | ||
249 | return (IPV6_ADDR_MULTICAST | | ||
250 | ipv6_addr_scope2type(IPV6_ADDR_MC_SCOPE(addr))); | ||
251 | } | ||
252 | |||
253 | if ((st & htonl(0xFFC00000)) == htonl(0xFE800000)) | ||
254 | return (IPV6_ADDR_LINKLOCAL | IPV6_ADDR_UNICAST | | ||
255 | IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_LINKLOCAL)); /* addr-select 3.1 */ | ||
256 | if ((st & htonl(0xFFC00000)) == htonl(0xFEC00000)) | ||
257 | return (IPV6_ADDR_SITELOCAL | IPV6_ADDR_UNICAST | | ||
258 | IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_SITELOCAL)); /* addr-select 3.1 */ | ||
259 | |||
260 | if ((addr->s6_addr32[0] | addr->s6_addr32[1]) == 0) { | ||
261 | if (addr->s6_addr32[2] == 0) { | ||
262 | if (addr->s6_addr32[3] == 0) | ||
263 | return IPV6_ADDR_ANY; | ||
264 | |||
265 | if (addr->s6_addr32[3] == htonl(0x00000001)) | ||
266 | return (IPV6_ADDR_LOOPBACK | IPV6_ADDR_UNICAST | | ||
267 | IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_LINKLOCAL)); /* addr-select 3.4 */ | ||
268 | |||
269 | return (IPV6_ADDR_COMPATv4 | IPV6_ADDR_UNICAST | | ||
270 | IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_GLOBAL)); /* addr-select 3.3 */ | ||
271 | } | ||
272 | |||
273 | if (addr->s6_addr32[2] == htonl(0x0000ffff)) | ||
274 | return (IPV6_ADDR_MAPPED | | ||
275 | IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_GLOBAL)); /* addr-select 3.3 */ | ||
276 | } | ||
277 | |||
278 | return (IPV6_ADDR_RESERVED | | ||
279 | IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_GLOBAL)); /* addr-select 3.4 */ | ||
280 | } | ||
281 | |||
282 | static void addrconf_del_timer(struct inet6_ifaddr *ifp) | 214 | static void addrconf_del_timer(struct inet6_ifaddr *ifp) |
283 | { | 215 | { |
284 | if (del_timer(&ifp->timer)) | 216 | if (del_timer(&ifp->timer)) |