Lines Matching refs:idev

115 static int addrconf_sysctl_register(struct inet6_dev *idev);
116 static void addrconf_sysctl_unregister(struct inet6_dev *idev);
118 static inline int addrconf_sysctl_register(struct inet6_dev *idev) in addrconf_sysctl_register() argument
123 static inline void addrconf_sysctl_unregister(struct inet6_dev *idev) in addrconf_sysctl_unregister() argument
128 static void __ipv6_regen_rndid(struct inet6_dev *idev);
129 static void __ipv6_try_regen_rndid(struct inet6_dev *idev, struct in6_addr *tmpaddr);
133 static int ipv6_count_addresses(struct inet6_dev *idev);
136 const struct inet6_dev *idev);
166 static void addrconf_dad_run(struct inet6_dev *idev);
171 static void inet6_prefix_notify(int event, struct inet6_dev *idev,
266 static void addrconf_del_rs_timer(struct inet6_dev *idev) in addrconf_del_rs_timer() argument
268 if (del_timer(&idev->rs_timer)) in addrconf_del_rs_timer()
269 __in6_dev_put(idev); in addrconf_del_rs_timer()
278 static void addrconf_mod_rs_timer(struct inet6_dev *idev, in addrconf_mod_rs_timer() argument
281 if (!timer_pending(&idev->rs_timer)) in addrconf_mod_rs_timer()
282 in6_dev_hold(idev); in addrconf_mod_rs_timer()
283 mod_timer(&idev->rs_timer, jiffies + when); in addrconf_mod_rs_timer()
294 static int snmp6_alloc_dev(struct inet6_dev *idev) in snmp6_alloc_dev() argument
298 idev->stats.ipv6 = alloc_percpu(struct ipstats_mib); in snmp6_alloc_dev()
299 if (!idev->stats.ipv6) in snmp6_alloc_dev()
304 addrconf_stats = per_cpu_ptr(idev->stats.ipv6, i); in snmp6_alloc_dev()
309 idev->stats.icmpv6dev = kzalloc(sizeof(struct icmpv6_mib_device), in snmp6_alloc_dev()
311 if (!idev->stats.icmpv6dev) in snmp6_alloc_dev()
313 idev->stats.icmpv6msgdev = kzalloc(sizeof(struct icmpv6msg_mib_device), in snmp6_alloc_dev()
315 if (!idev->stats.icmpv6msgdev) in snmp6_alloc_dev()
321 kfree(idev->stats.icmpv6dev); in snmp6_alloc_dev()
323 free_percpu(idev->stats.ipv6); in snmp6_alloc_dev()
449 struct inet6_dev *idev; in ipv6_find_idev() local
453 idev = __in6_dev_get(dev); in ipv6_find_idev()
454 if (!idev) { in ipv6_find_idev()
455 idev = ipv6_add_dev(dev); in ipv6_find_idev()
456 if (IS_ERR(idev)) in ipv6_find_idev()
461 ipv6_mc_up(idev); in ipv6_find_idev()
462 return idev; in ipv6_find_idev()
622 struct inet6_dev *idev; in inet6_netconf_dump_devconf() local
637 idev = __in6_dev_get(dev); in inet6_netconf_dump_devconf()
638 if (!idev) in inet6_netconf_dump_devconf()
642 &idev->cnf, in inet6_netconf_dump_devconf()
687 static void dev_forward_change(struct inet6_dev *idev) in dev_forward_change() argument
692 if (!idev) in dev_forward_change()
694 dev = idev->dev; in dev_forward_change()
695 if (idev->cnf.forwarding) in dev_forward_change()
698 if (idev->cnf.forwarding) { in dev_forward_change()
709 list_for_each_entry(ifa, &idev->addr_list, if_list) { in dev_forward_change()
712 if (idev->cnf.forwarding) in dev_forward_change()
718 dev->ifindex, &idev->cnf); in dev_forward_change()
725 struct inet6_dev *idev; in addrconf_forward_change() local
728 idev = __in6_dev_get(dev); in addrconf_forward_change()
729 if (idev) { in addrconf_forward_change()
730 int changed = (!idev->cnf.forwarding) ^ (!newf); in addrconf_forward_change()
731 idev->cnf.forwarding = newf; in addrconf_forward_change()
733 dev_forward_change(idev); in addrconf_forward_change()
785 in6_dev_put(ifp->idev); in inet6_ifa_finish_destroy()
801 ipv6_link_dev_addr(struct inet6_dev *idev, struct inet6_ifaddr *ifp) in ipv6_link_dev_addr() argument
810 list_for_each(p, &idev->addr_list) { in ipv6_link_dev_addr()
828 ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr, in ipv6_add_addr() argument
840 (!(idev->dev->flags & IFF_LOOPBACK) && in ipv6_add_addr()
845 if (idev->dead) { in ipv6_add_addr()
850 if (idev->cnf.disable_ipv6) { in ipv6_add_addr()
858 if (ipv6_chk_same_addr(dev_net(idev->dev), addr, idev->dev)) { in ipv6_add_addr()
872 rt = addrconf_dst_alloc(idev, addr, false); in ipv6_add_addr()
878 neigh_parms_data_state_setall(idev->nd_parms); in ipv6_add_addr()
897 ifa->idev = idev; in ipv6_add_addr()
898 in6_dev_hold(idev); in ipv6_add_addr()
908 write_lock(&idev->lock); in ipv6_add_addr()
910 ipv6_link_dev_addr(idev, ifa); in ipv6_add_addr()
913 list_add(&ifa->tmp_list, &idev->tempaddr_list); in ipv6_add_addr()
918 write_unlock(&idev->lock); in ipv6_add_addr()
963 struct inet6_dev *idev = ifp->idev; in check_cleanup_prefix_route() local
969 list_for_each_entry(ifa, &idev->addr_list, if_list) { in check_cleanup_prefix_route()
1003 ifp->idev->dev, in cleanup_prefix_route()
1039 write_lock_bh(&ifp->idev->lock); in ipv6_del_addr()
1056 write_unlock_bh(&ifp->idev->lock); in ipv6_del_addr()
1077 struct inet6_dev *idev = ifp->idev; in ipv6_create_tempaddr() local
1086 write_lock_bh(&idev->lock); in ipv6_create_tempaddr()
1096 in6_dev_hold(idev); in ipv6_create_tempaddr()
1097 if (idev->cnf.use_tempaddr <= 0) { in ipv6_create_tempaddr()
1098 write_unlock_bh(&idev->lock); in ipv6_create_tempaddr()
1100 in6_dev_put(idev); in ipv6_create_tempaddr()
1105 if (ifp->regen_count++ >= idev->cnf.regen_max_retry) { in ipv6_create_tempaddr()
1106 idev->cnf.use_tempaddr = -1; /*XXX*/ in ipv6_create_tempaddr()
1108 write_unlock_bh(&idev->lock); in ipv6_create_tempaddr()
1111 in6_dev_put(idev); in ipv6_create_tempaddr()
1117 __ipv6_try_regen_rndid(idev, tmpaddr); in ipv6_create_tempaddr()
1118 memcpy(&addr.s6_addr[8], idev->rndid, 8); in ipv6_create_tempaddr()
1122 idev->cnf.temp_valid_lft + age); in ipv6_create_tempaddr()
1125 idev->cnf.temp_prefered_lft + age - in ipv6_create_tempaddr()
1126 idev->cnf.max_desync_factor); in ipv6_create_tempaddr()
1131 regen_advance = idev->cnf.regen_max_retry * in ipv6_create_tempaddr()
1132 idev->cnf.dad_transmits * in ipv6_create_tempaddr()
1133 NEIGH_VAR(idev->nd_parms, RETRANS_TIME) / HZ; in ipv6_create_tempaddr()
1134 write_unlock_bh(&idev->lock); in ipv6_create_tempaddr()
1146 in6_dev_put(idev); in ipv6_create_tempaddr()
1156 ift = ipv6_add_addr(idev, &addr, NULL, tmp_plen, in ipv6_create_tempaddr()
1161 in6_dev_put(idev); in ipv6_create_tempaddr()
1164 write_lock_bh(&idev->lock); in ipv6_create_tempaddr()
1176 in6_dev_put(idev); in ipv6_create_tempaddr()
1227 static inline bool ipv6_use_optimistic_addr(struct inet6_dev *idev) in ipv6_use_optimistic_addr() argument
1230 return idev && idev->cnf.optimistic_dad && idev->cnf.use_optimistic; in ipv6_use_optimistic_addr()
1300 if (!ipv6_use_optimistic_addr(score->ifa->idev)) in ipv6_get_saddr_eval()
1318 dst->ifindex == score->ifa->idev->dev->ifindex); in ipv6_get_saddr_eval()
1324 score->ifa->idev->dev->ifindex) == dst->label; in ipv6_get_saddr_eval()
1333 score->ifa->idev->cnf.use_tempaddr >= 2; in ipv6_get_saddr_eval()
1393 struct inet6_dev *idev; in ipv6_dev_get_saddr() local
1412 idev = __in6_dev_get(dev); in ipv6_dev_get_saddr()
1413 if (!idev) in ipv6_dev_get_saddr()
1416 read_lock_bh(&idev->lock); in ipv6_dev_get_saddr()
1417 list_for_each_entry(score->ifa, &idev->addr_list, if_list) { in ipv6_dev_get_saddr()
1482 read_unlock_bh(&idev->lock); in ipv6_dev_get_saddr()
1495 int __ipv6_get_lladdr(struct inet6_dev *idev, struct in6_addr *addr, in __ipv6_get_lladdr() argument
1501 list_for_each_entry_reverse(ifp, &idev->addr_list, if_list) { in __ipv6_get_lladdr()
1517 struct inet6_dev *idev; in ipv6_get_lladdr() local
1521 idev = __in6_dev_get(dev); in ipv6_get_lladdr()
1522 if (idev) { in ipv6_get_lladdr()
1523 read_lock_bh(&idev->lock); in ipv6_get_lladdr()
1524 err = __ipv6_get_lladdr(idev, addr, banned_flags); in ipv6_get_lladdr()
1525 read_unlock_bh(&idev->lock); in ipv6_get_lladdr()
1531 static int ipv6_count_addresses(struct inet6_dev *idev) in ipv6_count_addresses() argument
1536 read_lock_bh(&idev->lock); in ipv6_count_addresses()
1537 list_for_each_entry(ifp, &idev->addr_list, if_list) in ipv6_count_addresses()
1539 read_unlock_bh(&idev->lock); in ipv6_count_addresses()
1560 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_chk_addr_and_flags()
1570 (!dev || ifp->idev->dev == dev || in ipv6_chk_addr_and_flags()
1589 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_chk_same_addr()
1592 if (!dev || ifp->idev->dev == dev) in ipv6_chk_same_addr()
1605 struct inet6_dev *idev; in ipv6_chk_custom_prefix() local
1610 idev = __in6_dev_get(dev); in ipv6_chk_custom_prefix()
1611 if (idev) { in ipv6_chk_custom_prefix()
1612 read_lock_bh(&idev->lock); in ipv6_chk_custom_prefix()
1613 list_for_each_entry(ifa, &idev->addr_list, if_list) { in ipv6_chk_custom_prefix()
1618 read_unlock_bh(&idev->lock); in ipv6_chk_custom_prefix()
1628 struct inet6_dev *idev; in ipv6_chk_prefix() local
1634 idev = __in6_dev_get(dev); in ipv6_chk_prefix()
1635 if (idev) { in ipv6_chk_prefix()
1636 read_lock_bh(&idev->lock); in ipv6_chk_prefix()
1637 list_for_each_entry(ifa, &idev->addr_list, if_list) { in ipv6_chk_prefix()
1643 read_unlock_bh(&idev->lock); in ipv6_chk_prefix()
1658 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_get_ifaddr()
1661 if (!dev || ifp->idev->dev == dev || in ipv6_get_ifaddr()
1723 struct inet6_dev *idev = ifp->idev; in addrconf_dad_failure() local
1724 struct net *net = dev_net(ifp->idev->dev); in addrconf_dad_failure()
1732 ifp->idev->dev->name, &ifp->addr); in addrconf_dad_failure()
1747 ifp->idev->dev->name); in addrconf_dad_failure()
1753 idev)) in addrconf_dad_failure()
1761 if (idev->cnf.max_addresses && in addrconf_dad_failure()
1762 ipv6_count_addresses(idev) >= in addrconf_dad_failure()
1763 idev->cnf.max_addresses) in addrconf_dad_failure()
1767 ifp->idev->dev->name); in addrconf_dad_failure()
1769 ifp2 = ipv6_add_addr(idev, &new_addr, NULL, pfxlen, in addrconf_dad_failure()
1784 } else if (idev->cnf.accept_dad > 1 && !idev->cnf.disable_ipv6) { in addrconf_dad_failure()
1788 if (!ipv6_generate_eui64(addr.s6_addr + 8, idev->dev) && in addrconf_dad_failure()
1791 idev->cnf.disable_ipv6 = 1; in addrconf_dad_failure()
1794 ifp->idev->dev->name); in addrconf_dad_failure()
1820 void addrconf_leave_solict(struct inet6_dev *idev, const struct in6_addr *addr) in addrconf_leave_solict() argument
1824 if (idev->dev->flags&(IFF_LOOPBACK|IFF_NOARP)) in addrconf_leave_solict()
1828 __ipv6_dev_mc_dec(idev, &maddr); in addrconf_leave_solict()
1841 __ipv6_dev_ac_inc(ifp->idev, &addr); in addrconf_join_anycast()
1854 __ipv6_dev_ac_dec(ifp->idev, &addr); in addrconf_leave_anycast()
1994 static int ipv6_inherit_eui64(u8 *eui, struct inet6_dev *idev) in ipv6_inherit_eui64() argument
1999 read_lock_bh(&idev->lock); in ipv6_inherit_eui64()
2000 list_for_each_entry_reverse(ifp, &idev->addr_list, if_list) { in ipv6_inherit_eui64()
2009 read_unlock_bh(&idev->lock); in ipv6_inherit_eui64()
2014 static void __ipv6_regen_rndid(struct inet6_dev *idev) in __ipv6_regen_rndid() argument
2017 get_random_bytes(idev->rndid, sizeof(idev->rndid)); in __ipv6_regen_rndid()
2018 idev->rndid[0] &= ~0x02; in __ipv6_regen_rndid()
2031 if (idev->rndid[0] == 0xfd && in __ipv6_regen_rndid()
2032 …(idev->rndid[1]&idev->rndid[2]&idev->rndid[3]&idev->rndid[4]&idev->rndid[5]&idev->rndid[6]) == 0xf… in __ipv6_regen_rndid()
2033 (idev->rndid[7]&0x80)) in __ipv6_regen_rndid()
2035 if ((idev->rndid[0]|idev->rndid[1]) == 0) { in __ipv6_regen_rndid()
2036 if (idev->rndid[2] == 0x5e && idev->rndid[3] == 0xfe) in __ipv6_regen_rndid()
2038 …if ((idev->rndid[2]|idev->rndid[3]|idev->rndid[4]|idev->rndid[5]|idev->rndid[6]|idev->rndid[7]) ==… in __ipv6_regen_rndid()
2045 struct inet6_dev *idev = (struct inet6_dev *) data; in ipv6_regen_rndid() local
2049 write_lock_bh(&idev->lock); in ipv6_regen_rndid()
2051 if (idev->dead) in ipv6_regen_rndid()
2054 __ipv6_regen_rndid(idev); in ipv6_regen_rndid()
2057 idev->cnf.temp_prefered_lft * HZ - in ipv6_regen_rndid()
2058 idev->cnf.regen_max_retry * idev->cnf.dad_transmits * in ipv6_regen_rndid()
2059 NEIGH_VAR(idev->nd_parms, RETRANS_TIME) - in ipv6_regen_rndid()
2060 idev->cnf.max_desync_factor * HZ; in ipv6_regen_rndid()
2063 __func__, idev->dev->name); in ipv6_regen_rndid()
2067 if (!mod_timer(&idev->regen_timer, expires)) in ipv6_regen_rndid()
2068 in6_dev_hold(idev); in ipv6_regen_rndid()
2071 write_unlock_bh(&idev->lock); in ipv6_regen_rndid()
2073 in6_dev_put(idev); in ipv6_regen_rndid()
2076 static void __ipv6_try_regen_rndid(struct inet6_dev *idev, struct in6_addr *tmpaddr) in __ipv6_try_regen_rndid() argument
2078 if (tmpaddr && memcmp(idev->rndid, &tmpaddr->s6_addr[8], 8) == 0) in __ipv6_try_regen_rndid()
2079 __ipv6_regen_rndid(idev); in __ipv6_try_regen_rndid()
2169 struct inet6_dev *idev; in addrconf_add_dev() local
2173 idev = ipv6_find_idev(dev); in addrconf_add_dev()
2174 if (!idev) in addrconf_add_dev()
2177 if (idev->cnf.disable_ipv6) in addrconf_add_dev()
2184 return idev; in addrconf_add_dev()
2187 static void manage_tempaddrs(struct inet6_dev *idev, in manage_tempaddrs() argument
2195 read_lock_bh(&idev->lock); in manage_tempaddrs()
2197 list_for_each_entry(ift, &idev->tempaddr_list, tmp_list) { in manage_tempaddrs()
2212 max_valid = idev->cnf.temp_valid_lft - age; in manage_tempaddrs()
2216 max_prefered = idev->cnf.temp_prefered_lft - in manage_tempaddrs()
2217 idev->cnf.max_desync_factor - age; in manage_tempaddrs()
2240 if ((create || list_empty(&idev->tempaddr_list)) && in manage_tempaddrs()
2241 idev->cnf.use_tempaddr > 0) { in manage_tempaddrs()
2247 read_unlock_bh(&idev->lock); in manage_tempaddrs()
2250 read_unlock_bh(&idev->lock); in manage_tempaddrs()
2571 struct inet6_dev *idev; in inet6_addr_add() local
2594 idev = addrconf_add_dev(dev); in inet6_addr_add()
2595 if (IS_ERR(idev)) in inet6_addr_add()
2596 return PTR_ERR(idev); in inet6_addr_add()
2626 ifp = ipv6_add_addr(idev, pfx, peer_pfx, plen, scope, ifa_flags, in inet6_addr_add()
2642 manage_tempaddrs(idev, ifp, valid_lft, prefered_lft, in inet6_addr_add()
2659 struct inet6_dev *idev; in inet6_addr_del() local
2669 idev = __in6_dev_get(dev); in inet6_addr_del()
2670 if (!idev) in inet6_addr_del()
2673 read_lock_bh(&idev->lock); in inet6_addr_del()
2674 list_for_each_entry(ifp, &idev->addr_list, if_list) { in inet6_addr_del()
2678 read_unlock_bh(&idev->lock); in inet6_addr_del()
2682 manage_tempaddrs(idev, ifp, 0, 0, false, in inet6_addr_del()
2693 read_unlock_bh(&idev->lock); in inet6_addr_del()
2735 static void add_addr(struct inet6_dev *idev, const struct in6_addr *addr, in add_addr() argument
2740 ifp = ipv6_add_addr(idev, addr, NULL, plen, in add_addr()
2753 static void sit_add_v4_addrs(struct inet6_dev *idev) in sit_add_v4_addrs() argument
2757 struct net *net = dev_net(idev->dev); in sit_add_v4_addrs()
2764 memcpy(&addr.s6_addr32[3], idev->dev->dev_addr, 4); in sit_add_v4_addrs()
2766 if (idev->dev->flags&IFF_POINTOPOINT) { in sit_add_v4_addrs()
2777 add_addr(idev, &addr, plen, scope); in sit_add_v4_addrs()
2778 addrconf_prefix_route(&addr, plen, idev->dev, 0, pflags); in sit_add_v4_addrs()
2796 if (idev->dev->flags&IFF_POINTOPOINT) in sit_add_v4_addrs()
2801 add_addr(idev, &addr, plen, flag); in sit_add_v4_addrs()
2802 addrconf_prefix_route(&addr, plen, idev->dev, 0, in sit_add_v4_addrs()
2812 struct inet6_dev *idev; in init_loopback() local
2821 idev = ipv6_find_idev(dev); in init_loopback()
2822 if (!idev) { in init_loopback()
2827 add_addr(idev, &in6addr_loopback, 128, IFA_HOST); in init_loopback()
2834 idev = __in6_dev_get(sp_dev); in init_loopback()
2835 if (!idev) in init_loopback()
2838 read_lock_bh(&idev->lock); in init_loopback()
2839 list_for_each_entry(sp_ifa, &idev->addr_list, if_list) { in init_loopback()
2857 sp_rt = addrconf_dst_alloc(idev, &sp_ifa->addr, false); in init_loopback()
2865 read_unlock_bh(&idev->lock); in init_loopback()
2869 static void addrconf_add_linklocal(struct inet6_dev *idev, in addrconf_add_linklocal() argument
2876 if (idev->cnf.optimistic_dad && in addrconf_add_linklocal()
2877 !dev_net(idev->dev)->ipv6.devconf_all->forwarding) in addrconf_add_linklocal()
2881 ifp = ipv6_add_addr(idev, addr, NULL, 64, IFA_LINK, addr_flags, in addrconf_add_linklocal()
2884 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, idev->dev, 0, 0); in addrconf_add_linklocal()
2908 const struct inet6_dev *idev) in ipv6_generate_stable_address() argument
2926 struct net *net = dev_net(idev->dev); in ipv6_generate_stable_address()
2930 if (idev->cnf.stable_secret.initialized) in ipv6_generate_stable_address()
2931 secret = idev->cnf.stable_secret.secret; in ipv6_generate_stable_address()
2943 memcpy(data.hwaddr, idev->dev->perm_addr, idev->dev->addr_len); in ipv6_generate_stable_address()
2959 if (dad_count > dev_net(idev->dev)->ipv6.sysctl.idgen_retries) in ipv6_generate_stable_address()
2968 static void addrconf_addr_gen(struct inet6_dev *idev, bool prefix_route) in addrconf_addr_gen() argument
2974 if (idev->addr_gen_mode == IN6_ADDR_GEN_MODE_STABLE_PRIVACY) { in addrconf_addr_gen()
2975 if (!ipv6_generate_stable_address(&addr, 0, idev)) in addrconf_addr_gen()
2976 addrconf_add_linklocal(idev, &addr, in addrconf_addr_gen()
2979 addrconf_prefix_route(&addr, 64, idev->dev, 0, 0); in addrconf_addr_gen()
2980 } else if (idev->addr_gen_mode == IN6_ADDR_GEN_MODE_EUI64) { in addrconf_addr_gen()
2985 if (ipv6_generate_eui64(addr.s6_addr + 8, idev->dev) == 0) in addrconf_addr_gen()
2986 addrconf_add_linklocal(idev, &addr, 0); in addrconf_addr_gen()
2988 addrconf_prefix_route(&addr, 64, idev->dev, 0, 0); in addrconf_addr_gen()
2994 struct inet6_dev *idev; in addrconf_dev_config() local
3010 idev = addrconf_add_dev(dev); in addrconf_dev_config()
3011 if (IS_ERR(idev)) in addrconf_dev_config()
3014 addrconf_addr_gen(idev, false); in addrconf_dev_config()
3020 struct inet6_dev *idev; in addrconf_sit_config() local
3030 idev = ipv6_find_idev(dev); in addrconf_sit_config()
3031 if (!idev) { in addrconf_sit_config()
3037 addrconf_addr_gen(idev, false); in addrconf_sit_config()
3041 sit_add_v4_addrs(idev); in addrconf_sit_config()
3051 struct inet6_dev *idev; in addrconf_gre_config() local
3055 idev = ipv6_find_idev(dev); in addrconf_gre_config()
3056 if (!idev) { in addrconf_gre_config()
3061 addrconf_addr_gen(idev, true); in addrconf_gre_config()
3069 struct inet6_dev *idev = __in6_dev_get(dev); in addrconf_notify() local
3075 if (!idev && dev->mtu >= IPV6_MIN_MTU) { in addrconf_notify()
3076 idev = ipv6_add_dev(dev); in addrconf_notify()
3077 if (IS_ERR(idev)) in addrconf_notify()
3078 return notifier_from_errno(PTR_ERR(idev)); in addrconf_notify()
3087 if (idev && idev->cnf.disable_ipv6) in addrconf_notify()
3098 if (!idev && dev->mtu >= IPV6_MIN_MTU) in addrconf_notify()
3099 idev = ipv6_add_dev(dev); in addrconf_notify()
3101 if (!IS_ERR_OR_NULL(idev)) { in addrconf_notify()
3102 idev->if_flags |= IF_READY; in addrconf_notify()
3111 if (idev) { in addrconf_notify()
3112 if (idev->if_flags & IF_READY) in addrconf_notify()
3115 idev->if_flags |= IF_READY; in addrconf_notify()
3144 if (!IS_ERR_OR_NULL(idev)) { in addrconf_notify()
3146 addrconf_dad_run(idev); in addrconf_notify()
3153 if (idev->cnf.mtu6 != dev->mtu && in addrconf_notify()
3156 idev->cnf.mtu6 = dev->mtu; in addrconf_notify()
3158 idev->tstamp = jiffies; in addrconf_notify()
3159 inet6_ifinfo_notify(RTM_NEWLINK, idev); in addrconf_notify()
3171 if (idev && dev->mtu >= IPV6_MIN_MTU) { in addrconf_notify()
3173 idev->cnf.mtu6 = dev->mtu; in addrconf_notify()
3177 if (!idev && dev->mtu >= IPV6_MIN_MTU) { in addrconf_notify()
3178 idev = ipv6_add_dev(dev); in addrconf_notify()
3179 if (!IS_ERR(idev)) in addrconf_notify()
3197 if (idev) { in addrconf_notify()
3198 snmp6_unregister_dev(idev); in addrconf_notify()
3199 addrconf_sysctl_unregister(idev); in addrconf_notify()
3200 err = addrconf_sysctl_register(idev); in addrconf_notify()
3203 err = snmp6_register_dev(idev); in addrconf_notify()
3205 addrconf_sysctl_unregister(idev); in addrconf_notify()
3229 struct inet6_dev *idev; in addrconf_type_change() local
3232 idev = __in6_dev_get(dev); in addrconf_type_change()
3235 ipv6_mc_remap(idev); in addrconf_type_change()
3237 ipv6_mc_unmap(idev); in addrconf_type_change()
3243 struct inet6_dev *idev; in addrconf_ifdown() local
3252 idev = __in6_dev_get(dev); in addrconf_ifdown()
3253 if (!idev) in addrconf_ifdown()
3261 idev->dead = 1; in addrconf_ifdown()
3267 snmp6_unregister_dev(idev); in addrconf_ifdown()
3278 if (ifa->idev == idev) { in addrconf_ifdown()
3287 write_lock_bh(&idev->lock); in addrconf_ifdown()
3289 addrconf_del_rs_timer(idev); in addrconf_ifdown()
3293 idev->if_flags &= ~(IF_RS_SENT|IF_RA_RCVD|IF_READY); in addrconf_ifdown()
3295 if (how && del_timer(&idev->regen_timer)) in addrconf_ifdown()
3296 in6_dev_put(idev); in addrconf_ifdown()
3299 while (!list_empty(&idev->tempaddr_list)) { in addrconf_ifdown()
3300 ifa = list_first_entry(&idev->tempaddr_list, in addrconf_ifdown()
3303 write_unlock_bh(&idev->lock); in addrconf_ifdown()
3312 write_lock_bh(&idev->lock); in addrconf_ifdown()
3315 while (!list_empty(&idev->addr_list)) { in addrconf_ifdown()
3316 ifa = list_first_entry(&idev->addr_list, in addrconf_ifdown()
3322 write_unlock_bh(&idev->lock); in addrconf_ifdown()
3335 write_lock_bh(&idev->lock); in addrconf_ifdown()
3338 write_unlock_bh(&idev->lock); in addrconf_ifdown()
3342 ipv6_ac_destroy_dev(idev); in addrconf_ifdown()
3343 ipv6_mc_destroy_dev(idev); in addrconf_ifdown()
3345 ipv6_mc_down(idev); in addrconf_ifdown()
3348 idev->tstamp = jiffies; in addrconf_ifdown()
3352 addrconf_sysctl_unregister(idev); in addrconf_ifdown()
3353 neigh_parms_release(&nd_tbl, idev->nd_parms); in addrconf_ifdown()
3355 in6_dev_put(idev); in addrconf_ifdown()
3362 struct inet6_dev *idev = (struct inet6_dev *)data; in addrconf_rs_timer() local
3363 struct net_device *dev = idev->dev; in addrconf_rs_timer()
3366 write_lock(&idev->lock); in addrconf_rs_timer()
3367 if (idev->dead || !(idev->if_flags & IF_READY)) in addrconf_rs_timer()
3370 if (!ipv6_accept_ra(idev)) in addrconf_rs_timer()
3374 if (idev->if_flags & IF_RA_RCVD) in addrconf_rs_timer()
3377 if (idev->rs_probes++ < idev->cnf.rtr_solicits) { in addrconf_rs_timer()
3378 write_unlock(&idev->lock); in addrconf_rs_timer()
3385 write_lock(&idev->lock); in addrconf_rs_timer()
3387 addrconf_mod_rs_timer(idev, (idev->rs_probes == in addrconf_rs_timer()
3388 idev->cnf.rtr_solicits) ? in addrconf_rs_timer()
3389 idev->cnf.rtr_solicit_delay : in addrconf_rs_timer()
3390 idev->cnf.rtr_solicit_interval); in addrconf_rs_timer()
3396 pr_debug("%s: no IPv6 routers present\n", idev->dev->name); in addrconf_rs_timer()
3400 write_unlock(&idev->lock); in addrconf_rs_timer()
3402 in6_dev_put(idev); in addrconf_rs_timer()
3411 struct inet6_dev *idev = ifp->idev; in addrconf_dad_kick() local
3416 rand_num = prandom_u32() % (idev->cnf.rtr_solicit_delay ? : 1); in addrconf_dad_kick()
3418 ifp->dad_probes = idev->cnf.dad_transmits; in addrconf_dad_kick()
3424 struct inet6_dev *idev = ifp->idev; in addrconf_dad_begin() local
3425 struct net_device *dev = idev->dev; in addrconf_dad_begin()
3432 read_lock_bh(&idev->lock); in addrconf_dad_begin()
3438 idev->cnf.accept_dad < 1 || in addrconf_dad_begin()
3443 read_unlock_bh(&idev->lock); in addrconf_dad_begin()
3449 if (!(idev->if_flags & IF_READY)) { in addrconf_dad_begin()
3451 read_unlock_bh(&idev->lock); in addrconf_dad_begin()
3468 if (ipv6_use_optimistic_addr(idev)) { in addrconf_dad_begin()
3479 read_unlock_bh(&idev->lock); in addrconf_dad_begin()
3504 struct inet6_dev *idev = ifp->idev; in addrconf_dad_work() local
3536 write_lock_bh(&idev->lock); in addrconf_dad_work()
3537 if (idev->dead || !(idev->if_flags & IF_READY)) { in addrconf_dad_work()
3538 write_unlock_bh(&idev->lock); in addrconf_dad_work()
3545 write_unlock_bh(&idev->lock); in addrconf_dad_work()
3556 write_unlock_bh(&idev->lock); in addrconf_dad_work()
3565 NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME)); in addrconf_dad_work()
3567 write_unlock_bh(&idev->lock); in addrconf_dad_work()
3571 ndisc_send_ns(ifp->idev->dev, NULL, &ifp->addr, &mcaddr, &in6addr_any); in addrconf_dad_work()
3581 struct inet6_dev *idev = ifp->idev; in ipv6_lonely_lladdr() local
3583 list_for_each_entry_reverse(ifpiter, &idev->addr_list, if_list) { in ipv6_lonely_lladdr()
3597 struct net_device *dev = ifp->idev->dev; in addrconf_dad_completed()
3613 read_lock_bh(&ifp->idev->lock); in addrconf_dad_completed()
3616 ipv6_accept_ra(ifp->idev) && in addrconf_dad_completed()
3617 ifp->idev->cnf.rtr_solicits > 0 && in addrconf_dad_completed()
3619 read_unlock_bh(&ifp->idev->lock); in addrconf_dad_completed()
3625 ipv6_mc_dad_complete(ifp->idev); in addrconf_dad_completed()
3637 write_lock_bh(&ifp->idev->lock); in addrconf_dad_completed()
3639 ifp->idev->rs_probes = 1; in addrconf_dad_completed()
3640 ifp->idev->if_flags |= IF_RS_SENT; in addrconf_dad_completed()
3641 addrconf_mod_rs_timer(ifp->idev, in addrconf_dad_completed()
3642 ifp->idev->cnf.rtr_solicit_interval); in addrconf_dad_completed()
3644 write_unlock_bh(&ifp->idev->lock); in addrconf_dad_completed()
3648 static void addrconf_dad_run(struct inet6_dev *idev) in addrconf_dad_run() argument
3652 read_lock_bh(&idev->lock); in addrconf_dad_run()
3653 list_for_each_entry(ifp, &idev->addr_list, if_list) { in addrconf_dad_run()
3660 read_unlock_bh(&idev->lock); in addrconf_dad_run()
3686 if (!net_eq(dev_net(ifa->idev->dev), net)) in if6_get_first()
3711 if (!net_eq(dev_net(ifa->idev->dev), net)) in if6_get_next()
3721 if (!net_eq(dev_net(ifa->idev->dev), net)) in if6_get_next()
3758 ifp->idev->dev->ifindex, in if6_seq_show()
3762 ifp->idev->dev->name); in if6_seq_show()
3825 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_chk_home_addr()
3906 unsigned long regen_advance = ifp->idev->cnf.regen_max_retry * in addrconf_verify_rtnl()
3907 ifp->idev->cnf.dad_transmits * in addrconf_verify_rtnl()
3908 NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME) / HZ; in addrconf_verify_rtnl()
4076 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, ifp->idev->dev, in inet6_addr_modify()
4082 write_lock_bh(&ifp->idev->lock); in inet6_addr_modify()
4084 write_unlock_bh(&ifp->idev->lock); in inet6_addr_modify()
4095 manage_tempaddrs(ifp->idev, ifp, valid_lft, prefered_lft, in inet6_addr_modify()
4227 ifa->idev->dev->ifindex); in inet6_fill_ifaddr()
4278 int ifindex = ifmca->idev->dev->ifindex; in inet6_fill_ifmcaddr()
4332 static int in6_dump_addrs(struct inet6_dev *idev, struct sk_buff *skb, in in6_dump_addrs() argument
4341 read_lock_bh(&idev->lock); in in6_dump_addrs()
4347 list_for_each_entry(ifa, &idev->addr_list, if_list) { in in6_dump_addrs()
4363 for (ifmca = idev->mc_list; ifmca; in in6_dump_addrs()
4378 for (ifaca = idev->ac_list; ifaca; in in6_dump_addrs()
4394 read_unlock_bh(&idev->lock); in in6_dump_addrs()
4407 struct inet6_dev *idev; in inet6_dump_addr() local
4425 idev = __in6_dev_get(dev); in inet6_dump_addr()
4426 if (!idev) in inet6_dump_addr()
4429 if (in6_dump_addrs(idev, skb, cb, type, in inet6_dump_addr()
4522 struct net *net = dev_net(ifa->idev->dev); in inet6_ifa_notify()
4652 static void snmp6_fill_stats(u64 *stats, struct inet6_dev *idev, int attrtype, in snmp6_fill_stats() argument
4657 __snmp6_fill_stats64(stats, idev->stats.ipv6, in snmp6_fill_stats()
4661 __snmp6_fill_statsdev(stats, idev->stats.icmpv6dev->mibs, ICMP6_MIB_MAX, bytes); in snmp6_fill_stats()
4666 static int inet6_fill_ifla6_attrs(struct sk_buff *skb, struct inet6_dev *idev) in inet6_fill_ifla6_attrs() argument
4671 if (nla_put_u32(skb, IFLA_INET6_FLAGS, idev->if_flags)) in inet6_fill_ifla6_attrs()
4674 ci.tstamp = cstamp_delta(idev->tstamp); in inet6_fill_ifla6_attrs()
4675 ci.reachable_time = jiffies_to_msecs(idev->nd_parms->reachable_time); in inet6_fill_ifla6_attrs()
4676 ci.retrans_time = jiffies_to_msecs(NEIGH_VAR(idev->nd_parms, RETRANS_TIME)); in inet6_fill_ifla6_attrs()
4682 ipv6_store_devconf(&idev->cnf, nla_data(nla), nla_len(nla)); in inet6_fill_ifla6_attrs()
4689 snmp6_fill_stats(nla_data(nla), idev, IFLA_INET6_STATS, nla_len(nla)); in inet6_fill_ifla6_attrs()
4694 snmp6_fill_stats(nla_data(nla), idev, IFLA_INET6_ICMP6STATS, nla_len(nla)); in inet6_fill_ifla6_attrs()
4700 if (nla_put_u8(skb, IFLA_INET6_ADDR_GEN_MODE, idev->addr_gen_mode)) in inet6_fill_ifla6_attrs()
4703 read_lock_bh(&idev->lock); in inet6_fill_ifla6_attrs()
4704 memcpy(nla_data(nla), idev->token.s6_addr, nla_len(nla)); in inet6_fill_ifla6_attrs()
4705 read_unlock_bh(&idev->lock); in inet6_fill_ifla6_attrs()
4723 struct inet6_dev *idev = __in6_dev_get(dev); in inet6_fill_link_af() local
4725 if (!idev) in inet6_fill_link_af()
4728 if (inet6_fill_ifla6_attrs(skb, idev) < 0) in inet6_fill_link_af()
4734 static int inet6_set_iftoken(struct inet6_dev *idev, struct in6_addr *token) in inet6_set_iftoken() argument
4737 struct net_device *dev = idev->dev; in inet6_set_iftoken()
4749 if (!ipv6_accept_ra(idev)) in inet6_set_iftoken()
4751 if (idev->cnf.rtr_solicits <= 0) in inet6_set_iftoken()
4754 write_lock_bh(&idev->lock); in inet6_set_iftoken()
4757 memcpy(idev->token.s6_addr + 8, token->s6_addr + 8, 8); in inet6_set_iftoken()
4759 write_unlock_bh(&idev->lock); in inet6_set_iftoken()
4761 if (!idev->dead && (idev->if_flags & IF_READY) && in inet6_set_iftoken()
4772 write_lock_bh(&idev->lock); in inet6_set_iftoken()
4775 idev->if_flags |= IF_RS_SENT; in inet6_set_iftoken()
4776 idev->rs_probes = 1; in inet6_set_iftoken()
4777 addrconf_mod_rs_timer(idev, idev->cnf.rtr_solicit_interval); in inet6_set_iftoken()
4781 list_for_each_entry(ifp, &idev->addr_list, if_list) { in inet6_set_iftoken()
4790 write_unlock_bh(&idev->lock); in inet6_set_iftoken()
4791 inet6_ifinfo_notify(RTM_NEWLINK, idev); in inet6_set_iftoken()
4815 struct inet6_dev *idev = __in6_dev_get(dev); in inet6_set_link_af() local
4818 if (!idev) in inet6_set_link_af()
4825 err = inet6_set_iftoken(idev, nla_data(tb[IFLA_INET6_TOKEN])); in inet6_set_link_af()
4839 !idev->cnf.stable_secret.initialized && in inet6_set_link_af()
4843 idev->addr_gen_mode = mode; in inet6_set_link_af()
4850 static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev, in inet6_fill_ifinfo() argument
4853 struct net_device *dev = idev->dev; in inet6_fill_ifinfo()
4881 if (inet6_fill_ifla6_attrs(skb, idev) < 0) in inet6_fill_ifinfo()
4899 struct inet6_dev *idev; in inet6_dump_ifinfo() local
4912 idev = __in6_dev_get(dev); in inet6_dump_ifinfo()
4913 if (!idev) in inet6_dump_ifinfo()
4915 if (inet6_fill_ifinfo(skb, idev, in inet6_dump_ifinfo()
4932 void inet6_ifinfo_notify(int event, struct inet6_dev *idev) in inet6_ifinfo_notify() argument
4935 struct net *net = dev_net(idev->dev); in inet6_ifinfo_notify()
4942 err = inet6_fill_ifinfo(skb, idev, 0, 0, event, 0); in inet6_ifinfo_notify()
4963 static int inet6_fill_prefix(struct sk_buff *skb, struct inet6_dev *idev, in inet6_fill_prefix() argument
4979 pmsg->prefix_ifindex = idev->dev->ifindex; in inet6_fill_prefix()
5003 static void inet6_prefix_notify(int event, struct inet6_dev *idev, in inet6_prefix_notify() argument
5007 struct net *net = dev_net(idev->dev); in inet6_prefix_notify()
5014 err = inet6_fill_prefix(skb, idev, pinfo, 0, 0, event, 0); in inet6_prefix_notify()
5030 struct net *net = dev_net(ifp->idev->dev); in __ipv6_ifa_notify()
5047 if (ifp->idev->cnf.forwarding) in __ipv6_ifa_notify()
5051 ifp->idev->dev, 0, 0); in __ipv6_ifa_notify()
5054 if (ifp->idev->cnf.forwarding) in __ipv6_ifa_notify()
5056 addrconf_leave_solict(ifp->idev, &ifp->addr); in __ipv6_ifa_notify()
5061 ifp->idev->dev, 0, 0); in __ipv6_ifa_notify()
5079 if (likely(ifp->idev->dead == 0)) in ipv6_ifa_notify()
5116 struct inet6_dev *idev = ctl->extra1; in addrconf_sysctl_mtu() local
5122 lctl.extra2 = idev ? &idev->dev->mtu : NULL; in addrconf_sysctl_mtu()
5127 static void dev_disable_change(struct inet6_dev *idev) in dev_disable_change() argument
5131 if (!idev || !idev->dev) in dev_disable_change()
5134 netdev_notifier_info_init(&info, idev->dev); in dev_disable_change()
5135 if (idev->cnf.disable_ipv6) in dev_disable_change()
5144 struct inet6_dev *idev; in addrconf_disable_change() local
5148 idev = __in6_dev_get(dev); in addrconf_disable_change()
5149 if (idev) { in addrconf_disable_change()
5150 int changed = (!idev->cnf.disable_ipv6) ^ (!newf); in addrconf_disable_change()
5151 idev->cnf.disable_ipv6 = newf; in addrconf_disable_change()
5153 dev_disable_change(idev); in addrconf_disable_change()
5239 struct inet6_dev *idev = ctl->extra1; in addrconf_sysctl_proxy_ndp() local
5242 idev->dev->ifindex, in addrconf_sysctl_proxy_ndp()
5243 &idev->cnf); in addrconf_sysctl_proxy_ndp()
5298 struct inet6_dev *idev = __in6_dev_get(dev); in addrconf_sysctl_stable_secret() local
5300 if (idev) { in addrconf_sysctl_stable_secret()
5301 idev->addr_gen_mode = in addrconf_sysctl_stable_secret()
5306 struct inet6_dev *idev = ctl->extra1; in addrconf_sysctl_stable_secret() local
5308 idev->addr_gen_mode = IN6_ADDR_GEN_MODE_STABLE_PRIVACY; in addrconf_sysctl_stable_secret()
5609 struct inet6_dev *idev, struct ipv6_devconf *p) in __addrconf_sysctl_register() argument
5621 t->addrconf_vars[i].extra1 = idev; /* embedded; no ref */ in __addrconf_sysctl_register()
5653 static int addrconf_sysctl_register(struct inet6_dev *idev) in addrconf_sysctl_register() argument
5657 if (!sysctl_dev_name_is_allowed(idev->dev->name)) in addrconf_sysctl_register()
5660 err = neigh_sysctl_register(idev->dev, idev->nd_parms, in addrconf_sysctl_register()
5664 err = __addrconf_sysctl_register(dev_net(idev->dev), idev->dev->name, in addrconf_sysctl_register()
5665 idev, &idev->cnf); in addrconf_sysctl_register()
5667 neigh_sysctl_unregister(idev->nd_parms); in addrconf_sysctl_register()
5672 static void addrconf_sysctl_unregister(struct inet6_dev *idev) in addrconf_sysctl_unregister() argument
5674 __addrconf_sysctl_unregister(&idev->cnf); in addrconf_sysctl_unregister()
5675 neigh_sysctl_unregister(idev->nd_parms); in addrconf_sysctl_unregister()
5756 struct inet6_dev *idev; in addrconf_init() local
5795 idev = ipv6_add_dev(init_net.loopback_dev); in addrconf_init()
5797 if (IS_ERR(idev)) { in addrconf_init()
5798 err = PTR_ERR(idev); in addrconf_init()