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)
134 static inline void addrconf_sysctl_unregister(struct inet6_dev *idev)
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,
316 static void addrconf_del_rs_timer(struct inet6_dev *idev)
318 if (timer_delete(&idev->rs_timer))
319 __in6_dev_put(idev);
328 static void addrconf_mod_rs_timer(struct inet6_dev *idev,
331 if (!mod_timer(&idev->rs_timer, jiffies + when))
332 in6_dev_hold(idev);
343 static int snmp6_alloc_dev(struct inet6_dev *idev)
347 idev->stats.ipv6 = alloc_percpu_gfp(struct ipstats_mib, GFP_KERNEL_ACCOUNT);
348 if (!idev->stats.ipv6)
353 addrconf_stats = per_cpu_ptr(idev->stats.ipv6, i);
358 idev->stats.icmpv6dev = kzalloc(sizeof(struct icmpv6_mib_device),
360 if (!idev->stats.icmpv6dev)
362 idev->stats.icmpv6msgdev = kzalloc(sizeof(struct icmpv6msg_mib_device),
364 if (!idev->stats.icmpv6msgdev)
370 kfree(idev->stats.icmpv6dev);
372 free_percpu(idev->stats.ipv6);
492 struct inet6_dev *idev;
496 idev = __in6_dev_get(dev);
497 if (!idev) {
498 idev = ipv6_add_dev(dev);
499 if (IS_ERR(idev))
500 return idev;
504 ipv6_mc_up(idev);
505 return idev;
745 struct inet6_dev *idev;
765 idev = __in6_dev_get(dev);
766 if (!idev)
769 &idev->cnf,
806 static void dev_forward_change(struct inet6_dev *idev)
812 if (!idev)
814 dev = idev->dev;
815 if (idev->cnf.forwarding)
818 if (idev->cnf.forwarding) {
829 read_lock_bh(&idev->lock);
830 list_for_each_entry(ifa, &idev->addr_list, if_list) {
835 read_unlock_bh(&idev->lock);
841 if (idev->cnf.forwarding)
849 dev->ifindex, &idev->cnf);
856 struct inet6_dev *idev;
859 idev = __in6_dev_get_rtnl_net(dev);
860 if (idev) {
861 int changed = (!idev->cnf.forwarding) ^ (!newf);
864 WRITE_ONCE(idev->cnf.force_forwarding, 0);
866 WRITE_ONCE(idev->cnf.forwarding, newf);
868 dev_forward_change(idev);
922 struct inet6_dev *idev;
925 idev = __in6_dev_get_rtnl_net(dev);
926 if (idev) {
927 int changed = (!idev->cnf.ignore_routes_with_linkdown) ^ (!newf);
929 WRITE_ONCE(idev->cnf.ignore_routes_with_linkdown, newf);
935 &idev->cnf);
989 in6_dev_put(ifp->idev);
1004 ipv6_link_dev_addr(struct inet6_dev *idev, struct inet6_ifaddr *ifp)
1013 list_for_each(p, &idev->addr_list) {
1037 if (!dev || ifp->idev->dev == dev)
1068 ipv6_add_addr(struct inet6_dev *idev, struct ifa6_config *cfg,
1073 struct net *net = dev_net(idev->dev);
1085 } else if (!(idev->dev->flags & IFF_LOOPBACK) &&
1086 !netif_is_l3_master(idev->dev) &&
1092 if (idev->dead) {
1098 if (idev->cnf.disable_ipv6) {
1110 .i6vi_dev = idev,
1126 f6i = addrconf_f6i_alloc(net, idev, cfg->pfx, false, gfp_flags, extack);
1133 neigh_parms_data_state_setall(idev->nd_parms);
1157 ifa->idev = idev;
1158 in6_dev_hold(idev);
1165 err = ipv6_add_addr_hash(idev->dev, ifa);
1171 write_lock_bh(&idev->lock);
1174 ipv6_link_dev_addr(idev, ifa);
1177 list_add(&ifa->tmp_list, &idev->tempaddr_list);
1182 write_unlock_bh(&idev->lock);
1192 if (ifa->idev)
1193 in6_dev_put(ifa->idev);
1230 struct inet6_dev *idev = ifp->idev;
1236 list_for_each_entry(ifa, &idev->addr_list, if_list) {
1273 ifp->idev->dev, 0, RTF_DEFAULT, true);
1276 ip6_del_rt(dev_net(ifp->idev->dev), f6i, false);
1298 struct net *net = dev_net(ifp->idev->dev);
1316 write_lock_bh(&ifp->idev->lock);
1333 write_unlock_bh(&ifp->idev->lock);
1352 static unsigned long ipv6_get_regen_advance(const struct inet6_dev *idev)
1354 return READ_ONCE(idev->cnf.regen_min_advance) +
1355 READ_ONCE(idev->cnf.regen_max_retry) *
1356 READ_ONCE(idev->cnf.dad_transmits) *
1357 max(NEIGH_VAR(idev->nd_parms, RETRANS_TIME), HZ/100) / HZ;
1362 struct inet6_dev *idev = ifp->idev;
1374 write_lock_bh(&idev->lock);
1377 in6_dev_hold(idev);
1378 if (READ_ONCE(idev->cnf.use_tempaddr) <= 0) {
1379 write_unlock_bh(&idev->lock);
1381 in6_dev_put(idev);
1386 if (ifp->regen_count++ >= READ_ONCE(idev->cnf.regen_max_retry)) {
1387 WRITE_ONCE(idev->cnf.use_tempaddr, -1); /*XXX*/
1389 write_unlock_bh(&idev->lock);
1392 in6_dev_put(idev);
1402 regen_advance = ipv6_get_regen_advance(idev);
1405 * idev->desync_factor if it's larger
1407 cnf_temp_preferred_lft = READ_ONCE(idev->cnf.temp_prefered_lft);
1409 READ_ONCE(idev->cnf.max_desync_factor),
1412 if (unlikely(idev->desync_factor > max_desync_factor)) {
1414 get_random_bytes(&idev->desync_factor,
1415 sizeof(idev->desync_factor));
1416 idev->desync_factor %= max_desync_factor;
1418 idev->desync_factor = 0;
1426 READ_ONCE(idev->cnf.temp_valid_lft) + age);
1427 cfg.preferred_lft = cnf_temp_preferred_lft + age - idev->desync_factor;
1435 write_unlock_bh(&idev->lock);
1468 in6_dev_put(idev);
1482 ift = ipv6_add_addr(idev, &cfg, block, NULL);
1485 in6_dev_put(idev);
1487 write_lock_bh(&idev->lock);
1499 in6_dev_put(idev);
1551 const struct inet6_dev *idev)
1554 if (!idev)
1557 !READ_ONCE(idev->cnf.optimistic_dad))
1560 !READ_ONCE(idev->cnf.use_optimistic))
1570 const struct inet6_dev *idev)
1573 if (!idev)
1576 !READ_ONCE(idev->cnf.optimistic_dad))
1649 if (!ipv6_use_optimistic_addr(net, score->ifa->idev))
1667 dst->ifindex == score->ifa->idev->dev->ifindex);
1673 score->ifa->idev->dev->ifindex) == dst->label;
1682 READ_ONCE(score->ifa->idev->cnf.use_tempaddr) >= 2;
1721 struct inet6_dev *idev,
1727 list_for_each_entry_rcu(score->ifa, &idev->addr_list, if_list) {
1749 idev->dev->name);
1798 struct inet6_dev *idev;
1800 idev = __in6_dev_get(dst_dev);
1801 if (idev)
1802 hiscore_idx = __ipv6_dev_get_saddr(net, dst, idev,
1805 idev = __in6_dev_get(master);
1806 if (idev)
1807 hiscore_idx = __ipv6_dev_get_saddr(net, dst, idev,
1819 struct inet6_dev *idev;
1855 idev = __in6_dev_get(dst_dev);
1858 (idev && READ_ONCE(idev->cnf.use_oif_addrs_only))) {
1864 if (idev)
1865 hiscore_idx = __ipv6_dev_get_saddr(net, &dst, idev, scores, hiscore_idx);
1893 idev = __in6_dev_get(dev);
1894 if (!idev)
1896 hiscore_idx = __ipv6_dev_get_saddr(net, &dst, idev, scores, hiscore_idx);
1912 static int __ipv6_get_lladdr(struct inet6_dev *idev, struct in6_addr *addr,
1918 list_for_each_entry_reverse(ifp, &idev->addr_list, if_list) {
1934 struct inet6_dev *idev;
1938 idev = __in6_dev_get(dev);
1939 if (idev) {
1940 read_lock_bh(&idev->lock);
1941 err = __ipv6_get_lladdr(idev, addr, banned_flags);
1942 read_unlock_bh(&idev->lock);
1948 static int ipv6_count_addresses(const struct inet6_dev *idev)
1954 list_for_each_entry_rcu(ifp, &idev->addr_list, if_list)
1994 ndev = ifp->idev->dev;
2035 const struct inet6_dev *idev;
2039 idev = __in6_dev_get(dev);
2040 if (idev) {
2041 list_for_each_entry_rcu(ifa, &idev->addr_list, if_list) {
2056 const struct inet6_dev *idev;
2061 idev = __in6_dev_get(dev);
2062 if (idev) {
2063 list_for_each_entry_rcu(ifa, &idev->addr_list, if_list) {
2100 if (!dev || ifp->idev->dev == dev ||
2165 struct inet6_dev *idev = ifp->idev;
2166 struct net *net = dev_net(idev->dev);
2175 ifp->idev->dev->name, &ifp->addr, eth_hdr(skb)->h_source);
2194 ifp->idev->dev->name);
2200 idev))
2205 max_addresses = READ_ONCE(idev->cnf.max_addresses);
2207 ipv6_count_addresses(idev) >= max_addresses)
2211 ifp->idev->dev->name);
2213 ifp2 = ipv6_add_addr(idev, &cfg, false, NULL);
2249 void addrconf_leave_solict(struct inet6_dev *idev, const struct in6_addr *addr)
2253 if (READ_ONCE(idev->dev->flags) & (IFF_LOOPBACK | IFF_NOARP))
2257 __ipv6_dev_mc_dec(idev, &maddr);
2269 __ipv6_dev_ac_inc(ifp->idev, &addr);
2281 __ipv6_dev_ac_dec(ifp->idev, &addr);
2403 static int ipv6_inherit_eui64(u8 *eui, struct inet6_dev *idev)
2408 read_lock_bh(&idev->lock);
2409 list_for_each_entry_reverse(ifp, &idev->addr_list, if_list) {
2418 read_unlock_bh(&idev->lock);
2557 struct inet6_dev *idev;
2561 idev = ipv6_find_idev(dev);
2562 if (IS_ERR(idev))
2563 return idev;
2565 if (idev->cnf.disable_ipv6)
2572 return idev;
2575 static void delete_tempaddrs(struct inet6_dev *idev,
2580 write_lock_bh(&idev->lock);
2581 list_for_each_entry_safe(ift, tmp, &idev->tempaddr_list, tmp_list) {
2586 write_unlock_bh(&idev->lock);
2588 write_lock_bh(&idev->lock);
2590 write_unlock_bh(&idev->lock);
2593 static void manage_tempaddrs(struct inet6_dev *idev,
2601 read_lock_bh(&idev->lock);
2603 list_for_each_entry(ift, &idev->tempaddr_list, tmp_list) {
2618 max_valid = READ_ONCE(idev->cnf.temp_valid_lft) - age;
2622 max_prefered = READ_ONCE(idev->cnf.temp_prefered_lft) -
2623 idev->desync_factor - age;
2652 if (list_empty(&idev->tempaddr_list) && (valid_lft || prefered_lft))
2655 if (create && READ_ONCE(idev->cnf.use_tempaddr) > 0) {
2659 read_unlock_bh(&idev->lock);
2662 read_unlock_bh(&idev->lock);
2666 static bool is_addr_mode_generate_stable(struct inet6_dev *idev)
2668 return idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_STABLE_PRIVACY ||
2669 idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_RANDOM;
3018 struct inet6_dev *idev;
3032 idev = addrconf_add_dev(dev);
3033 if (IS_ERR(idev)) {
3035 return PTR_ERR(idev);
3050 ifp = ipv6_add_addr(idev, cfg, true, extack);
3070 manage_tempaddrs(idev, ifp, cfg->valid_lft,
3088 struct inet6_dev *idev;
3102 idev = __in6_dev_get_rtnl_net(dev);
3103 if (!idev) {
3108 read_lock_bh(&idev->lock);
3109 list_for_each_entry(ifp, &idev->addr_list, if_list) {
3113 read_unlock_bh(&idev->lock);
3119 delete_tempaddrs(idev, ifp);
3129 read_unlock_bh(&idev->lock);
3187 static void add_addr(struct inet6_dev *idev, const struct in6_addr *addr,
3201 ifp = ipv6_add_addr(idev, &cfg, true, NULL);
3206 rt_genid_bump_ipv6(dev_net(idev->dev));
3213 static void add_v4_addrs(struct inet6_dev *idev)
3217 struct net *net = dev_net(idev->dev);
3224 memcpy(&addr.s6_addr32[3], idev->dev->dev_addr, 4);
3226 if (!(idev->dev->flags & IFF_POINTOPOINT) && idev->dev->type == ARPHRD_SIT) {
3231 if (idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_NONE)
3240 add_addr(idev, &addr, plen, scope, IFAPROT_UNSPEC);
3241 addrconf_prefix_route(&addr, plen, 0, idev->dev, 0, pflags,
3258 if (idev->dev->flags&IFF_POINTOPOINT)
3263 add_addr(idev, &addr, plen, flag,
3265 addrconf_prefix_route(&addr, plen, 0, idev->dev,
3275 struct inet6_dev *idev;
3281 idev = ipv6_find_idev(dev);
3282 if (IS_ERR(idev)) {
3287 add_addr(idev, &in6addr_loopback, 128, IFA_HOST, IFAPROT_KERNEL_LO);
3290 void addrconf_add_linklocal(struct inet6_dev *idev,
3305 if ((READ_ONCE(dev_net(idev->dev)->ipv6.devconf_all->optimistic_dad) ||
3306 READ_ONCE(idev->cnf.optimistic_dad)) &&
3307 !dev_net(idev->dev)->ipv6.devconf_all->forwarding)
3311 ifp = ipv6_add_addr(idev, &cfg, true, NULL);
3313 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, 0, idev->dev,
3339 const struct inet6_dev *idev)
3357 struct net *net = dev_net(idev->dev);
3361 if (idev->cnf.stable_secret.initialized)
3362 secret = idev->cnf.stable_secret.secret;
3374 memcpy(data.hwaddr, idev->dev->perm_addr, idev->dev->addr_len);
3390 if (dad_count > dev_net(idev->dev)->ipv6.sysctl.idgen_retries)
3399 static void ipv6_gen_mode_random_init(struct inet6_dev *idev)
3401 struct ipv6_stable_secret *s = &idev->cnf.stable_secret;
3405 s = &idev->cnf.stable_secret;
3410 static void addrconf_addr_gen(struct inet6_dev *idev, bool prefix_route)
3415 if (netif_is_l3_master(idev->dev))
3419 if (idev->dev->priv_flags & IFF_NO_ADDRCONF)
3424 switch (idev->cnf.addr_gen_mode) {
3426 ipv6_gen_mode_random_init(idev);
3429 if (!ipv6_generate_stable_address(&addr, 0, idev))
3430 addrconf_add_linklocal(idev, &addr,
3433 addrconf_prefix_route(&addr, 64, 0, idev->dev,
3441 if (ipv6_generate_eui64(addr.s6_addr + 8, idev->dev) == 0)
3442 addrconf_add_linklocal(idev, &addr, 0);
3444 addrconf_prefix_route(&addr, 64, 0, idev->dev,
3456 struct inet6_dev *idev;
3472 idev = __in6_dev_get(dev);
3473 if (!IS_ERR_OR_NULL(idev) && dev->flags & IFF_UP &&
3475 ipv6_mc_up(idev);
3479 idev = addrconf_add_dev(dev);
3480 if (IS_ERR(idev))
3485 idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_EUI64)
3486 WRITE_ONCE(idev->cnf.addr_gen_mode,
3489 addrconf_addr_gen(idev, false);
3495 struct inet6_dev *idev;
3505 idev = ipv6_find_idev(dev);
3506 if (IS_ERR(idev)) {
3512 addrconf_addr_gen(idev, false);
3516 add_v4_addrs(idev);
3526 struct inet6_dev *idev;
3530 idev = addrconf_add_dev(dev);
3531 if (IS_ERR(idev))
3540 idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_EUI64)) {
3541 addrconf_addr_gen(idev, true);
3545 add_v4_addrs(idev);
3573 struct inet6_dev *idev,
3583 f6i = addrconf_f6i_alloc(net, idev, &ifp->addr, false,
3599 ifp->rt_priority, idev->dev, 0, 0,
3612 struct inet6_dev *idev;
3614 idev = __in6_dev_get(dev);
3615 if (!idev)
3618 write_lock_bh(&idev->lock);
3620 list_for_each_entry_safe(ifp, tmp, &idev->addr_list, if_list) {
3622 fixup_permanent_addr(net, idev, ifp) < 0) {
3623 write_unlock_bh(&idev->lock);
3626 write_lock_bh(&idev->lock);
3629 idev->dev->name, &ifp->addr);
3633 write_unlock_bh(&idev->lock);
3642 struct inet6_dev *idev = __in6_dev_get(dev);
3649 if (!idev && dev->mtu >= IPV6_MIN_MTU) {
3650 idev = ipv6_add_dev(dev);
3651 if (IS_ERR(idev))
3652 return notifier_from_errno(PTR_ERR(idev));
3663 if (idev) {
3665 WRITE_ONCE(idev->cnf.mtu6, dev->mtu);
3669 /* allocate new idev */
3670 idev = ipv6_add_dev(dev);
3671 if (IS_ERR(idev))
3675 if (!(idev->if_flags & IF_READY))
3682 if (idev && idev->cnf.disable_ipv6)
3686 if (event == NETDEV_UP && !IS_ERR_OR_NULL(idev) &&
3688 ipv6_mc_up(idev);
3703 if (!idev && dev->mtu >= IPV6_MIN_MTU)
3704 idev = ipv6_add_dev(dev);
3706 if (!IS_ERR_OR_NULL(idev)) {
3707 idev->if_flags |= IF_READY;
3717 if (!IS_ERR_OR_NULL(idev)) {
3718 if (idev->if_flags & IF_READY) {
3724 ipv6_mc_up(idev);
3727 addrconf_dad_run(idev, true);
3731 idev->if_flags |= IF_READY;
3742 if (!IS_ERR_OR_NULL(idev)) {
3744 addrconf_dad_run(idev, false);
3752 * reflected in the idev as well as routers.
3754 if (idev->cnf.mtu6 != dev->mtu &&
3757 WRITE_ONCE(idev->cnf.mtu6, dev->mtu);
3759 WRITE_ONCE(idev->tstamp, jiffies);
3760 inet6_ifinfo_notify(RTM_NEWLINK, idev);
3780 if (idev) {
3781 snmp6_unregister_dev(idev);
3782 addrconf_sysctl_unregister(idev);
3783 err = addrconf_sysctl_register(idev);
3786 err = snmp6_register_dev(idev);
3788 addrconf_sysctl_unregister(idev);
3796 if (idev)
3823 struct inet6_dev *idev;
3826 idev = __in6_dev_get(dev);
3829 ipv6_mc_remap(idev);
3831 ipv6_mc_unmap(idev);
3844 struct inet6_dev *idev;
3855 idev = __in6_dev_get(dev);
3856 if (!idev)
3864 WRITE_ONCE(idev->dead, 1);
3870 snmp6_unregister_dev(idev);
3877 if (!unregister && !idev->cnf.disable_ipv6) {
3882 _keep_addr = READ_ONCE(idev->cnf.keep_addr_on_down);
3894 if (ifa->idev == idev) {
3910 write_lock_bh(&idev->lock);
3912 addrconf_del_rs_timer(idev);
3917 was_ready = idev->if_flags & IF_READY;
3919 idev->if_flags &= ~(IF_RS_SENT|IF_RA_RCVD|IF_READY);
3922 while (!list_empty(&idev->tempaddr_list)) {
3923 ifa = list_first_entry(&idev->tempaddr_list,
3926 write_unlock_bh(&idev->lock);
3935 write_lock_bh(&idev->lock);
3938 list_for_each_entry(ifa, &idev->addr_list, if_list)
3940 write_unlock_bh(&idev->lock);
3980 if (idev->cnf.forwarding)
3982 addrconf_leave_solict(ifa->idev, &ifa->addr);
3986 write_lock_bh(&idev->lock);
3988 write_unlock_bh(&idev->lock);
3995 ipv6_ac_destroy_dev(idev);
3996 ipv6_mc_destroy_dev(idev);
3998 ipv6_mc_down(idev);
4001 WRITE_ONCE(idev->tstamp, jiffies);
4002 idev->ra_mtu = 0;
4006 addrconf_sysctl_unregister(idev);
4007 neigh_parms_release(&nd_tbl, idev->nd_parms);
4009 in6_dev_put(idev);
4016 struct inet6_dev *idev = timer_container_of(idev, t, rs_timer);
4017 struct net_device *dev = idev->dev;
4021 write_lock(&idev->lock);
4022 if (idev->dead || !(idev->if_flags & IF_READY))
4025 if (!ipv6_accept_ra(idev))
4029 if (idev->if_flags & IF_RA_RCVD)
4032 rtr_solicits = READ_ONCE(idev->cnf.rtr_solicits);
4034 if (idev->rs_probes++ < rtr_solicits || rtr_solicits < 0) {
4035 write_unlock(&idev->lock);
4042 write_lock(&idev->lock);
4043 idev->rs_interval = rfc3315_s14_backoff_update(
4044 idev->rs_interval,
4045 READ_ONCE(idev->cnf.rtr_solicit_max_interval));
4047 addrconf_mod_rs_timer(idev, (idev->rs_probes ==
4048 READ_ONCE(idev->cnf.rtr_solicits)) ?
4049 READ_ONCE(idev->cnf.rtr_solicit_delay) :
4050 idev->rs_interval);
4056 pr_debug("%s: no IPv6 routers present\n", idev->dev->name);
4060 write_unlock(&idev->lock);
4062 in6_dev_put(idev);
4070 struct inet6_dev *idev = ifp->idev;
4078 READ_ONCE(idev->cnf.rtr_solicit_delay) ? : 1);
4081 if (READ_ONCE(idev->cnf.enhanced_dad) ||
4082 READ_ONCE(dev_net(idev->dev)->ipv6.devconf_all->enhanced_dad)) {
4088 ifp->dad_probes = READ_ONCE(idev->cnf.dad_transmits);
4094 struct inet6_dev *idev = ifp->idev;
4095 struct net_device *dev = idev->dev;
4101 read_lock_bh(&idev->lock);
4109 READ_ONCE(idev->cnf.accept_dad) < 1) ||
4120 read_unlock_bh(&idev->lock);
4126 if (!(idev->if_flags & IF_READY)) {
4128 read_unlock_bh(&idev->lock);
4145 if (ipv6_use_optimistic_addr(net, idev)) {
4156 read_unlock_bh(&idev->lock);
4181 struct inet6_dev *idev = ifp->idev;
4192 net = dev_net(idev->dev);
4205 READ_ONCE(idev->cnf.accept_dad) > 1) &&
4206 !idev->cnf.disable_ipv6 &&
4213 if (!ipv6_generate_eui64(addr.s6_addr + 8, idev->dev) &&
4216 WRITE_ONCE(idev->cnf.disable_ipv6, 1);
4219 ifp->idev->dev->name);
4233 addrconf_ifdown(idev->dev, false);
4240 write_lock_bh(&idev->lock);
4241 if (idev->dead || !(idev->if_flags & IF_READY)) {
4242 write_unlock_bh(&idev->lock);
4249 write_unlock_bh(&idev->lock);
4266 write_unlock_bh(&idev->lock);
4275 max(NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME),
4278 write_unlock_bh(&idev->lock);
4282 ndisc_send_ns(ifp->idev->dev, &ifp->addr, &mcaddr, &in6addr_any,
4289 /* ifp->idev must be at least read locked */
4293 struct inet6_dev *idev = ifp->idev;
4295 list_for_each_entry_reverse(ifpiter, &idev->addr_list, if_list) {
4310 struct net_device *dev = ifp->idev->dev;
4326 read_lock_bh(&ifp->idev->lock);
4329 ipv6_accept_ra(ifp->idev) &&
4330 READ_ONCE(ifp->idev->cnf.rtr_solicits) != 0 &&
4334 read_unlock_bh(&ifp->idev->lock);
4340 ipv6_mc_dad_complete(ifp->idev);
4344 (READ_ONCE(ifp->idev->cnf.ndisc_notify) ||
4347 /*router=*/ !!ifp->idev->cnf.forwarding,
4362 write_lock_bh(&ifp->idev->lock);
4364 ifp->idev->rs_interval = rfc3315_s14_backoff_init(
4365 READ_ONCE(ifp->idev->cnf.rtr_solicit_interval));
4366 ifp->idev->rs_probes = 1;
4367 ifp->idev->if_flags |= IF_RS_SENT;
4368 addrconf_mod_rs_timer(ifp->idev, ifp->idev->rs_interval);
4370 write_unlock_bh(&ifp->idev->lock);
4383 static void addrconf_dad_run(struct inet6_dev *idev, bool restart)
4387 read_lock_bh(&idev->lock);
4388 list_for_each_entry(ifp, &idev->addr_list, if_list) {
4398 read_unlock_bh(&idev->lock);
4488 ifp->idev->dev->ifindex,
4492 ifp->idev->dev->name);
4645 unsigned long regen_advance = ipv6_get_regen_advance(ifp->idev);
4817 ifp->idev->dev, 0, RTF_DEFAULT, true);
4824 ip6_del_rt(dev_net(ifp->idev->dev), f6i, false);
4829 ifp->rt_priority, ifp->idev->dev,
4908 ifp->rt_priority, ifp->idev->dev,
4917 ifp->rt_priority, ifp->idev->dev,
4924 write_lock_bh(&ifp->idev->lock);
4926 write_unlock_bh(&ifp->idev->lock);
4936 delete_tempaddrs(ifp->idev, ifp);
4938 manage_tempaddrs(ifp->idev, ifp, cfg->valid_lft,
4957 struct inet6_dev *idev;
5037 idev = ipv6_find_idev(dev);
5038 if (IS_ERR(idev)) {
5039 err = PTR_ERR(idev);
5043 if (!ipv6_allow_optimistic_dad(net, idev))
5145 ifa->idev->dev->ifindex);
5211 int ifindex = ifmca->idev->dev->ifindex;
5278 static int in6_dump_addrs(const struct inet6_dev *idev, struct sk_buff *skb,
5293 list_for_each_entry_rcu(ifa, &idev->addr_list, if_list) {
5309 for (ifmca = rcu_dereference(idev->mc_list);
5322 for (ifaca = rcu_dereference(idev->ac_list); ifaca;
5412 struct inet6_dev *idev;
5429 idev = __in6_dev_get(dev);
5430 if (idev)
5431 err = in6_dump_addrs(idev, skb, cb,
5440 idev = __in6_dev_get(dev);
5441 if (!idev)
5443 err = in6_dump_addrs(idev, skb, cb, &ctx->ip_idx,
5599 struct net *net = dev_net(ifa->idev->dev);
5781 static void snmp6_fill_stats(u64 *stats, struct inet6_dev *idev, int attrtype,
5786 __snmp6_fill_stats64(stats, idev->stats.ipv6, bytes,
5790 __snmp6_fill_statsdev(stats, idev->stats.icmpv6dev->mibs, bytes);
5796 struct inet6_dev *idev)
5803 snmp6_fill_stats(nla_data(nla), idev, IFLA_INET6_STATS, nla_len(nla));
5808 snmp6_fill_stats(nla_data(nla), idev, IFLA_INET6_ICMP6STATS, nla_len(nla));
5816 static int inet6_fill_ifla6_attrs(struct sk_buff *skb, struct inet6_dev *idev,
5823 if (nla_put_u32(skb, IFLA_INET6_FLAGS, READ_ONCE(idev->if_flags)))
5826 ci.tstamp = cstamp_delta(READ_ONCE(idev->tstamp));
5827 ci.reachable_time = jiffies_to_msecs(idev->nd_parms->reachable_time);
5828 ci.retrans_time = jiffies_to_msecs(NEIGH_VAR(idev->nd_parms, RETRANS_TIME));
5834 ipv6_store_devconf(&idev->cnf, nla_data(nla), nla_len(nla));
5839 if (inet6_fill_ifla6_stats_attrs(skb, idev) < 0)
5846 read_lock_bh(&idev->lock);
5847 memcpy(nla_data(nla), idev->token.s6_addr, nla_len(nla));
5848 read_unlock_bh(&idev->lock);
5851 READ_ONCE(idev->cnf.addr_gen_mode)))
5854 ra_mtu = READ_ONCE(idev->ra_mtu);
5876 struct inet6_dev *idev = __in6_dev_get(dev);
5878 if (!idev)
5881 if (inet6_fill_ifla6_attrs(skb, idev, ext_filter_mask) < 0)
5887 static int inet6_set_iftoken(struct inet6_dev *idev, struct in6_addr *token,
5891 struct net_device *dev = idev->dev;
5911 if (!ipv6_accept_ra(idev)) {
5917 if (READ_ONCE(idev->cnf.rtr_solicits) == 0) {
5923 write_lock_bh(&idev->lock);
5926 memcpy(idev->token.s6_addr + 8, token->s6_addr + 8, 8);
5928 write_unlock_bh(&idev->lock);
5934 if (!idev->dead && (idev->if_flags & IF_READY) &&
5945 write_lock_bh(&idev->lock);
5948 idev->if_flags |= IF_RS_SENT;
5949 idev->rs_interval = rfc3315_s14_backoff_init(
5950 READ_ONCE(idev->cnf.rtr_solicit_interval));
5951 idev->rs_probes = 1;
5952 addrconf_mod_rs_timer(idev, idev->rs_interval);
5956 list_for_each_entry(ifp, &idev->addr_list, if_list) {
5965 write_unlock_bh(&idev->lock);
5966 inet6_ifinfo_notify(RTM_NEWLINK, idev);
5989 static int check_stable_privacy(struct inet6_dev *idev, struct net *net,
5993 !idev->cnf.stable_secret.initialized &&
6004 struct inet6_dev *idev = NULL;
6008 idev = __in6_dev_get(dev);
6009 if (!idev)
6026 if (dev && check_stable_privacy(idev, dev_net(dev), mode) < 0)
6036 struct inet6_dev *idev = __in6_dev_get(dev);
6040 if (!idev)
6047 err = inet6_set_iftoken(idev, nla_data(tb[IFLA_INET6_TOKEN]),
6056 WRITE_ONCE(idev->cnf.addr_gen_mode, mode);
6062 static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev,
6065 struct net_device *dev = idev->dev;
6098 if (inet6_fill_ifla6_attrs(skb, idev, 0) < 0)
6142 struct inet6_dev *idev;
6158 idev = __in6_dev_get(dev);
6159 if (!idev)
6161 err = inet6_fill_ifinfo(skb, idev,
6173 void inet6_ifinfo_notify(int event, struct inet6_dev *idev)
6176 struct net *net = dev_net(idev->dev);
6183 err = inet6_fill_ifinfo(skb, idev, 0, 0, event, 0);
6203 static int inet6_fill_prefix(struct sk_buff *skb, struct inet6_dev *idev,
6219 pmsg->prefix_ifindex = idev->dev->ifindex;
6239 static void inet6_prefix_notify(int event, struct inet6_dev *idev,
6243 struct net *net = dev_net(idev->dev);
6250 err = inet6_fill_prefix(skb, idev, pinfo, 0, 0, event, 0);
6265 struct net *net = dev_net(ifp->idev->dev);
6284 } else if (!ifp->rt && (ifp->idev->dev->flags & IFF_UP)) {
6286 &ifp->addr, ifp->idev->dev->name);
6289 if (ifp->idev->cnf.forwarding)
6293 ifp->rt_priority, ifp->idev->dev,
6297 if (ifp->idev->cnf.forwarding)
6299 addrconf_leave_solict(ifp->idev, &ifp->addr);
6304 ifp->idev->dev, 0, 0,
6321 if (likely(ifp->idev->dead == 0))
6337 * ctl->data points to idev->cnf.forwarding, we should
6355 struct inet6_dev *idev = ctl->extra1;
6361 lctl.extra2 = idev ? &idev->dev->mtu : NULL;
6366 static void dev_disable_change(struct inet6_dev *idev)
6370 if (!idev || !idev->dev)
6373 netdev_notifier_info_init(&info, idev->dev);
6374 if (idev->cnf.disable_ipv6)
6383 struct inet6_dev *idev;
6386 idev = __in6_dev_get_rtnl_net(dev);
6387 if (idev) {
6388 int changed = (!idev->cnf.disable_ipv6) ^ (!newf);
6390 WRITE_ONCE(idev->cnf.disable_ipv6, newf);
6392 dev_disable_change(idev);
6434 * ctl->data points to idev->cnf.disable_ipv6, we should
6477 struct inet6_dev *idev = ctl->extra1;
6481 idev->dev->ifindex,
6482 &idev->cnf);
6496 struct inet6_dev *idev = (struct inet6_dev *)ctl->extra1;
6519 if (idev) {
6520 if (check_stable_privacy(idev, net, new_val) < 0) {
6525 if (idev->cnf.addr_gen_mode != new_val) {
6526 WRITE_ONCE(idev->cnf.addr_gen_mode, new_val);
6527 netdev_lock_ops(idev->dev);
6528 addrconf_init_auto_addrs(idev->dev);
6529 netdev_unlock_ops(idev->dev);
6536 idev = __in6_dev_get_rtnl_net(dev);
6537 if (idev &&
6538 idev->cnf.addr_gen_mode != new_val) {
6539 WRITE_ONCE(idev->cnf.addr_gen_mode,
6541 netdev_lock_ops(idev->dev);
6542 addrconf_init_auto_addrs(idev->dev);
6543 netdev_unlock_ops(idev->dev);
6604 struct inet6_dev *idev = __in6_dev_get_rtnl_net(dev);
6606 if (idev) {
6607 WRITE_ONCE(idev->cnf.addr_gen_mode,
6612 struct inet6_dev *idev = ctl->extra1;
6614 WRITE_ONCE(idev->cnf.addr_gen_mode,
6636 /* ctl->data points to idev->cnf.ignore_routes_when_linkdown
6663 void addrconf_disable_policy_idev(struct inet6_dev *idev, int val)
6667 read_lock_bh(&idev->lock);
6668 list_for_each_entry(ifa, &idev->addr_list, if_list) {
6689 read_unlock_bh(&idev->lock);
6696 struct inet6_dev *idev;
6712 idev = __in6_dev_get_rtnl_net(dev);
6713 if (idev)
6714 addrconf_disable_policy_idev(idev, val);
6717 idev = (struct inet6_dev *)ctl->extra1;
6718 addrconf_disable_policy_idev(idev, val);
6750 struct inet6_dev *idev;
6753 idev = __in6_dev_get_rtnl_net(dev);
6754 if (idev) {
6755 int changed = (!idev->cnf.force_forwarding) ^ (!newf);
6757 WRITE_ONCE(idev->cnf.force_forwarding, newf);
6761 dev->ifindex, &idev->cnf);
6769 struct inet6_dev *idev = ctl->extra1;
6805 idev->dev->ifindex,
6806 &idev->cnf);
7296 struct inet6_dev *idev, struct ipv6_devconf *p)
7314 table[i].extra1 = idev; /* embedded; no ref */
7331 ifindex = idev->dev->ifindex;
7358 static int addrconf_sysctl_register(struct inet6_dev *idev)
7362 if (!sysctl_dev_name_is_allowed(idev->dev->name))
7365 err = neigh_sysctl_register(idev->dev, idev->nd_parms,
7369 err = __addrconf_sysctl_register(dev_net(idev->dev), idev->dev->name,
7370 idev, &idev->cnf);
7372 neigh_sysctl_unregister(idev->nd_parms);
7377 static void addrconf_sysctl_unregister(struct inet6_dev *idev)
7379 __addrconf_sysctl_unregister(dev_net(idev->dev), &idev->cnf,
7380 idev->dev->ifindex);
7381 neigh_sysctl_unregister(idev->nd_parms);
7533 struct inet6_dev *idev;
7555 idev = ipv6_add_dev(blackhole_netdev);
7557 if (IS_ERR(idev)) {
7558 err = PTR_ERR(idev);