Lines Matching refs:idev

116 static int addrconf_sysctl_register(struct inet6_dev *idev);
117 static void addrconf_sysctl_unregister(struct inet6_dev *idev);
119 static inline int addrconf_sysctl_register(struct inet6_dev *idev) in addrconf_sysctl_register() argument
124 static inline void addrconf_sysctl_unregister(struct inet6_dev *idev) in addrconf_sysctl_unregister() argument
129 static void __ipv6_regen_rndid(struct inet6_dev *idev);
130 static void __ipv6_try_regen_rndid(struct inet6_dev *idev, struct in6_addr *tmpaddr);
134 static int ipv6_count_addresses(struct inet6_dev *idev);
137 const struct inet6_dev *idev);
167 static void addrconf_dad_run(struct inet6_dev *idev);
172 static void inet6_prefix_notify(int event, struct inet6_dev *idev,
271 static void addrconf_del_rs_timer(struct inet6_dev *idev) in addrconf_del_rs_timer() argument
273 if (del_timer(&idev->rs_timer)) in addrconf_del_rs_timer()
274 __in6_dev_put(idev); in addrconf_del_rs_timer()
283 static void addrconf_mod_rs_timer(struct inet6_dev *idev, in addrconf_mod_rs_timer() argument
286 if (!timer_pending(&idev->rs_timer)) in addrconf_mod_rs_timer()
287 in6_dev_hold(idev); in addrconf_mod_rs_timer()
288 mod_timer(&idev->rs_timer, jiffies + when); in addrconf_mod_rs_timer()
299 static int snmp6_alloc_dev(struct inet6_dev *idev) in snmp6_alloc_dev() argument
303 idev->stats.ipv6 = alloc_percpu(struct ipstats_mib); in snmp6_alloc_dev()
304 if (!idev->stats.ipv6) in snmp6_alloc_dev()
309 addrconf_stats = per_cpu_ptr(idev->stats.ipv6, i); in snmp6_alloc_dev()
314 idev->stats.icmpv6dev = kzalloc(sizeof(struct icmpv6_mib_device), in snmp6_alloc_dev()
316 if (!idev->stats.icmpv6dev) in snmp6_alloc_dev()
318 idev->stats.icmpv6msgdev = kzalloc(sizeof(struct icmpv6msg_mib_device), in snmp6_alloc_dev()
320 if (!idev->stats.icmpv6msgdev) in snmp6_alloc_dev()
326 kfree(idev->stats.icmpv6dev); in snmp6_alloc_dev()
328 free_percpu(idev->stats.ipv6); in snmp6_alloc_dev()
454 struct inet6_dev *idev; in ipv6_find_idev() local
458 idev = __in6_dev_get(dev); in ipv6_find_idev()
459 if (!idev) { in ipv6_find_idev()
460 idev = ipv6_add_dev(dev); in ipv6_find_idev()
461 if (IS_ERR(idev)) in ipv6_find_idev()
466 ipv6_mc_up(idev); in ipv6_find_idev()
467 return idev; in ipv6_find_idev()
636 struct inet6_dev *idev; in inet6_netconf_dump_devconf() local
651 idev = __in6_dev_get(dev); in inet6_netconf_dump_devconf()
652 if (!idev) in inet6_netconf_dump_devconf()
656 &idev->cnf, in inet6_netconf_dump_devconf()
701 static void dev_forward_change(struct inet6_dev *idev) in dev_forward_change() argument
706 if (!idev) in dev_forward_change()
708 dev = idev->dev; in dev_forward_change()
709 if (idev->cnf.forwarding) in dev_forward_change()
712 if (idev->cnf.forwarding) { in dev_forward_change()
723 list_for_each_entry(ifa, &idev->addr_list, if_list) { in dev_forward_change()
726 if (idev->cnf.forwarding) in dev_forward_change()
732 dev->ifindex, &idev->cnf); in dev_forward_change()
739 struct inet6_dev *idev; in addrconf_forward_change() local
742 idev = __in6_dev_get(dev); in addrconf_forward_change()
743 if (idev) { in addrconf_forward_change()
744 int changed = (!idev->cnf.forwarding) ^ (!newf); in addrconf_forward_change()
745 idev->cnf.forwarding = newf; in addrconf_forward_change()
747 dev_forward_change(idev); in addrconf_forward_change()
792 struct inet6_dev *idev; in addrconf_linkdown_change() local
795 idev = __in6_dev_get(dev); in addrconf_linkdown_change()
796 if (idev) { in addrconf_linkdown_change()
797 int changed = (!idev->cnf.ignore_routes_with_linkdown) ^ (!newf); in addrconf_linkdown_change()
799 idev->cnf.ignore_routes_with_linkdown = newf; in addrconf_linkdown_change()
804 &idev->cnf); in addrconf_linkdown_change()
856 in6_dev_put(ifp->idev); in inet6_ifa_finish_destroy()
872 ipv6_link_dev_addr(struct inet6_dev *idev, struct inet6_ifaddr *ifp) in ipv6_link_dev_addr() argument
881 list_for_each(p, &idev->addr_list) { in ipv6_link_dev_addr()
899 ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr, in ipv6_add_addr() argument
911 (!(idev->dev->flags & IFF_LOOPBACK) && in ipv6_add_addr()
916 if (idev->dead) { in ipv6_add_addr()
921 if (idev->cnf.disable_ipv6) { in ipv6_add_addr()
929 if (ipv6_chk_same_addr(dev_net(idev->dev), addr, idev->dev)) { in ipv6_add_addr()
943 rt = addrconf_dst_alloc(idev, addr, false); in ipv6_add_addr()
949 neigh_parms_data_state_setall(idev->nd_parms); in ipv6_add_addr()
968 ifa->idev = idev; in ipv6_add_addr()
969 in6_dev_hold(idev); in ipv6_add_addr()
979 write_lock(&idev->lock); in ipv6_add_addr()
981 ipv6_link_dev_addr(idev, ifa); in ipv6_add_addr()
984 list_add(&ifa->tmp_list, &idev->tempaddr_list); in ipv6_add_addr()
989 write_unlock(&idev->lock); in ipv6_add_addr()
1034 struct inet6_dev *idev = ifp->idev; in check_cleanup_prefix_route() local
1040 list_for_each_entry(ifa, &idev->addr_list, if_list) { in check_cleanup_prefix_route()
1074 ifp->idev->dev, in cleanup_prefix_route()
1110 write_lock_bh(&ifp->idev->lock); in ipv6_del_addr()
1127 write_unlock_bh(&ifp->idev->lock); in ipv6_del_addr()
1148 struct inet6_dev *idev = ifp->idev; in ipv6_create_tempaddr() local
1157 write_lock_bh(&idev->lock); in ipv6_create_tempaddr()
1167 in6_dev_hold(idev); in ipv6_create_tempaddr()
1168 if (idev->cnf.use_tempaddr <= 0) { in ipv6_create_tempaddr()
1169 write_unlock_bh(&idev->lock); in ipv6_create_tempaddr()
1171 in6_dev_put(idev); in ipv6_create_tempaddr()
1176 if (ifp->regen_count++ >= idev->cnf.regen_max_retry) { in ipv6_create_tempaddr()
1177 idev->cnf.use_tempaddr = -1; /*XXX*/ in ipv6_create_tempaddr()
1179 write_unlock_bh(&idev->lock); in ipv6_create_tempaddr()
1182 in6_dev_put(idev); in ipv6_create_tempaddr()
1188 __ipv6_try_regen_rndid(idev, tmpaddr); in ipv6_create_tempaddr()
1189 memcpy(&addr.s6_addr[8], idev->rndid, 8); in ipv6_create_tempaddr()
1193 idev->cnf.temp_valid_lft + age); in ipv6_create_tempaddr()
1196 idev->cnf.temp_prefered_lft + age - in ipv6_create_tempaddr()
1197 idev->cnf.max_desync_factor); in ipv6_create_tempaddr()
1202 regen_advance = idev->cnf.regen_max_retry * in ipv6_create_tempaddr()
1203 idev->cnf.dad_transmits * in ipv6_create_tempaddr()
1204 NEIGH_VAR(idev->nd_parms, RETRANS_TIME) / HZ; in ipv6_create_tempaddr()
1205 write_unlock_bh(&idev->lock); in ipv6_create_tempaddr()
1217 in6_dev_put(idev); in ipv6_create_tempaddr()
1227 ift = ipv6_add_addr(idev, &addr, NULL, tmp_plen, in ipv6_create_tempaddr()
1232 in6_dev_put(idev); in ipv6_create_tempaddr()
1235 write_lock_bh(&idev->lock); in ipv6_create_tempaddr()
1247 in6_dev_put(idev); in ipv6_create_tempaddr()
1298 static inline bool ipv6_use_optimistic_addr(struct inet6_dev *idev) in ipv6_use_optimistic_addr() argument
1301 return idev && idev->cnf.optimistic_dad && idev->cnf.use_optimistic; in ipv6_use_optimistic_addr()
1371 if (!ipv6_use_optimistic_addr(score->ifa->idev)) in ipv6_get_saddr_eval()
1389 dst->ifindex == score->ifa->idev->dev->ifindex); in ipv6_get_saddr_eval()
1395 score->ifa->idev->dev->ifindex) == dst->label; in ipv6_get_saddr_eval()
1404 score->ifa->idev->cnf.use_tempaddr >= 2; in ipv6_get_saddr_eval()
1443 struct inet6_dev *idev, in __ipv6_dev_get_saddr() argument
1449 read_lock_bh(&idev->lock); in __ipv6_dev_get_saddr()
1450 list_for_each_entry(score->ifa, &idev->addr_list, if_list) { in __ipv6_dev_get_saddr()
1472 idev->dev->name); in __ipv6_dev_get_saddr()
1516 read_unlock_bh(&idev->lock); in __ipv6_dev_get_saddr()
1526 struct inet6_dev *idev; in ipv6_dev_get_saddr() local
1561 idev = __in6_dev_get(dst_dev); in ipv6_dev_get_saddr()
1564 (idev && idev->cnf.use_oif_addrs_only)) { in ipv6_dev_get_saddr()
1570 if (idev) in ipv6_dev_get_saddr()
1571 hiscore_idx = __ipv6_dev_get_saddr(net, &dst, idev, scores, hiscore_idx); in ipv6_dev_get_saddr()
1574 idev = __in6_dev_get(dev); in ipv6_dev_get_saddr()
1575 if (!idev) in ipv6_dev_get_saddr()
1577 hiscore_idx = __ipv6_dev_get_saddr(net, &dst, idev, scores, hiscore_idx); in ipv6_dev_get_saddr()
1592 int __ipv6_get_lladdr(struct inet6_dev *idev, struct in6_addr *addr, in __ipv6_get_lladdr() argument
1598 list_for_each_entry_reverse(ifp, &idev->addr_list, if_list) { in __ipv6_get_lladdr()
1614 struct inet6_dev *idev; in ipv6_get_lladdr() local
1618 idev = __in6_dev_get(dev); in ipv6_get_lladdr()
1619 if (idev) { in ipv6_get_lladdr()
1620 read_lock_bh(&idev->lock); in ipv6_get_lladdr()
1621 err = __ipv6_get_lladdr(idev, addr, banned_flags); in ipv6_get_lladdr()
1622 read_unlock_bh(&idev->lock); in ipv6_get_lladdr()
1628 static int ipv6_count_addresses(struct inet6_dev *idev) in ipv6_count_addresses() argument
1633 read_lock_bh(&idev->lock); in ipv6_count_addresses()
1634 list_for_each_entry(ifp, &idev->addr_list, if_list) in ipv6_count_addresses()
1636 read_unlock_bh(&idev->lock); in ipv6_count_addresses()
1657 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_chk_addr_and_flags()
1667 (!dev || ifp->idev->dev == dev || in ipv6_chk_addr_and_flags()
1686 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_chk_same_addr()
1689 if (!dev || ifp->idev->dev == dev) in ipv6_chk_same_addr()
1702 struct inet6_dev *idev; in ipv6_chk_custom_prefix() local
1707 idev = __in6_dev_get(dev); in ipv6_chk_custom_prefix()
1708 if (idev) { in ipv6_chk_custom_prefix()
1709 read_lock_bh(&idev->lock); in ipv6_chk_custom_prefix()
1710 list_for_each_entry(ifa, &idev->addr_list, if_list) { in ipv6_chk_custom_prefix()
1715 read_unlock_bh(&idev->lock); in ipv6_chk_custom_prefix()
1725 struct inet6_dev *idev; in ipv6_chk_prefix() local
1731 idev = __in6_dev_get(dev); in ipv6_chk_prefix()
1732 if (idev) { in ipv6_chk_prefix()
1733 read_lock_bh(&idev->lock); in ipv6_chk_prefix()
1734 list_for_each_entry(ifa, &idev->addr_list, if_list) { in ipv6_chk_prefix()
1740 read_unlock_bh(&idev->lock); in ipv6_chk_prefix()
1755 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_get_ifaddr()
1758 if (!dev || ifp->idev->dev == dev || in ipv6_get_ifaddr()
1820 struct inet6_dev *idev = ifp->idev; in addrconf_dad_failure() local
1821 struct net *net = dev_net(ifp->idev->dev); in addrconf_dad_failure()
1829 ifp->idev->dev->name, &ifp->addr); in addrconf_dad_failure()
1844 ifp->idev->dev->name); in addrconf_dad_failure()
1850 idev)) in addrconf_dad_failure()
1858 if (idev->cnf.max_addresses && in addrconf_dad_failure()
1859 ipv6_count_addresses(idev) >= in addrconf_dad_failure()
1860 idev->cnf.max_addresses) in addrconf_dad_failure()
1864 ifp->idev->dev->name); in addrconf_dad_failure()
1866 ifp2 = ipv6_add_addr(idev, &new_addr, NULL, pfxlen, in addrconf_dad_failure()
1881 } else if (idev->cnf.accept_dad > 1 && !idev->cnf.disable_ipv6) { in addrconf_dad_failure()
1885 if (!ipv6_generate_eui64(addr.s6_addr + 8, idev->dev) && in addrconf_dad_failure()
1888 idev->cnf.disable_ipv6 = 1; in addrconf_dad_failure()
1891 ifp->idev->dev->name); in addrconf_dad_failure()
1917 void addrconf_leave_solict(struct inet6_dev *idev, const struct in6_addr *addr) in addrconf_leave_solict() argument
1921 if (idev->dev->flags&(IFF_LOOPBACK|IFF_NOARP)) in addrconf_leave_solict()
1925 __ipv6_dev_mc_dec(idev, &maddr); in addrconf_leave_solict()
1938 __ipv6_dev_ac_inc(ifp->idev, &addr); in addrconf_join_anycast()
1951 __ipv6_dev_ac_dec(ifp->idev, &addr); in addrconf_leave_anycast()
2060 static int ipv6_inherit_eui64(u8 *eui, struct inet6_dev *idev) in ipv6_inherit_eui64() argument
2065 read_lock_bh(&idev->lock); in ipv6_inherit_eui64()
2066 list_for_each_entry_reverse(ifp, &idev->addr_list, if_list) { in ipv6_inherit_eui64()
2075 read_unlock_bh(&idev->lock); in ipv6_inherit_eui64()
2080 static void __ipv6_regen_rndid(struct inet6_dev *idev) in __ipv6_regen_rndid() argument
2083 get_random_bytes(idev->rndid, sizeof(idev->rndid)); in __ipv6_regen_rndid()
2084 idev->rndid[0] &= ~0x02; in __ipv6_regen_rndid()
2097 if (idev->rndid[0] == 0xfd && in __ipv6_regen_rndid()
2098 …(idev->rndid[1]&idev->rndid[2]&idev->rndid[3]&idev->rndid[4]&idev->rndid[5]&idev->rndid[6]) == 0xf… in __ipv6_regen_rndid()
2099 (idev->rndid[7]&0x80)) in __ipv6_regen_rndid()
2101 if ((idev->rndid[0]|idev->rndid[1]) == 0) { in __ipv6_regen_rndid()
2102 if (idev->rndid[2] == 0x5e && idev->rndid[3] == 0xfe) in __ipv6_regen_rndid()
2104 …if ((idev->rndid[2]|idev->rndid[3]|idev->rndid[4]|idev->rndid[5]|idev->rndid[6]|idev->rndid[7]) ==… in __ipv6_regen_rndid()
2111 struct inet6_dev *idev = (struct inet6_dev *) data; in ipv6_regen_rndid() local
2115 write_lock_bh(&idev->lock); in ipv6_regen_rndid()
2117 if (idev->dead) in ipv6_regen_rndid()
2120 __ipv6_regen_rndid(idev); in ipv6_regen_rndid()
2123 idev->cnf.temp_prefered_lft * HZ - in ipv6_regen_rndid()
2124 idev->cnf.regen_max_retry * idev->cnf.dad_transmits * in ipv6_regen_rndid()
2125 NEIGH_VAR(idev->nd_parms, RETRANS_TIME) - in ipv6_regen_rndid()
2126 idev->cnf.max_desync_factor * HZ; in ipv6_regen_rndid()
2129 __func__, idev->dev->name); in ipv6_regen_rndid()
2133 if (!mod_timer(&idev->regen_timer, expires)) in ipv6_regen_rndid()
2134 in6_dev_hold(idev); in ipv6_regen_rndid()
2137 write_unlock_bh(&idev->lock); in ipv6_regen_rndid()
2139 in6_dev_put(idev); in ipv6_regen_rndid()
2142 static void __ipv6_try_regen_rndid(struct inet6_dev *idev, struct in6_addr *tmpaddr) in __ipv6_try_regen_rndid() argument
2144 if (tmpaddr && memcmp(idev->rndid, &tmpaddr->s6_addr[8], 8) == 0) in __ipv6_try_regen_rndid()
2145 __ipv6_regen_rndid(idev); in __ipv6_try_regen_rndid()
2238 struct inet6_dev *idev; in addrconf_add_dev() local
2242 idev = ipv6_find_idev(dev); in addrconf_add_dev()
2243 if (!idev) in addrconf_add_dev()
2246 if (idev->cnf.disable_ipv6) in addrconf_add_dev()
2253 return idev; in addrconf_add_dev()
2256 static void manage_tempaddrs(struct inet6_dev *idev, in manage_tempaddrs() argument
2264 read_lock_bh(&idev->lock); in manage_tempaddrs()
2266 list_for_each_entry(ift, &idev->tempaddr_list, tmp_list) { in manage_tempaddrs()
2281 max_valid = idev->cnf.temp_valid_lft - age; in manage_tempaddrs()
2285 max_prefered = idev->cnf.temp_prefered_lft - in manage_tempaddrs()
2286 idev->cnf.max_desync_factor - age; in manage_tempaddrs()
2309 if ((create || list_empty(&idev->tempaddr_list)) && in manage_tempaddrs()
2310 idev->cnf.use_tempaddr > 0) { in manage_tempaddrs()
2316 read_unlock_bh(&idev->lock); in manage_tempaddrs()
2319 read_unlock_bh(&idev->lock); in manage_tempaddrs()
2640 struct inet6_dev *idev; in inet6_addr_add() local
2663 idev = addrconf_add_dev(dev); in inet6_addr_add()
2664 if (IS_ERR(idev)) in inet6_addr_add()
2665 return PTR_ERR(idev); in inet6_addr_add()
2695 ifp = ipv6_add_addr(idev, pfx, peer_pfx, plen, scope, ifa_flags, in inet6_addr_add()
2711 manage_tempaddrs(idev, ifp, valid_lft, prefered_lft, in inet6_addr_add()
2728 struct inet6_dev *idev; in inet6_addr_del() local
2738 idev = __in6_dev_get(dev); in inet6_addr_del()
2739 if (!idev) in inet6_addr_del()
2742 read_lock_bh(&idev->lock); in inet6_addr_del()
2743 list_for_each_entry(ifp, &idev->addr_list, if_list) { in inet6_addr_del()
2747 read_unlock_bh(&idev->lock); in inet6_addr_del()
2751 manage_tempaddrs(idev, ifp, 0, 0, false, in inet6_addr_del()
2762 read_unlock_bh(&idev->lock); in inet6_addr_del()
2804 static void add_addr(struct inet6_dev *idev, const struct in6_addr *addr, in add_addr() argument
2809 ifp = ipv6_add_addr(idev, addr, NULL, plen, in add_addr()
2822 static void sit_add_v4_addrs(struct inet6_dev *idev) in sit_add_v4_addrs() argument
2826 struct net *net = dev_net(idev->dev); in sit_add_v4_addrs()
2833 memcpy(&addr.s6_addr32[3], idev->dev->dev_addr, 4); in sit_add_v4_addrs()
2835 if (idev->dev->flags&IFF_POINTOPOINT) { in sit_add_v4_addrs()
2846 add_addr(idev, &addr, plen, scope); in sit_add_v4_addrs()
2847 addrconf_prefix_route(&addr, plen, idev->dev, 0, pflags); in sit_add_v4_addrs()
2865 if (idev->dev->flags&IFF_POINTOPOINT) in sit_add_v4_addrs()
2870 add_addr(idev, &addr, plen, flag); in sit_add_v4_addrs()
2871 addrconf_prefix_route(&addr, plen, idev->dev, 0, in sit_add_v4_addrs()
2881 struct inet6_dev *idev; in init_loopback() local
2890 idev = ipv6_find_idev(dev); in init_loopback()
2891 if (!idev) { in init_loopback()
2896 add_addr(idev, &in6addr_loopback, 128, IFA_HOST); in init_loopback()
2903 idev = __in6_dev_get(sp_dev); in init_loopback()
2904 if (!idev) in init_loopback()
2907 read_lock_bh(&idev->lock); in init_loopback()
2908 list_for_each_entry(sp_ifa, &idev->addr_list, if_list) { in init_loopback()
2926 sp_rt = addrconf_dst_alloc(idev, &sp_ifa->addr, false); in init_loopback()
2934 read_unlock_bh(&idev->lock); in init_loopback()
2938 static void addrconf_add_linklocal(struct inet6_dev *idev, in addrconf_add_linklocal() argument
2945 if (idev->cnf.optimistic_dad && in addrconf_add_linklocal()
2946 !dev_net(idev->dev)->ipv6.devconf_all->forwarding) in addrconf_add_linklocal()
2950 ifp = ipv6_add_addr(idev, addr, NULL, 64, IFA_LINK, addr_flags, in addrconf_add_linklocal()
2953 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, idev->dev, 0, 0); in addrconf_add_linklocal()
2977 const struct inet6_dev *idev) in ipv6_generate_stable_address() argument
2995 struct net *net = dev_net(idev->dev); in ipv6_generate_stable_address()
2999 if (idev->cnf.stable_secret.initialized) in ipv6_generate_stable_address()
3000 secret = idev->cnf.stable_secret.secret; in ipv6_generate_stable_address()
3012 memcpy(data.hwaddr, idev->dev->perm_addr, idev->dev->addr_len); in ipv6_generate_stable_address()
3028 if (dad_count > dev_net(idev->dev)->ipv6.sysctl.idgen_retries) in ipv6_generate_stable_address()
3037 static void addrconf_addr_gen(struct inet6_dev *idev, bool prefix_route) in addrconf_addr_gen() argument
3042 if (netif_is_l3_master(idev->dev)) in addrconf_addr_gen()
3047 if (idev->addr_gen_mode == IN6_ADDR_GEN_MODE_STABLE_PRIVACY) { in addrconf_addr_gen()
3048 if (!ipv6_generate_stable_address(&addr, 0, idev)) in addrconf_addr_gen()
3049 addrconf_add_linklocal(idev, &addr, in addrconf_addr_gen()
3052 addrconf_prefix_route(&addr, 64, idev->dev, 0, 0); in addrconf_addr_gen()
3053 } else if (idev->addr_gen_mode == IN6_ADDR_GEN_MODE_EUI64) { in addrconf_addr_gen()
3058 if (ipv6_generate_eui64(addr.s6_addr + 8, idev->dev) == 0) in addrconf_addr_gen()
3059 addrconf_add_linklocal(idev, &addr, 0); in addrconf_addr_gen()
3061 addrconf_prefix_route(&addr, 64, idev->dev, 0, 0); in addrconf_addr_gen()
3067 struct inet6_dev *idev; in addrconf_dev_config() local
3083 idev = addrconf_add_dev(dev); in addrconf_dev_config()
3084 if (IS_ERR(idev)) in addrconf_dev_config()
3087 addrconf_addr_gen(idev, false); in addrconf_dev_config()
3093 struct inet6_dev *idev; in addrconf_sit_config() local
3103 idev = ipv6_find_idev(dev); in addrconf_sit_config()
3104 if (!idev) { in addrconf_sit_config()
3110 addrconf_addr_gen(idev, false); in addrconf_sit_config()
3114 sit_add_v4_addrs(idev); in addrconf_sit_config()
3124 struct inet6_dev *idev; in addrconf_gre_config() local
3128 idev = ipv6_find_idev(dev); in addrconf_gre_config()
3129 if (!idev) { in addrconf_gre_config()
3134 addrconf_addr_gen(idev, true); in addrconf_gre_config()
3144 struct inet6_dev *idev = __in6_dev_get(dev); in addrconf_notify() local
3150 if (!idev && dev->mtu >= IPV6_MIN_MTU) { in addrconf_notify()
3151 idev = ipv6_add_dev(dev); in addrconf_notify()
3152 if (IS_ERR(idev)) in addrconf_notify()
3153 return notifier_from_errno(PTR_ERR(idev)); in addrconf_notify()
3164 if (idev) { in addrconf_notify()
3166 idev->cnf.mtu6 = dev->mtu; in addrconf_notify()
3171 idev = ipv6_add_dev(dev); in addrconf_notify()
3172 if (IS_ERR(idev)) in addrconf_notify()
3176 if (!(idev->if_flags & IF_READY)) in addrconf_notify()
3188 if (idev && idev->cnf.disable_ipv6) in addrconf_notify()
3199 if (!idev && dev->mtu >= IPV6_MIN_MTU) in addrconf_notify()
3200 idev = ipv6_add_dev(dev); in addrconf_notify()
3202 if (!IS_ERR_OR_NULL(idev)) { in addrconf_notify()
3203 idev->if_flags |= IF_READY; in addrconf_notify()
3212 if (idev) { in addrconf_notify()
3213 if (idev->if_flags & IF_READY) in addrconf_notify()
3216 idev->if_flags |= IF_READY; in addrconf_notify()
3245 if (!IS_ERR_OR_NULL(idev)) { in addrconf_notify()
3247 addrconf_dad_run(idev); in addrconf_notify()
3254 if (idev->cnf.mtu6 != dev->mtu && in addrconf_notify()
3257 idev->cnf.mtu6 = dev->mtu; in addrconf_notify()
3259 idev->tstamp = jiffies; in addrconf_notify()
3260 inet6_ifinfo_notify(RTM_NEWLINK, idev); in addrconf_notify()
3280 if (idev) { in addrconf_notify()
3281 snmp6_unregister_dev(idev); in addrconf_notify()
3282 addrconf_sysctl_unregister(idev); in addrconf_notify()
3283 err = addrconf_sysctl_register(idev); in addrconf_notify()
3286 err = snmp6_register_dev(idev); in addrconf_notify()
3288 addrconf_sysctl_unregister(idev); in addrconf_notify()
3312 struct inet6_dev *idev; in addrconf_type_change() local
3315 idev = __in6_dev_get(dev); in addrconf_type_change()
3318 ipv6_mc_remap(idev); in addrconf_type_change()
3320 ipv6_mc_unmap(idev); in addrconf_type_change()
3326 struct inet6_dev *idev; in addrconf_ifdown() local
3335 idev = __in6_dev_get(dev); in addrconf_ifdown()
3336 if (!idev) in addrconf_ifdown()
3344 idev->dead = 1; in addrconf_ifdown()
3350 snmp6_unregister_dev(idev); in addrconf_ifdown()
3361 if (ifa->idev == idev) { in addrconf_ifdown()
3370 write_lock_bh(&idev->lock); in addrconf_ifdown()
3372 addrconf_del_rs_timer(idev); in addrconf_ifdown()
3376 idev->if_flags &= ~(IF_RS_SENT|IF_RA_RCVD|IF_READY); in addrconf_ifdown()
3378 if (how && del_timer(&idev->regen_timer)) in addrconf_ifdown()
3379 in6_dev_put(idev); in addrconf_ifdown()
3382 while (!list_empty(&idev->tempaddr_list)) { in addrconf_ifdown()
3383 ifa = list_first_entry(&idev->tempaddr_list, in addrconf_ifdown()
3386 write_unlock_bh(&idev->lock); in addrconf_ifdown()
3395 write_lock_bh(&idev->lock); in addrconf_ifdown()
3398 while (!list_empty(&idev->addr_list)) { in addrconf_ifdown()
3399 ifa = list_first_entry(&idev->addr_list, in addrconf_ifdown()
3405 write_unlock_bh(&idev->lock); in addrconf_ifdown()
3418 write_lock_bh(&idev->lock); in addrconf_ifdown()
3421 write_unlock_bh(&idev->lock); in addrconf_ifdown()
3425 ipv6_ac_destroy_dev(idev); in addrconf_ifdown()
3426 ipv6_mc_destroy_dev(idev); in addrconf_ifdown()
3428 ipv6_mc_down(idev); in addrconf_ifdown()
3431 idev->tstamp = jiffies; in addrconf_ifdown()
3435 addrconf_sysctl_unregister(idev); in addrconf_ifdown()
3436 neigh_parms_release(&nd_tbl, idev->nd_parms); in addrconf_ifdown()
3438 in6_dev_put(idev); in addrconf_ifdown()
3445 struct inet6_dev *idev = (struct inet6_dev *)data; in addrconf_rs_timer() local
3446 struct net_device *dev = idev->dev; in addrconf_rs_timer()
3449 write_lock(&idev->lock); in addrconf_rs_timer()
3450 if (idev->dead || !(idev->if_flags & IF_READY)) in addrconf_rs_timer()
3453 if (!ipv6_accept_ra(idev)) in addrconf_rs_timer()
3457 if (idev->if_flags & IF_RA_RCVD) in addrconf_rs_timer()
3460 if (idev->rs_probes++ < idev->cnf.rtr_solicits) { in addrconf_rs_timer()
3461 write_unlock(&idev->lock); in addrconf_rs_timer()
3468 write_lock(&idev->lock); in addrconf_rs_timer()
3470 addrconf_mod_rs_timer(idev, (idev->rs_probes == in addrconf_rs_timer()
3471 idev->cnf.rtr_solicits) ? in addrconf_rs_timer()
3472 idev->cnf.rtr_solicit_delay : in addrconf_rs_timer()
3473 idev->cnf.rtr_solicit_interval); in addrconf_rs_timer()
3479 pr_debug("%s: no IPv6 routers present\n", idev->dev->name); in addrconf_rs_timer()
3483 write_unlock(&idev->lock); in addrconf_rs_timer()
3485 in6_dev_put(idev); in addrconf_rs_timer()
3494 struct inet6_dev *idev = ifp->idev; in addrconf_dad_kick() local
3499 rand_num = prandom_u32() % (idev->cnf.rtr_solicit_delay ? : 1); in addrconf_dad_kick()
3501 ifp->dad_probes = idev->cnf.dad_transmits; in addrconf_dad_kick()
3507 struct inet6_dev *idev = ifp->idev; in addrconf_dad_begin() local
3508 struct net_device *dev = idev->dev; in addrconf_dad_begin()
3515 read_lock_bh(&idev->lock); in addrconf_dad_begin()
3521 idev->cnf.accept_dad < 1 || in addrconf_dad_begin()
3526 read_unlock_bh(&idev->lock); in addrconf_dad_begin()
3532 if (!(idev->if_flags & IF_READY)) { in addrconf_dad_begin()
3534 read_unlock_bh(&idev->lock); in addrconf_dad_begin()
3551 if (ipv6_use_optimistic_addr(idev)) { in addrconf_dad_begin()
3562 read_unlock_bh(&idev->lock); in addrconf_dad_begin()
3587 struct inet6_dev *idev = ifp->idev; in addrconf_dad_work() local
3619 write_lock_bh(&idev->lock); in addrconf_dad_work()
3620 if (idev->dead || !(idev->if_flags & IF_READY)) { in addrconf_dad_work()
3621 write_unlock_bh(&idev->lock); in addrconf_dad_work()
3628 write_unlock_bh(&idev->lock); in addrconf_dad_work()
3639 write_unlock_bh(&idev->lock); in addrconf_dad_work()
3648 NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME)); in addrconf_dad_work()
3650 write_unlock_bh(&idev->lock); in addrconf_dad_work()
3654 ndisc_send_ns(ifp->idev->dev, &ifp->addr, &mcaddr, &in6addr_any); in addrconf_dad_work()
3664 struct inet6_dev *idev = ifp->idev; in ipv6_lonely_lladdr() local
3666 list_for_each_entry_reverse(ifpiter, &idev->addr_list, if_list) { in ipv6_lonely_lladdr()
3680 struct net_device *dev = ifp->idev->dev; in addrconf_dad_completed()
3696 read_lock_bh(&ifp->idev->lock); in addrconf_dad_completed()
3699 ipv6_accept_ra(ifp->idev) && in addrconf_dad_completed()
3700 ifp->idev->cnf.rtr_solicits > 0 && in addrconf_dad_completed()
3702 read_unlock_bh(&ifp->idev->lock); in addrconf_dad_completed()
3708 ipv6_mc_dad_complete(ifp->idev); in addrconf_dad_completed()
3720 write_lock_bh(&ifp->idev->lock); in addrconf_dad_completed()
3722 ifp->idev->rs_probes = 1; in addrconf_dad_completed()
3723 ifp->idev->if_flags |= IF_RS_SENT; in addrconf_dad_completed()
3724 addrconf_mod_rs_timer(ifp->idev, in addrconf_dad_completed()
3725 ifp->idev->cnf.rtr_solicit_interval); in addrconf_dad_completed()
3727 write_unlock_bh(&ifp->idev->lock); in addrconf_dad_completed()
3731 static void addrconf_dad_run(struct inet6_dev *idev) in addrconf_dad_run() argument
3735 read_lock_bh(&idev->lock); in addrconf_dad_run()
3736 list_for_each_entry(ifp, &idev->addr_list, if_list) { in addrconf_dad_run()
3743 read_unlock_bh(&idev->lock); in addrconf_dad_run()
3769 if (!net_eq(dev_net(ifa->idev->dev), net)) in if6_get_first()
3794 if (!net_eq(dev_net(ifa->idev->dev), net)) in if6_get_next()
3804 if (!net_eq(dev_net(ifa->idev->dev), net)) in if6_get_next()
3841 ifp->idev->dev->ifindex, in if6_seq_show()
3845 ifp->idev->dev->name); in if6_seq_show()
3908 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_chk_home_addr()
3989 unsigned long regen_advance = ifp->idev->cnf.regen_max_retry * in addrconf_verify_rtnl()
3990 ifp->idev->cnf.dad_transmits * in addrconf_verify_rtnl()
3991 NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME) / HZ; in addrconf_verify_rtnl()
4159 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, ifp->idev->dev, in inet6_addr_modify()
4165 write_lock_bh(&ifp->idev->lock); in inet6_addr_modify()
4167 write_unlock_bh(&ifp->idev->lock); in inet6_addr_modify()
4178 manage_tempaddrs(ifp->idev, ifp, valid_lft, prefered_lft, in inet6_addr_modify()
4310 ifa->idev->dev->ifindex); in inet6_fill_ifaddr()
4361 int ifindex = ifmca->idev->dev->ifindex; in inet6_fill_ifmcaddr()
4415 static int in6_dump_addrs(struct inet6_dev *idev, struct sk_buff *skb, in in6_dump_addrs() argument
4424 read_lock_bh(&idev->lock); in in6_dump_addrs()
4430 list_for_each_entry(ifa, &idev->addr_list, if_list) { in in6_dump_addrs()
4446 for (ifmca = idev->mc_list; ifmca; in in6_dump_addrs()
4461 for (ifaca = idev->ac_list; ifaca; in in6_dump_addrs()
4477 read_unlock_bh(&idev->lock); in in6_dump_addrs()
4490 struct inet6_dev *idev; in inet6_dump_addr() local
4508 idev = __in6_dev_get(dev); in inet6_dump_addr()
4509 if (!idev) in inet6_dump_addr()
4512 if (in6_dump_addrs(idev, skb, cb, type, in inet6_dump_addr()
4605 struct net *net = dev_net(ifa->idev->dev); in inet6_ifa_notify()
4744 static void snmp6_fill_stats(u64 *stats, struct inet6_dev *idev, int attrtype, in snmp6_fill_stats() argument
4749 __snmp6_fill_stats64(stats, idev->stats.ipv6, bytes, in snmp6_fill_stats()
4753 __snmp6_fill_statsdev(stats, idev->stats.icmpv6dev->mibs, ICMP6_MIB_MAX, bytes); in snmp6_fill_stats()
4758 static int inet6_fill_ifla6_attrs(struct sk_buff *skb, struct inet6_dev *idev, in inet6_fill_ifla6_attrs() argument
4764 if (nla_put_u32(skb, IFLA_INET6_FLAGS, idev->if_flags)) in inet6_fill_ifla6_attrs()
4767 ci.tstamp = cstamp_delta(idev->tstamp); in inet6_fill_ifla6_attrs()
4768 ci.reachable_time = jiffies_to_msecs(idev->nd_parms->reachable_time); in inet6_fill_ifla6_attrs()
4769 ci.retrans_time = jiffies_to_msecs(NEIGH_VAR(idev->nd_parms, RETRANS_TIME)); in inet6_fill_ifla6_attrs()
4775 ipv6_store_devconf(&idev->cnf, nla_data(nla), nla_len(nla)); in inet6_fill_ifla6_attrs()
4785 snmp6_fill_stats(nla_data(nla), idev, IFLA_INET6_STATS, nla_len(nla)); in inet6_fill_ifla6_attrs()
4790 snmp6_fill_stats(nla_data(nla), idev, IFLA_INET6_ICMP6STATS, nla_len(nla)); in inet6_fill_ifla6_attrs()
4796 if (nla_put_u8(skb, IFLA_INET6_ADDR_GEN_MODE, idev->addr_gen_mode)) in inet6_fill_ifla6_attrs()
4799 read_lock_bh(&idev->lock); in inet6_fill_ifla6_attrs()
4800 memcpy(nla_data(nla), idev->token.s6_addr, nla_len(nla)); in inet6_fill_ifla6_attrs()
4801 read_unlock_bh(&idev->lock); in inet6_fill_ifla6_attrs()
4821 struct inet6_dev *idev = __in6_dev_get(dev); in inet6_fill_link_af() local
4823 if (!idev) in inet6_fill_link_af()
4826 if (inet6_fill_ifla6_attrs(skb, idev, ext_filter_mask) < 0) in inet6_fill_link_af()
4832 static int inet6_set_iftoken(struct inet6_dev *idev, struct in6_addr *token) in inet6_set_iftoken() argument
4835 struct net_device *dev = idev->dev; in inet6_set_iftoken()
4847 if (!ipv6_accept_ra(idev)) in inet6_set_iftoken()
4849 if (idev->cnf.rtr_solicits <= 0) in inet6_set_iftoken()
4852 write_lock_bh(&idev->lock); in inet6_set_iftoken()
4855 memcpy(idev->token.s6_addr + 8, token->s6_addr + 8, 8); in inet6_set_iftoken()
4857 write_unlock_bh(&idev->lock); in inet6_set_iftoken()
4859 if (!idev->dead && (idev->if_flags & IF_READY) && in inet6_set_iftoken()
4870 write_lock_bh(&idev->lock); in inet6_set_iftoken()
4873 idev->if_flags |= IF_RS_SENT; in inet6_set_iftoken()
4874 idev->rs_probes = 1; in inet6_set_iftoken()
4875 addrconf_mod_rs_timer(idev, idev->cnf.rtr_solicit_interval); in inet6_set_iftoken()
4879 list_for_each_entry(ifp, &idev->addr_list, if_list) { in inet6_set_iftoken()
4888 write_unlock_bh(&idev->lock); in inet6_set_iftoken()
4889 inet6_ifinfo_notify(RTM_NEWLINK, idev); in inet6_set_iftoken()
4913 struct inet6_dev *idev = __in6_dev_get(dev); in inet6_set_link_af() local
4916 if (!idev) in inet6_set_link_af()
4923 err = inet6_set_iftoken(idev, nla_data(tb[IFLA_INET6_TOKEN])); in inet6_set_link_af()
4937 !idev->cnf.stable_secret.initialized && in inet6_set_link_af()
4941 idev->addr_gen_mode = mode; in inet6_set_link_af()
4948 static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev, in inet6_fill_ifinfo() argument
4951 struct net_device *dev = idev->dev; in inet6_fill_ifinfo()
4981 if (inet6_fill_ifla6_attrs(skb, idev, 0) < 0) in inet6_fill_ifinfo()
4999 struct inet6_dev *idev; in inet6_dump_ifinfo() local
5012 idev = __in6_dev_get(dev); in inet6_dump_ifinfo()
5013 if (!idev) in inet6_dump_ifinfo()
5015 if (inet6_fill_ifinfo(skb, idev, in inet6_dump_ifinfo()
5032 void inet6_ifinfo_notify(int event, struct inet6_dev *idev) in inet6_ifinfo_notify() argument
5035 struct net *net = dev_net(idev->dev); in inet6_ifinfo_notify()
5042 err = inet6_fill_ifinfo(skb, idev, 0, 0, event, 0); in inet6_ifinfo_notify()
5063 static int inet6_fill_prefix(struct sk_buff *skb, struct inet6_dev *idev, in inet6_fill_prefix() argument
5079 pmsg->prefix_ifindex = idev->dev->ifindex; in inet6_fill_prefix()
5103 static void inet6_prefix_notify(int event, struct inet6_dev *idev, in inet6_prefix_notify() argument
5107 struct net *net = dev_net(idev->dev); in inet6_prefix_notify()
5114 err = inet6_fill_prefix(skb, idev, pinfo, 0, 0, event, 0); in inet6_prefix_notify()
5130 struct net *net = dev_net(ifp->idev->dev); in __ipv6_ifa_notify()
5147 if (ifp->idev->cnf.forwarding) in __ipv6_ifa_notify()
5151 ifp->idev->dev, 0, 0); in __ipv6_ifa_notify()
5154 if (ifp->idev->cnf.forwarding) in __ipv6_ifa_notify()
5156 addrconf_leave_solict(ifp->idev, &ifp->addr); in __ipv6_ifa_notify()
5161 ifp->idev->dev, 0, 0); in __ipv6_ifa_notify()
5178 if (likely(ifp->idev->dead == 0)) in ipv6_ifa_notify()
5215 struct inet6_dev *idev = ctl->extra1; in addrconf_sysctl_mtu() local
5221 lctl.extra2 = idev ? &idev->dev->mtu : NULL; in addrconf_sysctl_mtu()
5226 static void dev_disable_change(struct inet6_dev *idev) in dev_disable_change() argument
5230 if (!idev || !idev->dev) in dev_disable_change()
5233 netdev_notifier_info_init(&info, idev->dev); in dev_disable_change()
5234 if (idev->cnf.disable_ipv6) in dev_disable_change()
5243 struct inet6_dev *idev; in addrconf_disable_change() local
5247 idev = __in6_dev_get(dev); in addrconf_disable_change()
5248 if (idev) { in addrconf_disable_change()
5249 int changed = (!idev->cnf.disable_ipv6) ^ (!newf); in addrconf_disable_change()
5250 idev->cnf.disable_ipv6 = newf; in addrconf_disable_change()
5252 dev_disable_change(idev); in addrconf_disable_change()
5338 struct inet6_dev *idev = ctl->extra1; in addrconf_sysctl_proxy_ndp() local
5341 idev->dev->ifindex, in addrconf_sysctl_proxy_ndp()
5342 &idev->cnf); in addrconf_sysctl_proxy_ndp()
5397 struct inet6_dev *idev = __in6_dev_get(dev); in addrconf_sysctl_stable_secret() local
5399 if (idev) { in addrconf_sysctl_stable_secret()
5400 idev->addr_gen_mode = in addrconf_sysctl_stable_secret()
5405 struct inet6_dev *idev = ctl->extra1; in addrconf_sysctl_stable_secret() local
5407 idev->addr_gen_mode = IN6_ADDR_GEN_MODE_STABLE_PRIVACY; in addrconf_sysctl_stable_secret()
5750 struct inet6_dev *idev, struct ipv6_devconf *p) in __addrconf_sysctl_register() argument
5762 t->addrconf_vars[i].extra1 = idev; /* embedded; no ref */ in __addrconf_sysctl_register()
5794 static int addrconf_sysctl_register(struct inet6_dev *idev) in addrconf_sysctl_register() argument
5798 if (!sysctl_dev_name_is_allowed(idev->dev->name)) in addrconf_sysctl_register()
5801 err = neigh_sysctl_register(idev->dev, idev->nd_parms, in addrconf_sysctl_register()
5805 err = __addrconf_sysctl_register(dev_net(idev->dev), idev->dev->name, in addrconf_sysctl_register()
5806 idev, &idev->cnf); in addrconf_sysctl_register()
5808 neigh_sysctl_unregister(idev->nd_parms); in addrconf_sysctl_register()
5813 static void addrconf_sysctl_unregister(struct inet6_dev *idev) in addrconf_sysctl_unregister() argument
5815 __addrconf_sysctl_unregister(&idev->cnf); in addrconf_sysctl_unregister()
5816 neigh_sysctl_unregister(idev->nd_parms); in addrconf_sysctl_unregister()
5897 struct inet6_dev *idev; in addrconf_init() local
5936 idev = ipv6_add_dev(init_net.loopback_dev); in addrconf_init()
5938 if (IS_ERR(idev)) { in addrconf_init()
5939 err = PTR_ERR(idev); in addrconf_init()