1 /* 2 * IPv6 library code, needed by static components when full IPv6 support is 3 * not configured or static. 4 */ 5 6 #include <linux/export.h> 7 #include <net/ipv6.h> 8 #include <net/addrconf.h> 9 #include <net/ip.h> 10 11 #define IPV6_ADDR_SCOPE_TYPE(scope) ((scope) << 16) 12 13 static inline unsigned int ipv6_addr_scope2type(unsigned int scope) 14 { 15 switch (scope) { 16 case IPV6_ADDR_SCOPE_NODELOCAL: 17 return (IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_NODELOCAL) | 18 IPV6_ADDR_LOOPBACK); 19 case IPV6_ADDR_SCOPE_LINKLOCAL: 20 return (IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_LINKLOCAL) | 21 IPV6_ADDR_LINKLOCAL); 22 case IPV6_ADDR_SCOPE_SITELOCAL: 23 return (IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_SITELOCAL) | 24 IPV6_ADDR_SITELOCAL); 25 } 26 return IPV6_ADDR_SCOPE_TYPE(scope); 27 } 28 29 int __ipv6_addr_type(const struct in6_addr *addr) 30 { 31 __be32 st; 32 33 st = addr->s6_addr32[0]; 34 35 /* Consider all addresses with the first three bits different of 36 000 and 111 as unicasts. 37 */ 38 if ((st & htonl(0xE0000000)) != htonl(0x00000000) && 39 (st & htonl(0xE0000000)) != htonl(0xE0000000)) 40 return (IPV6_ADDR_UNICAST | 41 IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_GLOBAL)); 42 43 if ((st & htonl(0xFF000000)) == htonl(0xFF000000)) { 44 /* multicast */ 45 /* addr-select 3.1 */ 46 return (IPV6_ADDR_MULTICAST | 47 ipv6_addr_scope2type(IPV6_ADDR_MC_SCOPE(addr))); 48 } 49 50 if ((st & htonl(0xFFC00000)) == htonl(0xFE800000)) 51 return (IPV6_ADDR_LINKLOCAL | IPV6_ADDR_UNICAST | 52 IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_LINKLOCAL)); /* addr-select 3.1 */ 53 if ((st & htonl(0xFFC00000)) == htonl(0xFEC00000)) 54 return (IPV6_ADDR_SITELOCAL | IPV6_ADDR_UNICAST | 55 IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_SITELOCAL)); /* addr-select 3.1 */ 56 if ((st & htonl(0xFE000000)) == htonl(0xFC000000)) 57 return (IPV6_ADDR_UNICAST | 58 IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_GLOBAL)); /* RFC 4193 */ 59 60 if ((addr->s6_addr32[0] | addr->s6_addr32[1]) == 0) { 61 if (addr->s6_addr32[2] == 0) { 62 if (addr->s6_addr32[3] == 0) 63 return IPV6_ADDR_ANY; 64 65 if (addr->s6_addr32[3] == htonl(0x00000001)) 66 return (IPV6_ADDR_LOOPBACK | IPV6_ADDR_UNICAST | 67 IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_LINKLOCAL)); /* addr-select 3.4 */ 68 69 return (IPV6_ADDR_COMPATv4 | IPV6_ADDR_UNICAST | 70 IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_GLOBAL)); /* addr-select 3.3 */ 71 } 72 73 if (addr->s6_addr32[2] == htonl(0x0000ffff)) 74 return (IPV6_ADDR_MAPPED | 75 IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_GLOBAL)); /* addr-select 3.3 */ 76 } 77 78 return (IPV6_ADDR_UNICAST | 79 IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_GLOBAL)); /* addr-select 3.4 */ 80 } 81 EXPORT_SYMBOL(__ipv6_addr_type); 82 83 static ATOMIC_NOTIFIER_HEAD(inet6addr_chain); 84 85 int register_inet6addr_notifier(struct notifier_block *nb) 86 { 87 return atomic_notifier_chain_register(&inet6addr_chain, nb); 88 } 89 EXPORT_SYMBOL(register_inet6addr_notifier); 90 91 int unregister_inet6addr_notifier(struct notifier_block *nb) 92 { 93 return atomic_notifier_chain_unregister(&inet6addr_chain, nb); 94 } 95 EXPORT_SYMBOL(unregister_inet6addr_notifier); 96 97 int inet6addr_notifier_call_chain(unsigned long val, void *v) 98 { 99 return atomic_notifier_call_chain(&inet6addr_chain, val, v); 100 } 101 EXPORT_SYMBOL(inet6addr_notifier_call_chain); 102 103 const struct ipv6_stub *ipv6_stub __read_mostly; 104 EXPORT_SYMBOL_GPL(ipv6_stub); 105 106 /* IPv6 Wildcard Address and Loopback Address defined by RFC2553 */ 107 const struct in6_addr in6addr_loopback = IN6ADDR_LOOPBACK_INIT; 108 EXPORT_SYMBOL(in6addr_loopback); 109 const struct in6_addr in6addr_any = IN6ADDR_ANY_INIT; 110 EXPORT_SYMBOL(in6addr_any); 111 const struct in6_addr in6addr_linklocal_allnodes = IN6ADDR_LINKLOCAL_ALLNODES_INIT; 112 EXPORT_SYMBOL(in6addr_linklocal_allnodes); 113 const struct in6_addr in6addr_linklocal_allrouters = IN6ADDR_LINKLOCAL_ALLROUTERS_INIT; 114 EXPORT_SYMBOL(in6addr_linklocal_allrouters); 115 const struct in6_addr in6addr_interfacelocal_allnodes = IN6ADDR_INTERFACELOCAL_ALLNODES_INIT; 116 EXPORT_SYMBOL(in6addr_interfacelocal_allnodes); 117 const struct in6_addr in6addr_interfacelocal_allrouters = IN6ADDR_INTERFACELOCAL_ALLROUTERS_INIT; 118 EXPORT_SYMBOL(in6addr_interfacelocal_allrouters); 119 const struct in6_addr in6addr_sitelocal_allrouters = IN6ADDR_SITELOCAL_ALLROUTERS_INIT; 120 EXPORT_SYMBOL(in6addr_sitelocal_allrouters); 121 122 static void snmp6_free_dev(struct inet6_dev *idev) 123 { 124 kfree(idev->stats.icmpv6msgdev); 125 kfree(idev->stats.icmpv6dev); 126 free_percpu(idev->stats.ipv6); 127 } 128 129 /* Nobody refers to this device, we may destroy it. */ 130 131 void in6_dev_finish_destroy(struct inet6_dev *idev) 132 { 133 struct net_device *dev = idev->dev; 134 135 WARN_ON(!list_empty(&idev->addr_list)); 136 WARN_ON(idev->mc_list != NULL); 137 WARN_ON(timer_pending(&idev->rs_timer)); 138 139 #ifdef NET_REFCNT_DEBUG 140 pr_debug("%s: %s\n", __func__, dev ? dev->name : "NIL"); 141 #endif 142 dev_put(dev); 143 if (!idev->dead) { 144 pr_warn("Freeing alive inet6 device %p\n", idev); 145 return; 146 } 147 snmp6_free_dev(idev); 148 kfree_rcu(idev, rcu); 149 } 150 EXPORT_SYMBOL(in6_dev_finish_destroy); 151