Lines Matching refs:ifp

155 static void addrconf_join_anycast(struct inet6_ifaddr *ifp);
156 static void addrconf_leave_anycast(struct inet6_ifaddr *ifp);
168 static void addrconf_dad_start(struct inet6_ifaddr *ifp);
170 static void addrconf_dad_completed(struct inet6_ifaddr *ifp, bool bump_id,
314 static void addrconf_del_dad_work(struct inet6_ifaddr *ifp)
316 if (cancel_delayed_work(&ifp->dad_work))
317 __in6_ifa_put(ifp);
327 static void addrconf_mod_dad_work(struct inet6_ifaddr *ifp,
330 in6_ifa_hold(ifp);
331 if (mod_delayed_work(addrconf_wq, &ifp->dad_work, delay))
332 in6_ifa_put(ifp);
984 void inet6_ifa_finish_destroy(struct inet6_ifaddr *ifp)
986 WARN_ON(!hlist_unhashed(&ifp->addr_lst));
992 in6_dev_put(ifp->idev);
994 if (cancel_delayed_work(&ifp->dad_work))
996 ifp);
998 if (ifp->state != INET6_IFADDR_STATE_DEAD) {
999 pr_warn("Freeing alive inet6 address %p\n", ifp);
1003 kfree_rcu(ifp, rcu);
1007 ipv6_link_dev_addr(struct inet6_dev *idev, struct inet6_ifaddr *ifp)
1010 int ifp_scope = ipv6_addr_src_scope(&ifp->addr);
1023 list_add_tail_rcu(&ifp->if_list, p);
1036 struct inet6_ifaddr *ifp;
1038 hlist_for_each_entry(ifp, &net->ipv6.inet6_addr_lst[hash], addr_lst) {
1039 if (ipv6_addr_equal(&ifp->addr, addr)) {
1040 if (!dev || ifp->idev->dev == dev)
1068 /* On success it returns ifp with increased reference count */
1212 * Check, whether the prefix for ifp would still need a prefix route
1213 * after deleting ifp. The function returns one of the CLEANUP_PREFIX_RT_*
1230 check_cleanup_prefix_route(struct inet6_ifaddr *ifp, unsigned long *expires)
1233 struct inet6_dev *idev = ifp->idev;
1240 if (ifa == ifp)
1242 if (ifa->prefix_len != ifp->prefix_len ||
1243 !ipv6_prefix_equal(&ifa->addr, &ifp->addr,
1244 ifp->prefix_len))
1268 cleanup_prefix_route(struct inet6_ifaddr *ifp, unsigned long expires,
1273 f6i = addrconf_get_prefix_route(del_peer ? &ifp->peer_addr : &ifp->addr,
1274 ifp->prefix_len,
1275 ifp->idev->dev, 0, RTF_DEFAULT, true);
1278 ip6_del_rt(dev_net(ifp->idev->dev), f6i, false);
1288 /* This function wants to get referenced ifp and releases it before return */
1290 static void ipv6_del_addr(struct inet6_ifaddr *ifp)
1293 struct net *net = dev_net(ifp->idev->dev);
1299 spin_lock_bh(&ifp->lock);
1300 state = ifp->state;
1301 ifp->state = INET6_IFADDR_STATE_DEAD;
1302 spin_unlock_bh(&ifp->lock);
1308 hlist_del_init_rcu(&ifp->addr_lst);
1311 write_lock_bh(&ifp->idev->lock);
1313 if (ifp->flags&IFA_F_TEMPORARY) {
1314 list_del(&ifp->tmp_list);
1315 if (ifp->ifpub) {
1316 in6_ifa_put(ifp->ifpub);
1317 ifp->ifpub = NULL;
1319 __in6_ifa_put(ifp);
1322 if (ifp->flags & IFA_F_PERMANENT && !(ifp->flags & IFA_F_NOPREFIXROUTE))
1323 action = check_cleanup_prefix_route(ifp, &expires);
1325 list_del_rcu(&ifp->if_list);
1326 __in6_ifa_put(ifp);
1328 write_unlock_bh(&ifp->idev->lock);
1330 addrconf_del_dad_work(ifp);
1332 ipv6_ifa_notify(RTM_DELADDR, ifp);
1334 inet6addr_notifier_call_chain(NETDEV_DOWN, ifp);
1337 cleanup_prefix_route(ifp, expires,
1342 rt6_remove_prefsrc(ifp);
1344 in6_ifa_put(ifp);
1347 static int ipv6_create_tempaddr(struct inet6_ifaddr *ifp, bool block)
1349 struct inet6_dev *idev = ifp->idev;
1371 spin_lock_bh(&ifp->lock);
1372 if (ifp->regen_count++ >= idev->cnf.regen_max_retry) {
1374 spin_unlock_bh(&ifp->lock);
1382 in6_ifa_hold(ifp);
1383 memcpy(addr.s6_addr, ifp->addr.s6_addr, 8);
1386 age = (now - ifp->tstamp) / HZ;
1411 cfg.valid_lft = min_t(__u32, ifp->valid_lft,
1414 cfg.preferred_lft = min_t(__u32, ifp->prefered_lft, cfg.preferred_lft);
1416 cfg.plen = ifp->prefix_len;
1417 tmp_tstamp = ifp->tstamp;
1418 spin_unlock_bh(&ifp->lock);
1431 in6_ifa_put(ifp);
1439 if (ifp->flags & IFA_F_OPTIMISTIC)
1447 in6_ifa_put(ifp);
1455 ift->ifpub = ifp;
1874 struct inet6_ifaddr *ifp;
1877 list_for_each_entry_reverse(ifp, &idev->addr_list, if_list) {
1878 if (ifp->scope > IFA_LINK)
1880 if (ifp->scope == IFA_LINK &&
1881 !(ifp->flags & banned_flags)) {
1882 *addr = ifp->addr;
1909 const struct inet6_ifaddr *ifp;
1913 list_for_each_entry_rcu(ifp, &idev->addr_list, if_list)
1928 * skip_dev_check is set, then the ifp device is not checked against
1943 struct inet6_ifaddr *ifp;
1952 hlist_for_each_entry_rcu(ifp, &net->ipv6.inet6_addr_lst[hash], addr_lst) {
1953 ndev = ifp->idev->dev;
1961 ifp_flags = (ifp->flags&IFA_F_OPTIMISTIC)
1962 ? (ifp->flags&~IFA_F_TENTATIVE)
1963 : ifp->flags;
1964 if (ipv6_addr_equal(&ifp->addr, addr) &&
1967 !(ifp->scope&(IFA_LINK|IFA_HOST) || strict))) {
2054 struct inet6_ifaddr *ifp, *result = NULL;
2057 hlist_for_each_entry_rcu(ifp, &net->ipv6.inet6_addr_lst[hash], addr_lst) {
2058 if (ipv6_addr_equal(&ifp->addr, addr)) {
2059 if (!dev || ifp->idev->dev == dev ||
2060 !(ifp->scope&(IFA_LINK|IFA_HOST) || strict)) {
2061 result = ifp;
2062 in6_ifa_hold(ifp);
2074 static void addrconf_dad_stop(struct inet6_ifaddr *ifp, int dad_failed)
2077 ifp->flags |= IFA_F_DADFAILED;
2079 if (ifp->flags&IFA_F_TEMPORARY) {
2081 spin_lock_bh(&ifp->lock);
2082 ifpub = ifp->ifpub;
2085 spin_unlock_bh(&ifp->lock);
2089 spin_unlock_bh(&ifp->lock);
2091 ipv6_del_addr(ifp);
2092 } else if (ifp->flags&IFA_F_PERMANENT || !dad_failed) {
2093 spin_lock_bh(&ifp->lock);
2094 addrconf_del_dad_work(ifp);
2095 ifp->flags |= IFA_F_TENTATIVE;
2097 ifp->flags &= ~IFA_F_OPTIMISTIC;
2098 spin_unlock_bh(&ifp->lock);
2100 ipv6_ifa_notify(0, ifp);
2101 in6_ifa_put(ifp);
2103 ipv6_del_addr(ifp);
2107 static int addrconf_dad_end(struct inet6_ifaddr *ifp)
2111 spin_lock_bh(&ifp->lock);
2112 if (ifp->state == INET6_IFADDR_STATE_DAD) {
2113 ifp->state = INET6_IFADDR_STATE_POSTDAD;
2116 spin_unlock_bh(&ifp->lock);
2121 void addrconf_dad_failure(struct sk_buff *skb, struct inet6_ifaddr *ifp)
2123 struct inet6_dev *idev = ifp->idev;
2126 if (addrconf_dad_end(ifp)) {
2127 in6_ifa_put(ifp);
2132 ifp->idev->dev->name, &ifp->addr, eth_hdr(skb)->h_source);
2134 spin_lock_bh(&ifp->lock);
2136 if (ifp->flags & IFA_F_STABLE_PRIVACY) {
2139 int retries = ifp->stable_privacy_retry + 1;
2142 .plen = ifp->prefix_len,
2143 .ifa_flags = ifp->flags,
2144 .valid_lft = ifp->valid_lft,
2145 .preferred_lft = ifp->prefered_lft,
2146 .scope = ifp->scope,
2151 ifp->idev->dev->name);
2155 new_addr = ifp->addr;
2160 spin_unlock_bh(&ifp->lock);
2168 ifp->idev->dev->name);
2182 spin_lock_bh(&ifp->lock);
2187 ifp->state = INET6_IFADDR_STATE_ERRDAD;
2188 spin_unlock_bh(&ifp->lock);
2190 addrconf_mod_dad_work(ifp, 0);
2191 in6_ifa_put(ifp);
2220 static void addrconf_join_anycast(struct inet6_ifaddr *ifp)
2224 if (ifp->prefix_len >= 127) /* RFC 6164 */
2226 ipv6_addr_prefix(&addr, &ifp->addr, ifp->prefix_len);
2229 __ipv6_dev_ac_inc(ifp->idev, &addr);
2233 static void addrconf_leave_anycast(struct inet6_ifaddr *ifp)
2237 if (ifp->prefix_len >= 127) /* RFC 6164 */
2239 ipv6_addr_prefix(&addr, &ifp->addr, ifp->prefix_len);
2242 __ipv6_dev_ac_dec(ifp->idev, &addr);
2367 struct inet6_ifaddr *ifp;
2370 list_for_each_entry_reverse(ifp, &idev->addr_list, if_list) {
2371 if (ifp->scope > IFA_LINK)
2373 if (ifp->scope == IFA_LINK && !(ifp->flags&IFA_F_TENTATIVE)) {
2374 memcpy(eui, ifp->addr.s6_addr+8, 8);
2537 struct inet6_ifaddr *ifp,
2549 if (ifp != ift->ifpub)
2603 ipv6_create_tempaddr(ifp, false);
2622 struct inet6_ifaddr *ifp = ipv6_get_ifaddr(net, addr, dev, 1);
2625 if (!ifp && valid_lft) {
2649 ifp = ipv6_add_addr(in6_dev, &cfg, false, NULL);
2651 if (IS_ERR_OR_NULL(ifp))
2655 spin_lock_bh(&ifp->lock);
2656 ifp->flags |= IFA_F_MANAGETEMPADDR;
2657 ifp->cstamp = jiffies;
2658 ifp->tokenized = tokenized;
2659 spin_unlock_bh(&ifp->lock);
2660 addrconf_dad_start(ifp);
2663 if (ifp) {
2669 spin_lock_bh(&ifp->lock);
2671 if (ifp->valid_lft > (now - ifp->tstamp) / HZ)
2672 stored_lft = ifp->valid_lft - (now - ifp->tstamp) / HZ;
2694 ifp->valid_lft = valid_lft;
2695 ifp->prefered_lft = prefered_lft;
2696 ifp->tstamp = now;
2697 flags = ifp->flags;
2698 ifp->flags &= ~IFA_F_DEPRECATED;
2699 spin_unlock_bh(&ifp->lock);
2702 ipv6_ifa_notify(0, ifp);
2704 spin_unlock_bh(&ifp->lock);
2706 manage_tempaddrs(in6_dev, ifp, valid_lft, prefered_lft,
2709 in6_ifa_put(ifp);
2947 struct inet6_ifaddr *ifp;
3012 ifp = ipv6_add_addr(idev, cfg, true, extack);
3013 if (!IS_ERR(ifp)) {
3015 addrconf_prefix_route(&ifp->addr, ifp->prefix_len,
3016 ifp->rt_priority, dev, expires,
3023 if (!(ifp->flags & (IFA_F_OPTIMISTIC | IFA_F_NODAD)))
3024 ipv6_ifa_notify(0, ifp);
3030 addrconf_dad_start(ifp);
3032 manage_tempaddrs(idev, ifp, cfg->valid_lft,
3034 in6_ifa_put(ifp);
3042 return PTR_ERR(ifp);
3049 struct inet6_ifaddr *ifp;
3071 list_for_each_entry(ifp, &idev->addr_list, if_list) {
3072 if (ifp->prefix_len == plen &&
3073 ipv6_addr_equal(pfx, &ifp->addr)) {
3074 in6_ifa_hold(ifp);
3077 if (!(ifp->flags & IFA_F_TEMPORARY) &&
3079 manage_tempaddrs(idev, ifp, 0, 0, false,
3081 ipv6_del_addr(ifp);
3143 struct inet6_ifaddr *ifp;
3154 ifp = ipv6_add_addr(idev, &cfg, true, NULL);
3155 if (!IS_ERR(ifp)) {
3156 spin_lock_bh(&ifp->lock);
3157 ifp->flags &= ~IFA_F_TENTATIVE;
3158 spin_unlock_bh(&ifp->lock);
3160 ipv6_ifa_notify(RTM_NEWADDR, ifp);
3161 in6_ifa_put(ifp);
3258 struct inet6_ifaddr *ifp;
3267 ifp = ipv6_add_addr(idev, &cfg, true, NULL);
3268 if (!IS_ERR(ifp)) {
3269 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, 0, idev->dev,
3271 addrconf_dad_start(ifp);
3272 in6_ifa_put(ifp);
3528 struct inet6_ifaddr *ifp)
3534 if (!ifp->rt || !ifp->rt->fib6_node) {
3537 f6i = addrconf_f6i_alloc(net, idev, &ifp->addr, false,
3542 /* ifp->rt can be accessed outside of rtnl */
3543 spin_lock(&ifp->lock);
3544 prev = ifp->rt;
3545 ifp->rt = f6i;
3546 spin_unlock(&ifp->lock);
3551 if (!(ifp->flags & IFA_F_NOPREFIXROUTE)) {
3552 addrconf_prefix_route(&ifp->addr, ifp->prefix_len,
3553 ifp->rt_priority, idev->dev, 0, 0,
3557 if (ifp->state == INET6_IFADDR_STATE_PREDAD)
3558 addrconf_dad_start(ifp);
3565 struct inet6_ifaddr *ifp, *tmp;
3574 list_for_each_entry_safe(ifp, tmp, &idev->addr_list, if_list) {
3575 if ((ifp->flags & IFA_F_PERMANENT) &&
3576 fixup_permanent_addr(net, idev, ifp) < 0) {
3578 in6_ifa_hold(ifp);
3579 ipv6_del_addr(ifp);
3583 idev->dev->name, &ifp->addr);
4018 static void addrconf_dad_kick(struct inet6_ifaddr *ifp)
4021 struct inet6_dev *idev = ifp->idev;
4024 if (ifp->flags & IFA_F_OPTIMISTIC)
4036 ifp->dad_nonce = nonce;
4037 ifp->dad_probes = idev->cnf.dad_transmits;
4038 addrconf_mod_dad_work(ifp, rand_num);
4041 static void addrconf_dad_begin(struct inet6_ifaddr *ifp)
4043 struct inet6_dev *idev = ifp->idev;
4048 addrconf_join_solict(dev, &ifp->addr);
4051 spin_lock(&ifp->lock);
4052 if (ifp->state == INET6_IFADDR_STATE_DEAD)
4059 !(ifp->flags&IFA_F_TENTATIVE) ||
4060 ifp->flags & IFA_F_NODAD) {
4063 if (ifp->flags & IFA_F_TENTATIVE &&
4064 !(ifp->flags & IFA_F_OPTIMISTIC))
4066 bump_id = ifp->flags & IFA_F_TENTATIVE;
4067 ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED);
4068 spin_unlock(&ifp->lock);
4071 addrconf_dad_completed(ifp, bump_id, send_na);
4076 spin_unlock(&ifp->lock);
4083 in6_ifa_hold(ifp);
4084 addrconf_dad_stop(ifp, 0);
4092 if (ifp->flags & IFA_F_OPTIMISTIC) {
4093 ip6_ins_rt(net, ifp->rt);
4102 addrconf_dad_kick(ifp);
4104 spin_unlock(&ifp->lock);
4107 ipv6_ifa_notify(RTM_NEWADDR, ifp);
4110 static void addrconf_dad_start(struct inet6_ifaddr *ifp)
4114 spin_lock_bh(&ifp->lock);
4115 if (ifp->state != INET6_IFADDR_STATE_DEAD) {
4116 ifp->state = INET6_IFADDR_STATE_PREDAD;
4119 spin_unlock_bh(&ifp->lock);
4122 addrconf_mod_dad_work(ifp, 0);
4127 struct inet6_ifaddr *ifp = container_of(to_delayed_work(w),
4130 struct inet6_dev *idev = ifp->idev;
4142 spin_lock_bh(&ifp->lock);
4143 if (ifp->state == INET6_IFADDR_STATE_PREDAD) {
4145 ifp->state = INET6_IFADDR_STATE_DAD;
4146 } else if (ifp->state == INET6_IFADDR_STATE_ERRDAD) {
4148 ifp->state = INET6_IFADDR_STATE_POSTDAD;
4153 !(ifp->flags & IFA_F_STABLE_PRIVACY)) {
4160 ipv6_addr_equal(&ifp->addr, &addr)) {
4165 ifp->idev->dev->name);
4170 spin_unlock_bh(&ifp->lock);
4173 addrconf_dad_begin(ifp);
4176 in6_ifa_hold(ifp);
4177 addrconf_dad_stop(ifp, 1);
4183 if (!ifp->dad_probes && addrconf_dad_end(ifp))
4192 spin_lock(&ifp->lock);
4193 if (ifp->state == INET6_IFADDR_STATE_DEAD) {
4194 spin_unlock(&ifp->lock);
4199 if (ifp->dad_probes == 0) {
4206 if (ifp->flags & IFA_F_TENTATIVE &&
4207 !(ifp->flags & IFA_F_OPTIMISTIC))
4209 bump_id = ifp->flags & IFA_F_TENTATIVE;
4210 ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED);
4211 spin_unlock(&ifp->lock);
4214 addrconf_dad_completed(ifp, bump_id, send_na);
4219 ifp->dad_probes--;
4220 addrconf_mod_dad_work(ifp,
4221 max(NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME),
4223 spin_unlock(&ifp->lock);
4227 addrconf_addr_solict_mult(&ifp->addr, &mcaddr);
4228 ndisc_send_ns(ifp->idev->dev, &ifp->addr, &mcaddr, &in6addr_any,
4229 ifp->dad_nonce);
4231 in6_ifa_put(ifp);
4235 /* ifp->idev must be at least read locked */
4236 static bool ipv6_lonely_lladdr(struct inet6_ifaddr *ifp)
4239 struct inet6_dev *idev = ifp->idev;
4244 if (ifp != ifpiter && ifpiter->scope == IFA_LINK &&
4253 static void addrconf_dad_completed(struct inet6_ifaddr *ifp, bool bump_id,
4256 struct net_device *dev = ifp->idev->dev;
4260 addrconf_del_dad_work(ifp);
4266 ipv6_ifa_notify(RTM_NEWADDR, ifp);
4272 read_lock_bh(&ifp->idev->lock);
4273 send_mld = ifp->scope == IFA_LINK && ipv6_lonely_lladdr(ifp);
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 ||
4292 ndisc_send_na(dev, &in6addr_linklocal_allnodes, &ifp->addr,
4293 /*router=*/ !!ifp->idev->cnf.forwarding,
4308 write_lock_bh(&ifp->idev->lock);
4309 spin_lock(&ifp->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);
4315 spin_unlock(&ifp->lock);
4316 write_unlock_bh(&ifp->idev->lock);
4325 if (ifp->flags & IFA_F_TEMPORARY)
4331 struct inet6_ifaddr *ifp;
4334 list_for_each_entry(ifp, &idev->addr_list, if_list) {
4335 spin_lock(&ifp->lock);
4336 if ((ifp->flags & IFA_F_TENTATIVE &&
4337 ifp->state == INET6_IFADDR_STATE_DAD) || restart) {
4339 ifp->state = INET6_IFADDR_STATE_PREDAD;
4340 addrconf_dad_kick(ifp);
4342 spin_unlock(&ifp->lock);
4431 struct inet6_ifaddr *ifp = (struct inet6_ifaddr *)v;
4433 &ifp->addr,
4434 ifp->idev->dev->ifindex,
4435 ifp->prefix_len,
4436 ifp->scope,
4437 (u8) ifp->flags,
4438 ifp->idev->dev->name);
4483 struct inet6_ifaddr *ifp = NULL;
4487 hlist_for_each_entry_rcu(ifp, &net->ipv6.inet6_addr_lst[hash], addr_lst) {
4488 if (ipv6_addr_equal(&ifp->addr, addr) &&
4489 (ifp->flags & IFA_F_HOMEADDRESS)) {
4514 struct inet6_ifaddr *ifp;
4525 hlist_for_each_entry_rcu(ifp, &net->ipv6.inet6_addr_lst[hash], addr_lst) {
4527 if (ipv6_addr_equal(&ifp->addr, addr)) {
4557 struct inet6_ifaddr *ifp;
4570 hlist_for_each_entry_rcu_bh(ifp, &net->ipv6.inet6_addr_lst[i], addr_lst) {
4577 if ((ifp->flags & IFA_F_PERMANENT) &&
4578 (ifp->prefered_lft == INFINITY_LIFE_TIME))
4581 spin_lock(&ifp->lock);
4583 age = (now - ifp->tstamp + ADDRCONF_TIMER_FUZZ_MINUS) / HZ;
4585 if ((ifp->flags&IFA_F_TEMPORARY) &&
4586 !(ifp->flags&IFA_F_TENTATIVE) &&
4587 ifp->prefered_lft != INFINITY_LIFE_TIME &&
4588 !ifp->regen_count && ifp->ifpub) {
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;
4595 if (age + regen_advance >= ifp->prefered_lft) {
4596 struct inet6_ifaddr *ifpub = ifp->ifpub;
4597 if (time_before(ifp->tstamp + ifp->prefered_lft * HZ, next))
4598 next = ifp->tstamp + ifp->prefered_lft * HZ;
4600 ifp->regen_count++;
4601 in6_ifa_hold(ifp);
4603 spin_unlock(&ifp->lock);
4611 in6_ifa_put(ifp);
4614 } else if (time_before(ifp->tstamp + ifp->prefered_lft * HZ - regen_advance * HZ, next))
4615 next = ifp->tstamp + ifp->prefered_lft * HZ - regen_advance * HZ;
4618 if (ifp->valid_lft != INFINITY_LIFE_TIME &&
4619 age >= ifp->valid_lft) {
4620 spin_unlock(&ifp->lock);
4621 in6_ifa_hold(ifp);
4623 ipv6_del_addr(ifp);
4626 } else if (ifp->prefered_lft == INFINITY_LIFE_TIME) {
4627 spin_unlock(&ifp->lock);
4629 } else if (age >= ifp->prefered_lft) {
4630 /* jiffies - ifp->tstamp > age >= ifp->prefered_lft */
4633 if (!(ifp->flags&IFA_F_DEPRECATED)) {
4635 ifp->flags |= IFA_F_DEPRECATED;
4638 if ((ifp->valid_lft != INFINITY_LIFE_TIME) &&
4639 (time_before(ifp->tstamp + ifp->valid_lft * HZ, next)))
4640 next = ifp->tstamp + ifp->valid_lft * HZ;
4642 spin_unlock(&ifp->lock);
4645 in6_ifa_hold(ifp);
4647 ipv6_ifa_notify(0, ifp);
4648 in6_ifa_put(ifp);
4652 /* ifp->prefered_lft <= ifp->valid_lft */
4653 if (time_before(ifp->tstamp + ifp->prefered_lft * HZ, next))
4654 next = ifp->tstamp + ifp->prefered_lft * HZ;
4655 spin_unlock(&ifp->lock);
4751 static int modify_prefix_route(struct inet6_ifaddr *ifp,
4758 f6i = addrconf_get_prefix_route(modify_peer ? &ifp->peer_addr : &ifp->addr,
4759 ifp->prefix_len,
4760 ifp->idev->dev, 0, RTF_DEFAULT, true);
4764 prio = ifp->rt_priority ? : IP6_RT_PRIO_ADDRCONF;
4767 ip6_del_rt(dev_net(ifp->idev->dev), f6i, false);
4770 addrconf_prefix_route(modify_peer ? &ifp->peer_addr : &ifp->addr,
4771 ifp->prefix_len,
4772 ifp->rt_priority, ifp->idev->dev,
4786 static int inet6_addr_modify(struct net *net, struct inet6_ifaddr *ifp,
4802 (ifp->flags & IFA_F_TEMPORARY || ifp->prefix_len != 64))
4805 if (!(ifp->flags & IFA_F_TENTATIVE) || ifp->flags & IFA_F_DADFAILED)
4827 memcmp(&ifp->peer_addr, cfg->peer_pfx, sizeof(struct in6_addr))) {
4828 if (!ipv6_addr_any(&ifp->peer_addr))
4829 cleanup_prefix_route(ifp, expires, true, true);
4833 spin_lock_bh(&ifp->lock);
4834 was_managetempaddr = ifp->flags & IFA_F_MANAGETEMPADDR;
4835 had_prefixroute = ifp->flags & IFA_F_PERMANENT &&
4836 !(ifp->flags & IFA_F_NOPREFIXROUTE);
4837 ifp->flags &= ~(IFA_F_DEPRECATED | IFA_F_PERMANENT | IFA_F_NODAD |
4840 ifp->flags |= cfg->ifa_flags;
4841 ifp->tstamp = jiffies;
4842 ifp->valid_lft = cfg->valid_lft;
4843 ifp->prefered_lft = cfg->preferred_lft;
4844 ifp->ifa_proto = cfg->ifa_proto;
4846 if (cfg->rt_priority && cfg->rt_priority != ifp->rt_priority)
4847 ifp->rt_priority = cfg->rt_priority;
4850 ifp->peer_addr = *cfg->peer_pfx;
4852 spin_unlock_bh(&ifp->lock);
4853 if (!(ifp->flags&IFA_F_TENTATIVE))
4854 ipv6_ifa_notify(0, ifp);
4860 rc = modify_prefix_route(ifp, expires, flags, false);
4864 addrconf_prefix_route(&ifp->addr, ifp->prefix_len,
4865 ifp->rt_priority, ifp->idev->dev,
4869 if (had_prefixroute && !ipv6_addr_any(&ifp->peer_addr))
4870 rc = modify_prefix_route(ifp, expires, flags, true);
4872 if (rc == -ENOENT && !ipv6_addr_any(&ifp->peer_addr)) {
4873 addrconf_prefix_route(&ifp->peer_addr, ifp->prefix_len,
4874 ifp->rt_priority, ifp->idev->dev,
4881 write_lock_bh(&ifp->idev->lock);
4882 action = check_cleanup_prefix_route(ifp, &rt_expires);
4883 write_unlock_bh(&ifp->idev->lock);
4886 cleanup_prefix_route(ifp, rt_expires,
4891 if (was_managetempaddr || ifp->flags & IFA_F_MANAGETEMPADDR) {
4893 !(ifp->flags & IFA_F_MANAGETEMPADDR)) {
4897 manage_tempaddrs(ifp->idev, ifp, cfg->valid_lft,
5814 struct inet6_ifaddr *ifp;
5880 list_for_each_entry(ifp, &idev->addr_list, if_list) {
5881 spin_lock(&ifp->lock);
5882 if (ifp->tokenized) {
5883 ifp->valid_lft = 0;
5884 ifp->prefered_lft = 0;
5886 spin_unlock(&ifp->lock);
6197 static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp)
6199 struct net *net = dev_net(ifp->idev->dev);
6204 inet6_ifa_notify(event ? : RTM_NEWADDR, ifp);
6216 if (ifp->rt && !rcu_access_pointer(ifp->rt->fib6_node)) {
6217 ip6_ins_rt(net, ifp->rt);
6218 } else if (!ifp->rt && (ifp->idev->dev->flags & IFF_UP)) {
6220 &ifp->addr, ifp->idev->dev->name);
6223 if (ifp->idev->cnf.forwarding)
6224 addrconf_join_anycast(ifp);
6225 if (!ipv6_addr_any(&ifp->peer_addr))
6226 addrconf_prefix_route(&ifp->peer_addr, 128,
6227 ifp->rt_priority, ifp->idev->dev,
6231 if (ifp->idev->cnf.forwarding)
6232 addrconf_leave_anycast(ifp);
6233 addrconf_leave_solict(ifp->idev, &ifp->addr);
6234 if (!ipv6_addr_any(&ifp->peer_addr)) {
6237 rt = addrconf_get_prefix_route(&ifp->peer_addr, 128,
6238 ifp->idev->dev, 0, 0,
6243 if (ifp->rt) {
6244 ip6_del_rt(net, ifp->rt, false);
6245 ifp->rt = NULL;
6253 static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp)
6255 if (likely(ifp->idev->dead == 0))
6256 __ipv6_ifa_notify(event, ifp);