Lines Matching refs:ifp

161 static void addrconf_join_anycast(struct inet6_ifaddr *ifp);
162 static void addrconf_leave_anycast(struct inet6_ifaddr *ifp);
174 static void addrconf_dad_start(struct inet6_ifaddr *ifp);
176 static void addrconf_dad_completed(struct inet6_ifaddr *ifp, bool bump_id,
310 static void addrconf_del_dad_work(struct inet6_ifaddr *ifp)
312 if (cancel_delayed_work(&ifp->dad_work))
313 __in6_ifa_put(ifp);
323 static void addrconf_mod_dad_work(struct inet6_ifaddr *ifp,
326 in6_ifa_hold(ifp);
327 if (mod_delayed_work(addrconf_wq, &ifp->dad_work, delay))
328 in6_ifa_put(ifp);
961 void inet6_ifa_finish_destroy(struct inet6_ifaddr *ifp)
963 WARN_ON(!hlist_unhashed(&ifp->addr_lst));
969 in6_dev_put(ifp->idev);
971 if (cancel_delayed_work(&ifp->dad_work))
973 ifp);
975 if (ifp->state != INET6_IFADDR_STATE_DEAD) {
976 pr_warn("Freeing alive inet6 address %p\n", ifp);
980 kfree_rcu(ifp, rcu);
984 ipv6_link_dev_addr(struct inet6_dev *idev, struct inet6_ifaddr *ifp)
987 int ifp_scope = ipv6_addr_src_scope(&ifp->addr);
1000 list_add_tail_rcu(&ifp->if_list, p);
1013 struct inet6_ifaddr *ifp;
1015 hlist_for_each_entry(ifp, &inet6_addr_lst[hash], addr_lst) {
1016 if (!net_eq(dev_net(ifp->idev->dev), net))
1018 if (ipv6_addr_equal(&ifp->addr, addr)) {
1019 if (!dev || ifp->idev->dev == dev)
1046 /* On success it returns ifp with increased reference count */
1181 * Check, whether the prefix for ifp would still need a prefix route
1182 * after deleting ifp. The function returns one of the CLEANUP_PREFIX_RT_*
1199 check_cleanup_prefix_route(struct inet6_ifaddr *ifp, unsigned long *expires)
1202 struct inet6_dev *idev = ifp->idev;
1209 if (ifa == ifp)
1211 if (ifa->prefix_len != ifp->prefix_len ||
1212 !ipv6_prefix_equal(&ifa->addr, &ifp->addr,
1213 ifp->prefix_len))
1237 cleanup_prefix_route(struct inet6_ifaddr *ifp, unsigned long expires,
1242 f6i = addrconf_get_prefix_route(del_peer ? &ifp->peer_addr : &ifp->addr,
1243 ifp->prefix_len,
1244 ifp->idev->dev, 0, RTF_DEFAULT, true);
1247 ip6_del_rt(dev_net(ifp->idev->dev), f6i, false);
1257 /* This function wants to get referenced ifp and releases it before return */
1259 static void ipv6_del_addr(struct inet6_ifaddr *ifp)
1267 spin_lock_bh(&ifp->lock);
1268 state = ifp->state;
1269 ifp->state = INET6_IFADDR_STATE_DEAD;
1270 spin_unlock_bh(&ifp->lock);
1276 hlist_del_init_rcu(&ifp->addr_lst);
1279 write_lock_bh(&ifp->idev->lock);
1281 if (ifp->flags&IFA_F_TEMPORARY) {
1282 list_del(&ifp->tmp_list);
1283 if (ifp->ifpub) {
1284 in6_ifa_put(ifp->ifpub);
1285 ifp->ifpub = NULL;
1287 __in6_ifa_put(ifp);
1290 if (ifp->flags & IFA_F_PERMANENT && !(ifp->flags & IFA_F_NOPREFIXROUTE))
1291 action = check_cleanup_prefix_route(ifp, &expires);
1293 list_del_rcu(&ifp->if_list);
1294 __in6_ifa_put(ifp);
1296 write_unlock_bh(&ifp->idev->lock);
1298 addrconf_del_dad_work(ifp);
1300 ipv6_ifa_notify(RTM_DELADDR, ifp);
1302 inet6addr_notifier_call_chain(NETDEV_DOWN, ifp);
1305 cleanup_prefix_route(ifp, expires,
1310 rt6_remove_prefsrc(ifp);
1312 in6_ifa_put(ifp);
1315 static int ipv6_create_tempaddr(struct inet6_ifaddr *ifp, bool block)
1317 struct inet6_dev *idev = ifp->idev;
1339 spin_lock_bh(&ifp->lock);
1340 if (ifp->regen_count++ >= idev->cnf.regen_max_retry) {
1342 spin_unlock_bh(&ifp->lock);
1350 in6_ifa_hold(ifp);
1351 memcpy(addr.s6_addr, ifp->addr.s6_addr, 8);
1354 age = (now - ifp->tstamp) / HZ;
1379 cfg.valid_lft = min_t(__u32, ifp->valid_lft,
1382 cfg.preferred_lft = min_t(__u32, ifp->prefered_lft, cfg.preferred_lft);
1384 cfg.plen = ifp->prefix_len;
1385 tmp_tstamp = ifp->tstamp;
1386 spin_unlock_bh(&ifp->lock);
1399 in6_ifa_put(ifp);
1407 if (ifp->flags & IFA_F_OPTIMISTIC)
1415 in6_ifa_put(ifp);
1423 ift->ifpub = ifp;
1842 struct inet6_ifaddr *ifp;
1845 list_for_each_entry_reverse(ifp, &idev->addr_list, if_list) {
1846 if (ifp->scope > IFA_LINK)
1848 if (ifp->scope == IFA_LINK &&
1849 !(ifp->flags & banned_flags)) {
1850 *addr = ifp->addr;
1877 const struct inet6_ifaddr *ifp;
1881 list_for_each_entry_rcu(ifp, &idev->addr_list, if_list)
1896 * skip_dev_check is set, then the ifp device is not checked against
1911 struct inet6_ifaddr *ifp;
1920 hlist_for_each_entry_rcu(ifp, &inet6_addr_lst[hash], addr_lst) {
1921 ndev = ifp->idev->dev;
1931 ifp_flags = (ifp->flags&IFA_F_OPTIMISTIC)
1932 ? (ifp->flags&~IFA_F_TENTATIVE)
1933 : ifp->flags;
1934 if (ipv6_addr_equal(&ifp->addr, addr) &&
1937 !(ifp->scope&(IFA_LINK|IFA_HOST) || strict))) {
2023 struct inet6_ifaddr *ifp, *result = NULL;
2026 hlist_for_each_entry_rcu(ifp, &inet6_addr_lst[hash], addr_lst) {
2027 if (!net_eq(dev_net(ifp->idev->dev), net))
2029 if (ipv6_addr_equal(&ifp->addr, addr)) {
2030 if (!dev || ifp->idev->dev == dev ||
2031 !(ifp->scope&(IFA_LINK|IFA_HOST) || strict)) {
2032 if (in6_ifa_hold_safe(ifp)) {
2033 result = ifp;
2046 static void addrconf_dad_stop(struct inet6_ifaddr *ifp, int dad_failed)
2049 ifp->flags |= IFA_F_DADFAILED;
2051 if (ifp->flags&IFA_F_TEMPORARY) {
2053 spin_lock_bh(&ifp->lock);
2054 ifpub = ifp->ifpub;
2057 spin_unlock_bh(&ifp->lock);
2061 spin_unlock_bh(&ifp->lock);
2063 ipv6_del_addr(ifp);
2064 } else if (ifp->flags&IFA_F_PERMANENT || !dad_failed) {
2065 spin_lock_bh(&ifp->lock);
2066 addrconf_del_dad_work(ifp);
2067 ifp->flags |= IFA_F_TENTATIVE;
2069 ifp->flags &= ~IFA_F_OPTIMISTIC;
2070 spin_unlock_bh(&ifp->lock);
2072 ipv6_ifa_notify(0, ifp);
2073 in6_ifa_put(ifp);
2075 ipv6_del_addr(ifp);
2079 static int addrconf_dad_end(struct inet6_ifaddr *ifp)
2083 spin_lock_bh(&ifp->lock);
2084 if (ifp->state == INET6_IFADDR_STATE_DAD) {
2085 ifp->state = INET6_IFADDR_STATE_POSTDAD;
2088 spin_unlock_bh(&ifp->lock);
2093 void addrconf_dad_failure(struct sk_buff *skb, struct inet6_ifaddr *ifp)
2095 struct inet6_dev *idev = ifp->idev;
2096 struct net *net = dev_net(ifp->idev->dev);
2098 if (addrconf_dad_end(ifp)) {
2099 in6_ifa_put(ifp);
2104 ifp->idev->dev->name, &ifp->addr, eth_hdr(skb)->h_source);
2106 spin_lock_bh(&ifp->lock);
2108 if (ifp->flags & IFA_F_STABLE_PRIVACY) {
2111 int retries = ifp->stable_privacy_retry + 1;
2114 .plen = ifp->prefix_len,
2115 .ifa_flags = ifp->flags,
2116 .valid_lft = ifp->valid_lft,
2117 .preferred_lft = ifp->prefered_lft,
2118 .scope = ifp->scope,
2123 ifp->idev->dev->name);
2127 new_addr = ifp->addr;
2132 spin_unlock_bh(&ifp->lock);
2140 ifp->idev->dev->name);
2154 spin_lock_bh(&ifp->lock);
2159 ifp->state = INET6_IFADDR_STATE_ERRDAD;
2160 spin_unlock_bh(&ifp->lock);
2162 addrconf_mod_dad_work(ifp, 0);
2163 in6_ifa_put(ifp);
2192 static void addrconf_join_anycast(struct inet6_ifaddr *ifp)
2196 if (ifp->prefix_len >= 127) /* RFC 6164 */
2198 ipv6_addr_prefix(&addr, &ifp->addr, ifp->prefix_len);
2201 __ipv6_dev_ac_inc(ifp->idev, &addr);
2205 static void addrconf_leave_anycast(struct inet6_ifaddr *ifp)
2209 if (ifp->prefix_len >= 127) /* RFC 6164 */
2211 ipv6_addr_prefix(&addr, &ifp->addr, ifp->prefix_len);
2214 __ipv6_dev_ac_dec(ifp->idev, &addr);
2339 struct inet6_ifaddr *ifp;
2342 list_for_each_entry_reverse(ifp, &idev->addr_list, if_list) {
2343 if (ifp->scope > IFA_LINK)
2345 if (ifp->scope == IFA_LINK && !(ifp->flags&IFA_F_TENTATIVE)) {
2346 memcpy(eui, ifp->addr.s6_addr+8, 8);
2509 struct inet6_ifaddr *ifp,
2521 if (ifp != ift->ifpub)
2575 ipv6_create_tempaddr(ifp, false);
2594 struct inet6_ifaddr *ifp = ipv6_get_ifaddr(net, addr, dev, 1);
2597 if (!ifp && valid_lft) {
2620 ifp = ipv6_add_addr(in6_dev, &cfg, false, NULL);
2622 if (IS_ERR_OR_NULL(ifp))
2626 spin_lock_bh(&ifp->lock);
2627 ifp->flags |= IFA_F_MANAGETEMPADDR;
2628 ifp->cstamp = jiffies;
2629 ifp->tokenized = tokenized;
2630 spin_unlock_bh(&ifp->lock);
2631 addrconf_dad_start(ifp);
2634 if (ifp) {
2640 spin_lock_bh(&ifp->lock);
2642 if (ifp->valid_lft > (now - ifp->tstamp) / HZ)
2643 stored_lft = ifp->valid_lft - (now - ifp->tstamp) / HZ;
2665 ifp->valid_lft = valid_lft;
2666 ifp->prefered_lft = prefered_lft;
2667 ifp->tstamp = now;
2668 flags = ifp->flags;
2669 ifp->flags &= ~IFA_F_DEPRECATED;
2670 spin_unlock_bh(&ifp->lock);
2673 ipv6_ifa_notify(0, ifp);
2675 spin_unlock_bh(&ifp->lock);
2677 manage_tempaddrs(in6_dev, ifp, valid_lft, prefered_lft,
2680 in6_ifa_put(ifp);
2918 struct inet6_ifaddr *ifp;
2973 ifp = ipv6_add_addr(idev, cfg, true, extack);
2974 if (!IS_ERR(ifp)) {
2976 addrconf_prefix_route(&ifp->addr, ifp->prefix_len,
2977 ifp->rt_priority, dev, expires,
2984 if (!(ifp->flags & (IFA_F_OPTIMISTIC | IFA_F_NODAD)))
2985 ipv6_ifa_notify(0, ifp);
2991 addrconf_dad_start(ifp);
2993 manage_tempaddrs(idev, ifp, cfg->valid_lft,
2995 in6_ifa_put(ifp);
3003 return PTR_ERR(ifp);
3009 struct inet6_ifaddr *ifp;
3025 list_for_each_entry(ifp, &idev->addr_list, if_list) {
3026 if (ifp->prefix_len == plen &&
3027 ipv6_addr_equal(pfx, &ifp->addr)) {
3028 in6_ifa_hold(ifp);
3031 if (!(ifp->flags & IFA_F_TEMPORARY) &&
3033 manage_tempaddrs(idev, ifp, 0, 0, false,
3035 ipv6_del_addr(ifp);
3095 struct inet6_ifaddr *ifp;
3105 ifp = ipv6_add_addr(idev, &cfg, true, NULL);
3106 if (!IS_ERR(ifp)) {
3107 spin_lock_bh(&ifp->lock);
3108 ifp->flags &= ~IFA_F_TENTATIVE;
3109 spin_unlock_bh(&ifp->lock);
3111 ipv6_ifa_notify(RTM_NEWADDR, ifp);
3112 in6_ifa_put(ifp);
3204 struct inet6_ifaddr *ifp;
3213 ifp = ipv6_add_addr(idev, &cfg, true, NULL);
3214 if (!IS_ERR(ifp)) {
3215 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, 0, idev->dev,
3217 addrconf_dad_start(ifp);
3218 in6_ifa_put(ifp);
3446 struct inet6_ifaddr *ifp)
3452 if (!ifp->rt || !ifp->rt->fib6_node) {
3455 f6i = addrconf_f6i_alloc(net, idev, &ifp->addr, false,
3460 /* ifp->rt can be accessed outside of rtnl */
3461 spin_lock(&ifp->lock);
3462 prev = ifp->rt;
3463 ifp->rt = f6i;
3464 spin_unlock(&ifp->lock);
3469 if (!(ifp->flags & IFA_F_NOPREFIXROUTE)) {
3470 addrconf_prefix_route(&ifp->addr, ifp->prefix_len,
3471 ifp->rt_priority, idev->dev, 0, 0,
3475 if (ifp->state == INET6_IFADDR_STATE_PREDAD)
3476 addrconf_dad_start(ifp);
3483 struct inet6_ifaddr *ifp, *tmp;
3492 list_for_each_entry_safe(ifp, tmp, &idev->addr_list, if_list) {
3493 if ((ifp->flags & IFA_F_PERMANENT) &&
3494 fixup_permanent_addr(net, idev, ifp) < 0) {
3496 in6_ifa_hold(ifp);
3497 ipv6_del_addr(ifp);
3501 idev->dev->name, &ifp->addr);
3949 static void addrconf_dad_kick(struct inet6_ifaddr *ifp)
3952 struct inet6_dev *idev = ifp->idev;
3955 if (ifp->flags & IFA_F_OPTIMISTIC)
3967 ifp->dad_nonce = nonce;
3968 ifp->dad_probes = idev->cnf.dad_transmits;
3969 addrconf_mod_dad_work(ifp, rand_num);
3972 static void addrconf_dad_begin(struct inet6_ifaddr *ifp)
3974 struct inet6_dev *idev = ifp->idev;
3979 addrconf_join_solict(dev, &ifp->addr);
3981 prandom_seed((__force u32) ifp->addr.s6_addr32[3]);
3984 spin_lock(&ifp->lock);
3985 if (ifp->state == INET6_IFADDR_STATE_DEAD)
3992 !(ifp->flags&IFA_F_TENTATIVE) ||
3993 ifp->flags & IFA_F_NODAD) {
3996 if (ifp->flags & IFA_F_TENTATIVE &&
3997 !(ifp->flags & IFA_F_OPTIMISTIC))
3999 bump_id = ifp->flags & IFA_F_TENTATIVE;
4000 ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED);
4001 spin_unlock(&ifp->lock);
4004 addrconf_dad_completed(ifp, bump_id, send_na);
4009 spin_unlock(&ifp->lock);
4016 in6_ifa_hold(ifp);
4017 addrconf_dad_stop(ifp, 0);
4025 if (ifp->flags & IFA_F_OPTIMISTIC) {
4026 ip6_ins_rt(net, ifp->rt);
4035 addrconf_dad_kick(ifp);
4037 spin_unlock(&ifp->lock);
4040 ipv6_ifa_notify(RTM_NEWADDR, ifp);
4043 static void addrconf_dad_start(struct inet6_ifaddr *ifp)
4047 spin_lock_bh(&ifp->lock);
4048 if (ifp->state != INET6_IFADDR_STATE_DEAD) {
4049 ifp->state = INET6_IFADDR_STATE_PREDAD;
4052 spin_unlock_bh(&ifp->lock);
4055 addrconf_mod_dad_work(ifp, 0);
4060 struct inet6_ifaddr *ifp = container_of(to_delayed_work(w),
4063 struct inet6_dev *idev = ifp->idev;
4075 spin_lock_bh(&ifp->lock);
4076 if (ifp->state == INET6_IFADDR_STATE_PREDAD) {
4078 ifp->state = INET6_IFADDR_STATE_DAD;
4079 } else if (ifp->state == INET6_IFADDR_STATE_ERRDAD) {
4081 ifp->state = INET6_IFADDR_STATE_POSTDAD;
4086 !(ifp->flags & IFA_F_STABLE_PRIVACY)) {
4093 ipv6_addr_equal(&ifp->addr, &addr)) {
4098 ifp->idev->dev->name);
4103 spin_unlock_bh(&ifp->lock);
4106 addrconf_dad_begin(ifp);
4109 in6_ifa_hold(ifp);
4110 addrconf_dad_stop(ifp, 1);
4116 if (!ifp->dad_probes && addrconf_dad_end(ifp))
4125 spin_lock(&ifp->lock);
4126 if (ifp->state == INET6_IFADDR_STATE_DEAD) {
4127 spin_unlock(&ifp->lock);
4132 if (ifp->dad_probes == 0) {
4139 if (ifp->flags & IFA_F_TENTATIVE &&
4140 !(ifp->flags & IFA_F_OPTIMISTIC))
4142 bump_id = ifp->flags & IFA_F_TENTATIVE;
4143 ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED);
4144 spin_unlock(&ifp->lock);
4147 addrconf_dad_completed(ifp, bump_id, send_na);
4152 ifp->dad_probes--;
4153 addrconf_mod_dad_work(ifp,
4154 max(NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME),
4156 spin_unlock(&ifp->lock);
4160 addrconf_addr_solict_mult(&ifp->addr, &mcaddr);
4161 ndisc_send_ns(ifp->idev->dev, &ifp->addr, &mcaddr, &in6addr_any,
4162 ifp->dad_nonce);
4164 in6_ifa_put(ifp);
4168 /* ifp->idev must be at least read locked */
4169 static bool ipv6_lonely_lladdr(struct inet6_ifaddr *ifp)
4172 struct inet6_dev *idev = ifp->idev;
4177 if (ifp != ifpiter && ifpiter->scope == IFA_LINK &&
4186 static void addrconf_dad_completed(struct inet6_ifaddr *ifp, bool bump_id,
4189 struct net_device *dev = ifp->idev->dev;
4193 addrconf_del_dad_work(ifp);
4199 ipv6_ifa_notify(RTM_NEWADDR, ifp);
4205 read_lock_bh(&ifp->idev->lock);
4206 send_mld = ifp->scope == IFA_LINK && ipv6_lonely_lladdr(ifp);
4208 ipv6_accept_ra(ifp->idev) &&
4209 ifp->idev->cnf.rtr_solicits != 0 &&
4212 read_unlock_bh(&ifp->idev->lock);
4218 ipv6_mc_dad_complete(ifp->idev);
4222 (ifp->idev->cnf.ndisc_notify ||
4224 ndisc_send_na(dev, &in6addr_linklocal_allnodes, &ifp->addr,
4225 /*router=*/ !!ifp->idev->cnf.forwarding,
4240 write_lock_bh(&ifp->idev->lock);
4241 spin_lock(&ifp->lock);
4242 ifp->idev->rs_interval = rfc3315_s14_backoff_init(
4243 ifp->idev->cnf.rtr_solicit_interval);
4244 ifp->idev->rs_probes = 1;
4245 ifp->idev->if_flags |= IF_RS_SENT;
4246 addrconf_mod_rs_timer(ifp->idev, ifp->idev->rs_interval);
4247 spin_unlock(&ifp->lock);
4248 write_unlock_bh(&ifp->idev->lock);
4257 if (ifp->flags & IFA_F_TEMPORARY)
4263 struct inet6_ifaddr *ifp;
4266 list_for_each_entry(ifp, &idev->addr_list, if_list) {
4267 spin_lock(&ifp->lock);
4268 if ((ifp->flags & IFA_F_TENTATIVE &&
4269 ifp->state == INET6_IFADDR_STATE_DAD) || restart) {
4271 ifp->state = INET6_IFADDR_STATE_PREDAD;
4272 addrconf_dad_kick(ifp);
4274 spin_unlock(&ifp->lock);
4369 struct inet6_ifaddr *ifp = (struct inet6_ifaddr *)v;
4371 &ifp->addr,
4372 ifp->idev->dev->ifindex,
4373 ifp->prefix_len,
4374 ifp->scope,
4375 (u8) ifp->flags,
4376 ifp->idev->dev->name);
4421 struct inet6_ifaddr *ifp = NULL;
4425 hlist_for_each_entry_rcu(ifp, &inet6_addr_lst[hash], addr_lst) {
4426 if (!net_eq(dev_net(ifp->idev->dev), net))
4428 if (ipv6_addr_equal(&ifp->addr, addr) &&
4429 (ifp->flags & IFA_F_HOMEADDRESS)) {
4454 struct inet6_ifaddr *ifp;
4465 hlist_for_each_entry_rcu(ifp, &inet6_addr_lst[hash], addr_lst) {
4466 if (!net_eq(dev_net(ifp->idev->dev), net))
4469 if (ipv6_addr_equal(&ifp->addr, addr)) {
4499 struct inet6_ifaddr *ifp;
4512 hlist_for_each_entry_rcu_bh(ifp, &inet6_addr_lst[i], addr_lst) {
4519 if ((ifp->flags & IFA_F_PERMANENT) &&
4520 (ifp->prefered_lft == INFINITY_LIFE_TIME))
4523 spin_lock(&ifp->lock);
4525 age = (now - ifp->tstamp + ADDRCONF_TIMER_FUZZ_MINUS) / HZ;
4527 if (ifp->valid_lft != INFINITY_LIFE_TIME &&
4528 age >= ifp->valid_lft) {
4529 spin_unlock(&ifp->lock);
4530 in6_ifa_hold(ifp);
4531 ipv6_del_addr(ifp);
4533 } else if (ifp->prefered_lft == INFINITY_LIFE_TIME) {
4534 spin_unlock(&ifp->lock);
4536 } else if (age >= ifp->prefered_lft) {
4537 /* jiffies - ifp->tstamp > age >= ifp->prefered_lft */
4540 if (!(ifp->flags&IFA_F_DEPRECATED)) {
4542 ifp->flags |= IFA_F_DEPRECATED;
4545 if ((ifp->valid_lft != INFINITY_LIFE_TIME) &&
4546 (time_before(ifp->tstamp + ifp->valid_lft * HZ, next)))
4547 next = ifp->tstamp + ifp->valid_lft * HZ;
4549 spin_unlock(&ifp->lock);
4552 in6_ifa_hold(ifp);
4554 ipv6_ifa_notify(0, ifp);
4555 in6_ifa_put(ifp);
4558 } else if ((ifp->flags&IFA_F_TEMPORARY) &&
4559 !(ifp->flags&IFA_F_TENTATIVE)) {
4560 unsigned long regen_advance = ifp->idev->cnf.regen_max_retry *
4561 ifp->idev->cnf.dad_transmits *
4562 max(NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME), HZ/100) / HZ;
4564 if (age >= ifp->prefered_lft - regen_advance) {
4565 struct inet6_ifaddr *ifpub = ifp->ifpub;
4566 if (time_before(ifp->tstamp + ifp->prefered_lft * HZ, next))
4567 next = ifp->tstamp + ifp->prefered_lft * HZ;
4568 if (!ifp->regen_count && ifpub) {
4569 ifp->regen_count++;
4570 in6_ifa_hold(ifp);
4572 spin_unlock(&ifp->lock);
4580 in6_ifa_put(ifp);
4584 } else if (time_before(ifp->tstamp + ifp->prefered_lft * HZ - regen_advance * HZ, next))
4585 next = ifp->tstamp + ifp->prefered_lft * HZ - regen_advance * HZ;
4586 spin_unlock(&ifp->lock);
4588 /* ifp->prefered_lft <= ifp->valid_lft */
4589 if (time_before(ifp->tstamp + ifp->prefered_lft * HZ, next))
4590 next = ifp->tstamp + ifp->prefered_lft * HZ;
4591 spin_unlock(&ifp->lock);
4683 static int modify_prefix_route(struct inet6_ifaddr *ifp,
4690 f6i = addrconf_get_prefix_route(modify_peer ? &ifp->peer_addr : &ifp->addr,
4691 ifp->prefix_len,
4692 ifp->idev->dev, 0, RTF_DEFAULT, true);
4696 prio = ifp->rt_priority ? : IP6_RT_PRIO_ADDRCONF;
4699 ip6_del_rt(dev_net(ifp->idev->dev), f6i, false);
4702 addrconf_prefix_route(modify_peer ? &ifp->peer_addr : &ifp->addr,
4703 ifp->prefix_len,
4704 ifp->rt_priority, ifp->idev->dev,
4718 static int inet6_addr_modify(struct inet6_ifaddr *ifp, struct ifa6_config *cfg)
4733 (ifp->flags & IFA_F_TEMPORARY || ifp->prefix_len != 64))
4736 if (!(ifp->flags & IFA_F_TENTATIVE) || ifp->flags & IFA_F_DADFAILED)
4758 memcmp(&ifp->peer_addr, cfg->peer_pfx, sizeof(struct in6_addr))) {
4759 if (!ipv6_addr_any(&ifp->peer_addr))
4760 cleanup_prefix_route(ifp, expires, true, true);
4764 spin_lock_bh(&ifp->lock);
4765 was_managetempaddr = ifp->flags & IFA_F_MANAGETEMPADDR;
4766 had_prefixroute = ifp->flags & IFA_F_PERMANENT &&
4767 !(ifp->flags & IFA_F_NOPREFIXROUTE);
4768 ifp->flags &= ~(IFA_F_DEPRECATED | IFA_F_PERMANENT | IFA_F_NODAD |
4771 ifp->flags |= cfg->ifa_flags;
4772 ifp->tstamp = jiffies;
4773 ifp->valid_lft = cfg->valid_lft;
4774 ifp->prefered_lft = cfg->preferred_lft;
4776 if (cfg->rt_priority && cfg->rt_priority != ifp->rt_priority)
4777 ifp->rt_priority = cfg->rt_priority;
4780 ifp->peer_addr = *cfg->peer_pfx;
4782 spin_unlock_bh(&ifp->lock);
4783 if (!(ifp->flags&IFA_F_TENTATIVE))
4784 ipv6_ifa_notify(0, ifp);
4790 rc = modify_prefix_route(ifp, expires, flags, false);
4794 addrconf_prefix_route(&ifp->addr, ifp->prefix_len,
4795 ifp->rt_priority, ifp->idev->dev,
4799 if (had_prefixroute && !ipv6_addr_any(&ifp->peer_addr))
4800 rc = modify_prefix_route(ifp, expires, flags, true);
4802 if (rc == -ENOENT && !ipv6_addr_any(&ifp->peer_addr)) {
4803 addrconf_prefix_route(&ifp->peer_addr, ifp->prefix_len,
4804 ifp->rt_priority, ifp->idev->dev,
4811 write_lock_bh(&ifp->idev->lock);
4812 action = check_cleanup_prefix_route(ifp, &rt_expires);
4813 write_unlock_bh(&ifp->idev->lock);
4816 cleanup_prefix_route(ifp, rt_expires,
4821 if (was_managetempaddr || ifp->flags & IFA_F_MANAGETEMPADDR) {
4823 !(ifp->flags & IFA_F_MANAGETEMPADDR)) {
4827 manage_tempaddrs(ifp->idev, ifp, cfg->valid_lft,
5720 struct inet6_ifaddr *ifp;
5769 list_for_each_entry(ifp, &idev->addr_list, if_list) {
5770 spin_lock(&ifp->lock);
5771 if (ifp->tokenized) {
5772 ifp->valid_lft = 0;
5773 ifp->prefered_lft = 0;
5775 spin_unlock(&ifp->lock);
6080 static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp)
6082 struct net *net = dev_net(ifp->idev->dev);
6087 inet6_ifa_notify(event ? : RTM_NEWADDR, ifp);
6099 if (ifp->rt && !rcu_access_pointer(ifp->rt->fib6_node)) {
6100 ip6_ins_rt(net, ifp->rt);
6101 } else if (!ifp->rt && (ifp->idev->dev->flags & IFF_UP)) {
6103 &ifp->addr, ifp->idev->dev->name);
6106 if (ifp->idev->cnf.forwarding)
6107 addrconf_join_anycast(ifp);
6108 if (!ipv6_addr_any(&ifp->peer_addr))
6109 addrconf_prefix_route(&ifp->peer_addr, 128,
6110 ifp->rt_priority, ifp->idev->dev,
6114 if (ifp->idev->cnf.forwarding)
6115 addrconf_leave_anycast(ifp);
6116 addrconf_leave_solict(ifp->idev, &ifp->addr);
6117 if (!ipv6_addr_any(&ifp->peer_addr)) {
6120 rt = addrconf_get_prefix_route(&ifp->peer_addr, 128,
6121 ifp->idev->dev, 0, 0,
6126 if (ifp->rt) {
6127 ip6_del_rt(net, ifp->rt, false);
6128 ifp->rt = NULL;
6136 static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp)
6139 if (likely(ifp->idev->dead == 0))
6140 __ipv6_ifa_notify(event, ifp);