Lines Matching refs:idev
125 static int addrconf_sysctl_register(struct inet6_dev *idev);
126 static void addrconf_sysctl_unregister(struct inet6_dev *idev);
128 static inline int addrconf_sysctl_register(struct inet6_dev *idev) in addrconf_sysctl_register() argument
133 static inline void addrconf_sysctl_unregister(struct inet6_dev *idev) in addrconf_sysctl_unregister() argument
141 static int ipv6_count_addresses(const struct inet6_dev *idev);
144 const struct inet6_dev *idev);
178 static void addrconf_dad_run(struct inet6_dev *idev, bool restart);
183 static void inet6_prefix_notify(int event, struct inet6_dev *idev,
302 static void addrconf_del_rs_timer(struct inet6_dev *idev) in addrconf_del_rs_timer() argument
304 if (del_timer(&idev->rs_timer)) in addrconf_del_rs_timer()
305 __in6_dev_put(idev); in addrconf_del_rs_timer()
314 static void addrconf_mod_rs_timer(struct inet6_dev *idev, in addrconf_mod_rs_timer() argument
317 if (!timer_pending(&idev->rs_timer)) in addrconf_mod_rs_timer()
318 in6_dev_hold(idev); in addrconf_mod_rs_timer()
319 mod_timer(&idev->rs_timer, jiffies + when); in addrconf_mod_rs_timer()
330 static int snmp6_alloc_dev(struct inet6_dev *idev) in snmp6_alloc_dev() argument
334 idev->stats.ipv6 = alloc_percpu(struct ipstats_mib); in snmp6_alloc_dev()
335 if (!idev->stats.ipv6) in snmp6_alloc_dev()
340 addrconf_stats = per_cpu_ptr(idev->stats.ipv6, i); in snmp6_alloc_dev()
345 idev->stats.icmpv6dev = kzalloc(sizeof(struct icmpv6_mib_device), in snmp6_alloc_dev()
347 if (!idev->stats.icmpv6dev) in snmp6_alloc_dev()
349 idev->stats.icmpv6msgdev = kzalloc(sizeof(struct icmpv6msg_mib_device), in snmp6_alloc_dev()
351 if (!idev->stats.icmpv6msgdev) in snmp6_alloc_dev()
357 kfree(idev->stats.icmpv6dev); in snmp6_alloc_dev()
359 free_percpu(idev->stats.ipv6); in snmp6_alloc_dev()
473 struct inet6_dev *idev; in ipv6_find_idev() local
477 idev = __in6_dev_get(dev); in ipv6_find_idev()
478 if (!idev) { in ipv6_find_idev()
479 idev = ipv6_add_dev(dev); in ipv6_find_idev()
480 if (IS_ERR(idev)) in ipv6_find_idev()
481 return idev; in ipv6_find_idev()
485 ipv6_mc_up(idev); in ipv6_find_idev()
486 return idev; in ipv6_find_idev()
708 struct inet6_dev *idev; in inet6_netconf_dump_devconf() local
738 idev = __in6_dev_get(dev); in inet6_netconf_dump_devconf()
739 if (!idev) in inet6_netconf_dump_devconf()
743 &idev->cnf, in inet6_netconf_dump_devconf()
788 static void dev_forward_change(struct inet6_dev *idev) in dev_forward_change() argument
793 if (!idev) in dev_forward_change()
795 dev = idev->dev; in dev_forward_change()
796 if (idev->cnf.forwarding) in dev_forward_change()
799 if (idev->cnf.forwarding) { in dev_forward_change()
810 list_for_each_entry(ifa, &idev->addr_list, if_list) { in dev_forward_change()
813 if (idev->cnf.forwarding) in dev_forward_change()
820 dev->ifindex, &idev->cnf); in dev_forward_change()
827 struct inet6_dev *idev; in addrconf_forward_change() local
830 idev = __in6_dev_get(dev); in addrconf_forward_change()
831 if (idev) { in addrconf_forward_change()
832 int changed = (!idev->cnf.forwarding) ^ (!newf); in addrconf_forward_change()
833 idev->cnf.forwarding = newf; in addrconf_forward_change()
835 dev_forward_change(idev); in addrconf_forward_change()
890 struct inet6_dev *idev; in addrconf_linkdown_change() local
893 idev = __in6_dev_get(dev); in addrconf_linkdown_change()
894 if (idev) { in addrconf_linkdown_change()
895 int changed = (!idev->cnf.ignore_routes_with_linkdown) ^ (!newf); in addrconf_linkdown_change()
897 idev->cnf.ignore_routes_with_linkdown = newf; in addrconf_linkdown_change()
903 &idev->cnf); in addrconf_linkdown_change()
957 in6_dev_put(ifp->idev); in inet6_ifa_finish_destroy()
972 ipv6_link_dev_addr(struct inet6_dev *idev, struct inet6_ifaddr *ifp) in ipv6_link_dev_addr() argument
981 list_for_each(p, &idev->addr_list) { in ipv6_link_dev_addr()
1004 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_chk_same_addr()
1007 if (!dev || ifp->idev->dev == dev) in ipv6_chk_same_addr()
1037 ipv6_add_addr(struct inet6_dev *idev, struct ifa6_config *cfg, in ipv6_add_addr() argument
1042 struct net *net = dev_net(idev->dev); in ipv6_add_addr()
1050 (!(idev->dev->flags & IFF_LOOPBACK) && in ipv6_add_addr()
1051 !netif_is_l3_master(idev->dev) && in ipv6_add_addr()
1055 if (idev->dead) { in ipv6_add_addr()
1060 if (idev->cnf.disable_ipv6) { in ipv6_add_addr()
1071 .i6vi_dev = idev, in ipv6_add_addr()
1087 f6i = addrconf_f6i_alloc(net, idev, cfg->pfx, false, gfp_flags); in ipv6_add_addr()
1095 idev->cnf.disable_policy) in ipv6_add_addr()
1098 neigh_parms_data_state_setall(idev->nd_parms); in ipv6_add_addr()
1121 ifa->idev = idev; in ipv6_add_addr()
1122 in6_dev_hold(idev); in ipv6_add_addr()
1129 err = ipv6_add_addr_hash(idev->dev, ifa); in ipv6_add_addr()
1135 write_lock(&idev->lock); in ipv6_add_addr()
1138 ipv6_link_dev_addr(idev, ifa); in ipv6_add_addr()
1141 list_add(&ifa->tmp_list, &idev->tempaddr_list); in ipv6_add_addr()
1146 write_unlock(&idev->lock); in ipv6_add_addr()
1156 if (ifa->idev) in ipv6_add_addr()
1157 in6_dev_put(ifa->idev); in ipv6_add_addr()
1194 struct inet6_dev *idev = ifp->idev; in check_cleanup_prefix_route() local
1200 list_for_each_entry(ifa, &idev->addr_list, if_list) { in check_cleanup_prefix_route()
1236 ifp->idev->dev, 0, RTF_DEFAULT, true); in cleanup_prefix_route()
1239 ip6_del_rt(dev_net(ifp->idev->dev), f6i, false); in cleanup_prefix_route()
1271 write_lock_bh(&ifp->idev->lock); in ipv6_del_addr()
1288 write_unlock_bh(&ifp->idev->lock); in ipv6_del_addr()
1309 struct inet6_dev *idev = ifp->idev; in ipv6_create_tempaddr() local
1320 write_lock_bh(&idev->lock); in ipv6_create_tempaddr()
1323 in6_dev_hold(idev); in ipv6_create_tempaddr()
1324 if (idev->cnf.use_tempaddr <= 0) { in ipv6_create_tempaddr()
1325 write_unlock_bh(&idev->lock); in ipv6_create_tempaddr()
1327 in6_dev_put(idev); in ipv6_create_tempaddr()
1332 if (ifp->regen_count++ >= idev->cnf.regen_max_retry) { in ipv6_create_tempaddr()
1333 idev->cnf.use_tempaddr = -1; /*XXX*/ in ipv6_create_tempaddr()
1335 write_unlock_bh(&idev->lock); in ipv6_create_tempaddr()
1338 in6_dev_put(idev); in ipv6_create_tempaddr()
1348 regen_advance = idev->cnf.regen_max_retry * in ipv6_create_tempaddr()
1349 idev->cnf.dad_transmits * in ipv6_create_tempaddr()
1350 max(NEIGH_VAR(idev->nd_parms, RETRANS_TIME), HZ/100) / HZ; in ipv6_create_tempaddr()
1355 cnf_temp_preferred_lft = READ_ONCE(idev->cnf.temp_prefered_lft); in ipv6_create_tempaddr()
1357 idev->cnf.max_desync_factor, in ipv6_create_tempaddr()
1360 if (unlikely(idev->desync_factor > max_desync_factor)) { in ipv6_create_tempaddr()
1362 get_random_bytes(&idev->desync_factor, in ipv6_create_tempaddr()
1363 sizeof(idev->desync_factor)); in ipv6_create_tempaddr()
1364 idev->desync_factor %= max_desync_factor; in ipv6_create_tempaddr()
1366 idev->desync_factor = 0; in ipv6_create_tempaddr()
1372 idev->cnf.temp_valid_lft + age); in ipv6_create_tempaddr()
1373 cfg.preferred_lft = cnf_temp_preferred_lft + age - idev->desync_factor; in ipv6_create_tempaddr()
1380 write_unlock_bh(&idev->lock); in ipv6_create_tempaddr()
1392 in6_dev_put(idev); in ipv6_create_tempaddr()
1405 ift = ipv6_add_addr(idev, &cfg, block, NULL); in ipv6_create_tempaddr()
1408 in6_dev_put(idev); in ipv6_create_tempaddr()
1410 write_lock_bh(&idev->lock); in ipv6_create_tempaddr()
1422 in6_dev_put(idev); in ipv6_create_tempaddr()
1474 struct inet6_dev *idev) in ipv6_use_optimistic_addr() argument
1477 if (!idev) in ipv6_use_optimistic_addr()
1479 if (!net->ipv6.devconf_all->optimistic_dad && !idev->cnf.optimistic_dad) in ipv6_use_optimistic_addr()
1481 if (!net->ipv6.devconf_all->use_optimistic && !idev->cnf.use_optimistic) in ipv6_use_optimistic_addr()
1491 struct inet6_dev *idev) in ipv6_allow_optimistic_dad() argument
1494 if (!idev) in ipv6_allow_optimistic_dad()
1496 if (!net->ipv6.devconf_all->optimistic_dad && !idev->cnf.optimistic_dad) in ipv6_allow_optimistic_dad()
1569 if (!ipv6_use_optimistic_addr(net, score->ifa->idev)) in ipv6_get_saddr_eval()
1587 dst->ifindex == score->ifa->idev->dev->ifindex); in ipv6_get_saddr_eval()
1593 score->ifa->idev->dev->ifindex) == dst->label; in ipv6_get_saddr_eval()
1602 score->ifa->idev->cnf.use_tempaddr >= 2; in ipv6_get_saddr_eval()
1641 struct inet6_dev *idev, in __ipv6_dev_get_saddr() argument
1647 list_for_each_entry_rcu(score->ifa, &idev->addr_list, if_list) { in __ipv6_dev_get_saddr()
1669 idev->dev->name); in __ipv6_dev_get_saddr()
1718 struct inet6_dev *idev; in ipv6_get_saddr_master() local
1720 idev = __in6_dev_get(dst_dev); in ipv6_get_saddr_master()
1721 if (idev) in ipv6_get_saddr_master()
1722 hiscore_idx = __ipv6_dev_get_saddr(net, dst, idev, in ipv6_get_saddr_master()
1725 idev = __in6_dev_get(master); in ipv6_get_saddr_master()
1726 if (idev) in ipv6_get_saddr_master()
1727 hiscore_idx = __ipv6_dev_get_saddr(net, dst, idev, in ipv6_get_saddr_master()
1739 struct inet6_dev *idev; in ipv6_dev_get_saddr() local
1775 idev = __in6_dev_get(dst_dev); in ipv6_dev_get_saddr()
1778 (idev && idev->cnf.use_oif_addrs_only)) { in ipv6_dev_get_saddr()
1784 if (idev) in ipv6_dev_get_saddr()
1785 hiscore_idx = __ipv6_dev_get_saddr(net, &dst, idev, scores, hiscore_idx); in ipv6_dev_get_saddr()
1812 idev = __in6_dev_get(dev); in ipv6_dev_get_saddr()
1813 if (!idev) in ipv6_dev_get_saddr()
1815 hiscore_idx = __ipv6_dev_get_saddr(net, &dst, idev, scores, hiscore_idx); in ipv6_dev_get_saddr()
1831 int __ipv6_get_lladdr(struct inet6_dev *idev, struct in6_addr *addr, in __ipv6_get_lladdr() argument
1837 list_for_each_entry_reverse(ifp, &idev->addr_list, if_list) { in __ipv6_get_lladdr()
1853 struct inet6_dev *idev; in ipv6_get_lladdr() local
1857 idev = __in6_dev_get(dev); in ipv6_get_lladdr()
1858 if (idev) { in ipv6_get_lladdr()
1859 read_lock_bh(&idev->lock); in ipv6_get_lladdr()
1860 err = __ipv6_get_lladdr(idev, addr, banned_flags); in ipv6_get_lladdr()
1861 read_unlock_bh(&idev->lock); in ipv6_get_lladdr()
1867 static int ipv6_count_addresses(const struct inet6_dev *idev) in ipv6_count_addresses() argument
1873 list_for_each_entry_rcu(ifp, &idev->addr_list, if_list) in ipv6_count_addresses()
1913 ndev = ifp->idev->dev; in __ipv6_chk_addr_and_flags()
1956 const struct inet6_dev *idev; in ipv6_chk_custom_prefix() local
1960 idev = __in6_dev_get(dev); in ipv6_chk_custom_prefix()
1961 if (idev) { in ipv6_chk_custom_prefix()
1962 list_for_each_entry_rcu(ifa, &idev->addr_list, if_list) { in ipv6_chk_custom_prefix()
1977 const struct inet6_dev *idev; in ipv6_chk_prefix() local
1982 idev = __in6_dev_get(dev); in ipv6_chk_prefix()
1983 if (idev) { in ipv6_chk_prefix()
1984 list_for_each_entry_rcu(ifa, &idev->addr_list, if_list) { in ipv6_chk_prefix()
2019 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_get_ifaddr()
2022 if (!dev || ifp->idev->dev == dev || in ipv6_get_ifaddr()
2086 struct inet6_dev *idev = ifp->idev; in addrconf_dad_failure() local
2087 struct net *net = dev_net(ifp->idev->dev); in addrconf_dad_failure()
2095 ifp->idev->dev->name, &ifp->addr, eth_hdr(skb)->h_source); in addrconf_dad_failure()
2114 ifp->idev->dev->name); in addrconf_dad_failure()
2120 idev)) in addrconf_dad_failure()
2125 if (idev->cnf.max_addresses && in addrconf_dad_failure()
2126 ipv6_count_addresses(idev) >= in addrconf_dad_failure()
2127 idev->cnf.max_addresses) in addrconf_dad_failure()
2131 ifp->idev->dev->name); in addrconf_dad_failure()
2133 ifp2 = ipv6_add_addr(idev, &cfg, false, NULL); in addrconf_dad_failure()
2171 void addrconf_leave_solict(struct inet6_dev *idev, const struct in6_addr *addr) in addrconf_leave_solict() argument
2175 if (idev->dev->flags&(IFF_LOOPBACK|IFF_NOARP)) in addrconf_leave_solict()
2179 __ipv6_dev_mc_dec(idev, &maddr); in addrconf_leave_solict()
2192 __ipv6_dev_ac_inc(ifp->idev, &addr); in addrconf_join_anycast()
2205 __ipv6_dev_ac_dec(ifp->idev, &addr); in addrconf_leave_anycast()
2327 static int ipv6_inherit_eui64(u8 *eui, struct inet6_dev *idev) in ipv6_inherit_eui64() argument
2332 read_lock_bh(&idev->lock); in ipv6_inherit_eui64()
2333 list_for_each_entry_reverse(ifp, &idev->addr_list, if_list) { in ipv6_inherit_eui64()
2342 read_unlock_bh(&idev->lock); in ipv6_inherit_eui64()
2480 struct inet6_dev *idev; in addrconf_add_dev() local
2484 idev = ipv6_find_idev(dev); in addrconf_add_dev()
2485 if (IS_ERR(idev)) in addrconf_add_dev()
2486 return idev; in addrconf_add_dev()
2488 if (idev->cnf.disable_ipv6) in addrconf_add_dev()
2495 return idev; in addrconf_add_dev()
2498 static void manage_tempaddrs(struct inet6_dev *idev, in manage_tempaddrs() argument
2506 read_lock_bh(&idev->lock); in manage_tempaddrs()
2508 list_for_each_entry(ift, &idev->tempaddr_list, tmp_list) { in manage_tempaddrs()
2523 max_valid = idev->cnf.temp_valid_lft - age; in manage_tempaddrs()
2527 max_prefered = idev->cnf.temp_prefered_lft - in manage_tempaddrs()
2528 idev->desync_factor - age; in manage_tempaddrs()
2551 if ((create || list_empty(&idev->tempaddr_list)) && in manage_tempaddrs()
2552 idev->cnf.use_tempaddr > 0) { in manage_tempaddrs()
2558 read_unlock_bh(&idev->lock); in manage_tempaddrs()
2561 read_unlock_bh(&idev->lock); in manage_tempaddrs()
2565 static bool is_addr_mode_generate_stable(struct inet6_dev *idev) in is_addr_mode_generate_stable() argument
2567 return idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_STABLE_PRIVACY || in is_addr_mode_generate_stable()
2568 idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_RANDOM; in is_addr_mode_generate_stable()
2887 struct inet6_dev *idev; in inet6_addr_add() local
2909 idev = addrconf_add_dev(dev); in inet6_addr_add()
2910 if (IS_ERR(idev)) in inet6_addr_add()
2911 return PTR_ERR(idev); in inet6_addr_add()
2941 ifp = ipv6_add_addr(idev, cfg, true, extack); in inet6_addr_add()
2961 manage_tempaddrs(idev, ifp, cfg->valid_lft, in inet6_addr_add()
2978 struct inet6_dev *idev; in inet6_addr_del() local
2988 idev = __in6_dev_get(dev); in inet6_addr_del()
2989 if (!idev) in inet6_addr_del()
2992 read_lock_bh(&idev->lock); in inet6_addr_del()
2993 list_for_each_entry(ifp, &idev->addr_list, if_list) { in inet6_addr_del()
2997 read_unlock_bh(&idev->lock); in inet6_addr_del()
3001 manage_tempaddrs(idev, ifp, 0, 0, false, in inet6_addr_del()
3012 read_unlock_bh(&idev->lock); in inet6_addr_del()
3060 static void add_addr(struct inet6_dev *idev, const struct in6_addr *addr, in add_addr() argument
3073 ifp = ipv6_add_addr(idev, &cfg, true, NULL); in add_addr()
3078 rt_genid_bump_ipv6(dev_net(idev->dev)); in add_addr()
3085 static void sit_add_v4_addrs(struct inet6_dev *idev) in sit_add_v4_addrs() argument
3089 struct net *net = dev_net(idev->dev); in sit_add_v4_addrs()
3096 memcpy(&addr.s6_addr32[3], idev->dev->dev_addr, 4); in sit_add_v4_addrs()
3098 if (idev->dev->flags&IFF_POINTOPOINT) { in sit_add_v4_addrs()
3109 add_addr(idev, &addr, plen, scope); in sit_add_v4_addrs()
3110 addrconf_prefix_route(&addr, plen, 0, idev->dev, 0, pflags, in sit_add_v4_addrs()
3127 if (idev->dev->flags&IFF_POINTOPOINT) in sit_add_v4_addrs()
3132 add_addr(idev, &addr, plen, flag); in sit_add_v4_addrs()
3133 addrconf_prefix_route(&addr, plen, 0, idev->dev, in sit_add_v4_addrs()
3143 struct inet6_dev *idev; in init_loopback() local
3149 idev = ipv6_find_idev(dev); in init_loopback()
3150 if (IS_ERR(idev)) { in init_loopback()
3155 add_addr(idev, &in6addr_loopback, 128, IFA_HOST); in init_loopback()
3158 void addrconf_add_linklocal(struct inet6_dev *idev, in addrconf_add_linklocal() argument
3172 if ((dev_net(idev->dev)->ipv6.devconf_all->optimistic_dad || in addrconf_add_linklocal()
3173 idev->cnf.optimistic_dad) && in addrconf_add_linklocal()
3174 !dev_net(idev->dev)->ipv6.devconf_all->forwarding) in addrconf_add_linklocal()
3178 ifp = ipv6_add_addr(idev, &cfg, true, NULL); in addrconf_add_linklocal()
3180 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, 0, idev->dev, in addrconf_add_linklocal()
3206 const struct inet6_dev *idev) in ipv6_generate_stable_address() argument
3224 struct net *net = dev_net(idev->dev); in ipv6_generate_stable_address()
3228 if (idev->cnf.stable_secret.initialized) in ipv6_generate_stable_address()
3229 secret = idev->cnf.stable_secret.secret; in ipv6_generate_stable_address()
3241 memcpy(data.hwaddr, idev->dev->perm_addr, idev->dev->addr_len); in ipv6_generate_stable_address()
3257 if (dad_count > dev_net(idev->dev)->ipv6.sysctl.idgen_retries) in ipv6_generate_stable_address()
3266 static void ipv6_gen_mode_random_init(struct inet6_dev *idev) in ipv6_gen_mode_random_init() argument
3268 struct ipv6_stable_secret *s = &idev->cnf.stable_secret; in ipv6_gen_mode_random_init()
3272 s = &idev->cnf.stable_secret; in ipv6_gen_mode_random_init()
3277 static void addrconf_addr_gen(struct inet6_dev *idev, bool prefix_route) in addrconf_addr_gen() argument
3282 if (netif_is_l3_master(idev->dev)) in addrconf_addr_gen()
3286 if (idev->dev->flags & IFF_SLAVE) in addrconf_addr_gen()
3291 switch (idev->cnf.addr_gen_mode) { in addrconf_addr_gen()
3293 ipv6_gen_mode_random_init(idev); in addrconf_addr_gen()
3296 if (!ipv6_generate_stable_address(&addr, 0, idev)) in addrconf_addr_gen()
3297 addrconf_add_linklocal(idev, &addr, in addrconf_addr_gen()
3300 addrconf_prefix_route(&addr, 64, 0, idev->dev, in addrconf_addr_gen()
3308 if (ipv6_generate_eui64(addr.s6_addr + 8, idev->dev) == 0) in addrconf_addr_gen()
3309 addrconf_add_linklocal(idev, &addr, 0); in addrconf_addr_gen()
3311 addrconf_prefix_route(&addr, 64, 0, idev->dev, in addrconf_addr_gen()
3323 struct inet6_dev *idev; in addrconf_dev_config() local
3340 idev = __in6_dev_get(dev); in addrconf_dev_config()
3341 if (!IS_ERR_OR_NULL(idev) && dev->flags & IFF_UP && in addrconf_dev_config()
3343 ipv6_mc_up(idev); in addrconf_dev_config()
3347 idev = addrconf_add_dev(dev); in addrconf_dev_config()
3348 if (IS_ERR(idev)) in addrconf_dev_config()
3353 idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_EUI64) in addrconf_dev_config()
3354 idev->cnf.addr_gen_mode = IN6_ADDR_GEN_MODE_RANDOM; in addrconf_dev_config()
3356 addrconf_addr_gen(idev, false); in addrconf_dev_config()
3362 struct inet6_dev *idev; in addrconf_sit_config() local
3372 idev = ipv6_find_idev(dev); in addrconf_sit_config()
3373 if (IS_ERR(idev)) { in addrconf_sit_config()
3379 addrconf_addr_gen(idev, false); in addrconf_sit_config()
3383 sit_add_v4_addrs(idev); in addrconf_sit_config()
3393 struct inet6_dev *idev; in addrconf_gre_config() local
3397 idev = ipv6_find_idev(dev); in addrconf_gre_config()
3398 if (IS_ERR(idev)) { in addrconf_gre_config()
3403 addrconf_addr_gen(idev, true); in addrconf_gre_config()
3410 struct inet6_dev *idev, in fixup_permanent_addr() argument
3420 f6i = addrconf_f6i_alloc(net, idev, &ifp->addr, false, in fixup_permanent_addr()
3436 ifp->rt_priority, idev->dev, 0, 0, in fixup_permanent_addr()
3449 struct inet6_dev *idev; in addrconf_permanent_addr() local
3451 idev = __in6_dev_get(dev); in addrconf_permanent_addr()
3452 if (!idev) in addrconf_permanent_addr()
3455 write_lock_bh(&idev->lock); in addrconf_permanent_addr()
3457 list_for_each_entry_safe(ifp, tmp, &idev->addr_list, if_list) { in addrconf_permanent_addr()
3459 fixup_permanent_addr(net, idev, ifp) < 0) { in addrconf_permanent_addr()
3460 write_unlock_bh(&idev->lock); in addrconf_permanent_addr()
3463 write_lock_bh(&idev->lock); in addrconf_permanent_addr()
3466 idev->dev->name, &ifp->addr); in addrconf_permanent_addr()
3470 write_unlock_bh(&idev->lock); in addrconf_permanent_addr()
3479 struct inet6_dev *idev = __in6_dev_get(dev); in addrconf_notify() local
3486 if (!idev && dev->mtu >= IPV6_MIN_MTU) { in addrconf_notify()
3487 idev = ipv6_add_dev(dev); in addrconf_notify()
3488 if (IS_ERR(idev)) in addrconf_notify()
3489 return notifier_from_errno(PTR_ERR(idev)); in addrconf_notify()
3500 if (idev) { in addrconf_notify()
3502 idev->cnf.mtu6 = dev->mtu; in addrconf_notify()
3507 idev = ipv6_add_dev(dev); in addrconf_notify()
3508 if (IS_ERR(idev)) in addrconf_notify()
3512 if (!(idev->if_flags & IF_READY)) in addrconf_notify()
3522 if (idev && idev->cnf.disable_ipv6) in addrconf_notify()
3536 if (!idev && dev->mtu >= IPV6_MIN_MTU) in addrconf_notify()
3537 idev = ipv6_add_dev(dev); in addrconf_notify()
3539 if (!IS_ERR_OR_NULL(idev)) { in addrconf_notify()
3540 idev->if_flags |= IF_READY; in addrconf_notify()
3550 if (!IS_ERR_OR_NULL(idev)) { in addrconf_notify()
3551 if (idev->if_flags & IF_READY) { in addrconf_notify()
3557 ipv6_mc_up(idev); in addrconf_notify()
3560 addrconf_dad_run(idev, true); in addrconf_notify()
3564 idev->if_flags |= IF_READY; in addrconf_notify()
3593 if (!IS_ERR_OR_NULL(idev)) { in addrconf_notify()
3595 addrconf_dad_run(idev, false); in addrconf_notify()
3605 if (idev->cnf.mtu6 != dev->mtu && in addrconf_notify()
3608 idev->cnf.mtu6 = dev->mtu; in addrconf_notify()
3610 idev->tstamp = jiffies; in addrconf_notify()
3611 inet6_ifinfo_notify(RTM_NEWLINK, idev); in addrconf_notify()
3631 if (idev) { in addrconf_notify()
3632 snmp6_unregister_dev(idev); in addrconf_notify()
3633 addrconf_sysctl_unregister(idev); in addrconf_notify()
3634 err = addrconf_sysctl_register(idev); in addrconf_notify()
3637 err = snmp6_register_dev(idev); in addrconf_notify()
3639 addrconf_sysctl_unregister(idev); in addrconf_notify()
3647 if (idev) in addrconf_notify()
3674 struct inet6_dev *idev; in addrconf_type_change() local
3677 idev = __in6_dev_get(dev); in addrconf_type_change()
3680 ipv6_mc_remap(idev); in addrconf_type_change()
3682 ipv6_mc_unmap(idev); in addrconf_type_change()
3695 struct inet6_dev *idev; in addrconf_ifdown() local
3704 idev = __in6_dev_get(dev); in addrconf_ifdown()
3705 if (!idev) in addrconf_ifdown()
3713 idev->dead = 1; in addrconf_ifdown()
3719 snmp6_unregister_dev(idev); in addrconf_ifdown()
3726 if (!unregister && !idev->cnf.disable_ipv6) { in addrconf_ifdown()
3731 _keep_addr = idev->cnf.keep_addr_on_down; in addrconf_ifdown()
3743 if (ifa->idev == idev) { in addrconf_ifdown()
3759 write_lock_bh(&idev->lock); in addrconf_ifdown()
3761 addrconf_del_rs_timer(idev); in addrconf_ifdown()
3765 idev->if_flags &= ~(IF_RS_SENT|IF_RA_RCVD|IF_READY); in addrconf_ifdown()
3768 while (!list_empty(&idev->tempaddr_list)) { in addrconf_ifdown()
3769 ifa = list_first_entry(&idev->tempaddr_list, in addrconf_ifdown()
3772 write_unlock_bh(&idev->lock); in addrconf_ifdown()
3781 write_lock_bh(&idev->lock); in addrconf_ifdown()
3784 list_for_each_entry_safe(ifa, tmp, &idev->addr_list, if_list) { in addrconf_ifdown()
3793 write_unlock_bh(&idev->lock); in addrconf_ifdown()
3819 if (idev->cnf.forwarding) in addrconf_ifdown()
3821 addrconf_leave_solict(ifa->idev, &ifa->addr); in addrconf_ifdown()
3824 write_lock_bh(&idev->lock); in addrconf_ifdown()
3831 write_unlock_bh(&idev->lock); in addrconf_ifdown()
3835 ipv6_ac_destroy_dev(idev); in addrconf_ifdown()
3836 ipv6_mc_destroy_dev(idev); in addrconf_ifdown()
3838 ipv6_mc_down(idev); in addrconf_ifdown()
3841 idev->tstamp = jiffies; in addrconf_ifdown()
3845 addrconf_sysctl_unregister(idev); in addrconf_ifdown()
3846 neigh_parms_release(&nd_tbl, idev->nd_parms); in addrconf_ifdown()
3848 in6_dev_put(idev); in addrconf_ifdown()
3855 struct inet6_dev *idev = from_timer(idev, t, rs_timer); in addrconf_rs_timer() local
3856 struct net_device *dev = idev->dev; in addrconf_rs_timer()
3859 write_lock(&idev->lock); in addrconf_rs_timer()
3860 if (idev->dead || !(idev->if_flags & IF_READY)) in addrconf_rs_timer()
3863 if (!ipv6_accept_ra(idev)) in addrconf_rs_timer()
3867 if (idev->if_flags & IF_RA_RCVD) in addrconf_rs_timer()
3870 if (idev->rs_probes++ < idev->cnf.rtr_solicits || idev->cnf.rtr_solicits < 0) { in addrconf_rs_timer()
3871 write_unlock(&idev->lock); in addrconf_rs_timer()
3878 write_lock(&idev->lock); in addrconf_rs_timer()
3879 idev->rs_interval = rfc3315_s14_backoff_update( in addrconf_rs_timer()
3880 idev->rs_interval, idev->cnf.rtr_solicit_max_interval); in addrconf_rs_timer()
3882 addrconf_mod_rs_timer(idev, (idev->rs_probes == in addrconf_rs_timer()
3883 idev->cnf.rtr_solicits) ? in addrconf_rs_timer()
3884 idev->cnf.rtr_solicit_delay : in addrconf_rs_timer()
3885 idev->rs_interval); in addrconf_rs_timer()
3891 pr_debug("%s: no IPv6 routers present\n", idev->dev->name); in addrconf_rs_timer()
3895 write_unlock(&idev->lock); in addrconf_rs_timer()
3897 in6_dev_put(idev); in addrconf_rs_timer()
3906 struct inet6_dev *idev = ifp->idev; in addrconf_dad_kick() local
3912 rand_num = prandom_u32() % (idev->cnf.rtr_solicit_delay ? : 1); in addrconf_dad_kick()
3915 if (idev->cnf.enhanced_dad || in addrconf_dad_kick()
3916 dev_net(idev->dev)->ipv6.devconf_all->enhanced_dad) { in addrconf_dad_kick()
3922 ifp->dad_probes = idev->cnf.dad_transmits; in addrconf_dad_kick()
3928 struct inet6_dev *idev = ifp->idev; in addrconf_dad_begin() local
3929 struct net_device *dev = idev->dev; in addrconf_dad_begin()
3937 read_lock_bh(&idev->lock); in addrconf_dad_begin()
3945 idev->cnf.accept_dad < 1) || in addrconf_dad_begin()
3956 read_unlock_bh(&idev->lock); in addrconf_dad_begin()
3962 if (!(idev->if_flags & IF_READY)) { in addrconf_dad_begin()
3964 read_unlock_bh(&idev->lock); in addrconf_dad_begin()
3981 if (ipv6_use_optimistic_addr(net, idev)) { in addrconf_dad_begin()
3992 read_unlock_bh(&idev->lock); in addrconf_dad_begin()
4017 struct inet6_dev *idev = ifp->idev; in addrconf_dad_work() local
4037 if ((dev_net(idev->dev)->ipv6.devconf_all->accept_dad > 1 || in addrconf_dad_work()
4038 idev->cnf.accept_dad > 1) && in addrconf_dad_work()
4039 !idev->cnf.disable_ipv6 && in addrconf_dad_work()
4046 if (!ipv6_generate_eui64(addr.s6_addr + 8, idev->dev) && in addrconf_dad_work()
4049 idev->cnf.disable_ipv6 = 1; in addrconf_dad_work()
4052 ifp->idev->dev->name); in addrconf_dad_work()
4066 addrconf_ifdown(idev->dev, false); in addrconf_dad_work()
4073 write_lock_bh(&idev->lock); in addrconf_dad_work()
4074 if (idev->dead || !(idev->if_flags & IF_READY)) { in addrconf_dad_work()
4075 write_unlock_bh(&idev->lock); in addrconf_dad_work()
4082 write_unlock_bh(&idev->lock); in addrconf_dad_work()
4099 write_unlock_bh(&idev->lock); in addrconf_dad_work()
4108 max(NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME), in addrconf_dad_work()
4111 write_unlock_bh(&idev->lock); in addrconf_dad_work()
4115 ndisc_send_ns(ifp->idev->dev, &ifp->addr, &mcaddr, &in6addr_any, in addrconf_dad_work()
4126 struct inet6_dev *idev = ifp->idev; in ipv6_lonely_lladdr() local
4128 list_for_each_entry_reverse(ifpiter, &idev->addr_list, if_list) { in ipv6_lonely_lladdr()
4143 struct net_device *dev = ifp->idev->dev; in addrconf_dad_completed()
4159 read_lock_bh(&ifp->idev->lock); in addrconf_dad_completed()
4162 ipv6_accept_ra(ifp->idev) && in addrconf_dad_completed()
4163 ifp->idev->cnf.rtr_solicits != 0 && in addrconf_dad_completed()
4165 read_unlock_bh(&ifp->idev->lock); in addrconf_dad_completed()
4171 ipv6_mc_dad_complete(ifp->idev); in addrconf_dad_completed()
4175 (ifp->idev->cnf.ndisc_notify || in addrconf_dad_completed()
4178 /*router=*/ !!ifp->idev->cnf.forwarding, in addrconf_dad_completed()
4193 write_lock_bh(&ifp->idev->lock); in addrconf_dad_completed()
4195 ifp->idev->rs_interval = rfc3315_s14_backoff_init( in addrconf_dad_completed()
4196 ifp->idev->cnf.rtr_solicit_interval); in addrconf_dad_completed()
4197 ifp->idev->rs_probes = 1; in addrconf_dad_completed()
4198 ifp->idev->if_flags |= IF_RS_SENT; in addrconf_dad_completed()
4199 addrconf_mod_rs_timer(ifp->idev, ifp->idev->rs_interval); in addrconf_dad_completed()
4201 write_unlock_bh(&ifp->idev->lock); in addrconf_dad_completed()
4214 static void addrconf_dad_run(struct inet6_dev *idev, bool restart) in addrconf_dad_run() argument
4218 read_lock_bh(&idev->lock); in addrconf_dad_run()
4219 list_for_each_entry(ifp, &idev->addr_list, if_list) { in addrconf_dad_run()
4229 read_unlock_bh(&idev->lock); in addrconf_dad_run()
4255 if (!net_eq(dev_net(ifa->idev->dev), net)) in if6_get_first()
4279 if (!net_eq(dev_net(ifa->idev->dev), net)) in if6_get_next()
4289 if (!net_eq(dev_net(ifa->idev->dev), net)) in if6_get_next()
4325 ifp->idev->dev->ifindex, in if6_seq_show()
4329 ifp->idev->dev->name); in if6_seq_show()
4379 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_chk_home_addr()
4419 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_chk_rpl_srh_loop()
4513 unsigned long regen_advance = ifp->idev->cnf.regen_max_retry * in addrconf_verify_rtnl()
4514 ifp->idev->cnf.dad_transmits * in addrconf_verify_rtnl()
4515 max(NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME), HZ/100) / HZ; in addrconf_verify_rtnl()
4645 ifp->idev->dev, 0, RTF_DEFAULT, true); in modify_prefix_route()
4652 ip6_del_rt(dev_net(ifp->idev->dev), f6i, false); in modify_prefix_route()
4657 ifp->rt_priority, ifp->idev->dev, in modify_prefix_route()
4748 ifp->rt_priority, ifp->idev->dev, in inet6_addr_modify()
4757 ifp->rt_priority, ifp->idev->dev, in inet6_addr_modify()
4764 write_lock_bh(&ifp->idev->lock); in inet6_addr_modify()
4766 write_unlock_bh(&ifp->idev->lock); in inet6_addr_modify()
4780 manage_tempaddrs(ifp->idev, ifp, cfg->valid_lft, in inet6_addr_modify()
4800 struct inet6_dev *idev; in inet6_rtm_newaddr() local
4846 idev = ipv6_find_idev(dev); in inet6_rtm_newaddr()
4847 if (IS_ERR(idev)) in inet6_rtm_newaddr()
4848 return PTR_ERR(idev); in inet6_rtm_newaddr()
4850 if (!ipv6_allow_optimistic_dad(net, idev)) in inet6_rtm_newaddr()
4955 ifa->idev->dev->ifindex); in inet6_fill_ifaddr()
5014 int ifindex = ifmca->idev->dev->ifindex; in inet6_fill_ifmcaddr()
5077 static int in6_dump_addrs(struct inet6_dev *idev, struct sk_buff *skb, in in6_dump_addrs() argument
5086 read_lock_bh(&idev->lock); in in6_dump_addrs()
5093 list_for_each_entry(ifa, &idev->addr_list, if_list) { in in6_dump_addrs()
5109 for (ifmca = idev->mc_list; ifmca; in in6_dump_addrs()
5121 for (ifaca = idev->ac_list; ifaca; in in6_dump_addrs()
5133 read_unlock_bh(&idev->lock); in in6_dump_addrs()
5210 struct inet6_dev *idev; in inet6_dump_addr() local
5231 idev = __in6_dev_get(dev); in inet6_dump_addr()
5232 if (idev) { in inet6_dump_addr()
5233 err = in6_dump_addrs(idev, skb, cb, s_ip_idx, in inet6_dump_addr()
5252 idev = __in6_dev_get(dev); in inet6_dump_addr()
5253 if (!idev) in inet6_dump_addr()
5256 if (in6_dump_addrs(idev, skb, cb, s_ip_idx, in inet6_dump_addr()
5417 struct net *net = dev_net(ifa->idev->dev); in inet6_ifa_notify()
5580 static void snmp6_fill_stats(u64 *stats, struct inet6_dev *idev, int attrtype, in snmp6_fill_stats() argument
5585 __snmp6_fill_stats64(stats, idev->stats.ipv6, bytes, in snmp6_fill_stats()
5589 __snmp6_fill_statsdev(stats, idev->stats.icmpv6dev->mibs, bytes); in snmp6_fill_stats()
5594 static int inet6_fill_ifla6_attrs(struct sk_buff *skb, struct inet6_dev *idev, in inet6_fill_ifla6_attrs() argument
5600 if (nla_put_u32(skb, IFLA_INET6_FLAGS, idev->if_flags)) in inet6_fill_ifla6_attrs()
5603 ci.tstamp = cstamp_delta(idev->tstamp); in inet6_fill_ifla6_attrs()
5604 ci.reachable_time = jiffies_to_msecs(idev->nd_parms->reachable_time); in inet6_fill_ifla6_attrs()
5605 ci.retrans_time = jiffies_to_msecs(NEIGH_VAR(idev->nd_parms, RETRANS_TIME)); in inet6_fill_ifla6_attrs()
5611 ipv6_store_devconf(&idev->cnf, nla_data(nla), nla_len(nla)); in inet6_fill_ifla6_attrs()
5621 snmp6_fill_stats(nla_data(nla), idev, IFLA_INET6_STATS, nla_len(nla)); in inet6_fill_ifla6_attrs()
5626 snmp6_fill_stats(nla_data(nla), idev, IFLA_INET6_ICMP6STATS, nla_len(nla)); in inet6_fill_ifla6_attrs()
5631 read_lock_bh(&idev->lock); in inet6_fill_ifla6_attrs()
5632 memcpy(nla_data(nla), idev->token.s6_addr, nla_len(nla)); in inet6_fill_ifla6_attrs()
5633 read_unlock_bh(&idev->lock); in inet6_fill_ifla6_attrs()
5635 if (nla_put_u8(skb, IFLA_INET6_ADDR_GEN_MODE, idev->cnf.addr_gen_mode)) in inet6_fill_ifla6_attrs()
5656 struct inet6_dev *idev = __in6_dev_get(dev); in inet6_fill_link_af() local
5658 if (!idev) in inet6_fill_link_af()
5661 if (inet6_fill_ifla6_attrs(skb, idev, ext_filter_mask) < 0) in inet6_fill_link_af()
5667 static int inet6_set_iftoken(struct inet6_dev *idev, struct in6_addr *token) in inet6_set_iftoken() argument
5670 struct net_device *dev = idev->dev; in inet6_set_iftoken()
5680 if (!ipv6_accept_ra(idev)) in inet6_set_iftoken()
5682 if (idev->cnf.rtr_solicits == 0) in inet6_set_iftoken()
5685 write_lock_bh(&idev->lock); in inet6_set_iftoken()
5688 memcpy(idev->token.s6_addr + 8, token->s6_addr + 8, 8); in inet6_set_iftoken()
5690 write_unlock_bh(&idev->lock); in inet6_set_iftoken()
5696 if (!idev->dead && (idev->if_flags & IF_READY) && in inet6_set_iftoken()
5707 write_lock_bh(&idev->lock); in inet6_set_iftoken()
5710 idev->if_flags |= IF_RS_SENT; in inet6_set_iftoken()
5711 idev->rs_interval = rfc3315_s14_backoff_init( in inet6_set_iftoken()
5712 idev->cnf.rtr_solicit_interval); in inet6_set_iftoken()
5713 idev->rs_probes = 1; in inet6_set_iftoken()
5714 addrconf_mod_rs_timer(idev, idev->rs_interval); in inet6_set_iftoken()
5718 list_for_each_entry(ifp, &idev->addr_list, if_list) { in inet6_set_iftoken()
5727 write_unlock_bh(&idev->lock); in inet6_set_iftoken()
5728 inet6_ifinfo_notify(RTM_NEWLINK, idev); in inet6_set_iftoken()
5748 static int check_stable_privacy(struct inet6_dev *idev, struct net *net, in check_stable_privacy() argument
5752 !idev->cnf.stable_secret.initialized && in check_stable_privacy()
5762 struct inet6_dev *idev = NULL; in inet6_validate_link_af() local
5766 idev = __in6_dev_get(dev); in inet6_validate_link_af()
5767 if (!idev) in inet6_validate_link_af()
5784 if (dev && check_stable_privacy(idev, dev_net(dev), mode) < 0) in inet6_validate_link_af()
5793 struct inet6_dev *idev = __in6_dev_get(dev); in inet6_set_link_af() local
5797 if (!idev) in inet6_set_link_af()
5804 err = inet6_set_iftoken(idev, nla_data(tb[IFLA_INET6_TOKEN])); in inet6_set_link_af()
5812 idev->cnf.addr_gen_mode = mode; in inet6_set_link_af()
5818 static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev, in inet6_fill_ifinfo() argument
5821 struct net_device *dev = idev->dev; in inet6_fill_ifinfo()
5851 if (inet6_fill_ifla6_attrs(skb, idev, 0) < 0) in inet6_fill_ifinfo()
5894 struct inet6_dev *idev; in inet6_dump_ifinfo() local
5917 idev = __in6_dev_get(dev); in inet6_dump_ifinfo()
5918 if (!idev) in inet6_dump_ifinfo()
5920 if (inet6_fill_ifinfo(skb, idev, in inet6_dump_ifinfo()
5937 void inet6_ifinfo_notify(int event, struct inet6_dev *idev) in inet6_ifinfo_notify() argument
5940 struct net *net = dev_net(idev->dev); in inet6_ifinfo_notify()
5947 err = inet6_fill_ifinfo(skb, idev, 0, 0, event, 0); in inet6_ifinfo_notify()
5968 static int inet6_fill_prefix(struct sk_buff *skb, struct inet6_dev *idev, in inet6_fill_prefix() argument
5984 pmsg->prefix_ifindex = idev->dev->ifindex; in inet6_fill_prefix()
6008 static void inet6_prefix_notify(int event, struct inet6_dev *idev, in inet6_prefix_notify() argument
6012 struct net *net = dev_net(idev->dev); in inet6_prefix_notify()
6019 err = inet6_fill_prefix(skb, idev, pinfo, 0, 0, event, 0); in inet6_prefix_notify()
6035 struct net *net = dev_net(ifp->idev->dev); in __ipv6_ifa_notify()
6054 } else if (!ifp->rt && (ifp->idev->dev->flags & IFF_UP)) { in __ipv6_ifa_notify()
6056 &ifp->addr, ifp->idev->dev->name); in __ipv6_ifa_notify()
6059 if (ifp->idev->cnf.forwarding) in __ipv6_ifa_notify()
6063 ifp->rt_priority, ifp->idev->dev, in __ipv6_ifa_notify()
6067 if (ifp->idev->cnf.forwarding) in __ipv6_ifa_notify()
6069 addrconf_leave_solict(ifp->idev, &ifp->addr); in __ipv6_ifa_notify()
6074 ifp->idev->dev, 0, 0, in __ipv6_ifa_notify()
6092 if (likely(ifp->idev->dead == 0)) in ipv6_ifa_notify()
6127 struct inet6_dev *idev = ctl->extra1; in addrconf_sysctl_mtu() local
6133 lctl.extra2 = idev ? &idev->dev->mtu : NULL; in addrconf_sysctl_mtu()
6138 static void dev_disable_change(struct inet6_dev *idev) in dev_disable_change() argument
6142 if (!idev || !idev->dev) in dev_disable_change()
6145 netdev_notifier_info_init(&info, idev->dev); in dev_disable_change()
6146 if (idev->cnf.disable_ipv6) in dev_disable_change()
6155 struct inet6_dev *idev; in addrconf_disable_change() local
6158 idev = __in6_dev_get(dev); in addrconf_disable_change()
6159 if (idev) { in addrconf_disable_change()
6160 int changed = (!idev->cnf.disable_ipv6) ^ (!newf); in addrconf_disable_change()
6161 idev->cnf.disable_ipv6 = newf; in addrconf_disable_change()
6163 dev_disable_change(idev); in addrconf_disable_change()
6248 struct inet6_dev *idev = ctl->extra1; in addrconf_sysctl_proxy_ndp() local
6252 idev->dev->ifindex, in addrconf_sysctl_proxy_ndp()
6253 &idev->cnf); in addrconf_sysctl_proxy_ndp()
6267 struct inet6_dev *idev = (struct inet6_dev *)ctl->extra1; in addrconf_sysctl_addr_gen_mode() local
6290 if (idev) { in addrconf_sysctl_addr_gen_mode()
6291 if (check_stable_privacy(idev, net, new_val) < 0) { in addrconf_sysctl_addr_gen_mode()
6296 if (idev->cnf.addr_gen_mode != new_val) { in addrconf_sysctl_addr_gen_mode()
6297 idev->cnf.addr_gen_mode = new_val; in addrconf_sysctl_addr_gen_mode()
6298 addrconf_dev_config(idev->dev); in addrconf_sysctl_addr_gen_mode()
6305 idev = __in6_dev_get(dev); in addrconf_sysctl_addr_gen_mode()
6306 if (idev && in addrconf_sysctl_addr_gen_mode()
6307 idev->cnf.addr_gen_mode != new_val) { in addrconf_sysctl_addr_gen_mode()
6308 idev->cnf.addr_gen_mode = new_val; in addrconf_sysctl_addr_gen_mode()
6309 addrconf_dev_config(idev->dev); in addrconf_sysctl_addr_gen_mode()
6370 struct inet6_dev *idev = __in6_dev_get(dev); in addrconf_sysctl_stable_secret() local
6372 if (idev) { in addrconf_sysctl_stable_secret()
6373 idev->cnf.addr_gen_mode = in addrconf_sysctl_stable_secret()
6378 struct inet6_dev *idev = ctl->extra1; in addrconf_sysctl_stable_secret() local
6380 idev->cnf.addr_gen_mode = IN6_ADDR_GEN_MODE_STABLE_PRIVACY; in addrconf_sysctl_stable_secret()
6428 void addrconf_disable_policy_idev(struct inet6_dev *idev, int val) in addrconf_disable_policy_idev() argument
6432 read_lock_bh(&idev->lock); in addrconf_disable_policy_idev()
6433 list_for_each_entry(ifa, &idev->addr_list, if_list) { in addrconf_disable_policy_idev()
6454 read_unlock_bh(&idev->lock); in addrconf_disable_policy_idev()
6460 struct inet6_dev *idev; in addrconf_disable_policy() local
6478 idev = __in6_dev_get(dev); in addrconf_disable_policy()
6479 if (idev) in addrconf_disable_policy()
6480 addrconf_disable_policy_idev(idev, val); in addrconf_disable_policy()
6483 idev = (struct inet6_dev *)ctl->extra1; in addrconf_disable_policy()
6484 addrconf_disable_policy_idev(idev, val); in addrconf_disable_policy()
6905 struct inet6_dev *idev, struct ipv6_devconf *p) in __addrconf_sysctl_register() argument
6922 table[i].extra1 = idev; /* embedded; no ref */ in __addrconf_sysctl_register()
6938 ifindex = idev->dev->ifindex; in __addrconf_sysctl_register()
6965 static int addrconf_sysctl_register(struct inet6_dev *idev) in addrconf_sysctl_register() argument
6969 if (!sysctl_dev_name_is_allowed(idev->dev->name)) in addrconf_sysctl_register()
6972 err = neigh_sysctl_register(idev->dev, idev->nd_parms, in addrconf_sysctl_register()
6976 err = __addrconf_sysctl_register(dev_net(idev->dev), idev->dev->name, in addrconf_sysctl_register()
6977 idev, &idev->cnf); in addrconf_sysctl_register()
6979 neigh_sysctl_unregister(idev->nd_parms); in addrconf_sysctl_register()
6984 static void addrconf_sysctl_unregister(struct inet6_dev *idev) in addrconf_sysctl_unregister() argument
6986 __addrconf_sysctl_unregister(dev_net(idev->dev), &idev->cnf, in addrconf_sysctl_unregister()
6987 idev->dev->ifindex); in addrconf_sysctl_unregister()
6988 neigh_sysctl_unregister(idev->nd_parms); in addrconf_sysctl_unregister()
7094 struct inet6_dev *idev; in addrconf_init() local
7133 idev = ipv6_add_dev(init_net.loopback_dev); in addrconf_init()
7135 if (IS_ERR(idev)) { in addrconf_init()
7136 err = PTR_ERR(idev); in addrconf_init()