Lines Matching refs:idev

126 static int addrconf_sysctl_register(struct inet6_dev *idev);
127 static void addrconf_sysctl_unregister(struct inet6_dev *idev);
129 static inline int addrconf_sysctl_register(struct inet6_dev *idev) in addrconf_sysctl_register() argument
134 static inline void addrconf_sysctl_unregister(struct inet6_dev *idev) in addrconf_sysctl_unregister() argument
142 static int ipv6_count_addresses(const struct inet6_dev *idev);
145 const struct inet6_dev *idev);
172 static void addrconf_dad_run(struct inet6_dev *idev, bool restart);
177 static void inet6_prefix_notify(int event, struct inet6_dev *idev,
308 static void addrconf_del_rs_timer(struct inet6_dev *idev) in addrconf_del_rs_timer() argument
310 if (del_timer(&idev->rs_timer)) in addrconf_del_rs_timer()
311 __in6_dev_put(idev); in addrconf_del_rs_timer()
320 static void addrconf_mod_rs_timer(struct inet6_dev *idev, in addrconf_mod_rs_timer() argument
323 if (!mod_timer(&idev->rs_timer, jiffies + when)) in addrconf_mod_rs_timer()
324 in6_dev_hold(idev); in addrconf_mod_rs_timer()
335 static int snmp6_alloc_dev(struct inet6_dev *idev) in snmp6_alloc_dev() argument
339 idev->stats.ipv6 = alloc_percpu_gfp(struct ipstats_mib, GFP_KERNEL_ACCOUNT); in snmp6_alloc_dev()
340 if (!idev->stats.ipv6) in snmp6_alloc_dev()
345 addrconf_stats = per_cpu_ptr(idev->stats.ipv6, i); in snmp6_alloc_dev()
350 idev->stats.icmpv6dev = kzalloc(sizeof(struct icmpv6_mib_device), in snmp6_alloc_dev()
352 if (!idev->stats.icmpv6dev) in snmp6_alloc_dev()
354 idev->stats.icmpv6msgdev = kzalloc(sizeof(struct icmpv6msg_mib_device), in snmp6_alloc_dev()
356 if (!idev->stats.icmpv6msgdev) in snmp6_alloc_dev()
362 kfree(idev->stats.icmpv6dev); in snmp6_alloc_dev()
364 free_percpu(idev->stats.ipv6); in snmp6_alloc_dev()
483 struct inet6_dev *idev; in ipv6_find_idev() local
487 idev = __in6_dev_get(dev); in ipv6_find_idev()
488 if (!idev) { in ipv6_find_idev()
489 idev = ipv6_add_dev(dev); in ipv6_find_idev()
490 if (IS_ERR(idev)) in ipv6_find_idev()
491 return idev; in ipv6_find_idev()
495 ipv6_mc_up(idev); in ipv6_find_idev()
496 return idev; in ipv6_find_idev()
717 struct inet6_dev *idev; in inet6_netconf_dump_devconf() local
747 idev = __in6_dev_get(dev); in inet6_netconf_dump_devconf()
748 if (!idev) in inet6_netconf_dump_devconf()
752 &idev->cnf, in inet6_netconf_dump_devconf()
797 static void dev_forward_change(struct inet6_dev *idev) in dev_forward_change() argument
803 if (!idev) in dev_forward_change()
805 dev = idev->dev; in dev_forward_change()
806 if (idev->cnf.forwarding) in dev_forward_change()
809 if (idev->cnf.forwarding) { in dev_forward_change()
820 read_lock_bh(&idev->lock); in dev_forward_change()
821 list_for_each_entry(ifa, &idev->addr_list, if_list) { in dev_forward_change()
826 read_unlock_bh(&idev->lock); in dev_forward_change()
832 if (idev->cnf.forwarding) in dev_forward_change()
840 dev->ifindex, &idev->cnf); in dev_forward_change()
847 struct inet6_dev *idev; in addrconf_forward_change() local
850 idev = __in6_dev_get(dev); in addrconf_forward_change()
851 if (idev) { in addrconf_forward_change()
852 int changed = (!idev->cnf.forwarding) ^ (!newf); in addrconf_forward_change()
853 idev->cnf.forwarding = newf; in addrconf_forward_change()
855 dev_forward_change(idev); in addrconf_forward_change()
910 struct inet6_dev *idev; in addrconf_linkdown_change() local
913 idev = __in6_dev_get(dev); in addrconf_linkdown_change()
914 if (idev) { in addrconf_linkdown_change()
915 int changed = (!idev->cnf.ignore_routes_with_linkdown) ^ (!newf); in addrconf_linkdown_change()
917 idev->cnf.ignore_routes_with_linkdown = newf; in addrconf_linkdown_change()
923 &idev->cnf); in addrconf_linkdown_change()
977 in6_dev_put(ifp->idev); in inet6_ifa_finish_destroy()
992 ipv6_link_dev_addr(struct inet6_dev *idev, struct inet6_ifaddr *ifp) in ipv6_link_dev_addr() argument
1001 list_for_each(p, &idev->addr_list) { in ipv6_link_dev_addr()
1025 if (!dev || ifp->idev->dev == dev) in ipv6_chk_same_addr()
1056 ipv6_add_addr(struct inet6_dev *idev, struct ifa6_config *cfg, in ipv6_add_addr() argument
1061 struct net *net = dev_net(idev->dev); in ipv6_add_addr()
1073 } else if (!(idev->dev->flags & IFF_LOOPBACK) && in ipv6_add_addr()
1074 !netif_is_l3_master(idev->dev) && in ipv6_add_addr()
1080 if (idev->dead) { in ipv6_add_addr()
1086 if (idev->cnf.disable_ipv6) { in ipv6_add_addr()
1098 .i6vi_dev = idev, in ipv6_add_addr()
1114 f6i = addrconf_f6i_alloc(net, idev, cfg->pfx, false, gfp_flags, extack); in ipv6_add_addr()
1121 neigh_parms_data_state_setall(idev->nd_parms); in ipv6_add_addr()
1145 ifa->idev = idev; in ipv6_add_addr()
1146 in6_dev_hold(idev); in ipv6_add_addr()
1153 err = ipv6_add_addr_hash(idev->dev, ifa); in ipv6_add_addr()
1159 write_lock_bh(&idev->lock); in ipv6_add_addr()
1162 ipv6_link_dev_addr(idev, ifa); in ipv6_add_addr()
1165 list_add(&ifa->tmp_list, &idev->tempaddr_list); in ipv6_add_addr()
1170 write_unlock_bh(&idev->lock); in ipv6_add_addr()
1180 if (ifa->idev) in ipv6_add_addr()
1181 in6_dev_put(ifa->idev); in ipv6_add_addr()
1218 struct inet6_dev *idev = ifp->idev; in check_cleanup_prefix_route() local
1224 list_for_each_entry(ifa, &idev->addr_list, if_list) { in check_cleanup_prefix_route()
1260 ifp->idev->dev, 0, RTF_DEFAULT, true); in cleanup_prefix_route()
1263 ip6_del_rt(dev_net(ifp->idev->dev), f6i, false); in cleanup_prefix_route()
1278 struct net *net = dev_net(ifp->idev->dev); in ipv6_del_addr()
1296 write_lock_bh(&ifp->idev->lock); in ipv6_del_addr()
1313 write_unlock_bh(&ifp->idev->lock); in ipv6_del_addr()
1334 struct inet6_dev *idev = ifp->idev; in ipv6_create_tempaddr() local
1345 write_lock_bh(&idev->lock); in ipv6_create_tempaddr()
1348 in6_dev_hold(idev); in ipv6_create_tempaddr()
1349 if (idev->cnf.use_tempaddr <= 0) { in ipv6_create_tempaddr()
1350 write_unlock_bh(&idev->lock); in ipv6_create_tempaddr()
1352 in6_dev_put(idev); in ipv6_create_tempaddr()
1357 if (ifp->regen_count++ >= idev->cnf.regen_max_retry) { in ipv6_create_tempaddr()
1358 idev->cnf.use_tempaddr = -1; /*XXX*/ in ipv6_create_tempaddr()
1360 write_unlock_bh(&idev->lock); in ipv6_create_tempaddr()
1363 in6_dev_put(idev); in ipv6_create_tempaddr()
1373 regen_advance = idev->cnf.regen_max_retry * in ipv6_create_tempaddr()
1374 idev->cnf.dad_transmits * in ipv6_create_tempaddr()
1375 max(NEIGH_VAR(idev->nd_parms, RETRANS_TIME), HZ/100) / HZ; in ipv6_create_tempaddr()
1380 cnf_temp_preferred_lft = READ_ONCE(idev->cnf.temp_prefered_lft); in ipv6_create_tempaddr()
1382 idev->cnf.max_desync_factor, in ipv6_create_tempaddr()
1385 if (unlikely(idev->desync_factor > max_desync_factor)) { in ipv6_create_tempaddr()
1387 get_random_bytes(&idev->desync_factor, in ipv6_create_tempaddr()
1388 sizeof(idev->desync_factor)); in ipv6_create_tempaddr()
1389 idev->desync_factor %= max_desync_factor; in ipv6_create_tempaddr()
1391 idev->desync_factor = 0; in ipv6_create_tempaddr()
1397 idev->cnf.temp_valid_lft + age); in ipv6_create_tempaddr()
1398 cfg.preferred_lft = cnf_temp_preferred_lft + age - idev->desync_factor; in ipv6_create_tempaddr()
1405 write_unlock_bh(&idev->lock); in ipv6_create_tempaddr()
1417 in6_dev_put(idev); in ipv6_create_tempaddr()
1430 ift = ipv6_add_addr(idev, &cfg, block, NULL); in ipv6_create_tempaddr()
1433 in6_dev_put(idev); in ipv6_create_tempaddr()
1435 write_lock_bh(&idev->lock); in ipv6_create_tempaddr()
1447 in6_dev_put(idev); in ipv6_create_tempaddr()
1499 struct inet6_dev *idev) in ipv6_use_optimistic_addr() argument
1502 if (!idev) in ipv6_use_optimistic_addr()
1504 if (!net->ipv6.devconf_all->optimistic_dad && !idev->cnf.optimistic_dad) in ipv6_use_optimistic_addr()
1506 if (!net->ipv6.devconf_all->use_optimistic && !idev->cnf.use_optimistic) in ipv6_use_optimistic_addr()
1516 struct inet6_dev *idev) in ipv6_allow_optimistic_dad() argument
1519 if (!idev) in ipv6_allow_optimistic_dad()
1521 if (!net->ipv6.devconf_all->optimistic_dad && !idev->cnf.optimistic_dad) in ipv6_allow_optimistic_dad()
1594 if (!ipv6_use_optimistic_addr(net, score->ifa->idev)) in ipv6_get_saddr_eval()
1612 dst->ifindex == score->ifa->idev->dev->ifindex); in ipv6_get_saddr_eval()
1618 score->ifa->idev->dev->ifindex) == dst->label; in ipv6_get_saddr_eval()
1627 score->ifa->idev->cnf.use_tempaddr >= 2; in ipv6_get_saddr_eval()
1666 struct inet6_dev *idev, in __ipv6_dev_get_saddr() argument
1672 list_for_each_entry_rcu(score->ifa, &idev->addr_list, if_list) { in __ipv6_dev_get_saddr()
1694 idev->dev->name); in __ipv6_dev_get_saddr()
1743 struct inet6_dev *idev; in ipv6_get_saddr_master() local
1745 idev = __in6_dev_get(dst_dev); in ipv6_get_saddr_master()
1746 if (idev) in ipv6_get_saddr_master()
1747 hiscore_idx = __ipv6_dev_get_saddr(net, dst, idev, in ipv6_get_saddr_master()
1750 idev = __in6_dev_get(master); in ipv6_get_saddr_master()
1751 if (idev) in ipv6_get_saddr_master()
1752 hiscore_idx = __ipv6_dev_get_saddr(net, dst, idev, in ipv6_get_saddr_master()
1764 struct inet6_dev *idev; in ipv6_dev_get_saddr() local
1800 idev = __in6_dev_get(dst_dev); in ipv6_dev_get_saddr()
1803 (idev && idev->cnf.use_oif_addrs_only)) { in ipv6_dev_get_saddr()
1809 if (idev) in ipv6_dev_get_saddr()
1810 hiscore_idx = __ipv6_dev_get_saddr(net, &dst, idev, scores, hiscore_idx); in ipv6_dev_get_saddr()
1837 idev = __in6_dev_get(dev); in ipv6_dev_get_saddr()
1838 if (!idev) in ipv6_dev_get_saddr()
1840 hiscore_idx = __ipv6_dev_get_saddr(net, &dst, idev, scores, hiscore_idx); in ipv6_dev_get_saddr()
1856 static int __ipv6_get_lladdr(struct inet6_dev *idev, struct in6_addr *addr, in __ipv6_get_lladdr() argument
1862 list_for_each_entry_reverse(ifp, &idev->addr_list, if_list) { in __ipv6_get_lladdr()
1878 struct inet6_dev *idev; in ipv6_get_lladdr() local
1882 idev = __in6_dev_get(dev); in ipv6_get_lladdr()
1883 if (idev) { in ipv6_get_lladdr()
1884 read_lock_bh(&idev->lock); in ipv6_get_lladdr()
1885 err = __ipv6_get_lladdr(idev, addr, banned_flags); in ipv6_get_lladdr()
1886 read_unlock_bh(&idev->lock); in ipv6_get_lladdr()
1892 static int ipv6_count_addresses(const struct inet6_dev *idev) in ipv6_count_addresses() argument
1898 list_for_each_entry_rcu(ifp, &idev->addr_list, if_list) in ipv6_count_addresses()
1938 ndev = ifp->idev->dev; in __ipv6_chk_addr_and_flags()
1979 const struct inet6_dev *idev; in ipv6_chk_custom_prefix() local
1983 idev = __in6_dev_get(dev); in ipv6_chk_custom_prefix()
1984 if (idev) { in ipv6_chk_custom_prefix()
1985 list_for_each_entry_rcu(ifa, &idev->addr_list, if_list) { in ipv6_chk_custom_prefix()
2000 const struct inet6_dev *idev; in ipv6_chk_prefix() local
2005 idev = __in6_dev_get(dev); in ipv6_chk_prefix()
2006 if (idev) { in ipv6_chk_prefix()
2007 list_for_each_entry_rcu(ifa, &idev->addr_list, if_list) { in ipv6_chk_prefix()
2044 if (!dev || ifp->idev->dev == dev || in ipv6_get_ifaddr()
2108 struct inet6_dev *idev = ifp->idev; in addrconf_dad_failure() local
2109 struct net *net = dev_net(idev->dev); in addrconf_dad_failure()
2117 ifp->idev->dev->name, &ifp->addr, eth_hdr(skb)->h_source); in addrconf_dad_failure()
2136 ifp->idev->dev->name); in addrconf_dad_failure()
2142 idev)) in addrconf_dad_failure()
2147 if (idev->cnf.max_addresses && in addrconf_dad_failure()
2148 ipv6_count_addresses(idev) >= in addrconf_dad_failure()
2149 idev->cnf.max_addresses) in addrconf_dad_failure()
2153 ifp->idev->dev->name); in addrconf_dad_failure()
2155 ifp2 = ipv6_add_addr(idev, &cfg, false, NULL); in addrconf_dad_failure()
2193 void addrconf_leave_solict(struct inet6_dev *idev, const struct in6_addr *addr) in addrconf_leave_solict() argument
2197 if (idev->dev->flags&(IFF_LOOPBACK|IFF_NOARP)) in addrconf_leave_solict()
2201 __ipv6_dev_mc_dec(idev, &maddr); in addrconf_leave_solict()
2214 __ipv6_dev_ac_inc(ifp->idev, &addr); in addrconf_join_anycast()
2227 __ipv6_dev_ac_dec(ifp->idev, &addr); in addrconf_leave_anycast()
2349 static int ipv6_inherit_eui64(u8 *eui, struct inet6_dev *idev) in ipv6_inherit_eui64() argument
2354 read_lock_bh(&idev->lock); in ipv6_inherit_eui64()
2355 list_for_each_entry_reverse(ifp, &idev->addr_list, if_list) { in ipv6_inherit_eui64()
2364 read_unlock_bh(&idev->lock); in ipv6_inherit_eui64()
2503 struct inet6_dev *idev; in addrconf_add_dev() local
2507 idev = ipv6_find_idev(dev); in addrconf_add_dev()
2508 if (IS_ERR(idev)) in addrconf_add_dev()
2509 return idev; in addrconf_add_dev()
2511 if (idev->cnf.disable_ipv6) in addrconf_add_dev()
2518 return idev; in addrconf_add_dev()
2521 static void manage_tempaddrs(struct inet6_dev *idev, in manage_tempaddrs() argument
2529 read_lock_bh(&idev->lock); in manage_tempaddrs()
2531 list_for_each_entry(ift, &idev->tempaddr_list, tmp_list) { in manage_tempaddrs()
2546 max_valid = idev->cnf.temp_valid_lft - age; in manage_tempaddrs()
2550 max_prefered = idev->cnf.temp_prefered_lft - in manage_tempaddrs()
2551 idev->desync_factor - age; in manage_tempaddrs()
2580 if (list_empty(&idev->tempaddr_list) && (valid_lft || prefered_lft)) in manage_tempaddrs()
2583 if (create && idev->cnf.use_tempaddr > 0) { in manage_tempaddrs()
2587 read_unlock_bh(&idev->lock); in manage_tempaddrs()
2590 read_unlock_bh(&idev->lock); in manage_tempaddrs()
2594 static bool is_addr_mode_generate_stable(struct inet6_dev *idev) in is_addr_mode_generate_stable() argument
2596 return idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_STABLE_PRIVACY || in is_addr_mode_generate_stable()
2597 idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_RANDOM; in is_addr_mode_generate_stable()
2933 struct inet6_dev *idev; in inet6_addr_add() local
2961 idev = addrconf_add_dev(dev); in inet6_addr_add()
2962 if (IS_ERR(idev)) { in inet6_addr_add()
2964 return PTR_ERR(idev); in inet6_addr_add()
2997 ifp = ipv6_add_addr(idev, cfg, true, extack); in inet6_addr_add()
3017 manage_tempaddrs(idev, ifp, cfg->valid_lft, in inet6_addr_add()
3035 struct inet6_dev *idev; in inet6_addr_del() local
3049 idev = __in6_dev_get(dev); in inet6_addr_del()
3050 if (!idev) { in inet6_addr_del()
3055 read_lock_bh(&idev->lock); in inet6_addr_del()
3056 list_for_each_entry(ifp, &idev->addr_list, if_list) { in inet6_addr_del()
3060 read_unlock_bh(&idev->lock); in inet6_addr_del()
3064 manage_tempaddrs(idev, ifp, 0, 0, false, in inet6_addr_del()
3075 read_unlock_bh(&idev->lock); in inet6_addr_del()
3125 static void add_addr(struct inet6_dev *idev, const struct in6_addr *addr, in add_addr() argument
3139 ifp = ipv6_add_addr(idev, &cfg, true, NULL); in add_addr()
3144 rt_genid_bump_ipv6(dev_net(idev->dev)); in add_addr()
3151 static void add_v4_addrs(struct inet6_dev *idev) in add_v4_addrs() argument
3155 struct net *net = dev_net(idev->dev); in add_v4_addrs()
3163 if (idev->dev->addr_len == sizeof(struct in6_addr)) in add_v4_addrs()
3165 memcpy(&addr.s6_addr32[3], idev->dev->dev_addr + offset, 4); in add_v4_addrs()
3167 if (!(idev->dev->flags & IFF_POINTOPOINT) && idev->dev->type == ARPHRD_SIT) { in add_v4_addrs()
3172 if (idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_NONE) in add_v4_addrs()
3181 add_addr(idev, &addr, plen, scope, IFAPROT_UNSPEC); in add_v4_addrs()
3182 addrconf_prefix_route(&addr, plen, 0, idev->dev, 0, pflags, in add_v4_addrs()
3199 if (idev->dev->flags&IFF_POINTOPOINT) in add_v4_addrs()
3204 add_addr(idev, &addr, plen, flag, in add_v4_addrs()
3206 addrconf_prefix_route(&addr, plen, 0, idev->dev, in add_v4_addrs()
3216 struct inet6_dev *idev; in init_loopback() local
3222 idev = ipv6_find_idev(dev); in init_loopback()
3223 if (IS_ERR(idev)) { in init_loopback()
3228 add_addr(idev, &in6addr_loopback, 128, IFA_HOST, IFAPROT_KERNEL_LO); in init_loopback()
3231 void addrconf_add_linklocal(struct inet6_dev *idev, in addrconf_add_linklocal() argument
3246 if ((dev_net(idev->dev)->ipv6.devconf_all->optimistic_dad || in addrconf_add_linklocal()
3247 idev->cnf.optimistic_dad) && in addrconf_add_linklocal()
3248 !dev_net(idev->dev)->ipv6.devconf_all->forwarding) in addrconf_add_linklocal()
3252 ifp = ipv6_add_addr(idev, &cfg, true, NULL); in addrconf_add_linklocal()
3254 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, 0, idev->dev, in addrconf_add_linklocal()
3280 const struct inet6_dev *idev) in ipv6_generate_stable_address() argument
3298 struct net *net = dev_net(idev->dev); in ipv6_generate_stable_address()
3302 if (idev->cnf.stable_secret.initialized) in ipv6_generate_stable_address()
3303 secret = idev->cnf.stable_secret.secret; in ipv6_generate_stable_address()
3315 memcpy(data.hwaddr, idev->dev->perm_addr, idev->dev->addr_len); in ipv6_generate_stable_address()
3331 if (dad_count > dev_net(idev->dev)->ipv6.sysctl.idgen_retries) in ipv6_generate_stable_address()
3340 static void ipv6_gen_mode_random_init(struct inet6_dev *idev) in ipv6_gen_mode_random_init() argument
3342 struct ipv6_stable_secret *s = &idev->cnf.stable_secret; in ipv6_gen_mode_random_init()
3346 s = &idev->cnf.stable_secret; in ipv6_gen_mode_random_init()
3351 static void addrconf_addr_gen(struct inet6_dev *idev, bool prefix_route) in addrconf_addr_gen() argument
3356 if (netif_is_l3_master(idev->dev)) in addrconf_addr_gen()
3360 if (idev->dev->priv_flags & IFF_NO_ADDRCONF) in addrconf_addr_gen()
3365 switch (idev->cnf.addr_gen_mode) { in addrconf_addr_gen()
3367 ipv6_gen_mode_random_init(idev); in addrconf_addr_gen()
3370 if (!ipv6_generate_stable_address(&addr, 0, idev)) in addrconf_addr_gen()
3371 addrconf_add_linklocal(idev, &addr, in addrconf_addr_gen()
3374 addrconf_prefix_route(&addr, 64, 0, idev->dev, in addrconf_addr_gen()
3382 if (ipv6_generate_eui64(addr.s6_addr + 8, idev->dev) == 0) in addrconf_addr_gen()
3383 addrconf_add_linklocal(idev, &addr, 0); in addrconf_addr_gen()
3385 addrconf_prefix_route(&addr, 64, 0, idev->dev, in addrconf_addr_gen()
3397 struct inet6_dev *idev; in addrconf_dev_config() local
3412 idev = __in6_dev_get(dev); in addrconf_dev_config()
3413 if (!IS_ERR_OR_NULL(idev) && dev->flags & IFF_UP && in addrconf_dev_config()
3415 ipv6_mc_up(idev); in addrconf_dev_config()
3419 idev = addrconf_add_dev(dev); in addrconf_dev_config()
3420 if (IS_ERR(idev)) in addrconf_dev_config()
3425 idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_EUI64) in addrconf_dev_config()
3426 idev->cnf.addr_gen_mode = IN6_ADDR_GEN_MODE_RANDOM; in addrconf_dev_config()
3428 addrconf_addr_gen(idev, false); in addrconf_dev_config()
3434 struct inet6_dev *idev; in addrconf_sit_config() local
3444 idev = ipv6_find_idev(dev); in addrconf_sit_config()
3445 if (IS_ERR(idev)) { in addrconf_sit_config()
3451 addrconf_addr_gen(idev, false); in addrconf_sit_config()
3455 add_v4_addrs(idev); in addrconf_sit_config()
3465 struct inet6_dev *idev; in addrconf_gre_config() local
3469 idev = ipv6_find_idev(dev); in addrconf_gre_config()
3470 if (IS_ERR(idev)) { in addrconf_gre_config()
3476 addrconf_addr_gen(idev, true); in addrconf_gre_config()
3480 add_v4_addrs(idev); in addrconf_gre_config()
3512 struct inet6_dev *idev, in fixup_permanent_addr() argument
3522 f6i = addrconf_f6i_alloc(net, idev, &ifp->addr, false, in fixup_permanent_addr()
3538 ifp->rt_priority, idev->dev, 0, 0, in fixup_permanent_addr()
3551 struct inet6_dev *idev; in addrconf_permanent_addr() local
3553 idev = __in6_dev_get(dev); in addrconf_permanent_addr()
3554 if (!idev) in addrconf_permanent_addr()
3557 write_lock_bh(&idev->lock); in addrconf_permanent_addr()
3559 list_for_each_entry_safe(ifp, tmp, &idev->addr_list, if_list) { in addrconf_permanent_addr()
3561 fixup_permanent_addr(net, idev, ifp) < 0) { in addrconf_permanent_addr()
3562 write_unlock_bh(&idev->lock); in addrconf_permanent_addr()
3565 write_lock_bh(&idev->lock); in addrconf_permanent_addr()
3568 idev->dev->name, &ifp->addr); in addrconf_permanent_addr()
3572 write_unlock_bh(&idev->lock); in addrconf_permanent_addr()
3581 struct inet6_dev *idev = __in6_dev_get(dev); in addrconf_notify() local
3588 if (!idev && dev->mtu >= IPV6_MIN_MTU) { in addrconf_notify()
3589 idev = ipv6_add_dev(dev); in addrconf_notify()
3590 if (IS_ERR(idev)) in addrconf_notify()
3591 return notifier_from_errno(PTR_ERR(idev)); in addrconf_notify()
3602 if (idev) { in addrconf_notify()
3604 idev->cnf.mtu6 = dev->mtu; in addrconf_notify()
3609 idev = ipv6_add_dev(dev); in addrconf_notify()
3610 if (IS_ERR(idev)) in addrconf_notify()
3614 if (!(idev->if_flags & IF_READY)) in addrconf_notify()
3621 if (idev && idev->cnf.disable_ipv6) in addrconf_notify()
3625 if (event == NETDEV_UP && !IS_ERR_OR_NULL(idev) && in addrconf_notify()
3627 ipv6_mc_up(idev); in addrconf_notify()
3642 if (!idev && dev->mtu >= IPV6_MIN_MTU) in addrconf_notify()
3643 idev = ipv6_add_dev(dev); in addrconf_notify()
3645 if (!IS_ERR_OR_NULL(idev)) { in addrconf_notify()
3646 idev->if_flags |= IF_READY; in addrconf_notify()
3656 if (!IS_ERR_OR_NULL(idev)) { in addrconf_notify()
3657 if (idev->if_flags & IF_READY) { in addrconf_notify()
3663 ipv6_mc_up(idev); in addrconf_notify()
3666 addrconf_dad_run(idev, true); in addrconf_notify()
3670 idev->if_flags |= IF_READY; in addrconf_notify()
3681 if (!IS_ERR_OR_NULL(idev)) { in addrconf_notify()
3683 addrconf_dad_run(idev, false); in addrconf_notify()
3693 if (idev->cnf.mtu6 != dev->mtu && in addrconf_notify()
3696 idev->cnf.mtu6 = dev->mtu; in addrconf_notify()
3698 idev->tstamp = jiffies; in addrconf_notify()
3699 inet6_ifinfo_notify(RTM_NEWLINK, idev); in addrconf_notify()
3719 if (idev) { in addrconf_notify()
3720 snmp6_unregister_dev(idev); in addrconf_notify()
3721 addrconf_sysctl_unregister(idev); in addrconf_notify()
3722 err = addrconf_sysctl_register(idev); in addrconf_notify()
3725 err = snmp6_register_dev(idev); in addrconf_notify()
3727 addrconf_sysctl_unregister(idev); in addrconf_notify()
3735 if (idev) in addrconf_notify()
3762 struct inet6_dev *idev; in addrconf_type_change() local
3765 idev = __in6_dev_get(dev); in addrconf_type_change()
3768 ipv6_mc_remap(idev); in addrconf_type_change()
3770 ipv6_mc_unmap(idev); in addrconf_type_change()
3783 struct inet6_dev *idev; in addrconf_ifdown() local
3794 idev = __in6_dev_get(dev); in addrconf_ifdown()
3795 if (!idev) in addrconf_ifdown()
3803 idev->dead = 1; in addrconf_ifdown()
3809 snmp6_unregister_dev(idev); in addrconf_ifdown()
3816 if (!unregister && !idev->cnf.disable_ipv6) { in addrconf_ifdown()
3821 _keep_addr = idev->cnf.keep_addr_on_down; in addrconf_ifdown()
3833 if (ifa->idev == idev) { in addrconf_ifdown()
3849 write_lock_bh(&idev->lock); in addrconf_ifdown()
3851 addrconf_del_rs_timer(idev); in addrconf_ifdown()
3856 was_ready = idev->if_flags & IF_READY; in addrconf_ifdown()
3858 idev->if_flags &= ~(IF_RS_SENT|IF_RA_RCVD|IF_READY); in addrconf_ifdown()
3861 while (!list_empty(&idev->tempaddr_list)) { in addrconf_ifdown()
3862 ifa = list_first_entry(&idev->tempaddr_list, in addrconf_ifdown()
3865 write_unlock_bh(&idev->lock); in addrconf_ifdown()
3874 write_lock_bh(&idev->lock); in addrconf_ifdown()
3877 list_for_each_entry(ifa, &idev->addr_list, if_list) in addrconf_ifdown()
3879 write_unlock_bh(&idev->lock); in addrconf_ifdown()
3919 if (idev->cnf.forwarding) in addrconf_ifdown()
3921 addrconf_leave_solict(ifa->idev, &ifa->addr); in addrconf_ifdown()
3925 write_lock_bh(&idev->lock); in addrconf_ifdown()
3927 write_unlock_bh(&idev->lock); in addrconf_ifdown()
3934 ipv6_ac_destroy_dev(idev); in addrconf_ifdown()
3935 ipv6_mc_destroy_dev(idev); in addrconf_ifdown()
3937 ipv6_mc_down(idev); in addrconf_ifdown()
3940 idev->tstamp = jiffies; in addrconf_ifdown()
3941 idev->ra_mtu = 0; in addrconf_ifdown()
3945 addrconf_sysctl_unregister(idev); in addrconf_ifdown()
3946 neigh_parms_release(&nd_tbl, idev->nd_parms); in addrconf_ifdown()
3948 in6_dev_put(idev); in addrconf_ifdown()
3955 struct inet6_dev *idev = from_timer(idev, t, rs_timer); in addrconf_rs_timer() local
3956 struct net_device *dev = idev->dev; in addrconf_rs_timer()
3959 write_lock(&idev->lock); in addrconf_rs_timer()
3960 if (idev->dead || !(idev->if_flags & IF_READY)) in addrconf_rs_timer()
3963 if (!ipv6_accept_ra(idev)) in addrconf_rs_timer()
3967 if (idev->if_flags & IF_RA_RCVD) in addrconf_rs_timer()
3970 if (idev->rs_probes++ < idev->cnf.rtr_solicits || idev->cnf.rtr_solicits < 0) { in addrconf_rs_timer()
3971 write_unlock(&idev->lock); in addrconf_rs_timer()
3978 write_lock(&idev->lock); in addrconf_rs_timer()
3979 idev->rs_interval = rfc3315_s14_backoff_update( in addrconf_rs_timer()
3980 idev->rs_interval, idev->cnf.rtr_solicit_max_interval); in addrconf_rs_timer()
3982 addrconf_mod_rs_timer(idev, (idev->rs_probes == in addrconf_rs_timer()
3983 idev->cnf.rtr_solicits) ? in addrconf_rs_timer()
3984 idev->cnf.rtr_solicit_delay : in addrconf_rs_timer()
3985 idev->rs_interval); in addrconf_rs_timer()
3991 pr_debug("%s: no IPv6 routers present\n", idev->dev->name); in addrconf_rs_timer()
3995 write_unlock(&idev->lock); in addrconf_rs_timer()
3997 in6_dev_put(idev); in addrconf_rs_timer()
4006 struct inet6_dev *idev = ifp->idev; in addrconf_dad_kick() local
4012 rand_num = get_random_u32_below(idev->cnf.rtr_solicit_delay ? : 1); in addrconf_dad_kick()
4015 if (idev->cnf.enhanced_dad || in addrconf_dad_kick()
4016 dev_net(idev->dev)->ipv6.devconf_all->enhanced_dad) { in addrconf_dad_kick()
4022 ifp->dad_probes = idev->cnf.dad_transmits; in addrconf_dad_kick()
4028 struct inet6_dev *idev = ifp->idev; in addrconf_dad_begin() local
4029 struct net_device *dev = idev->dev; in addrconf_dad_begin()
4035 read_lock_bh(&idev->lock); in addrconf_dad_begin()
4043 idev->cnf.accept_dad < 1) || in addrconf_dad_begin()
4054 read_unlock_bh(&idev->lock); in addrconf_dad_begin()
4060 if (!(idev->if_flags & IF_READY)) { in addrconf_dad_begin()
4062 read_unlock_bh(&idev->lock); in addrconf_dad_begin()
4079 if (ipv6_use_optimistic_addr(net, idev)) { in addrconf_dad_begin()
4090 read_unlock_bh(&idev->lock); in addrconf_dad_begin()
4115 struct inet6_dev *idev = ifp->idev; in addrconf_dad_work() local
4135 if ((dev_net(idev->dev)->ipv6.devconf_all->accept_dad > 1 || in addrconf_dad_work()
4136 idev->cnf.accept_dad > 1) && in addrconf_dad_work()
4137 !idev->cnf.disable_ipv6 && in addrconf_dad_work()
4144 if (!ipv6_generate_eui64(addr.s6_addr + 8, idev->dev) && in addrconf_dad_work()
4147 idev->cnf.disable_ipv6 = 1; in addrconf_dad_work()
4150 ifp->idev->dev->name); in addrconf_dad_work()
4164 addrconf_ifdown(idev->dev, false); in addrconf_dad_work()
4171 write_lock_bh(&idev->lock); in addrconf_dad_work()
4172 if (idev->dead || !(idev->if_flags & IF_READY)) { in addrconf_dad_work()
4173 write_unlock_bh(&idev->lock); in addrconf_dad_work()
4180 write_unlock_bh(&idev->lock); in addrconf_dad_work()
4197 write_unlock_bh(&idev->lock); in addrconf_dad_work()
4206 max(NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME), in addrconf_dad_work()
4209 write_unlock_bh(&idev->lock); in addrconf_dad_work()
4213 ndisc_send_ns(ifp->idev->dev, &ifp->addr, &mcaddr, &in6addr_any, in addrconf_dad_work()
4224 struct inet6_dev *idev = ifp->idev; in ipv6_lonely_lladdr() local
4226 list_for_each_entry_reverse(ifpiter, &idev->addr_list, if_list) { in ipv6_lonely_lladdr()
4241 struct net_device *dev = ifp->idev->dev; in addrconf_dad_completed()
4257 read_lock_bh(&ifp->idev->lock); in addrconf_dad_completed()
4260 ipv6_accept_ra(ifp->idev) && in addrconf_dad_completed()
4261 ifp->idev->cnf.rtr_solicits != 0 && in addrconf_dad_completed()
4265 read_unlock_bh(&ifp->idev->lock); in addrconf_dad_completed()
4271 ipv6_mc_dad_complete(ifp->idev); in addrconf_dad_completed()
4275 (ifp->idev->cnf.ndisc_notify || in addrconf_dad_completed()
4278 /*router=*/ !!ifp->idev->cnf.forwarding, in addrconf_dad_completed()
4293 write_lock_bh(&ifp->idev->lock); in addrconf_dad_completed()
4295 ifp->idev->rs_interval = rfc3315_s14_backoff_init( in addrconf_dad_completed()
4296 ifp->idev->cnf.rtr_solicit_interval); in addrconf_dad_completed()
4297 ifp->idev->rs_probes = 1; in addrconf_dad_completed()
4298 ifp->idev->if_flags |= IF_RS_SENT; in addrconf_dad_completed()
4299 addrconf_mod_rs_timer(ifp->idev, ifp->idev->rs_interval); in addrconf_dad_completed()
4301 write_unlock_bh(&ifp->idev->lock); in addrconf_dad_completed()
4314 static void addrconf_dad_run(struct inet6_dev *idev, bool restart) in addrconf_dad_run() argument
4318 read_lock_bh(&idev->lock); in addrconf_dad_run()
4319 list_for_each_entry(ifp, &idev->addr_list, if_list) { in addrconf_dad_run()
4329 read_unlock_bh(&idev->lock); in addrconf_dad_run()
4419 ifp->idev->dev->ifindex, in if6_seq_show()
4423 ifp->idev->dev->name); in if6_seq_show()
4576 unsigned long regen_advance = ifp->idev->cnf.regen_max_retry * in addrconf_verify_rtnl()
4577 ifp->idev->cnf.dad_transmits * in addrconf_verify_rtnl()
4578 max(NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME), HZ/100) / HZ; in addrconf_verify_rtnl()
4745 ifp->idev->dev, 0, RTF_DEFAULT, true); in modify_prefix_route()
4752 ip6_del_rt(dev_net(ifp->idev->dev), f6i, false); in modify_prefix_route()
4757 ifp->rt_priority, ifp->idev->dev, in modify_prefix_route()
4850 ifp->rt_priority, ifp->idev->dev, in inet6_addr_modify()
4859 ifp->rt_priority, ifp->idev->dev, in inet6_addr_modify()
4866 write_lock_bh(&ifp->idev->lock); in inet6_addr_modify()
4868 write_unlock_bh(&ifp->idev->lock); in inet6_addr_modify()
4882 manage_tempaddrs(ifp->idev, ifp, cfg->valid_lft, in inet6_addr_modify()
4902 struct inet6_dev *idev; in inet6_rtm_newaddr() local
4953 idev = ipv6_find_idev(dev); in inet6_rtm_newaddr()
4954 if (IS_ERR(idev)) in inet6_rtm_newaddr()
4955 return PTR_ERR(idev); in inet6_rtm_newaddr()
4957 if (!ipv6_allow_optimistic_dad(net, idev)) in inet6_rtm_newaddr()
5065 ifa->idev->dev->ifindex); in inet6_fill_ifaddr()
5130 int ifindex = ifmca->idev->dev->ifindex; in inet6_fill_ifmcaddr()
5193 static int in6_dump_addrs(struct inet6_dev *idev, struct sk_buff *skb, in in6_dump_addrs() argument
5202 read_lock_bh(&idev->lock); in in6_dump_addrs()
5209 list_for_each_entry(ifa, &idev->addr_list, if_list) { in in6_dump_addrs()
5222 read_unlock_bh(&idev->lock); in in6_dump_addrs()
5226 for (ifmca = rtnl_dereference(idev->mc_list); in in6_dump_addrs()
5235 read_lock_bh(&idev->lock); in in6_dump_addrs()
5240 for (ifaca = idev->ac_list; ifaca; in in6_dump_addrs()
5252 read_unlock_bh(&idev->lock); in in6_dump_addrs()
5328 struct inet6_dev *idev; in inet6_dump_addr() local
5349 idev = __in6_dev_get(dev); in inet6_dump_addr()
5350 if (idev) { in inet6_dump_addr()
5351 err = in6_dump_addrs(idev, skb, cb, s_ip_idx, in inet6_dump_addr()
5370 idev = __in6_dev_get(dev); in inet6_dump_addr()
5371 if (!idev) in inet6_dump_addr()
5374 if (in6_dump_addrs(idev, skb, cb, s_ip_idx, in inet6_dump_addr()
5533 struct net *net = dev_net(ifa->idev->dev); in inet6_ifa_notify()
5704 static void snmp6_fill_stats(u64 *stats, struct inet6_dev *idev, int attrtype, in snmp6_fill_stats() argument
5709 __snmp6_fill_stats64(stats, idev->stats.ipv6, bytes, in snmp6_fill_stats()
5713 __snmp6_fill_statsdev(stats, idev->stats.icmpv6dev->mibs, bytes); in snmp6_fill_stats()
5718 static int inet6_fill_ifla6_attrs(struct sk_buff *skb, struct inet6_dev *idev, in inet6_fill_ifla6_attrs() argument
5724 if (nla_put_u32(skb, IFLA_INET6_FLAGS, idev->if_flags)) in inet6_fill_ifla6_attrs()
5727 ci.tstamp = cstamp_delta(idev->tstamp); in inet6_fill_ifla6_attrs()
5728 ci.reachable_time = jiffies_to_msecs(idev->nd_parms->reachable_time); in inet6_fill_ifla6_attrs()
5729 ci.retrans_time = jiffies_to_msecs(NEIGH_VAR(idev->nd_parms, RETRANS_TIME)); in inet6_fill_ifla6_attrs()
5735 ipv6_store_devconf(&idev->cnf, nla_data(nla), nla_len(nla)); in inet6_fill_ifla6_attrs()
5745 snmp6_fill_stats(nla_data(nla), idev, IFLA_INET6_STATS, nla_len(nla)); in inet6_fill_ifla6_attrs()
5750 snmp6_fill_stats(nla_data(nla), idev, IFLA_INET6_ICMP6STATS, nla_len(nla)); in inet6_fill_ifla6_attrs()
5755 read_lock_bh(&idev->lock); in inet6_fill_ifla6_attrs()
5756 memcpy(nla_data(nla), idev->token.s6_addr, nla_len(nla)); in inet6_fill_ifla6_attrs()
5757 read_unlock_bh(&idev->lock); in inet6_fill_ifla6_attrs()
5759 if (nla_put_u8(skb, IFLA_INET6_ADDR_GEN_MODE, idev->cnf.addr_gen_mode)) in inet6_fill_ifla6_attrs()
5762 if (idev->ra_mtu && in inet6_fill_ifla6_attrs()
5763 nla_put_u32(skb, IFLA_INET6_RA_MTU, idev->ra_mtu)) in inet6_fill_ifla6_attrs()
5784 struct inet6_dev *idev = __in6_dev_get(dev); in inet6_fill_link_af() local
5786 if (!idev) in inet6_fill_link_af()
5789 if (inet6_fill_ifla6_attrs(skb, idev, ext_filter_mask) < 0) in inet6_fill_link_af()
5795 static int inet6_set_iftoken(struct inet6_dev *idev, struct in6_addr *token, in inet6_set_iftoken() argument
5799 struct net_device *dev = idev->dev; in inet6_set_iftoken()
5819 if (!ipv6_accept_ra(idev)) { in inet6_set_iftoken()
5825 if (idev->cnf.rtr_solicits == 0) { in inet6_set_iftoken()
5831 write_lock_bh(&idev->lock); in inet6_set_iftoken()
5834 memcpy(idev->token.s6_addr + 8, token->s6_addr + 8, 8); in inet6_set_iftoken()
5836 write_unlock_bh(&idev->lock); in inet6_set_iftoken()
5842 if (!idev->dead && (idev->if_flags & IF_READY) && in inet6_set_iftoken()
5853 write_lock_bh(&idev->lock); in inet6_set_iftoken()
5856 idev->if_flags |= IF_RS_SENT; in inet6_set_iftoken()
5857 idev->rs_interval = rfc3315_s14_backoff_init( in inet6_set_iftoken()
5858 idev->cnf.rtr_solicit_interval); in inet6_set_iftoken()
5859 idev->rs_probes = 1; in inet6_set_iftoken()
5860 addrconf_mod_rs_timer(idev, idev->rs_interval); in inet6_set_iftoken()
5864 list_for_each_entry(ifp, &idev->addr_list, if_list) { in inet6_set_iftoken()
5873 write_unlock_bh(&idev->lock); in inet6_set_iftoken()
5874 inet6_ifinfo_notify(RTM_NEWLINK, idev); in inet6_set_iftoken()
5897 static int check_stable_privacy(struct inet6_dev *idev, struct net *net, in check_stable_privacy() argument
5901 !idev->cnf.stable_secret.initialized && in check_stable_privacy()
5912 struct inet6_dev *idev = NULL; in inet6_validate_link_af() local
5916 idev = __in6_dev_get(dev); in inet6_validate_link_af()
5917 if (!idev) in inet6_validate_link_af()
5934 if (dev && check_stable_privacy(idev, dev_net(dev), mode) < 0) in inet6_validate_link_af()
5944 struct inet6_dev *idev = __in6_dev_get(dev); in inet6_set_link_af() local
5948 if (!idev) in inet6_set_link_af()
5955 err = inet6_set_iftoken(idev, nla_data(tb[IFLA_INET6_TOKEN]), in inet6_set_link_af()
5964 idev->cnf.addr_gen_mode = mode; in inet6_set_link_af()
5970 static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev, in inet6_fill_ifinfo() argument
5973 struct net_device *dev = idev->dev; in inet6_fill_ifinfo()
6003 if (inet6_fill_ifla6_attrs(skb, idev, 0) < 0) in inet6_fill_ifinfo()
6046 struct inet6_dev *idev; in inet6_dump_ifinfo() local
6069 idev = __in6_dev_get(dev); in inet6_dump_ifinfo()
6070 if (!idev) in inet6_dump_ifinfo()
6072 if (inet6_fill_ifinfo(skb, idev, in inet6_dump_ifinfo()
6089 void inet6_ifinfo_notify(int event, struct inet6_dev *idev) in inet6_ifinfo_notify() argument
6092 struct net *net = dev_net(idev->dev); in inet6_ifinfo_notify()
6099 err = inet6_fill_ifinfo(skb, idev, 0, 0, event, 0); in inet6_ifinfo_notify()
6120 static int inet6_fill_prefix(struct sk_buff *skb, struct inet6_dev *idev, in inet6_fill_prefix() argument
6136 pmsg->prefix_ifindex = idev->dev->ifindex; in inet6_fill_prefix()
6160 static void inet6_prefix_notify(int event, struct inet6_dev *idev, in inet6_prefix_notify() argument
6164 struct net *net = dev_net(idev->dev); in inet6_prefix_notify()
6171 err = inet6_fill_prefix(skb, idev, pinfo, 0, 0, event, 0); in inet6_prefix_notify()
6187 struct net *net = dev_net(ifp->idev->dev); in __ipv6_ifa_notify()
6206 } else if (!ifp->rt && (ifp->idev->dev->flags & IFF_UP)) { in __ipv6_ifa_notify()
6208 &ifp->addr, ifp->idev->dev->name); in __ipv6_ifa_notify()
6211 if (ifp->idev->cnf.forwarding) in __ipv6_ifa_notify()
6215 ifp->rt_priority, ifp->idev->dev, in __ipv6_ifa_notify()
6219 if (ifp->idev->cnf.forwarding) in __ipv6_ifa_notify()
6221 addrconf_leave_solict(ifp->idev, &ifp->addr); in __ipv6_ifa_notify()
6226 ifp->idev->dev, 0, 0, in __ipv6_ifa_notify()
6243 if (likely(ifp->idev->dead == 0)) in ipv6_ifa_notify()
6277 struct inet6_dev *idev = ctl->extra1; in addrconf_sysctl_mtu() local
6283 lctl.extra2 = idev ? &idev->dev->mtu : NULL; in addrconf_sysctl_mtu()
6288 static void dev_disable_change(struct inet6_dev *idev) in dev_disable_change() argument
6292 if (!idev || !idev->dev) in dev_disable_change()
6295 netdev_notifier_info_init(&info, idev->dev); in dev_disable_change()
6296 if (idev->cnf.disable_ipv6) in dev_disable_change()
6305 struct inet6_dev *idev; in addrconf_disable_change() local
6308 idev = __in6_dev_get(dev); in addrconf_disable_change()
6309 if (idev) { in addrconf_disable_change()
6310 int changed = (!idev->cnf.disable_ipv6) ^ (!newf); in addrconf_disable_change()
6311 idev->cnf.disable_ipv6 = newf; in addrconf_disable_change()
6313 dev_disable_change(idev); in addrconf_disable_change()
6398 struct inet6_dev *idev = ctl->extra1; in addrconf_sysctl_proxy_ndp() local
6402 idev->dev->ifindex, in addrconf_sysctl_proxy_ndp()
6403 &idev->cnf); in addrconf_sysctl_proxy_ndp()
6417 struct inet6_dev *idev = (struct inet6_dev *)ctl->extra1; in addrconf_sysctl_addr_gen_mode() local
6440 if (idev) { in addrconf_sysctl_addr_gen_mode()
6441 if (check_stable_privacy(idev, net, new_val) < 0) { in addrconf_sysctl_addr_gen_mode()
6446 if (idev->cnf.addr_gen_mode != new_val) { in addrconf_sysctl_addr_gen_mode()
6447 idev->cnf.addr_gen_mode = new_val; in addrconf_sysctl_addr_gen_mode()
6448 addrconf_init_auto_addrs(idev->dev); in addrconf_sysctl_addr_gen_mode()
6455 idev = __in6_dev_get(dev); in addrconf_sysctl_addr_gen_mode()
6456 if (idev && in addrconf_sysctl_addr_gen_mode()
6457 idev->cnf.addr_gen_mode != new_val) { in addrconf_sysctl_addr_gen_mode()
6458 idev->cnf.addr_gen_mode = new_val; in addrconf_sysctl_addr_gen_mode()
6459 addrconf_init_auto_addrs(idev->dev); in addrconf_sysctl_addr_gen_mode()
6520 struct inet6_dev *idev = __in6_dev_get(dev); in addrconf_sysctl_stable_secret() local
6522 if (idev) { in addrconf_sysctl_stable_secret()
6523 idev->cnf.addr_gen_mode = in addrconf_sysctl_stable_secret()
6528 struct inet6_dev *idev = ctl->extra1; in addrconf_sysctl_stable_secret() local
6530 idev->cnf.addr_gen_mode = IN6_ADDR_GEN_MODE_STABLE_PRIVACY; in addrconf_sysctl_stable_secret()
6578 void addrconf_disable_policy_idev(struct inet6_dev *idev, int val) in addrconf_disable_policy_idev() argument
6582 read_lock_bh(&idev->lock); in addrconf_disable_policy_idev()
6583 list_for_each_entry(ifa, &idev->addr_list, if_list) { in addrconf_disable_policy_idev()
6604 read_unlock_bh(&idev->lock); in addrconf_disable_policy_idev()
6610 struct inet6_dev *idev; in addrconf_disable_policy() local
6628 idev = __in6_dev_get(dev); in addrconf_disable_policy()
6629 if (idev) in addrconf_disable_policy()
6630 addrconf_disable_policy_idev(idev, val); in addrconf_disable_policy()
6633 idev = (struct inet6_dev *)ctl->extra1; in addrconf_disable_policy()
6634 addrconf_disable_policy_idev(idev, val); in addrconf_disable_policy()
7114 struct inet6_dev *idev, struct ipv6_devconf *p) in __addrconf_sysctl_register() argument
7131 table[i].extra1 = idev; /* embedded; no ref */ in __addrconf_sysctl_register()
7148 ifindex = idev->dev->ifindex; in __addrconf_sysctl_register()
7175 static int addrconf_sysctl_register(struct inet6_dev *idev) in addrconf_sysctl_register() argument
7179 if (!sysctl_dev_name_is_allowed(idev->dev->name)) in addrconf_sysctl_register()
7182 err = neigh_sysctl_register(idev->dev, idev->nd_parms, in addrconf_sysctl_register()
7186 err = __addrconf_sysctl_register(dev_net(idev->dev), idev->dev->name, in addrconf_sysctl_register()
7187 idev, &idev->cnf); in addrconf_sysctl_register()
7189 neigh_sysctl_unregister(idev->nd_parms); in addrconf_sysctl_register()
7194 static void addrconf_sysctl_unregister(struct inet6_dev *idev) in addrconf_sysctl_unregister() argument
7196 __addrconf_sysctl_unregister(dev_net(idev->dev), &idev->cnf, in addrconf_sysctl_unregister()
7197 idev->dev->ifindex); in addrconf_sysctl_unregister()
7198 neigh_sysctl_unregister(idev->nd_parms); in addrconf_sysctl_unregister()
7329 struct inet6_dev *idev; in addrconf_init() local
7350 idev = ipv6_add_dev(blackhole_netdev); in addrconf_init()
7352 if (IS_ERR(idev)) { in addrconf_init()
7353 err = PTR_ERR(idev); in addrconf_init()