Lines Matching refs:idev

129 static int addrconf_sysctl_register(struct inet6_dev *idev);
130 static void addrconf_sysctl_unregister(struct inet6_dev *idev);
132 static inline int addrconf_sysctl_register(struct inet6_dev *idev) in addrconf_sysctl_register() argument
137 static inline void addrconf_sysctl_unregister(struct inet6_dev *idev) in addrconf_sysctl_unregister() argument
142 static void ipv6_regen_rndid(struct inet6_dev *idev);
143 static void ipv6_try_regen_rndid(struct inet6_dev *idev, struct in6_addr *tmpaddr);
146 static int ipv6_count_addresses(const struct inet6_dev *idev);
149 const struct inet6_dev *idev);
182 static void addrconf_dad_run(struct inet6_dev *idev);
187 static void inet6_prefix_notify(int event, struct inet6_dev *idev,
304 static void addrconf_del_rs_timer(struct inet6_dev *idev) in addrconf_del_rs_timer() argument
306 if (del_timer(&idev->rs_timer)) in addrconf_del_rs_timer()
307 __in6_dev_put(idev); in addrconf_del_rs_timer()
316 static void addrconf_mod_rs_timer(struct inet6_dev *idev, in addrconf_mod_rs_timer() argument
319 if (!timer_pending(&idev->rs_timer)) in addrconf_mod_rs_timer()
320 in6_dev_hold(idev); in addrconf_mod_rs_timer()
321 mod_timer(&idev->rs_timer, jiffies + when); in addrconf_mod_rs_timer()
332 static int snmp6_alloc_dev(struct inet6_dev *idev) in snmp6_alloc_dev() argument
336 idev->stats.ipv6 = alloc_percpu(struct ipstats_mib); in snmp6_alloc_dev()
337 if (!idev->stats.ipv6) in snmp6_alloc_dev()
342 addrconf_stats = per_cpu_ptr(idev->stats.ipv6, i); in snmp6_alloc_dev()
347 idev->stats.icmpv6dev = kzalloc(sizeof(struct icmpv6_mib_device), in snmp6_alloc_dev()
349 if (!idev->stats.icmpv6dev) in snmp6_alloc_dev()
351 idev->stats.icmpv6msgdev = kzalloc(sizeof(struct icmpv6msg_mib_device), in snmp6_alloc_dev()
353 if (!idev->stats.icmpv6msgdev) in snmp6_alloc_dev()
359 kfree(idev->stats.icmpv6dev); in snmp6_alloc_dev()
361 free_percpu(idev->stats.ipv6); in snmp6_alloc_dev()
476 struct inet6_dev *idev; in ipv6_find_idev() local
480 idev = __in6_dev_get(dev); in ipv6_find_idev()
481 if (!idev) { in ipv6_find_idev()
482 idev = ipv6_add_dev(dev); in ipv6_find_idev()
483 if (IS_ERR(idev)) in ipv6_find_idev()
488 ipv6_mc_up(idev); in ipv6_find_idev()
489 return idev; in ipv6_find_idev()
673 struct inet6_dev *idev; in inet6_netconf_dump_devconf() local
688 idev = __in6_dev_get(dev); in inet6_netconf_dump_devconf()
689 if (!idev) in inet6_netconf_dump_devconf()
693 &idev->cnf, in inet6_netconf_dump_devconf()
738 static void dev_forward_change(struct inet6_dev *idev) in dev_forward_change() argument
743 if (!idev) in dev_forward_change()
745 dev = idev->dev; in dev_forward_change()
746 if (idev->cnf.forwarding) in dev_forward_change()
749 if (idev->cnf.forwarding) { in dev_forward_change()
760 list_for_each_entry(ifa, &idev->addr_list, if_list) { in dev_forward_change()
763 if (idev->cnf.forwarding) in dev_forward_change()
770 dev->ifindex, &idev->cnf); in dev_forward_change()
777 struct inet6_dev *idev; in addrconf_forward_change() local
780 idev = __in6_dev_get(dev); in addrconf_forward_change()
781 if (idev) { in addrconf_forward_change()
782 int changed = (!idev->cnf.forwarding) ^ (!newf); in addrconf_forward_change()
783 idev->cnf.forwarding = newf; in addrconf_forward_change()
785 dev_forward_change(idev); in addrconf_forward_change()
840 struct inet6_dev *idev; in addrconf_linkdown_change() local
843 idev = __in6_dev_get(dev); in addrconf_linkdown_change()
844 if (idev) { in addrconf_linkdown_change()
845 int changed = (!idev->cnf.ignore_routes_with_linkdown) ^ (!newf); in addrconf_linkdown_change()
847 idev->cnf.ignore_routes_with_linkdown = newf; in addrconf_linkdown_change()
853 &idev->cnf); in addrconf_linkdown_change()
907 in6_dev_put(ifp->idev); in inet6_ifa_finish_destroy()
922 ipv6_link_dev_addr(struct inet6_dev *idev, struct inet6_ifaddr *ifp) in ipv6_link_dev_addr() argument
931 list_for_each(p, &idev->addr_list) { in ipv6_link_dev_addr()
954 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_chk_same_addr()
957 if (!dev || ifp->idev->dev == dev) in ipv6_chk_same_addr()
987 ipv6_add_addr(struct inet6_dev *idev, struct ifa6_config *cfg, in ipv6_add_addr() argument
992 struct net *net = dev_net(idev->dev); in ipv6_add_addr()
999 (!(idev->dev->flags & IFF_LOOPBACK) && in ipv6_add_addr()
1003 if (idev->dead) { in ipv6_add_addr()
1008 if (idev->cnf.disable_ipv6) { in ipv6_add_addr()
1019 .i6vi_dev = idev, in ipv6_add_addr()
1035 f6i = addrconf_f6i_alloc(net, idev, cfg->pfx, false, gfp_flags); in ipv6_add_addr()
1043 idev->cnf.disable_policy) in ipv6_add_addr()
1046 neigh_parms_data_state_setall(idev->nd_parms); in ipv6_add_addr()
1069 ifa->idev = idev; in ipv6_add_addr()
1070 in6_dev_hold(idev); in ipv6_add_addr()
1077 err = ipv6_add_addr_hash(idev->dev, ifa); in ipv6_add_addr()
1083 write_lock(&idev->lock); in ipv6_add_addr()
1086 ipv6_link_dev_addr(idev, ifa); in ipv6_add_addr()
1089 list_add(&ifa->tmp_list, &idev->tempaddr_list); in ipv6_add_addr()
1094 write_unlock(&idev->lock); in ipv6_add_addr()
1104 if (ifa->idev) in ipv6_add_addr()
1105 in6_dev_put(ifa->idev); in ipv6_add_addr()
1142 struct inet6_dev *idev = ifp->idev; in check_cleanup_prefix_route() local
1148 list_for_each_entry(ifa, &idev->addr_list, if_list) { in check_cleanup_prefix_route()
1182 ifp->idev->dev, in cleanup_prefix_route()
1186 ip6_del_rt(dev_net(ifp->idev->dev), f6i); in cleanup_prefix_route()
1218 write_lock_bh(&ifp->idev->lock); in ipv6_del_addr()
1235 write_unlock_bh(&ifp->idev->lock); in ipv6_del_addr()
1258 struct inet6_dev *idev = ifp->idev; in ipv6_create_tempaddr() local
1268 write_lock_bh(&idev->lock); in ipv6_create_tempaddr()
1278 in6_dev_hold(idev); in ipv6_create_tempaddr()
1279 if (idev->cnf.use_tempaddr <= 0) { in ipv6_create_tempaddr()
1280 write_unlock_bh(&idev->lock); in ipv6_create_tempaddr()
1282 in6_dev_put(idev); in ipv6_create_tempaddr()
1287 if (ifp->regen_count++ >= idev->cnf.regen_max_retry) { in ipv6_create_tempaddr()
1288 idev->cnf.use_tempaddr = -1; /*XXX*/ in ipv6_create_tempaddr()
1290 write_unlock_bh(&idev->lock); in ipv6_create_tempaddr()
1293 in6_dev_put(idev); in ipv6_create_tempaddr()
1299 ipv6_try_regen_rndid(idev, tmpaddr); in ipv6_create_tempaddr()
1300 memcpy(&addr.s6_addr[8], idev->rndid, 8); in ipv6_create_tempaddr()
1303 regen_advance = idev->cnf.regen_max_retry * in ipv6_create_tempaddr()
1304 idev->cnf.dad_transmits * in ipv6_create_tempaddr()
1305 NEIGH_VAR(idev->nd_parms, RETRANS_TIME) / HZ; in ipv6_create_tempaddr()
1310 cnf_temp_preferred_lft = READ_ONCE(idev->cnf.temp_prefered_lft); in ipv6_create_tempaddr()
1312 idev->cnf.max_desync_factor, in ipv6_create_tempaddr()
1315 if (unlikely(idev->desync_factor > max_desync_factor)) { in ipv6_create_tempaddr()
1317 get_random_bytes(&idev->desync_factor, in ipv6_create_tempaddr()
1318 sizeof(idev->desync_factor)); in ipv6_create_tempaddr()
1319 idev->desync_factor %= max_desync_factor; in ipv6_create_tempaddr()
1321 idev->desync_factor = 0; in ipv6_create_tempaddr()
1327 idev->cnf.temp_valid_lft + age); in ipv6_create_tempaddr()
1328 cfg.preferred_lft = cnf_temp_preferred_lft + age - idev->desync_factor; in ipv6_create_tempaddr()
1335 write_unlock_bh(&idev->lock); in ipv6_create_tempaddr()
1347 in6_dev_put(idev); in ipv6_create_tempaddr()
1360 ift = ipv6_add_addr(idev, &cfg, block, NULL); in ipv6_create_tempaddr()
1363 in6_dev_put(idev); in ipv6_create_tempaddr()
1366 write_lock_bh(&idev->lock); in ipv6_create_tempaddr()
1378 in6_dev_put(idev); in ipv6_create_tempaddr()
1430 struct inet6_dev *idev) in ipv6_use_optimistic_addr() argument
1433 if (!idev) in ipv6_use_optimistic_addr()
1435 if (!net->ipv6.devconf_all->optimistic_dad && !idev->cnf.optimistic_dad) in ipv6_use_optimistic_addr()
1437 if (!net->ipv6.devconf_all->use_optimistic && !idev->cnf.use_optimistic) in ipv6_use_optimistic_addr()
1447 struct inet6_dev *idev) in ipv6_allow_optimistic_dad() argument
1450 if (!idev) in ipv6_allow_optimistic_dad()
1452 if (!net->ipv6.devconf_all->optimistic_dad && !idev->cnf.optimistic_dad) in ipv6_allow_optimistic_dad()
1525 if (!ipv6_use_optimistic_addr(net, score->ifa->idev)) in ipv6_get_saddr_eval()
1543 dst->ifindex == score->ifa->idev->dev->ifindex); in ipv6_get_saddr_eval()
1549 score->ifa->idev->dev->ifindex) == dst->label; in ipv6_get_saddr_eval()
1558 score->ifa->idev->cnf.use_tempaddr >= 2; in ipv6_get_saddr_eval()
1597 struct inet6_dev *idev, in __ipv6_dev_get_saddr() argument
1603 list_for_each_entry_rcu(score->ifa, &idev->addr_list, if_list) { in __ipv6_dev_get_saddr()
1625 idev->dev->name); in __ipv6_dev_get_saddr()
1674 struct inet6_dev *idev; in ipv6_get_saddr_master() local
1676 idev = __in6_dev_get(dst_dev); in ipv6_get_saddr_master()
1677 if (idev) in ipv6_get_saddr_master()
1678 hiscore_idx = __ipv6_dev_get_saddr(net, dst, idev, in ipv6_get_saddr_master()
1681 idev = __in6_dev_get(master); in ipv6_get_saddr_master()
1682 if (idev) in ipv6_get_saddr_master()
1683 hiscore_idx = __ipv6_dev_get_saddr(net, dst, idev, in ipv6_get_saddr_master()
1695 struct inet6_dev *idev; in ipv6_dev_get_saddr() local
1731 idev = __in6_dev_get(dst_dev); in ipv6_dev_get_saddr()
1734 (idev && idev->cnf.use_oif_addrs_only)) { in ipv6_dev_get_saddr()
1740 if (idev) in ipv6_dev_get_saddr()
1741 hiscore_idx = __ipv6_dev_get_saddr(net, &dst, idev, scores, hiscore_idx); in ipv6_dev_get_saddr()
1768 idev = __in6_dev_get(dev); in ipv6_dev_get_saddr()
1769 if (!idev) in ipv6_dev_get_saddr()
1771 hiscore_idx = __ipv6_dev_get_saddr(net, &dst, idev, scores, hiscore_idx); in ipv6_dev_get_saddr()
1787 int __ipv6_get_lladdr(struct inet6_dev *idev, struct in6_addr *addr, in __ipv6_get_lladdr() argument
1793 list_for_each_entry_reverse(ifp, &idev->addr_list, if_list) { in __ipv6_get_lladdr()
1809 struct inet6_dev *idev; in ipv6_get_lladdr() local
1813 idev = __in6_dev_get(dev); in ipv6_get_lladdr()
1814 if (idev) { in ipv6_get_lladdr()
1815 read_lock_bh(&idev->lock); in ipv6_get_lladdr()
1816 err = __ipv6_get_lladdr(idev, addr, banned_flags); in ipv6_get_lladdr()
1817 read_unlock_bh(&idev->lock); in ipv6_get_lladdr()
1823 static int ipv6_count_addresses(const struct inet6_dev *idev) in ipv6_count_addresses() argument
1829 list_for_each_entry_rcu(ifp, &idev->addr_list, if_list) in ipv6_count_addresses()
1868 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_chk_addr_and_flags()
1871 if (l3mdev_master_dev_rcu(ifp->idev->dev) != l3mdev) in ipv6_chk_addr_and_flags()
1882 (!dev || ifp->idev->dev == dev || in ipv6_chk_addr_and_flags()
1902 const struct inet6_dev *idev; in ipv6_chk_custom_prefix() local
1906 idev = __in6_dev_get(dev); in ipv6_chk_custom_prefix()
1907 if (idev) { in ipv6_chk_custom_prefix()
1908 list_for_each_entry_rcu(ifa, &idev->addr_list, if_list) { in ipv6_chk_custom_prefix()
1923 const struct inet6_dev *idev; in ipv6_chk_prefix() local
1928 idev = __in6_dev_get(dev); in ipv6_chk_prefix()
1929 if (idev) { in ipv6_chk_prefix()
1930 list_for_each_entry_rcu(ifa, &idev->addr_list, if_list) { in ipv6_chk_prefix()
1950 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_get_ifaddr()
1953 if (!dev || ifp->idev->dev == dev || in ipv6_get_ifaddr()
2017 struct inet6_dev *idev = ifp->idev; in addrconf_dad_failure() local
2018 struct net *net = dev_net(ifp->idev->dev); in addrconf_dad_failure()
2026 ifp->idev->dev->name, &ifp->addr, eth_hdr(skb)->h_source); in addrconf_dad_failure()
2045 ifp->idev->dev->name); in addrconf_dad_failure()
2051 idev)) in addrconf_dad_failure()
2056 if (idev->cnf.max_addresses && in addrconf_dad_failure()
2057 ipv6_count_addresses(idev) >= in addrconf_dad_failure()
2058 idev->cnf.max_addresses) in addrconf_dad_failure()
2062 ifp->idev->dev->name); in addrconf_dad_failure()
2064 ifp2 = ipv6_add_addr(idev, &cfg, false, NULL); in addrconf_dad_failure()
2102 void addrconf_leave_solict(struct inet6_dev *idev, const struct in6_addr *addr) in addrconf_leave_solict() argument
2106 if (idev->dev->flags&(IFF_LOOPBACK|IFF_NOARP)) in addrconf_leave_solict()
2110 __ipv6_dev_mc_dec(idev, &maddr); in addrconf_leave_solict()
2123 __ipv6_dev_ac_inc(ifp->idev, &addr); in addrconf_join_anycast()
2136 __ipv6_dev_ac_dec(ifp->idev, &addr); in addrconf_leave_anycast()
2258 static int ipv6_inherit_eui64(u8 *eui, struct inet6_dev *idev) in ipv6_inherit_eui64() argument
2263 read_lock_bh(&idev->lock); in ipv6_inherit_eui64()
2264 list_for_each_entry_reverse(ifp, &idev->addr_list, if_list) { in ipv6_inherit_eui64()
2273 read_unlock_bh(&idev->lock); in ipv6_inherit_eui64()
2278 static void ipv6_regen_rndid(struct inet6_dev *idev) in ipv6_regen_rndid() argument
2281 get_random_bytes(idev->rndid, sizeof(idev->rndid)); in ipv6_regen_rndid()
2282 idev->rndid[0] &= ~0x02; in ipv6_regen_rndid()
2295 if (idev->rndid[0] == 0xfd && in ipv6_regen_rndid()
2296 …(idev->rndid[1]&idev->rndid[2]&idev->rndid[3]&idev->rndid[4]&idev->rndid[5]&idev->rndid[6]) == 0xf… in ipv6_regen_rndid()
2297 (idev->rndid[7]&0x80)) in ipv6_regen_rndid()
2299 if ((idev->rndid[0]|idev->rndid[1]) == 0) { in ipv6_regen_rndid()
2300 if (idev->rndid[2] == 0x5e && idev->rndid[3] == 0xfe) in ipv6_regen_rndid()
2302 …if ((idev->rndid[2]|idev->rndid[3]|idev->rndid[4]|idev->rndid[5]|idev->rndid[6]|idev->rndid[7]) ==… in ipv6_regen_rndid()
2307 static void ipv6_try_regen_rndid(struct inet6_dev *idev, struct in6_addr *tmpaddr) in ipv6_try_regen_rndid() argument
2309 if (tmpaddr && memcmp(idev->rndid, &tmpaddr->s6_addr[8], 8) == 0) in ipv6_try_regen_rndid()
2310 ipv6_regen_rndid(idev); in ipv6_try_regen_rndid()
2406 struct inet6_dev *idev; in addrconf_add_dev() local
2410 idev = ipv6_find_idev(dev); in addrconf_add_dev()
2411 if (!idev) in addrconf_add_dev()
2414 if (idev->cnf.disable_ipv6) in addrconf_add_dev()
2421 return idev; in addrconf_add_dev()
2424 static void manage_tempaddrs(struct inet6_dev *idev, in manage_tempaddrs() argument
2432 read_lock_bh(&idev->lock); in manage_tempaddrs()
2434 list_for_each_entry(ift, &idev->tempaddr_list, tmp_list) { in manage_tempaddrs()
2449 max_valid = idev->cnf.temp_valid_lft - age; in manage_tempaddrs()
2453 max_prefered = idev->cnf.temp_prefered_lft - in manage_tempaddrs()
2454 idev->desync_factor - age; in manage_tempaddrs()
2477 if ((create || list_empty(&idev->tempaddr_list)) && in manage_tempaddrs()
2478 idev->cnf.use_tempaddr > 0) { in manage_tempaddrs()
2484 read_unlock_bh(&idev->lock); in manage_tempaddrs()
2487 read_unlock_bh(&idev->lock); in manage_tempaddrs()
2491 static bool is_addr_mode_generate_stable(struct inet6_dev *idev) in is_addr_mode_generate_stable() argument
2493 return idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_STABLE_PRIVACY || in is_addr_mode_generate_stable()
2494 idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_RANDOM; in is_addr_mode_generate_stable()
2841 struct inet6_dev *idev; in inet6_addr_add() local
2863 idev = addrconf_add_dev(dev); in inet6_addr_add()
2864 if (IS_ERR(idev)) in inet6_addr_add()
2865 return PTR_ERR(idev); in inet6_addr_add()
2895 ifp = ipv6_add_addr(idev, cfg, true, extack); in inet6_addr_add()
2915 manage_tempaddrs(idev, ifp, cfg->valid_lft, in inet6_addr_add()
2932 struct inet6_dev *idev; in inet6_addr_del() local
2942 idev = __in6_dev_get(dev); in inet6_addr_del()
2943 if (!idev) in inet6_addr_del()
2946 read_lock_bh(&idev->lock); in inet6_addr_del()
2947 list_for_each_entry(ifp, &idev->addr_list, if_list) { in inet6_addr_del()
2951 read_unlock_bh(&idev->lock); in inet6_addr_del()
2955 manage_tempaddrs(idev, ifp, 0, 0, false, in inet6_addr_del()
2966 read_unlock_bh(&idev->lock); in inet6_addr_del()
3014 static void add_addr(struct inet6_dev *idev, const struct in6_addr *addr, in add_addr() argument
3027 ifp = ipv6_add_addr(idev, &cfg, true, NULL); in add_addr()
3032 rt_genid_bump_ipv6(dev_net(idev->dev)); in add_addr()
3039 static void sit_add_v4_addrs(struct inet6_dev *idev) in sit_add_v4_addrs() argument
3043 struct net *net = dev_net(idev->dev); in sit_add_v4_addrs()
3050 memcpy(&addr.s6_addr32[3], idev->dev->dev_addr, 4); in sit_add_v4_addrs()
3052 if (idev->dev->flags&IFF_POINTOPOINT) { in sit_add_v4_addrs()
3063 add_addr(idev, &addr, plen, scope); in sit_add_v4_addrs()
3064 addrconf_prefix_route(&addr, plen, 0, idev->dev, 0, pflags, in sit_add_v4_addrs()
3083 if (idev->dev->flags&IFF_POINTOPOINT) in sit_add_v4_addrs()
3088 add_addr(idev, &addr, plen, flag); in sit_add_v4_addrs()
3089 addrconf_prefix_route(&addr, plen, 0, idev->dev, in sit_add_v4_addrs()
3099 struct inet6_dev *idev; in init_loopback() local
3105 idev = ipv6_find_idev(dev); in init_loopback()
3106 if (!idev) { in init_loopback()
3111 add_addr(idev, &in6addr_loopback, 128, IFA_HOST); in init_loopback()
3114 void addrconf_add_linklocal(struct inet6_dev *idev, in addrconf_add_linklocal() argument
3128 if ((dev_net(idev->dev)->ipv6.devconf_all->optimistic_dad || in addrconf_add_linklocal()
3129 idev->cnf.optimistic_dad) && in addrconf_add_linklocal()
3130 !dev_net(idev->dev)->ipv6.devconf_all->forwarding) in addrconf_add_linklocal()
3134 ifp = ipv6_add_addr(idev, &cfg, true, NULL); in addrconf_add_linklocal()
3136 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, 0, idev->dev, in addrconf_add_linklocal()
3162 const struct inet6_dev *idev) in ipv6_generate_stable_address() argument
3180 struct net *net = dev_net(idev->dev); in ipv6_generate_stable_address()
3184 if (idev->cnf.stable_secret.initialized) in ipv6_generate_stable_address()
3185 secret = idev->cnf.stable_secret.secret; in ipv6_generate_stable_address()
3197 memcpy(data.hwaddr, idev->dev->perm_addr, idev->dev->addr_len); in ipv6_generate_stable_address()
3213 if (dad_count > dev_net(idev->dev)->ipv6.sysctl.idgen_retries) in ipv6_generate_stable_address()
3222 static void ipv6_gen_mode_random_init(struct inet6_dev *idev) in ipv6_gen_mode_random_init() argument
3224 struct ipv6_stable_secret *s = &idev->cnf.stable_secret; in ipv6_gen_mode_random_init()
3228 s = &idev->cnf.stable_secret; in ipv6_gen_mode_random_init()
3233 static void addrconf_addr_gen(struct inet6_dev *idev, bool prefix_route) in addrconf_addr_gen() argument
3238 if (netif_is_l3_master(idev->dev)) in addrconf_addr_gen()
3243 switch (idev->cnf.addr_gen_mode) { in addrconf_addr_gen()
3245 ipv6_gen_mode_random_init(idev); in addrconf_addr_gen()
3248 if (!ipv6_generate_stable_address(&addr, 0, idev)) in addrconf_addr_gen()
3249 addrconf_add_linklocal(idev, &addr, in addrconf_addr_gen()
3252 addrconf_prefix_route(&addr, 64, 0, idev->dev, in addrconf_addr_gen()
3260 if (ipv6_generate_eui64(addr.s6_addr + 8, idev->dev) == 0) in addrconf_addr_gen()
3261 addrconf_add_linklocal(idev, &addr, 0); in addrconf_addr_gen()
3263 addrconf_prefix_route(&addr, 64, 0, idev->dev, in addrconf_addr_gen()
3275 struct inet6_dev *idev; in addrconf_dev_config() local
3295 idev = addrconf_add_dev(dev); in addrconf_dev_config()
3296 if (IS_ERR(idev)) in addrconf_dev_config()
3301 idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_EUI64) in addrconf_dev_config()
3302 idev->cnf.addr_gen_mode = IN6_ADDR_GEN_MODE_RANDOM; in addrconf_dev_config()
3304 addrconf_addr_gen(idev, false); in addrconf_dev_config()
3310 struct inet6_dev *idev; in addrconf_sit_config() local
3320 idev = ipv6_find_idev(dev); in addrconf_sit_config()
3321 if (!idev) { in addrconf_sit_config()
3327 addrconf_addr_gen(idev, false); in addrconf_sit_config()
3331 sit_add_v4_addrs(idev); in addrconf_sit_config()
3341 struct inet6_dev *idev; in addrconf_gre_config() local
3345 idev = ipv6_find_idev(dev); in addrconf_gre_config()
3346 if (!idev) { in addrconf_gre_config()
3351 addrconf_addr_gen(idev, true); in addrconf_gre_config()
3358 struct inet6_dev *idev, in fixup_permanent_addr() argument
3368 f6i = addrconf_f6i_alloc(net, idev, &ifp->addr, false, in fixup_permanent_addr()
3384 ifp->rt_priority, idev->dev, 0, 0, in fixup_permanent_addr()
3397 struct inet6_dev *idev; in addrconf_permanent_addr() local
3399 idev = __in6_dev_get(dev); in addrconf_permanent_addr()
3400 if (!idev) in addrconf_permanent_addr()
3403 write_lock_bh(&idev->lock); in addrconf_permanent_addr()
3405 list_for_each_entry_safe(ifp, tmp, &idev->addr_list, if_list) { in addrconf_permanent_addr()
3407 fixup_permanent_addr(net, idev, ifp) < 0) { in addrconf_permanent_addr()
3408 write_unlock_bh(&idev->lock); in addrconf_permanent_addr()
3411 write_lock_bh(&idev->lock); in addrconf_permanent_addr()
3414 idev->dev->name, &ifp->addr); in addrconf_permanent_addr()
3418 write_unlock_bh(&idev->lock); in addrconf_permanent_addr()
3426 struct inet6_dev *idev = __in6_dev_get(dev); in addrconf_notify() local
3433 if (!idev && dev->mtu >= IPV6_MIN_MTU) { in addrconf_notify()
3434 idev = ipv6_add_dev(dev); in addrconf_notify()
3435 if (IS_ERR(idev)) in addrconf_notify()
3436 return notifier_from_errno(PTR_ERR(idev)); in addrconf_notify()
3447 if (idev) { in addrconf_notify()
3449 idev->cnf.mtu6 = dev->mtu; in addrconf_notify()
3454 idev = ipv6_add_dev(dev); in addrconf_notify()
3455 if (IS_ERR(idev)) in addrconf_notify()
3459 if (!(idev->if_flags & IF_READY)) in addrconf_notify()
3471 if (idev && idev->cnf.disable_ipv6) in addrconf_notify()
3485 if (!idev && dev->mtu >= IPV6_MIN_MTU) in addrconf_notify()
3486 idev = ipv6_add_dev(dev); in addrconf_notify()
3488 if (!IS_ERR_OR_NULL(idev)) { in addrconf_notify()
3489 idev->if_flags |= IF_READY; in addrconf_notify()
3499 if (idev) { in addrconf_notify()
3500 if (idev->if_flags & IF_READY) { in addrconf_notify()
3506 ipv6_mc_up(idev); in addrconf_notify()
3510 idev->if_flags |= IF_READY; in addrconf_notify()
3539 if (!IS_ERR_OR_NULL(idev)) { in addrconf_notify()
3541 addrconf_dad_run(idev); in addrconf_notify()
3551 if (idev->cnf.mtu6 != dev->mtu && in addrconf_notify()
3554 idev->cnf.mtu6 = dev->mtu; in addrconf_notify()
3556 idev->tstamp = jiffies; in addrconf_notify()
3557 inet6_ifinfo_notify(RTM_NEWLINK, idev); in addrconf_notify()
3577 if (idev) { in addrconf_notify()
3578 snmp6_unregister_dev(idev); in addrconf_notify()
3579 addrconf_sysctl_unregister(idev); in addrconf_notify()
3580 err = addrconf_sysctl_register(idev); in addrconf_notify()
3583 err = snmp6_register_dev(idev); in addrconf_notify()
3585 addrconf_sysctl_unregister(idev); in addrconf_notify()
3593 if (idev) in addrconf_notify()
3620 struct inet6_dev *idev; in addrconf_type_change() local
3623 idev = __in6_dev_get(dev); in addrconf_type_change()
3626 ipv6_mc_remap(idev); in addrconf_type_change()
3628 ipv6_mc_unmap(idev); in addrconf_type_change()
3641 struct inet6_dev *idev; in addrconf_ifdown() local
3650 idev = __in6_dev_get(dev); in addrconf_ifdown()
3651 if (!idev) in addrconf_ifdown()
3659 idev->dead = 1; in addrconf_ifdown()
3665 snmp6_unregister_dev(idev); in addrconf_ifdown()
3672 if (!how && !idev->cnf.disable_ipv6) { in addrconf_ifdown()
3677 _keep_addr = idev->cnf.keep_addr_on_down; in addrconf_ifdown()
3689 if (ifa->idev == idev) { in addrconf_ifdown()
3705 write_lock_bh(&idev->lock); in addrconf_ifdown()
3707 addrconf_del_rs_timer(idev); in addrconf_ifdown()
3711 idev->if_flags &= ~(IF_RS_SENT|IF_RA_RCVD|IF_READY); in addrconf_ifdown()
3714 while (!list_empty(&idev->tempaddr_list)) { in addrconf_ifdown()
3715 ifa = list_first_entry(&idev->tempaddr_list, in addrconf_ifdown()
3718 write_unlock_bh(&idev->lock); in addrconf_ifdown()
3727 write_lock_bh(&idev->lock); in addrconf_ifdown()
3730 list_for_each_entry_safe(ifa, tmp, &idev->addr_list, if_list) { in addrconf_ifdown()
3739 write_unlock_bh(&idev->lock); in addrconf_ifdown()
3765 if (idev->cnf.forwarding) in addrconf_ifdown()
3767 addrconf_leave_solict(ifa->idev, &ifa->addr); in addrconf_ifdown()
3770 write_lock_bh(&idev->lock); in addrconf_ifdown()
3777 write_unlock_bh(&idev->lock); in addrconf_ifdown()
3781 ipv6_ac_destroy_dev(idev); in addrconf_ifdown()
3782 ipv6_mc_destroy_dev(idev); in addrconf_ifdown()
3784 ipv6_mc_down(idev); in addrconf_ifdown()
3787 idev->tstamp = jiffies; in addrconf_ifdown()
3791 addrconf_sysctl_unregister(idev); in addrconf_ifdown()
3792 neigh_parms_release(&nd_tbl, idev->nd_parms); in addrconf_ifdown()
3794 in6_dev_put(idev); in addrconf_ifdown()
3801 struct inet6_dev *idev = from_timer(idev, t, rs_timer); in addrconf_rs_timer() local
3802 struct net_device *dev = idev->dev; in addrconf_rs_timer()
3805 write_lock(&idev->lock); in addrconf_rs_timer()
3806 if (idev->dead || !(idev->if_flags & IF_READY)) in addrconf_rs_timer()
3809 if (!ipv6_accept_ra(idev)) in addrconf_rs_timer()
3813 if (idev->if_flags & IF_RA_RCVD) in addrconf_rs_timer()
3816 if (idev->rs_probes++ < idev->cnf.rtr_solicits || idev->cnf.rtr_solicits < 0) { in addrconf_rs_timer()
3817 write_unlock(&idev->lock); in addrconf_rs_timer()
3824 write_lock(&idev->lock); in addrconf_rs_timer()
3825 idev->rs_interval = rfc3315_s14_backoff_update( in addrconf_rs_timer()
3826 idev->rs_interval, idev->cnf.rtr_solicit_max_interval); in addrconf_rs_timer()
3828 addrconf_mod_rs_timer(idev, (idev->rs_probes == in addrconf_rs_timer()
3829 idev->cnf.rtr_solicits) ? in addrconf_rs_timer()
3830 idev->cnf.rtr_solicit_delay : in addrconf_rs_timer()
3831 idev->rs_interval); in addrconf_rs_timer()
3837 pr_debug("%s: no IPv6 routers present\n", idev->dev->name); in addrconf_rs_timer()
3841 write_unlock(&idev->lock); in addrconf_rs_timer()
3843 in6_dev_put(idev); in addrconf_rs_timer()
3852 struct inet6_dev *idev = ifp->idev; in addrconf_dad_kick() local
3858 rand_num = prandom_u32() % (idev->cnf.rtr_solicit_delay ? : 1); in addrconf_dad_kick()
3861 if (idev->cnf.enhanced_dad || in addrconf_dad_kick()
3862 dev_net(idev->dev)->ipv6.devconf_all->enhanced_dad) { in addrconf_dad_kick()
3868 ifp->dad_probes = idev->cnf.dad_transmits; in addrconf_dad_kick()
3874 struct inet6_dev *idev = ifp->idev; in addrconf_dad_begin() local
3875 struct net_device *dev = idev->dev; in addrconf_dad_begin()
3883 read_lock_bh(&idev->lock); in addrconf_dad_begin()
3891 idev->cnf.accept_dad < 1) || in addrconf_dad_begin()
3902 read_unlock_bh(&idev->lock); in addrconf_dad_begin()
3908 if (!(idev->if_flags & IF_READY)) { in addrconf_dad_begin()
3910 read_unlock_bh(&idev->lock); in addrconf_dad_begin()
3927 if (ipv6_use_optimistic_addr(net, idev)) { in addrconf_dad_begin()
3938 read_unlock_bh(&idev->lock); in addrconf_dad_begin()
3963 struct inet6_dev *idev = ifp->idev; in addrconf_dad_work() local
3983 if ((dev_net(idev->dev)->ipv6.devconf_all->accept_dad > 1 || in addrconf_dad_work()
3984 idev->cnf.accept_dad > 1) && in addrconf_dad_work()
3985 !idev->cnf.disable_ipv6 && in addrconf_dad_work()
3992 if (!ipv6_generate_eui64(addr.s6_addr + 8, idev->dev) && in addrconf_dad_work()
3995 idev->cnf.disable_ipv6 = 1; in addrconf_dad_work()
3998 ifp->idev->dev->name); in addrconf_dad_work()
4012 addrconf_ifdown(idev->dev, 0); in addrconf_dad_work()
4019 write_lock_bh(&idev->lock); in addrconf_dad_work()
4020 if (idev->dead || !(idev->if_flags & IF_READY)) { in addrconf_dad_work()
4021 write_unlock_bh(&idev->lock); in addrconf_dad_work()
4028 write_unlock_bh(&idev->lock); in addrconf_dad_work()
4045 write_unlock_bh(&idev->lock); in addrconf_dad_work()
4054 NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME)); in addrconf_dad_work()
4056 write_unlock_bh(&idev->lock); in addrconf_dad_work()
4060 ndisc_send_ns(ifp->idev->dev, &ifp->addr, &mcaddr, &in6addr_any, in addrconf_dad_work()
4071 struct inet6_dev *idev = ifp->idev; in ipv6_lonely_lladdr() local
4073 list_for_each_entry_reverse(ifpiter, &idev->addr_list, if_list) { in ipv6_lonely_lladdr()
4088 struct net_device *dev = ifp->idev->dev; in addrconf_dad_completed()
4104 read_lock_bh(&ifp->idev->lock); in addrconf_dad_completed()
4107 ipv6_accept_ra(ifp->idev) && in addrconf_dad_completed()
4108 ifp->idev->cnf.rtr_solicits != 0 && in addrconf_dad_completed()
4110 read_unlock_bh(&ifp->idev->lock); in addrconf_dad_completed()
4116 ipv6_mc_dad_complete(ifp->idev); in addrconf_dad_completed()
4120 (ifp->idev->cnf.ndisc_notify || in addrconf_dad_completed()
4123 /*router=*/ !!ifp->idev->cnf.forwarding, in addrconf_dad_completed()
4138 write_lock_bh(&ifp->idev->lock); in addrconf_dad_completed()
4140 ifp->idev->rs_interval = rfc3315_s14_backoff_init( in addrconf_dad_completed()
4141 ifp->idev->cnf.rtr_solicit_interval); in addrconf_dad_completed()
4142 ifp->idev->rs_probes = 1; in addrconf_dad_completed()
4143 ifp->idev->if_flags |= IF_RS_SENT; in addrconf_dad_completed()
4144 addrconf_mod_rs_timer(ifp->idev, ifp->idev->rs_interval); in addrconf_dad_completed()
4146 write_unlock_bh(&ifp->idev->lock); in addrconf_dad_completed()
4159 static void addrconf_dad_run(struct inet6_dev *idev) in addrconf_dad_run() argument
4163 read_lock_bh(&idev->lock); in addrconf_dad_run()
4164 list_for_each_entry(ifp, &idev->addr_list, if_list) { in addrconf_dad_run()
4171 read_unlock_bh(&idev->lock); in addrconf_dad_run()
4197 if (!net_eq(dev_net(ifa->idev->dev), net)) in if6_get_first()
4221 if (!net_eq(dev_net(ifa->idev->dev), net)) in if6_get_next()
4231 if (!net_eq(dev_net(ifa->idev->dev), net)) in if6_get_next()
4267 ifp->idev->dev->ifindex, in if6_seq_show()
4271 ifp->idev->dev->name); in if6_seq_show()
4321 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_chk_home_addr()
4402 unsigned long regen_advance = ifp->idev->cnf.regen_max_retry * in addrconf_verify_rtnl()
4403 ifp->idev->cnf.dad_transmits * in addrconf_verify_rtnl()
4404 NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME) / HZ; in addrconf_verify_rtnl()
4532 ifp->idev->dev, in modify_prefix_route()
4540 ip6_del_rt(dev_net(ifp->idev->dev), f6i); in modify_prefix_route()
4544 ifp->rt_priority, ifp->idev->dev, in modify_prefix_route()
4624 ifp->rt_priority, ifp->idev->dev, in inet6_addr_modify()
4631 write_lock_bh(&ifp->idev->lock); in inet6_addr_modify()
4633 write_unlock_bh(&ifp->idev->lock); in inet6_addr_modify()
4647 manage_tempaddrs(ifp->idev, ifp, cfg->valid_lft, in inet6_addr_modify()
4667 struct inet6_dev *idev; in inet6_rtm_newaddr() local
4713 idev = ipv6_find_idev(dev); in inet6_rtm_newaddr()
4714 if (IS_ERR(idev)) in inet6_rtm_newaddr()
4715 return PTR_ERR(idev); in inet6_rtm_newaddr()
4717 if (!ipv6_allow_optimistic_dad(net, idev)) in inet6_rtm_newaddr()
4805 ifa->idev->dev->ifindex); in inet6_fill_ifaddr()
4860 int ifindex = ifmca->idev->dev->ifindex; in inet6_fill_ifmcaddr()
4915 static int in6_dump_addrs(struct inet6_dev *idev, struct sk_buff *skb, in in6_dump_addrs() argument
4924 read_lock_bh(&idev->lock); in in6_dump_addrs()
4930 list_for_each_entry(ifa, &idev->addr_list, if_list) { in in6_dump_addrs()
4948 for (ifmca = idev->mc_list; ifmca; in in6_dump_addrs()
4963 for (ifaca = idev->ac_list; ifaca; in in6_dump_addrs()
4979 read_unlock_bh(&idev->lock); in in6_dump_addrs()
4992 struct inet6_dev *idev; in inet6_dump_addr() local
5010 idev = __in6_dev_get(dev); in inet6_dump_addr()
5011 if (!idev) in inet6_dump_addr()
5014 if (in6_dump_addrs(idev, skb, cb, type, in inet6_dump_addr()
5109 struct net *net = dev_net(ifa->idev->dev); in inet6_ifa_notify()
5264 static void snmp6_fill_stats(u64 *stats, struct inet6_dev *idev, int attrtype, in snmp6_fill_stats() argument
5269 __snmp6_fill_stats64(stats, idev->stats.ipv6, bytes, in snmp6_fill_stats()
5273 __snmp6_fill_statsdev(stats, idev->stats.icmpv6dev->mibs, bytes); in snmp6_fill_stats()
5278 static int inet6_fill_ifla6_attrs(struct sk_buff *skb, struct inet6_dev *idev, in inet6_fill_ifla6_attrs() argument
5284 if (nla_put_u32(skb, IFLA_INET6_FLAGS, idev->if_flags)) in inet6_fill_ifla6_attrs()
5287 ci.tstamp = cstamp_delta(idev->tstamp); in inet6_fill_ifla6_attrs()
5288 ci.reachable_time = jiffies_to_msecs(idev->nd_parms->reachable_time); in inet6_fill_ifla6_attrs()
5289 ci.retrans_time = jiffies_to_msecs(NEIGH_VAR(idev->nd_parms, RETRANS_TIME)); in inet6_fill_ifla6_attrs()
5295 ipv6_store_devconf(&idev->cnf, nla_data(nla), nla_len(nla)); in inet6_fill_ifla6_attrs()
5305 snmp6_fill_stats(nla_data(nla), idev, IFLA_INET6_STATS, nla_len(nla)); in inet6_fill_ifla6_attrs()
5310 snmp6_fill_stats(nla_data(nla), idev, IFLA_INET6_ICMP6STATS, nla_len(nla)); in inet6_fill_ifla6_attrs()
5316 if (nla_put_u8(skb, IFLA_INET6_ADDR_GEN_MODE, idev->cnf.addr_gen_mode)) in inet6_fill_ifla6_attrs()
5319 read_lock_bh(&idev->lock); in inet6_fill_ifla6_attrs()
5320 memcpy(nla_data(nla), idev->token.s6_addr, nla_len(nla)); in inet6_fill_ifla6_attrs()
5321 read_unlock_bh(&idev->lock); in inet6_fill_ifla6_attrs()
5341 struct inet6_dev *idev = __in6_dev_get(dev); in inet6_fill_link_af() local
5343 if (!idev) in inet6_fill_link_af()
5346 if (inet6_fill_ifla6_attrs(skb, idev, ext_filter_mask) < 0) in inet6_fill_link_af()
5352 static int inet6_set_iftoken(struct inet6_dev *idev, struct in6_addr *token) in inet6_set_iftoken() argument
5355 struct net_device *dev = idev->dev; in inet6_set_iftoken()
5365 if (!ipv6_accept_ra(idev)) in inet6_set_iftoken()
5367 if (idev->cnf.rtr_solicits == 0) in inet6_set_iftoken()
5370 write_lock_bh(&idev->lock); in inet6_set_iftoken()
5373 memcpy(idev->token.s6_addr + 8, token->s6_addr + 8, 8); in inet6_set_iftoken()
5375 write_unlock_bh(&idev->lock); in inet6_set_iftoken()
5381 if (!idev->dead && (idev->if_flags & IF_READY) && in inet6_set_iftoken()
5392 write_lock_bh(&idev->lock); in inet6_set_iftoken()
5395 idev->if_flags |= IF_RS_SENT; in inet6_set_iftoken()
5396 idev->rs_interval = rfc3315_s14_backoff_init( in inet6_set_iftoken()
5397 idev->cnf.rtr_solicit_interval); in inet6_set_iftoken()
5398 idev->rs_probes = 1; in inet6_set_iftoken()
5399 addrconf_mod_rs_timer(idev, idev->rs_interval); in inet6_set_iftoken()
5403 list_for_each_entry(ifp, &idev->addr_list, if_list) { in inet6_set_iftoken()
5412 write_unlock_bh(&idev->lock); in inet6_set_iftoken()
5413 inet6_ifinfo_notify(RTM_NEWLINK, idev); in inet6_set_iftoken()
5445 static int check_stable_privacy(struct inet6_dev *idev, struct net *net, in check_stable_privacy() argument
5449 !idev->cnf.stable_secret.initialized && in check_stable_privacy()
5458 struct inet6_dev *idev = __in6_dev_get(dev); in inet6_set_link_af() local
5461 if (!idev) in inet6_set_link_af()
5468 err = inet6_set_iftoken(idev, nla_data(tb[IFLA_INET6_TOKEN])); in inet6_set_link_af()
5477 check_stable_privacy(idev, dev_net(dev), mode) < 0) in inet6_set_link_af()
5480 idev->cnf.addr_gen_mode = mode; in inet6_set_link_af()
5487 static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev, in inet6_fill_ifinfo() argument
5490 struct net_device *dev = idev->dev; in inet6_fill_ifinfo()
5520 if (inet6_fill_ifla6_attrs(skb, idev, 0) < 0) in inet6_fill_ifinfo()
5538 struct inet6_dev *idev; in inet6_dump_ifinfo() local
5551 idev = __in6_dev_get(dev); in inet6_dump_ifinfo()
5552 if (!idev) in inet6_dump_ifinfo()
5554 if (inet6_fill_ifinfo(skb, idev, in inet6_dump_ifinfo()
5571 void inet6_ifinfo_notify(int event, struct inet6_dev *idev) in inet6_ifinfo_notify() argument
5574 struct net *net = dev_net(idev->dev); in inet6_ifinfo_notify()
5581 err = inet6_fill_ifinfo(skb, idev, 0, 0, event, 0); in inet6_ifinfo_notify()
5602 static int inet6_fill_prefix(struct sk_buff *skb, struct inet6_dev *idev, in inet6_fill_prefix() argument
5618 pmsg->prefix_ifindex = idev->dev->ifindex; in inet6_fill_prefix()
5642 static void inet6_prefix_notify(int event, struct inet6_dev *idev, in inet6_prefix_notify() argument
5646 struct net *net = dev_net(idev->dev); in inet6_prefix_notify()
5653 err = inet6_fill_prefix(skb, idev, pinfo, 0, 0, event, 0); in inet6_prefix_notify()
5669 struct net *net = dev_net(ifp->idev->dev); in __ipv6_ifa_notify()
5686 if (ifp->idev->cnf.forwarding) in __ipv6_ifa_notify()
5690 ifp->idev->dev, 0, 0, in __ipv6_ifa_notify()
5694 if (ifp->idev->cnf.forwarding) in __ipv6_ifa_notify()
5696 addrconf_leave_solict(ifp->idev, &ifp->addr); in __ipv6_ifa_notify()
5701 ifp->idev->dev, 0, 0); in __ipv6_ifa_notify()
5718 if (likely(ifp->idev->dead == 0)) in ipv6_ifa_notify()
5755 struct inet6_dev *idev = ctl->extra1; in addrconf_sysctl_mtu() local
5761 lctl.extra2 = idev ? &idev->dev->mtu : NULL; in addrconf_sysctl_mtu()
5766 static void dev_disable_change(struct inet6_dev *idev) in dev_disable_change() argument
5770 if (!idev || !idev->dev) in dev_disable_change()
5773 netdev_notifier_info_init(&info, idev->dev); in dev_disable_change()
5774 if (idev->cnf.disable_ipv6) in dev_disable_change()
5783 struct inet6_dev *idev; in addrconf_disable_change() local
5786 idev = __in6_dev_get(dev); in addrconf_disable_change()
5787 if (idev) { in addrconf_disable_change()
5788 int changed = (!idev->cnf.disable_ipv6) ^ (!newf); in addrconf_disable_change()
5789 idev->cnf.disable_ipv6 = newf; in addrconf_disable_change()
5791 dev_disable_change(idev); in addrconf_disable_change()
5878 struct inet6_dev *idev = ctl->extra1; in addrconf_sysctl_proxy_ndp() local
5882 idev->dev->ifindex, in addrconf_sysctl_proxy_ndp()
5883 &idev->cnf); in addrconf_sysctl_proxy_ndp()
5897 struct inet6_dev *idev = (struct inet6_dev *)ctl->extra1; in addrconf_sysctl_addr_gen_mode() local
5920 if (idev) { in addrconf_sysctl_addr_gen_mode()
5921 if (check_stable_privacy(idev, net, new_val) < 0) { in addrconf_sysctl_addr_gen_mode()
5926 if (idev->cnf.addr_gen_mode != new_val) { in addrconf_sysctl_addr_gen_mode()
5927 idev->cnf.addr_gen_mode = new_val; in addrconf_sysctl_addr_gen_mode()
5928 addrconf_dev_config(idev->dev); in addrconf_sysctl_addr_gen_mode()
5935 idev = __in6_dev_get(dev); in addrconf_sysctl_addr_gen_mode()
5936 if (idev && in addrconf_sysctl_addr_gen_mode()
5937 idev->cnf.addr_gen_mode != new_val) { in addrconf_sysctl_addr_gen_mode()
5938 idev->cnf.addr_gen_mode = new_val; in addrconf_sysctl_addr_gen_mode()
5939 addrconf_dev_config(idev->dev); in addrconf_sysctl_addr_gen_mode()
6000 struct inet6_dev *idev = __in6_dev_get(dev); in addrconf_sysctl_stable_secret() local
6002 if (idev) { in addrconf_sysctl_stable_secret()
6003 idev->cnf.addr_gen_mode = in addrconf_sysctl_stable_secret()
6008 struct inet6_dev *idev = ctl->extra1; in addrconf_sysctl_stable_secret() local
6010 idev->cnf.addr_gen_mode = IN6_ADDR_GEN_MODE_STABLE_PRIVACY; in addrconf_sysctl_stable_secret()
6059 void addrconf_disable_policy_idev(struct inet6_dev *idev, int val) in addrconf_disable_policy_idev() argument
6063 read_lock_bh(&idev->lock); in addrconf_disable_policy_idev()
6064 list_for_each_entry(ifa, &idev->addr_list, if_list) { in addrconf_disable_policy_idev()
6084 read_unlock_bh(&idev->lock); in addrconf_disable_policy_idev()
6090 struct inet6_dev *idev; in addrconf_disable_policy() local
6108 idev = __in6_dev_get(dev); in addrconf_disable_policy()
6109 if (idev) in addrconf_disable_policy()
6110 addrconf_disable_policy_idev(idev, val); in addrconf_disable_policy()
6113 idev = (struct inet6_dev *)ctl->extra1; in addrconf_disable_policy()
6114 addrconf_disable_policy_idev(idev, val); in addrconf_disable_policy()
6532 struct inet6_dev *idev, struct ipv6_devconf *p) in __addrconf_sysctl_register() argument
6549 table[i].extra1 = idev; /* embedded; no ref */ in __addrconf_sysctl_register()
6565 ifindex = idev->dev->ifindex; in __addrconf_sysctl_register()
6592 static int addrconf_sysctl_register(struct inet6_dev *idev) in addrconf_sysctl_register() argument
6596 if (!sysctl_dev_name_is_allowed(idev->dev->name)) in addrconf_sysctl_register()
6599 err = neigh_sysctl_register(idev->dev, idev->nd_parms, in addrconf_sysctl_register()
6603 err = __addrconf_sysctl_register(dev_net(idev->dev), idev->dev->name, in addrconf_sysctl_register()
6604 idev, &idev->cnf); in addrconf_sysctl_register()
6606 neigh_sysctl_unregister(idev->nd_parms); in addrconf_sysctl_register()
6611 static void addrconf_sysctl_unregister(struct inet6_dev *idev) in addrconf_sysctl_unregister() argument
6613 __addrconf_sysctl_unregister(dev_net(idev->dev), &idev->cnf, in addrconf_sysctl_unregister()
6614 idev->dev->ifindex); in addrconf_sysctl_unregister()
6615 neigh_sysctl_unregister(idev->nd_parms); in addrconf_sysctl_unregister()
6698 struct inet6_dev *idev; in addrconf_init() local
6737 idev = ipv6_add_dev(init_net.loopback_dev); in addrconf_init()
6739 if (IS_ERR(idev)) { in addrconf_init()
6740 err = PTR_ERR(idev); in addrconf_init()