Lines Matching defs: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,
308 static void addrconf_del_rs_timer(struct inet6_dev *idev)
310 if (del_timer(&idev->rs_timer))
311 __in6_dev_put(idev);
320 static void addrconf_mod_rs_timer(struct inet6_dev *idev,
323 if (!mod_timer(&idev->rs_timer, jiffies + when))
324 in6_dev_hold(idev);
335 static int snmp6_alloc_dev(struct inet6_dev *idev)
339 idev->stats.ipv6 = alloc_percpu_gfp(struct ipstats_mib, GFP_KERNEL_ACCOUNT);
340 if (!idev->stats.ipv6)
345 addrconf_stats = per_cpu_ptr(idev->stats.ipv6, i);
350 idev->stats.icmpv6dev = kzalloc(sizeof(struct icmpv6_mib_device),
352 if (!idev->stats.icmpv6dev)
354 idev->stats.icmpv6msgdev = kzalloc(sizeof(struct icmpv6msg_mib_device),
356 if (!idev->stats.icmpv6msgdev)
362 kfree(idev->stats.icmpv6dev);
364 free_percpu(idev->stats.ipv6);
483 struct inet6_dev *idev;
487 idev = __in6_dev_get(dev);
488 if (!idev) {
489 idev = ipv6_add_dev(dev);
490 if (IS_ERR(idev))
491 return idev;
495 ipv6_mc_up(idev);
496 return idev;
733 struct inet6_dev *idev;
762 idev = __in6_dev_get(dev);
763 if (!idev)
767 &idev->cnf,
812 static void dev_forward_change(struct inet6_dev *idev)
818 if (!idev)
820 dev = idev->dev;
821 if (idev->cnf.forwarding)
824 if (idev->cnf.forwarding) {
835 read_lock_bh(&idev->lock);
836 list_for_each_entry(ifa, &idev->addr_list, if_list) {
841 read_unlock_bh(&idev->lock);
847 if (idev->cnf.forwarding)
855 dev->ifindex, &idev->cnf);
862 struct inet6_dev *idev;
865 idev = __in6_dev_get(dev);
866 if (idev) {
867 int changed = (!idev->cnf.forwarding) ^ (!newf);
868 idev->cnf.forwarding = newf;
870 dev_forward_change(idev);
925 struct inet6_dev *idev;
928 idev = __in6_dev_get(dev);
929 if (idev) {
930 int changed = (!idev->cnf.ignore_routes_with_linkdown) ^ (!newf);
932 idev->cnf.ignore_routes_with_linkdown = newf;
938 &idev->cnf);
992 in6_dev_put(ifp->idev);
1007 ipv6_link_dev_addr(struct inet6_dev *idev, struct inet6_ifaddr *ifp)
1016 list_for_each(p, &idev->addr_list) {
1040 if (!dev || ifp->idev->dev == dev)
1071 ipv6_add_addr(struct inet6_dev *idev, struct ifa6_config *cfg,
1076 struct net *net = dev_net(idev->dev);
1088 } else if (!(idev->dev->flags & IFF_LOOPBACK) &&
1089 !netif_is_l3_master(idev->dev) &&
1095 if (idev->dead) {
1101 if (idev->cnf.disable_ipv6) {
1113 .i6vi_dev = idev,
1129 f6i = addrconf_f6i_alloc(net, idev, cfg->pfx, false, gfp_flags, extack);
1136 neigh_parms_data_state_setall(idev->nd_parms);
1160 ifa->idev = idev;
1161 in6_dev_hold(idev);
1168 err = ipv6_add_addr_hash(idev->dev, ifa);
1174 write_lock_bh(&idev->lock);
1177 ipv6_link_dev_addr(idev, ifa);
1180 list_add(&ifa->tmp_list, &idev->tempaddr_list);
1185 write_unlock_bh(&idev->lock);
1195 if (ifa->idev)
1196 in6_dev_put(ifa->idev);
1233 struct inet6_dev *idev = ifp->idev;
1239 list_for_each_entry(ifa, &idev->addr_list, if_list) {
1275 ifp->idev->dev, 0, RTF_DEFAULT, true);
1278 ip6_del_rt(dev_net(ifp->idev->dev), f6i, false);
1293 struct net *net = dev_net(ifp->idev->dev);
1311 write_lock_bh(&ifp->idev->lock);
1328 write_unlock_bh(&ifp->idev->lock);
1349 struct inet6_dev *idev = ifp->idev;
1360 write_lock_bh(&idev->lock);
1363 in6_dev_hold(idev);
1364 if (idev->cnf.use_tempaddr <= 0) {
1365 write_unlock_bh(&idev->lock);
1367 in6_dev_put(idev);
1372 if (ifp->regen_count++ >= idev->cnf.regen_max_retry) {
1373 idev->cnf.use_tempaddr = -1; /*XXX*/
1375 write_unlock_bh(&idev->lock);
1378 in6_dev_put(idev);
1388 regen_advance = idev->cnf.regen_max_retry *
1389 idev->cnf.dad_transmits *
1390 max(NEIGH_VAR(idev->nd_parms, RETRANS_TIME), HZ/100) / HZ;
1393 * idev->desync_factor if it's larger
1395 cnf_temp_preferred_lft = READ_ONCE(idev->cnf.temp_prefered_lft);
1397 idev->cnf.max_desync_factor,
1400 if (unlikely(idev->desync_factor > max_desync_factor)) {
1402 get_random_bytes(&idev->desync_factor,
1403 sizeof(idev->desync_factor));
1404 idev->desync_factor %= max_desync_factor;
1406 idev->desync_factor = 0;
1412 idev->cnf.temp_valid_lft + age);
1413 cfg.preferred_lft = cnf_temp_preferred_lft + age - idev->desync_factor;
1420 write_unlock_bh(&idev->lock);
1432 in6_dev_put(idev);
1445 ift = ipv6_add_addr(idev, &cfg, block, NULL);
1448 in6_dev_put(idev);
1450 write_lock_bh(&idev->lock);
1462 in6_dev_put(idev);
1514 struct inet6_dev *idev)
1517 if (!idev)
1519 if (!net->ipv6.devconf_all->optimistic_dad && !idev->cnf.optimistic_dad)
1521 if (!net->ipv6.devconf_all->use_optimistic && !idev->cnf.use_optimistic)
1531 struct inet6_dev *idev)
1534 if (!idev)
1536 if (!net->ipv6.devconf_all->optimistic_dad && !idev->cnf.optimistic_dad)
1609 if (!ipv6_use_optimistic_addr(net, score->ifa->idev))
1627 dst->ifindex == score->ifa->idev->dev->ifindex);
1633 score->ifa->idev->dev->ifindex) == dst->label;
1642 score->ifa->idev->cnf.use_tempaddr >= 2;
1681 struct inet6_dev *idev,
1687 list_for_each_entry_rcu(score->ifa, &idev->addr_list, if_list) {
1709 idev->dev->name);
1758 struct inet6_dev *idev;
1760 idev = __in6_dev_get(dst_dev);
1761 if (idev)
1762 hiscore_idx = __ipv6_dev_get_saddr(net, dst, idev,
1765 idev = __in6_dev_get(master);
1766 if (idev)
1767 hiscore_idx = __ipv6_dev_get_saddr(net, dst, idev,
1779 struct inet6_dev *idev;
1815 idev = __in6_dev_get(dst_dev);
1818 (idev && idev->cnf.use_oif_addrs_only)) {
1824 if (idev)
1825 hiscore_idx = __ipv6_dev_get_saddr(net, &dst, idev, scores, hiscore_idx);
1852 idev = __in6_dev_get(dev);
1853 if (!idev)
1855 hiscore_idx = __ipv6_dev_get_saddr(net, &dst, idev, scores, hiscore_idx);
1871 static int __ipv6_get_lladdr(struct inet6_dev *idev, struct in6_addr *addr,
1877 list_for_each_entry_reverse(ifp, &idev->addr_list, if_list) {
1893 struct inet6_dev *idev;
1897 idev = __in6_dev_get(dev);
1898 if (idev) {
1899 read_lock_bh(&idev->lock);
1900 err = __ipv6_get_lladdr(idev, addr, banned_flags);
1901 read_unlock_bh(&idev->lock);
1907 static int ipv6_count_addresses(const struct inet6_dev *idev)
1913 list_for_each_entry_rcu(ifp, &idev->addr_list, if_list)
1953 ndev = ifp->idev->dev;
1994 const struct inet6_dev *idev;
1998 idev = __in6_dev_get(dev);
1999 if (idev) {
2000 list_for_each_entry_rcu(ifa, &idev->addr_list, if_list) {
2015 const struct inet6_dev *idev;
2020 idev = __in6_dev_get(dev);
2021 if (idev) {
2022 list_for_each_entry_rcu(ifa, &idev->addr_list, if_list) {
2059 if (!dev || ifp->idev->dev == dev ||
2123 struct inet6_dev *idev = ifp->idev;
2124 struct net *net = dev_net(idev->dev);
2132 ifp->idev->dev->name, &ifp->addr, eth_hdr(skb)->h_source);
2151 ifp->idev->dev->name);
2157 idev))
2162 if (idev->cnf.max_addresses &&
2163 ipv6_count_addresses(idev) >=
2164 idev->cnf.max_addresses)
2168 ifp->idev->dev->name);
2170 ifp2 = ipv6_add_addr(idev, &cfg, false, NULL);
2208 void addrconf_leave_solict(struct inet6_dev *idev, const struct in6_addr *addr)
2212 if (idev->dev->flags&(IFF_LOOPBACK|IFF_NOARP))
2216 __ipv6_dev_mc_dec(idev, &maddr);
2229 __ipv6_dev_ac_inc(ifp->idev, &addr);
2242 __ipv6_dev_ac_dec(ifp->idev, &addr);
2364 static int ipv6_inherit_eui64(u8 *eui, struct inet6_dev *idev)
2369 read_lock_bh(&idev->lock);
2370 list_for_each_entry_reverse(ifp, &idev->addr_list, if_list) {
2379 read_unlock_bh(&idev->lock);
2518 struct inet6_dev *idev;
2522 idev = ipv6_find_idev(dev);
2523 if (IS_ERR(idev))
2524 return idev;
2526 if (idev->cnf.disable_ipv6)
2533 return idev;
2536 static void manage_tempaddrs(struct inet6_dev *idev,
2544 read_lock_bh(&idev->lock);
2546 list_for_each_entry(ift, &idev->tempaddr_list, tmp_list) {
2561 max_valid = idev->cnf.temp_valid_lft - age;
2565 max_prefered = idev->cnf.temp_prefered_lft -
2566 idev->desync_factor - age;
2595 if (list_empty(&idev->tempaddr_list) && (valid_lft || prefered_lft))
2598 if (create && idev->cnf.use_tempaddr > 0) {
2602 read_unlock_bh(&idev->lock);
2605 read_unlock_bh(&idev->lock);
2609 static bool is_addr_mode_generate_stable(struct inet6_dev *idev)
2611 return idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_STABLE_PRIVACY ||
2612 idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_RANDOM;
2948 struct inet6_dev *idev;
2976 idev = addrconf_add_dev(dev);
2977 if (IS_ERR(idev)) {
2979 return PTR_ERR(idev);
3012 ifp = ipv6_add_addr(idev, cfg, true, extack);
3032 manage_tempaddrs(idev, ifp, cfg->valid_lft,
3050 struct inet6_dev *idev;
3064 idev = __in6_dev_get(dev);
3065 if (!idev) {
3070 read_lock_bh(&idev->lock);
3071 list_for_each_entry(ifp, &idev->addr_list, if_list) {
3075 read_unlock_bh(&idev->lock);
3079 manage_tempaddrs(idev, ifp, 0, 0, false,
3090 read_unlock_bh(&idev->lock);
3140 static void add_addr(struct inet6_dev *idev, const struct in6_addr *addr,
3154 ifp = ipv6_add_addr(idev, &cfg, true, NULL);
3159 rt_genid_bump_ipv6(dev_net(idev->dev));
3166 static void add_v4_addrs(struct inet6_dev *idev)
3170 struct net *net = dev_net(idev->dev);
3178 if (idev->dev->addr_len == sizeof(struct in6_addr))
3180 memcpy(&addr.s6_addr32[3], idev->dev->dev_addr + offset, 4);
3182 if (!(idev->dev->flags & IFF_POINTOPOINT) && idev->dev->type == ARPHRD_SIT) {
3187 if (idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_NONE)
3196 add_addr(idev, &addr, plen, scope, IFAPROT_UNSPEC);
3197 addrconf_prefix_route(&addr, plen, 0, idev->dev, 0, pflags,
3214 if (idev->dev->flags&IFF_POINTOPOINT)
3219 add_addr(idev, &addr, plen, flag,
3221 addrconf_prefix_route(&addr, plen, 0, idev->dev,
3231 struct inet6_dev *idev;
3237 idev = ipv6_find_idev(dev);
3238 if (IS_ERR(idev)) {
3243 add_addr(idev, &in6addr_loopback, 128, IFA_HOST, IFAPROT_KERNEL_LO);
3246 void addrconf_add_linklocal(struct inet6_dev *idev,
3261 if ((dev_net(idev->dev)->ipv6.devconf_all->optimistic_dad ||
3262 idev->cnf.optimistic_dad) &&
3263 !dev_net(idev->dev)->ipv6.devconf_all->forwarding)
3267 ifp = ipv6_add_addr(idev, &cfg, true, NULL);
3269 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, 0, idev->dev,
3295 const struct inet6_dev *idev)
3313 struct net *net = dev_net(idev->dev);
3317 if (idev->cnf.stable_secret.initialized)
3318 secret = idev->cnf.stable_secret.secret;
3330 memcpy(data.hwaddr, idev->dev->perm_addr, idev->dev->addr_len);
3346 if (dad_count > dev_net(idev->dev)->ipv6.sysctl.idgen_retries)
3355 static void ipv6_gen_mode_random_init(struct inet6_dev *idev)
3357 struct ipv6_stable_secret *s = &idev->cnf.stable_secret;
3361 s = &idev->cnf.stable_secret;
3366 static void addrconf_addr_gen(struct inet6_dev *idev, bool prefix_route)
3371 if (netif_is_l3_master(idev->dev))
3375 if (idev->dev->priv_flags & IFF_NO_ADDRCONF)
3380 switch (idev->cnf.addr_gen_mode) {
3382 ipv6_gen_mode_random_init(idev);
3385 if (!ipv6_generate_stable_address(&addr, 0, idev))
3386 addrconf_add_linklocal(idev, &addr,
3389 addrconf_prefix_route(&addr, 64, 0, idev->dev,
3397 if (ipv6_generate_eui64(addr.s6_addr + 8, idev->dev) == 0)
3398 addrconf_add_linklocal(idev, &addr, 0);
3400 addrconf_prefix_route(&addr, 64, 0, idev->dev,
3412 struct inet6_dev *idev;
3427 idev = __in6_dev_get(dev);
3428 if (!IS_ERR_OR_NULL(idev) && dev->flags & IFF_UP &&
3430 ipv6_mc_up(idev);
3434 idev = addrconf_add_dev(dev);
3435 if (IS_ERR(idev))
3440 idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_EUI64)
3441 idev->cnf.addr_gen_mode = IN6_ADDR_GEN_MODE_RANDOM;
3443 addrconf_addr_gen(idev, false);
3449 struct inet6_dev *idev;
3459 idev = ipv6_find_idev(dev);
3460 if (IS_ERR(idev)) {
3466 addrconf_addr_gen(idev, false);
3470 add_v4_addrs(idev);
3480 struct inet6_dev *idev;
3484 idev = ipv6_find_idev(dev);
3485 if (IS_ERR(idev)) {
3491 addrconf_addr_gen(idev, true);
3495 add_v4_addrs(idev);
3527 struct inet6_dev *idev,
3537 f6i = addrconf_f6i_alloc(net, idev, &ifp->addr, false,
3553 ifp->rt_priority, idev->dev, 0, 0,
3566 struct inet6_dev *idev;
3568 idev = __in6_dev_get(dev);
3569 if (!idev)
3572 write_lock_bh(&idev->lock);
3574 list_for_each_entry_safe(ifp, tmp, &idev->addr_list, if_list) {
3576 fixup_permanent_addr(net, idev, ifp) < 0) {
3577 write_unlock_bh(&idev->lock);
3580 write_lock_bh(&idev->lock);
3583 idev->dev->name, &ifp->addr);
3587 write_unlock_bh(&idev->lock);
3596 struct inet6_dev *idev = __in6_dev_get(dev);
3603 if (!idev && dev->mtu >= IPV6_MIN_MTU) {
3604 idev = ipv6_add_dev(dev);
3605 if (IS_ERR(idev))
3606 return notifier_from_errno(PTR_ERR(idev));
3617 if (idev) {
3619 idev->cnf.mtu6 = dev->mtu;
3623 /* allocate new idev */
3624 idev = ipv6_add_dev(dev);
3625 if (IS_ERR(idev))
3629 if (!(idev->if_flags & IF_READY))
3636 if (idev && idev->cnf.disable_ipv6)
3640 if (event == NETDEV_UP && !IS_ERR_OR_NULL(idev) &&
3642 ipv6_mc_up(idev);
3657 if (!idev && dev->mtu >= IPV6_MIN_MTU)
3658 idev = ipv6_add_dev(dev);
3660 if (!IS_ERR_OR_NULL(idev)) {
3661 idev->if_flags |= IF_READY;
3671 if (!IS_ERR_OR_NULL(idev)) {
3672 if (idev->if_flags & IF_READY) {
3678 ipv6_mc_up(idev);
3681 addrconf_dad_run(idev, true);
3685 idev->if_flags |= IF_READY;
3696 if (!IS_ERR_OR_NULL(idev)) {
3698 addrconf_dad_run(idev, false);
3706 * reflected in the idev as well as routers.
3708 if (idev->cnf.mtu6 != dev->mtu &&
3711 idev->cnf.mtu6 = dev->mtu;
3713 idev->tstamp = jiffies;
3714 inet6_ifinfo_notify(RTM_NEWLINK, idev);
3734 if (idev) {
3735 snmp6_unregister_dev(idev);
3736 addrconf_sysctl_unregister(idev);
3737 err = addrconf_sysctl_register(idev);
3740 err = snmp6_register_dev(idev);
3742 addrconf_sysctl_unregister(idev);
3750 if (idev)
3777 struct inet6_dev *idev;
3780 idev = __in6_dev_get(dev);
3783 ipv6_mc_remap(idev);
3785 ipv6_mc_unmap(idev);
3798 struct inet6_dev *idev;
3809 idev = __in6_dev_get(dev);
3810 if (!idev)
3818 idev->dead = 1;
3824 snmp6_unregister_dev(idev);
3831 if (!unregister && !idev->cnf.disable_ipv6) {
3836 _keep_addr = idev->cnf.keep_addr_on_down;
3848 if (ifa->idev == idev) {
3864 write_lock_bh(&idev->lock);
3866 addrconf_del_rs_timer(idev);
3871 was_ready = idev->if_flags & IF_READY;
3873 idev->if_flags &= ~(IF_RS_SENT|IF_RA_RCVD|IF_READY);
3876 while (!list_empty(&idev->tempaddr_list)) {
3877 ifa = list_first_entry(&idev->tempaddr_list,
3880 write_unlock_bh(&idev->lock);
3889 write_lock_bh(&idev->lock);
3892 list_for_each_entry(ifa, &idev->addr_list, if_list)
3894 write_unlock_bh(&idev->lock);
3934 if (idev->cnf.forwarding)
3936 addrconf_leave_solict(ifa->idev, &ifa->addr);
3940 write_lock_bh(&idev->lock);
3942 write_unlock_bh(&idev->lock);
3949 ipv6_ac_destroy_dev(idev);
3950 ipv6_mc_destroy_dev(idev);
3952 ipv6_mc_down(idev);
3955 idev->tstamp = jiffies;
3956 idev->ra_mtu = 0;
3960 addrconf_sysctl_unregister(idev);
3961 neigh_parms_release(&nd_tbl, idev->nd_parms);
3963 in6_dev_put(idev);
3970 struct inet6_dev *idev = from_timer(idev, t, rs_timer);
3971 struct net_device *dev = idev->dev;
3974 write_lock(&idev->lock);
3975 if (idev->dead || !(idev->if_flags & IF_READY))
3978 if (!ipv6_accept_ra(idev))
3982 if (idev->if_flags & IF_RA_RCVD)
3985 if (idev->rs_probes++ < idev->cnf.rtr_solicits || idev->cnf.rtr_solicits < 0) {
3986 write_unlock(&idev->lock);
3993 write_lock(&idev->lock);
3994 idev->rs_interval = rfc3315_s14_backoff_update(
3995 idev->rs_interval, idev->cnf.rtr_solicit_max_interval);
3997 addrconf_mod_rs_timer(idev, (idev->rs_probes ==
3998 idev->cnf.rtr_solicits) ?
3999 idev->cnf.rtr_solicit_delay :
4000 idev->rs_interval);
4006 pr_debug("%s: no IPv6 routers present\n", idev->dev->name);
4010 write_unlock(&idev->lock);
4012 in6_dev_put(idev);
4021 struct inet6_dev *idev = ifp->idev;
4027 rand_num = get_random_u32_below(idev->cnf.rtr_solicit_delay ? : 1);
4030 if (idev->cnf.enhanced_dad ||
4031 dev_net(idev->dev)->ipv6.devconf_all->enhanced_dad) {
4037 ifp->dad_probes = idev->cnf.dad_transmits;
4043 struct inet6_dev *idev = ifp->idev;
4044 struct net_device *dev = idev->dev;
4050 read_lock_bh(&idev->lock);
4058 idev->cnf.accept_dad < 1) ||
4069 read_unlock_bh(&idev->lock);
4075 if (!(idev->if_flags & IF_READY)) {
4077 read_unlock_bh(&idev->lock);
4094 if (ipv6_use_optimistic_addr(net, idev)) {
4105 read_unlock_bh(&idev->lock);
4130 struct inet6_dev *idev = ifp->idev;
4150 if ((dev_net(idev->dev)->ipv6.devconf_all->accept_dad > 1 ||
4151 idev->cnf.accept_dad > 1) &&
4152 !idev->cnf.disable_ipv6 &&
4159 if (!ipv6_generate_eui64(addr.s6_addr + 8, idev->dev) &&
4162 idev->cnf.disable_ipv6 = 1;
4165 ifp->idev->dev->name);
4179 addrconf_ifdown(idev->dev, false);
4186 write_lock_bh(&idev->lock);
4187 if (idev->dead || !(idev->if_flags & IF_READY)) {
4188 write_unlock_bh(&idev->lock);
4195 write_unlock_bh(&idev->lock);
4212 write_unlock_bh(&idev->lock);
4221 max(NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME),
4224 write_unlock_bh(&idev->lock);
4228 ndisc_send_ns(ifp->idev->dev, &ifp->addr, &mcaddr, &in6addr_any,
4235 /* ifp->idev must be at least read locked */
4239 struct inet6_dev *idev = ifp->idev;
4241 list_for_each_entry_reverse(ifpiter, &idev->addr_list, if_list) {
4256 struct net_device *dev = ifp->idev->dev;
4272 read_lock_bh(&ifp->idev->lock);
4275 ipv6_accept_ra(ifp->idev) &&
4276 ifp->idev->cnf.rtr_solicits != 0 &&
4280 read_unlock_bh(&ifp->idev->lock);
4286 ipv6_mc_dad_complete(ifp->idev);
4290 (ifp->idev->cnf.ndisc_notify ||
4293 /*router=*/ !!ifp->idev->cnf.forwarding,
4308 write_lock_bh(&ifp->idev->lock);
4310 ifp->idev->rs_interval = rfc3315_s14_backoff_init(
4311 ifp->idev->cnf.rtr_solicit_interval);
4312 ifp->idev->rs_probes = 1;
4313 ifp->idev->if_flags |= IF_RS_SENT;
4314 addrconf_mod_rs_timer(ifp->idev, ifp->idev->rs_interval);
4316 write_unlock_bh(&ifp->idev->lock);
4329 static void addrconf_dad_run(struct inet6_dev *idev, bool restart)
4333 read_lock_bh(&idev->lock);
4334 list_for_each_entry(ifp, &idev->addr_list, if_list) {
4344 read_unlock_bh(&idev->lock);
4434 ifp->idev->dev->ifindex,
4438 ifp->idev->dev->name);
4591 unsigned long regen_advance = ifp->idev->cnf.regen_max_retry *
4592 ifp->idev->cnf.dad_transmits *
4593 max(NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME), HZ/100) / HZ;
4760 ifp->idev->dev, 0, RTF_DEFAULT, true);
4767 ip6_del_rt(dev_net(ifp->idev->dev), f6i, false);
4772 ifp->rt_priority, ifp->idev->dev,
4865 ifp->rt_priority, ifp->idev->dev,
4874 ifp->rt_priority, ifp->idev->dev,
4881 write_lock_bh(&ifp->idev->lock);
4883 write_unlock_bh(&ifp->idev->lock);
4897 manage_tempaddrs(ifp->idev, ifp, cfg->valid_lft,
4917 struct inet6_dev *idev;
4968 idev = ipv6_find_idev(dev);
4969 if (IS_ERR(idev))
4970 return PTR_ERR(idev);
4972 if (!ipv6_allow_optimistic_dad(net, idev))
5080 ifa->idev->dev->ifindex);
5145 int ifindex = ifmca->idev->dev->ifindex;
5208 static int in6_dump_addrs(struct inet6_dev *idev, struct sk_buff *skb,
5217 read_lock_bh(&idev->lock);
5224 list_for_each_entry(ifa, &idev->addr_list, if_list) {
5237 read_unlock_bh(&idev->lock);
5241 for (ifmca = rtnl_dereference(idev->mc_list);
5250 read_lock_bh(&idev->lock);
5255 for (ifaca = idev->ac_list; ifaca;
5267 read_unlock_bh(&idev->lock);
5343 struct inet6_dev *idev;
5364 idev = __in6_dev_get(dev);
5365 if (idev) {
5366 err = in6_dump_addrs(idev, skb, cb, s_ip_idx,
5385 idev = __in6_dev_get(dev);
5386 if (!idev)
5389 if (in6_dump_addrs(idev, skb, cb, s_ip_idx,
5549 struct net *net = dev_net(ifa->idev->dev);
5720 static void snmp6_fill_stats(u64 *stats, struct inet6_dev *idev, int attrtype,
5725 __snmp6_fill_stats64(stats, idev->stats.ipv6, bytes,
5729 __snmp6_fill_statsdev(stats, idev->stats.icmpv6dev->mibs, bytes);
5734 static int inet6_fill_ifla6_attrs(struct sk_buff *skb, struct inet6_dev *idev,
5740 if (nla_put_u32(skb, IFLA_INET6_FLAGS, idev->if_flags))
5743 ci.tstamp = cstamp_delta(idev->tstamp);
5744 ci.reachable_time = jiffies_to_msecs(idev->nd_parms->reachable_time);
5745 ci.retrans_time = jiffies_to_msecs(NEIGH_VAR(idev->nd_parms, RETRANS_TIME));
5751 ipv6_store_devconf(&idev->cnf, nla_data(nla), nla_len(nla));
5761 snmp6_fill_stats(nla_data(nla), idev, IFLA_INET6_STATS, nla_len(nla));
5766 snmp6_fill_stats(nla_data(nla), idev, IFLA_INET6_ICMP6STATS, nla_len(nla));
5771 read_lock_bh(&idev->lock);
5772 memcpy(nla_data(nla), idev->token.s6_addr, nla_len(nla));
5773 read_unlock_bh(&idev->lock);
5775 if (nla_put_u8(skb, IFLA_INET6_ADDR_GEN_MODE, idev->cnf.addr_gen_mode))
5778 if (idev->ra_mtu &&
5779 nla_put_u32(skb, IFLA_INET6_RA_MTU, idev->ra_mtu))
5800 struct inet6_dev *idev = __in6_dev_get(dev);
5802 if (!idev)
5805 if (inet6_fill_ifla6_attrs(skb, idev, ext_filter_mask) < 0)
5811 static int inet6_set_iftoken(struct inet6_dev *idev, struct in6_addr *token,
5815 struct net_device *dev = idev->dev;
5835 if (!ipv6_accept_ra(idev)) {
5841 if (idev->cnf.rtr_solicits == 0) {
5847 write_lock_bh(&idev->lock);
5850 memcpy(idev->token.s6_addr + 8, token->s6_addr + 8, 8);
5852 write_unlock_bh(&idev->lock);
5858 if (!idev->dead && (idev->if_flags & IF_READY) &&
5869 write_lock_bh(&idev->lock);
5872 idev->if_flags |= IF_RS_SENT;
5873 idev->rs_interval = rfc3315_s14_backoff_init(
5874 idev->cnf.rtr_solicit_interval);
5875 idev->rs_probes = 1;
5876 addrconf_mod_rs_timer(idev, idev->rs_interval);
5880 list_for_each_entry(ifp, &idev->addr_list, if_list) {
5889 write_unlock_bh(&idev->lock);
5890 inet6_ifinfo_notify(RTM_NEWLINK, idev);
5913 static int check_stable_privacy(struct inet6_dev *idev, struct net *net,
5917 !idev->cnf.stable_secret.initialized &&
5928 struct inet6_dev *idev = NULL;
5932 idev = __in6_dev_get(dev);
5933 if (!idev)
5950 if (dev && check_stable_privacy(idev, dev_net(dev), mode) < 0)
5960 struct inet6_dev *idev = __in6_dev_get(dev);
5964 if (!idev)
5971 err = inet6_set_iftoken(idev, nla_data(tb[IFLA_INET6_TOKEN]),
5980 idev->cnf.addr_gen_mode = mode;
5986 static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev,
5989 struct net_device *dev = idev->dev;
6019 if (inet6_fill_ifla6_attrs(skb, idev, 0) < 0)
6062 struct inet6_dev *idev;
6085 idev = __in6_dev_get(dev);
6086 if (!idev)
6088 if (inet6_fill_ifinfo(skb, idev,
6105 void inet6_ifinfo_notify(int event, struct inet6_dev *idev)
6108 struct net *net = dev_net(idev->dev);
6115 err = inet6_fill_ifinfo(skb, idev, 0, 0, event, 0);
6136 static int inet6_fill_prefix(struct sk_buff *skb, struct inet6_dev *idev,
6152 pmsg->prefix_ifindex = idev->dev->ifindex;
6172 static void inet6_prefix_notify(int event, struct inet6_dev *idev,
6176 struct net *net = dev_net(idev->dev);
6183 err = inet6_fill_prefix(skb, idev, pinfo, 0, 0, event, 0);
6199 struct net *net = dev_net(ifp->idev->dev);
6218 } else if (!ifp->rt && (ifp->idev->dev->flags & IFF_UP)) {
6220 &ifp->addr, ifp->idev->dev->name);
6223 if (ifp->idev->cnf.forwarding)
6227 ifp->rt_priority, ifp->idev->dev,
6231 if (ifp->idev->cnf.forwarding)
6233 addrconf_leave_solict(ifp->idev, &ifp->addr);
6238 ifp->idev->dev, 0, 0,
6255 if (likely(ifp->idev->dead == 0))
6271 * ctl->data points to idev->cnf.forwarding, we should
6289 struct inet6_dev *idev = ctl->extra1;
6295 lctl.extra2 = idev ? &idev->dev->mtu : NULL;
6300 static void dev_disable_change(struct inet6_dev *idev)
6304 if (!idev || !idev->dev)
6307 netdev_notifier_info_init(&info, idev->dev);
6308 if (idev->cnf.disable_ipv6)
6317 struct inet6_dev *idev;
6320 idev = __in6_dev_get(dev);
6321 if (idev) {
6322 int changed = (!idev->cnf.disable_ipv6) ^ (!newf);
6323 idev->cnf.disable_ipv6 = newf;
6325 dev_disable_change(idev);
6367 * ctl->data points to idev->cnf.disable_ipv6, we should
6410 struct inet6_dev *idev = ctl->extra1;
6414 idev->dev->ifindex,
6415 &idev->cnf);
6429 struct inet6_dev *idev = (struct inet6_dev *)ctl->extra1;
6452 if (idev) {
6453 if (check_stable_privacy(idev, net, new_val) < 0) {
6458 if (idev->cnf.addr_gen_mode != new_val) {
6459 idev->cnf.addr_gen_mode = new_val;
6460 addrconf_init_auto_addrs(idev->dev);
6467 idev = __in6_dev_get(dev);
6468 if (idev &&
6469 idev->cnf.addr_gen_mode != new_val) {
6470 idev->cnf.addr_gen_mode = new_val;
6471 addrconf_init_auto_addrs(idev->dev);
6532 struct inet6_dev *idev = __in6_dev_get(dev);
6534 if (idev) {
6535 idev->cnf.addr_gen_mode =
6540 struct inet6_dev *idev = ctl->extra1;
6542 idev->cnf.addr_gen_mode = IN6_ADDR_GEN_MODE_STABLE_PRIVACY;
6563 /* ctl->data points to idev->cnf.ignore_routes_when_linkdown
6590 void addrconf_disable_policy_idev(struct inet6_dev *idev, int val)
6594 read_lock_bh(&idev->lock);
6595 list_for_each_entry(ifa, &idev->addr_list, if_list) {
6616 read_unlock_bh(&idev->lock);
6622 struct inet6_dev *idev;
6640 idev = __in6_dev_get(dev);
6641 if (idev)
6642 addrconf_disable_policy_idev(idev, val);
6645 idev = (struct inet6_dev *)ctl->extra1;
6646 addrconf_disable_policy_idev(idev, val);
7126 struct inet6_dev *idev, struct ipv6_devconf *p)
7143 table[i].extra1 = idev; /* embedded; no ref */
7160 ifindex = idev->dev->ifindex;
7187 static int addrconf_sysctl_register(struct inet6_dev *idev)
7191 if (!sysctl_dev_name_is_allowed(idev->dev->name))
7194 err = neigh_sysctl_register(idev->dev, idev->nd_parms,
7198 err = __addrconf_sysctl_register(dev_net(idev->dev), idev->dev->name,
7199 idev, &idev->cnf);
7201 neigh_sysctl_unregister(idev->nd_parms);
7206 static void addrconf_sysctl_unregister(struct inet6_dev *idev)
7208 __addrconf_sysctl_unregister(dev_net(idev->dev), &idev->cnf,
7209 idev->dev->ifindex);
7210 neigh_sysctl_unregister(idev->nd_parms);
7341 struct inet6_dev *idev;
7362 idev = ipv6_add_dev(blackhole_netdev);
7364 if (IS_ERR(idev)) {
7365 err = PTR_ERR(idev);