Lines Matching full: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) in addrconf_del_dad_work() argument
316 if (cancel_delayed_work(&ifp->dad_work)) in addrconf_del_dad_work()
317 __in6_ifa_put(ifp); in addrconf_del_dad_work()
327 static void addrconf_mod_dad_work(struct inet6_ifaddr *ifp, in addrconf_mod_dad_work() argument
330 in6_ifa_hold(ifp); in addrconf_mod_dad_work()
331 if (mod_delayed_work(addrconf_wq, &ifp->dad_work, delay)) in addrconf_mod_dad_work()
332 in6_ifa_put(ifp); in addrconf_mod_dad_work()
984 void inet6_ifa_finish_destroy(struct inet6_ifaddr *ifp) in inet6_ifa_finish_destroy() argument
986 WARN_ON(!hlist_unhashed(&ifp->addr_lst)); in inet6_ifa_finish_destroy()
992 in6_dev_put(ifp->idev); in inet6_ifa_finish_destroy()
994 if (cancel_delayed_work(&ifp->dad_work)) in inet6_ifa_finish_destroy()
996 ifp); in inet6_ifa_finish_destroy()
998 if (ifp->state != INET6_IFADDR_STATE_DEAD) { in inet6_ifa_finish_destroy()
999 pr_warn("Freeing alive inet6 address %p\n", ifp); in inet6_ifa_finish_destroy()
1003 kfree_rcu(ifp, rcu); in inet6_ifa_finish_destroy()
1007 ipv6_link_dev_addr(struct inet6_dev *idev, struct inet6_ifaddr *ifp) in ipv6_link_dev_addr() argument
1010 int ifp_scope = ipv6_addr_src_scope(&ifp->addr); in ipv6_link_dev_addr()
1023 list_add_tail_rcu(&ifp->if_list, p); in ipv6_link_dev_addr()
1036 struct inet6_ifaddr *ifp; in ipv6_chk_same_addr() local
1038 hlist_for_each_entry(ifp, &net->ipv6.inet6_addr_lst[hash], addr_lst) { in ipv6_chk_same_addr()
1039 if (ipv6_addr_equal(&ifp->addr, addr)) { in ipv6_chk_same_addr()
1040 if (!dev || ifp->idev->dev == dev) in ipv6_chk_same_addr()
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) in check_cleanup_prefix_route() argument
1233 struct inet6_dev *idev = ifp->idev; in check_cleanup_prefix_route()
1240 if (ifa == ifp) in check_cleanup_prefix_route()
1242 if (ifa->prefix_len != ifp->prefix_len || in check_cleanup_prefix_route()
1243 !ipv6_prefix_equal(&ifa->addr, &ifp->addr, in check_cleanup_prefix_route()
1244 ifp->prefix_len)) in check_cleanup_prefix_route()
1268 cleanup_prefix_route(struct inet6_ifaddr *ifp, unsigned long expires, in cleanup_prefix_route() argument
1273 f6i = addrconf_get_prefix_route(del_peer ? &ifp->peer_addr : &ifp->addr, in cleanup_prefix_route()
1274 ifp->prefix_len, in cleanup_prefix_route()
1275 ifp->idev->dev, 0, RTF_DEFAULT, true); in cleanup_prefix_route()
1278 ip6_del_rt(dev_net(ifp->idev->dev), f6i, false); in cleanup_prefix_route()
1288 /* This function wants to get referenced ifp and releases it before return */
1290 static void ipv6_del_addr(struct inet6_ifaddr *ifp) in ipv6_del_addr() argument
1293 struct net *net = dev_net(ifp->idev->dev); in ipv6_del_addr()
1299 spin_lock_bh(&ifp->lock); in ipv6_del_addr()
1300 state = ifp->state; in ipv6_del_addr()
1301 ifp->state = INET6_IFADDR_STATE_DEAD; in ipv6_del_addr()
1302 spin_unlock_bh(&ifp->lock); in ipv6_del_addr()
1308 hlist_del_init_rcu(&ifp->addr_lst); in ipv6_del_addr()
1311 write_lock_bh(&ifp->idev->lock); in ipv6_del_addr()
1313 if (ifp->flags&IFA_F_TEMPORARY) { in ipv6_del_addr()
1314 list_del(&ifp->tmp_list); in ipv6_del_addr()
1315 if (ifp->ifpub) { in ipv6_del_addr()
1316 in6_ifa_put(ifp->ifpub); in ipv6_del_addr()
1317 ifp->ifpub = NULL; in ipv6_del_addr()
1319 __in6_ifa_put(ifp); in ipv6_del_addr()
1322 if (ifp->flags & IFA_F_PERMANENT && !(ifp->flags & IFA_F_NOPREFIXROUTE)) in ipv6_del_addr()
1323 action = check_cleanup_prefix_route(ifp, &expires); in ipv6_del_addr()
1325 list_del_rcu(&ifp->if_list); in ipv6_del_addr()
1326 __in6_ifa_put(ifp); in ipv6_del_addr()
1328 write_unlock_bh(&ifp->idev->lock); in ipv6_del_addr()
1330 addrconf_del_dad_work(ifp); in ipv6_del_addr()
1332 ipv6_ifa_notify(RTM_DELADDR, ifp); in ipv6_del_addr()
1334 inet6addr_notifier_call_chain(NETDEV_DOWN, ifp); in ipv6_del_addr()
1337 cleanup_prefix_route(ifp, expires, in ipv6_del_addr()
1342 rt6_remove_prefsrc(ifp); in ipv6_del_addr()
1344 in6_ifa_put(ifp); in ipv6_del_addr()
1347 static int ipv6_create_tempaddr(struct inet6_ifaddr *ifp, bool block) in ipv6_create_tempaddr() argument
1349 struct inet6_dev *idev = ifp->idev; in ipv6_create_tempaddr()
1371 spin_lock_bh(&ifp->lock); in ipv6_create_tempaddr()
1372 if (ifp->regen_count++ >= idev->cnf.regen_max_retry) { in ipv6_create_tempaddr()
1374 spin_unlock_bh(&ifp->lock); in ipv6_create_tempaddr()
1382 in6_ifa_hold(ifp); in ipv6_create_tempaddr()
1383 memcpy(addr.s6_addr, ifp->addr.s6_addr, 8); in ipv6_create_tempaddr()
1386 age = (now - ifp->tstamp) / HZ; in ipv6_create_tempaddr()
1411 cfg.valid_lft = min_t(__u32, ifp->valid_lft, in ipv6_create_tempaddr()
1414 cfg.preferred_lft = min_t(__u32, ifp->prefered_lft, cfg.preferred_lft); in ipv6_create_tempaddr()
1416 cfg.plen = ifp->prefix_len; in ipv6_create_tempaddr()
1417 tmp_tstamp = ifp->tstamp; in ipv6_create_tempaddr()
1418 spin_unlock_bh(&ifp->lock); in ipv6_create_tempaddr()
1431 in6_ifa_put(ifp); in ipv6_create_tempaddr()
1439 if (ifp->flags & IFA_F_OPTIMISTIC) in ipv6_create_tempaddr()
1447 in6_ifa_put(ifp); in ipv6_create_tempaddr()
1455 ift->ifpub = ifp; in ipv6_create_tempaddr()
1875 struct inet6_ifaddr *ifp; in __ipv6_get_lladdr() local
1878 list_for_each_entry_reverse(ifp, &idev->addr_list, if_list) { in __ipv6_get_lladdr()
1879 if (ifp->scope > IFA_LINK) in __ipv6_get_lladdr()
1881 if (ifp->scope == IFA_LINK && in __ipv6_get_lladdr()
1882 !(ifp->flags & banned_flags)) { in __ipv6_get_lladdr()
1883 *addr = ifp->addr; in __ipv6_get_lladdr()
1910 const struct inet6_ifaddr *ifp; in ipv6_count_addresses() local
1914 list_for_each_entry_rcu(ifp, &idev->addr_list, if_list) in ipv6_count_addresses()
1929 * skip_dev_check is set, then the ifp device is not checked against
1944 struct inet6_ifaddr *ifp; in __ipv6_chk_addr_and_flags() local
1953 hlist_for_each_entry_rcu(ifp, &net->ipv6.inet6_addr_lst[hash], addr_lst) { in __ipv6_chk_addr_and_flags()
1954 ndev = ifp->idev->dev; in __ipv6_chk_addr_and_flags()
1962 ifp_flags = (ifp->flags&IFA_F_OPTIMISTIC) in __ipv6_chk_addr_and_flags()
1963 ? (ifp->flags&~IFA_F_TENTATIVE) in __ipv6_chk_addr_and_flags()
1964 : ifp->flags; in __ipv6_chk_addr_and_flags()
1965 if (ipv6_addr_equal(&ifp->addr, addr) && in __ipv6_chk_addr_and_flags()
1968 !(ifp->scope&(IFA_LINK|IFA_HOST) || strict))) { in __ipv6_chk_addr_and_flags()
2055 struct inet6_ifaddr *ifp, *result = NULL; in ipv6_get_ifaddr() local
2058 hlist_for_each_entry_rcu(ifp, &net->ipv6.inet6_addr_lst[hash], addr_lst) { in ipv6_get_ifaddr()
2059 if (ipv6_addr_equal(&ifp->addr, addr)) { in ipv6_get_ifaddr()
2060 if (!dev || ifp->idev->dev == dev || in ipv6_get_ifaddr()
2061 !(ifp->scope&(IFA_LINK|IFA_HOST) || strict)) { in ipv6_get_ifaddr()
2062 if (in6_ifa_hold_safe(ifp)) { in ipv6_get_ifaddr()
2063 result = ifp; in ipv6_get_ifaddr()
2076 static void addrconf_dad_stop(struct inet6_ifaddr *ifp, int dad_failed) in addrconf_dad_stop() argument
2079 ifp->flags |= IFA_F_DADFAILED; in addrconf_dad_stop()
2081 if (ifp->flags&IFA_F_TEMPORARY) { in addrconf_dad_stop()
2083 spin_lock_bh(&ifp->lock); in addrconf_dad_stop()
2084 ifpub = ifp->ifpub; in addrconf_dad_stop()
2087 spin_unlock_bh(&ifp->lock); in addrconf_dad_stop()
2091 spin_unlock_bh(&ifp->lock); in addrconf_dad_stop()
2093 ipv6_del_addr(ifp); in addrconf_dad_stop()
2094 } else if (ifp->flags&IFA_F_PERMANENT || !dad_failed) { in addrconf_dad_stop()
2095 spin_lock_bh(&ifp->lock); in addrconf_dad_stop()
2096 addrconf_del_dad_work(ifp); in addrconf_dad_stop()
2097 ifp->flags |= IFA_F_TENTATIVE; in addrconf_dad_stop()
2099 ifp->flags &= ~IFA_F_OPTIMISTIC; in addrconf_dad_stop()
2100 spin_unlock_bh(&ifp->lock); in addrconf_dad_stop()
2102 ipv6_ifa_notify(0, ifp); in addrconf_dad_stop()
2103 in6_ifa_put(ifp); in addrconf_dad_stop()
2105 ipv6_del_addr(ifp); in addrconf_dad_stop()
2109 static int addrconf_dad_end(struct inet6_ifaddr *ifp) in addrconf_dad_end() argument
2113 spin_lock_bh(&ifp->lock); in addrconf_dad_end()
2114 if (ifp->state == INET6_IFADDR_STATE_DAD) { in addrconf_dad_end()
2115 ifp->state = INET6_IFADDR_STATE_POSTDAD; in addrconf_dad_end()
2118 spin_unlock_bh(&ifp->lock); in addrconf_dad_end()
2123 void addrconf_dad_failure(struct sk_buff *skb, struct inet6_ifaddr *ifp) in addrconf_dad_failure() argument
2125 struct inet6_dev *idev = ifp->idev; in addrconf_dad_failure()
2128 if (addrconf_dad_end(ifp)) { in addrconf_dad_failure()
2129 in6_ifa_put(ifp); in addrconf_dad_failure()
2134 ifp->idev->dev->name, &ifp->addr, eth_hdr(skb)->h_source); in addrconf_dad_failure()
2136 spin_lock_bh(&ifp->lock); in addrconf_dad_failure()
2138 if (ifp->flags & IFA_F_STABLE_PRIVACY) { in addrconf_dad_failure()
2141 int retries = ifp->stable_privacy_retry + 1; in addrconf_dad_failure()
2144 .plen = ifp->prefix_len, in addrconf_dad_failure()
2145 .ifa_flags = ifp->flags, in addrconf_dad_failure()
2146 .valid_lft = ifp->valid_lft, in addrconf_dad_failure()
2147 .preferred_lft = ifp->prefered_lft, in addrconf_dad_failure()
2148 .scope = ifp->scope, in addrconf_dad_failure()
2153 ifp->idev->dev->name); in addrconf_dad_failure()
2157 new_addr = ifp->addr; in addrconf_dad_failure()
2162 spin_unlock_bh(&ifp->lock); in addrconf_dad_failure()
2170 ifp->idev->dev->name); in addrconf_dad_failure()
2184 spin_lock_bh(&ifp->lock); in addrconf_dad_failure()
2189 ifp->state = INET6_IFADDR_STATE_ERRDAD; in addrconf_dad_failure()
2190 spin_unlock_bh(&ifp->lock); in addrconf_dad_failure()
2192 addrconf_mod_dad_work(ifp, 0); in addrconf_dad_failure()
2193 in6_ifa_put(ifp); in addrconf_dad_failure()
2222 static void addrconf_join_anycast(struct inet6_ifaddr *ifp) in addrconf_join_anycast() argument
2226 if (ifp->prefix_len >= 127) /* RFC 6164 */ in addrconf_join_anycast()
2228 ipv6_addr_prefix(&addr, &ifp->addr, ifp->prefix_len); in addrconf_join_anycast()
2231 __ipv6_dev_ac_inc(ifp->idev, &addr); in addrconf_join_anycast()
2235 static void addrconf_leave_anycast(struct inet6_ifaddr *ifp) in addrconf_leave_anycast() argument
2239 if (ifp->prefix_len >= 127) /* RFC 6164 */ in addrconf_leave_anycast()
2241 ipv6_addr_prefix(&addr, &ifp->addr, ifp->prefix_len); in addrconf_leave_anycast()
2244 __ipv6_dev_ac_dec(ifp->idev, &addr); in addrconf_leave_anycast()
2369 struct inet6_ifaddr *ifp; in ipv6_inherit_eui64() local
2372 list_for_each_entry_reverse(ifp, &idev->addr_list, if_list) { in ipv6_inherit_eui64()
2373 if (ifp->scope > IFA_LINK) in ipv6_inherit_eui64()
2375 if (ifp->scope == IFA_LINK && !(ifp->flags&IFA_F_TENTATIVE)) { in ipv6_inherit_eui64()
2376 memcpy(eui, ifp->addr.s6_addr+8, 8); in ipv6_inherit_eui64()
2539 struct inet6_ifaddr *ifp) in delete_tempaddrs() argument
2545 if (ift->ifpub != ifp) in delete_tempaddrs()
2557 struct inet6_ifaddr *ifp, in manage_tempaddrs() argument
2569 if (ifp != ift->ifpub) in manage_tempaddrs()
2623 ipv6_create_tempaddr(ifp, false); in manage_tempaddrs()
2642 struct inet6_ifaddr *ifp = ipv6_get_ifaddr(net, addr, dev, 1); in addrconf_prefix_rcv_add_addr() local
2645 if (!ifp && valid_lft) { in addrconf_prefix_rcv_add_addr()
2669 ifp = ipv6_add_addr(in6_dev, &cfg, false, NULL); in addrconf_prefix_rcv_add_addr()
2671 if (IS_ERR_OR_NULL(ifp)) in addrconf_prefix_rcv_add_addr()
2675 spin_lock_bh(&ifp->lock); in addrconf_prefix_rcv_add_addr()
2676 ifp->flags |= IFA_F_MANAGETEMPADDR; in addrconf_prefix_rcv_add_addr()
2677 ifp->cstamp = jiffies; in addrconf_prefix_rcv_add_addr()
2678 ifp->tokenized = tokenized; in addrconf_prefix_rcv_add_addr()
2679 spin_unlock_bh(&ifp->lock); in addrconf_prefix_rcv_add_addr()
2680 addrconf_dad_start(ifp); in addrconf_prefix_rcv_add_addr()
2683 if (ifp) { in addrconf_prefix_rcv_add_addr()
2689 spin_lock_bh(&ifp->lock); in addrconf_prefix_rcv_add_addr()
2691 if (ifp->valid_lft > (now - ifp->tstamp) / HZ) in addrconf_prefix_rcv_add_addr()
2692 stored_lft = ifp->valid_lft - (now - ifp->tstamp) / HZ; in addrconf_prefix_rcv_add_addr()
2714 ifp->valid_lft = valid_lft; in addrconf_prefix_rcv_add_addr()
2715 ifp->prefered_lft = prefered_lft; in addrconf_prefix_rcv_add_addr()
2716 ifp->tstamp = now; in addrconf_prefix_rcv_add_addr()
2717 flags = ifp->flags; in addrconf_prefix_rcv_add_addr()
2718 ifp->flags &= ~IFA_F_DEPRECATED; in addrconf_prefix_rcv_add_addr()
2719 spin_unlock_bh(&ifp->lock); in addrconf_prefix_rcv_add_addr()
2722 ipv6_ifa_notify(0, ifp); in addrconf_prefix_rcv_add_addr()
2724 spin_unlock_bh(&ifp->lock); in addrconf_prefix_rcv_add_addr()
2726 manage_tempaddrs(in6_dev, ifp, valid_lft, prefered_lft, in addrconf_prefix_rcv_add_addr()
2729 in6_ifa_put(ifp); in addrconf_prefix_rcv_add_addr()
2967 struct inet6_ifaddr *ifp; in inet6_addr_add() local
3032 ifp = ipv6_add_addr(idev, cfg, true, extack); in inet6_addr_add()
3033 if (!IS_ERR(ifp)) { in inet6_addr_add()
3035 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, in inet6_addr_add()
3036 ifp->rt_priority, dev, expires, in inet6_addr_add()
3043 if (!(ifp->flags & (IFA_F_OPTIMISTIC | IFA_F_NODAD))) in inet6_addr_add()
3044 ipv6_ifa_notify(0, ifp); in inet6_addr_add()
3050 addrconf_dad_start(ifp); in inet6_addr_add()
3052 manage_tempaddrs(idev, ifp, cfg->valid_lft, in inet6_addr_add()
3054 in6_ifa_put(ifp); in inet6_addr_add()
3062 return PTR_ERR(ifp); in inet6_addr_add()
3069 struct inet6_ifaddr *ifp; in inet6_addr_del() local
3091 list_for_each_entry(ifp, &idev->addr_list, if_list) { in inet6_addr_del()
3092 if (ifp->prefix_len == plen && in inet6_addr_del()
3093 ipv6_addr_equal(pfx, &ifp->addr)) { in inet6_addr_del()
3094 in6_ifa_hold(ifp); in inet6_addr_del()
3097 ipv6_del_addr(ifp); in inet6_addr_del()
3099 if (!(ifp->flags & IFA_F_TEMPORARY) && in inet6_addr_del()
3100 (ifp->flags & IFA_F_MANAGETEMPADDR)) in inet6_addr_del()
3101 delete_tempaddrs(idev, ifp); in inet6_addr_del()
3164 struct inet6_ifaddr *ifp; in add_addr() local
3175 ifp = ipv6_add_addr(idev, &cfg, true, NULL); in add_addr()
3176 if (!IS_ERR(ifp)) { in add_addr()
3177 spin_lock_bh(&ifp->lock); in add_addr()
3178 ifp->flags &= ~IFA_F_TENTATIVE; in add_addr()
3179 spin_unlock_bh(&ifp->lock); in add_addr()
3181 ipv6_ifa_notify(RTM_NEWADDR, ifp); in add_addr()
3182 in6_ifa_put(ifp); in add_addr()
3279 struct inet6_ifaddr *ifp; in addrconf_add_linklocal() local
3288 ifp = ipv6_add_addr(idev, &cfg, true, NULL); in addrconf_add_linklocal()
3289 if (!IS_ERR(ifp)) { in addrconf_add_linklocal()
3290 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, 0, idev->dev, in addrconf_add_linklocal()
3292 addrconf_dad_start(ifp); in addrconf_add_linklocal()
3293 in6_ifa_put(ifp); in addrconf_add_linklocal()
3549 struct inet6_ifaddr *ifp) in fixup_permanent_addr() argument
3555 if (!ifp->rt || !ifp->rt->fib6_node) { in fixup_permanent_addr()
3558 f6i = addrconf_f6i_alloc(net, idev, &ifp->addr, false, in fixup_permanent_addr()
3563 /* ifp->rt can be accessed outside of rtnl */ in fixup_permanent_addr()
3564 spin_lock(&ifp->lock); in fixup_permanent_addr()
3565 prev = ifp->rt; in fixup_permanent_addr()
3566 ifp->rt = f6i; in fixup_permanent_addr()
3567 spin_unlock(&ifp->lock); in fixup_permanent_addr()
3572 if (!(ifp->flags & IFA_F_NOPREFIXROUTE)) { in fixup_permanent_addr()
3573 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, in fixup_permanent_addr()
3574 ifp->rt_priority, idev->dev, 0, 0, in fixup_permanent_addr()
3578 if (ifp->state == INET6_IFADDR_STATE_PREDAD) in fixup_permanent_addr()
3579 addrconf_dad_start(ifp); in fixup_permanent_addr()
3586 struct inet6_ifaddr *ifp, *tmp; in addrconf_permanent_addr() local
3595 list_for_each_entry_safe(ifp, tmp, &idev->addr_list, if_list) { in addrconf_permanent_addr()
3596 if ((ifp->flags & IFA_F_PERMANENT) && in addrconf_permanent_addr()
3597 fixup_permanent_addr(net, idev, ifp) < 0) { in addrconf_permanent_addr()
3599 in6_ifa_hold(ifp); in addrconf_permanent_addr()
3600 ipv6_del_addr(ifp); in addrconf_permanent_addr()
3604 idev->dev->name, &ifp->addr); in addrconf_permanent_addr()
4039 static void addrconf_dad_kick(struct inet6_ifaddr *ifp) in addrconf_dad_kick() argument
4042 struct inet6_dev *idev = ifp->idev; in addrconf_dad_kick()
4045 if (ifp->flags & IFA_F_OPTIMISTIC) in addrconf_dad_kick()
4057 ifp->dad_nonce = nonce; in addrconf_dad_kick()
4058 ifp->dad_probes = idev->cnf.dad_transmits; in addrconf_dad_kick()
4059 addrconf_mod_dad_work(ifp, rand_num); in addrconf_dad_kick()
4062 static void addrconf_dad_begin(struct inet6_ifaddr *ifp) in addrconf_dad_begin() argument
4064 struct inet6_dev *idev = ifp->idev; in addrconf_dad_begin()
4069 addrconf_join_solict(dev, &ifp->addr); in addrconf_dad_begin()
4072 spin_lock(&ifp->lock); in addrconf_dad_begin()
4073 if (ifp->state == INET6_IFADDR_STATE_DEAD) in addrconf_dad_begin()
4080 !(ifp->flags&IFA_F_TENTATIVE) || in addrconf_dad_begin()
4081 ifp->flags & IFA_F_NODAD) { in addrconf_dad_begin()
4084 if (ifp->flags & IFA_F_TENTATIVE && in addrconf_dad_begin()
4085 !(ifp->flags & IFA_F_OPTIMISTIC)) in addrconf_dad_begin()
4087 bump_id = ifp->flags & IFA_F_TENTATIVE; in addrconf_dad_begin()
4088 ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED); in addrconf_dad_begin()
4089 spin_unlock(&ifp->lock); in addrconf_dad_begin()
4092 addrconf_dad_completed(ifp, bump_id, send_na); in addrconf_dad_begin()
4097 spin_unlock(&ifp->lock); in addrconf_dad_begin()
4104 in6_ifa_hold(ifp); in addrconf_dad_begin()
4105 addrconf_dad_stop(ifp, 0); in addrconf_dad_begin()
4113 if (ifp->flags & IFA_F_OPTIMISTIC) { in addrconf_dad_begin()
4114 ip6_ins_rt(net, ifp->rt); in addrconf_dad_begin()
4123 addrconf_dad_kick(ifp); in addrconf_dad_begin()
4125 spin_unlock(&ifp->lock); in addrconf_dad_begin()
4128 ipv6_ifa_notify(RTM_NEWADDR, ifp); in addrconf_dad_begin()
4131 static void addrconf_dad_start(struct inet6_ifaddr *ifp) in addrconf_dad_start() argument
4135 spin_lock_bh(&ifp->lock); in addrconf_dad_start()
4136 if (ifp->state != INET6_IFADDR_STATE_DEAD) { in addrconf_dad_start()
4137 ifp->state = INET6_IFADDR_STATE_PREDAD; in addrconf_dad_start()
4140 spin_unlock_bh(&ifp->lock); in addrconf_dad_start()
4143 addrconf_mod_dad_work(ifp, 0); in addrconf_dad_start()
4148 struct inet6_ifaddr *ifp = container_of(to_delayed_work(w), in addrconf_dad_work() local
4151 struct inet6_dev *idev = ifp->idev; in addrconf_dad_work()
4163 spin_lock_bh(&ifp->lock); in addrconf_dad_work()
4164 if (ifp->state == INET6_IFADDR_STATE_PREDAD) { in addrconf_dad_work()
4166 ifp->state = INET6_IFADDR_STATE_DAD; in addrconf_dad_work()
4167 } else if (ifp->state == INET6_IFADDR_STATE_ERRDAD) { in addrconf_dad_work()
4169 ifp->state = INET6_IFADDR_STATE_POSTDAD; in addrconf_dad_work()
4174 !(ifp->flags & IFA_F_STABLE_PRIVACY)) { in addrconf_dad_work()
4181 ipv6_addr_equal(&ifp->addr, &addr)) { in addrconf_dad_work()
4186 ifp->idev->dev->name); in addrconf_dad_work()
4191 spin_unlock_bh(&ifp->lock); in addrconf_dad_work()
4194 addrconf_dad_begin(ifp); in addrconf_dad_work()
4197 in6_ifa_hold(ifp); in addrconf_dad_work()
4198 addrconf_dad_stop(ifp, 1); in addrconf_dad_work()
4204 if (!ifp->dad_probes && addrconf_dad_end(ifp)) in addrconf_dad_work()
4213 spin_lock(&ifp->lock); in addrconf_dad_work()
4214 if (ifp->state == INET6_IFADDR_STATE_DEAD) { in addrconf_dad_work()
4215 spin_unlock(&ifp->lock); in addrconf_dad_work()
4220 if (ifp->dad_probes == 0) { in addrconf_dad_work()
4227 if (ifp->flags & IFA_F_TENTATIVE && in addrconf_dad_work()
4228 !(ifp->flags & IFA_F_OPTIMISTIC)) in addrconf_dad_work()
4230 bump_id = ifp->flags & IFA_F_TENTATIVE; in addrconf_dad_work()
4231 ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED); in addrconf_dad_work()
4232 spin_unlock(&ifp->lock); in addrconf_dad_work()
4235 addrconf_dad_completed(ifp, bump_id, send_na); in addrconf_dad_work()
4240 ifp->dad_probes--; in addrconf_dad_work()
4241 addrconf_mod_dad_work(ifp, in addrconf_dad_work()
4242 max(NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME), in addrconf_dad_work()
4244 spin_unlock(&ifp->lock); in addrconf_dad_work()
4248 addrconf_addr_solict_mult(&ifp->addr, &mcaddr); in addrconf_dad_work()
4249 ndisc_send_ns(ifp->idev->dev, &ifp->addr, &mcaddr, &in6addr_any, in addrconf_dad_work()
4250 ifp->dad_nonce); in addrconf_dad_work()
4252 in6_ifa_put(ifp); in addrconf_dad_work()
4256 /* ifp->idev must be at least read locked */
4257 static bool ipv6_lonely_lladdr(struct inet6_ifaddr *ifp) in ipv6_lonely_lladdr() argument
4260 struct inet6_dev *idev = ifp->idev; in ipv6_lonely_lladdr()
4265 if (ifp != ifpiter && ifpiter->scope == IFA_LINK && in ipv6_lonely_lladdr()
4274 static void addrconf_dad_completed(struct inet6_ifaddr *ifp, bool bump_id, in addrconf_dad_completed() argument
4277 struct net_device *dev = ifp->idev->dev; in addrconf_dad_completed()
4281 addrconf_del_dad_work(ifp); in addrconf_dad_completed()
4287 ipv6_ifa_notify(RTM_NEWADDR, ifp); in addrconf_dad_completed()
4293 read_lock_bh(&ifp->idev->lock); in addrconf_dad_completed()
4294 send_mld = ifp->scope == IFA_LINK && ipv6_lonely_lladdr(ifp); in addrconf_dad_completed()
4296 ipv6_accept_ra(ifp->idev) && in addrconf_dad_completed()
4297 ifp->idev->cnf.rtr_solicits != 0 && in addrconf_dad_completed()
4301 read_unlock_bh(&ifp->idev->lock); in addrconf_dad_completed()
4307 ipv6_mc_dad_complete(ifp->idev); in addrconf_dad_completed()
4311 (ifp->idev->cnf.ndisc_notify || in addrconf_dad_completed()
4313 ndisc_send_na(dev, &in6addr_linklocal_allnodes, &ifp->addr, in addrconf_dad_completed()
4314 /*router=*/ !!ifp->idev->cnf.forwarding, in addrconf_dad_completed()
4329 write_lock_bh(&ifp->idev->lock); in addrconf_dad_completed()
4330 spin_lock(&ifp->lock); in addrconf_dad_completed()
4331 ifp->idev->rs_interval = rfc3315_s14_backoff_init( in addrconf_dad_completed()
4332 ifp->idev->cnf.rtr_solicit_interval); in addrconf_dad_completed()
4333 ifp->idev->rs_probes = 1; in addrconf_dad_completed()
4334 ifp->idev->if_flags |= IF_RS_SENT; in addrconf_dad_completed()
4335 addrconf_mod_rs_timer(ifp->idev, ifp->idev->rs_interval); in addrconf_dad_completed()
4336 spin_unlock(&ifp->lock); in addrconf_dad_completed()
4337 write_unlock_bh(&ifp->idev->lock); in addrconf_dad_completed()
4346 if (ifp->flags & IFA_F_TEMPORARY) in addrconf_dad_completed()
4352 struct inet6_ifaddr *ifp; in addrconf_dad_run() local
4355 list_for_each_entry(ifp, &idev->addr_list, if_list) { in addrconf_dad_run()
4356 spin_lock(&ifp->lock); in addrconf_dad_run()
4357 if ((ifp->flags & IFA_F_TENTATIVE && in addrconf_dad_run()
4358 ifp->state == INET6_IFADDR_STATE_DAD) || restart) { in addrconf_dad_run()
4360 ifp->state = INET6_IFADDR_STATE_PREDAD; in addrconf_dad_run()
4361 addrconf_dad_kick(ifp); in addrconf_dad_run()
4363 spin_unlock(&ifp->lock); in addrconf_dad_run()
4452 struct inet6_ifaddr *ifp = (struct inet6_ifaddr *)v; in if6_seq_show() local
4454 &ifp->addr, in if6_seq_show()
4455 ifp->idev->dev->ifindex, in if6_seq_show()
4456 ifp->prefix_len, in if6_seq_show()
4457 ifp->scope, in if6_seq_show()
4458 (u8) ifp->flags, in if6_seq_show()
4459 ifp->idev->dev->name); in if6_seq_show()
4504 struct inet6_ifaddr *ifp = NULL; in ipv6_chk_home_addr() local
4508 hlist_for_each_entry_rcu(ifp, &net->ipv6.inet6_addr_lst[hash], addr_lst) { in ipv6_chk_home_addr()
4509 if (ipv6_addr_equal(&ifp->addr, addr) && in ipv6_chk_home_addr()
4510 (ifp->flags & IFA_F_HOMEADDRESS)) { in ipv6_chk_home_addr()
4535 struct inet6_ifaddr *ifp; in ipv6_chk_rpl_srh_loop() local
4546 hlist_for_each_entry_rcu(ifp, &net->ipv6.inet6_addr_lst[hash], addr_lst) { in ipv6_chk_rpl_srh_loop()
4548 if (ipv6_addr_equal(&ifp->addr, addr)) { in ipv6_chk_rpl_srh_loop()
4578 struct inet6_ifaddr *ifp; in addrconf_verify_rtnl() local
4591 hlist_for_each_entry_rcu_bh(ifp, &net->ipv6.inet6_addr_lst[i], addr_lst) { in addrconf_verify_rtnl()
4598 if ((ifp->flags & IFA_F_PERMANENT) && in addrconf_verify_rtnl()
4599 (ifp->prefered_lft == INFINITY_LIFE_TIME)) in addrconf_verify_rtnl()
4602 spin_lock(&ifp->lock); in addrconf_verify_rtnl()
4604 age = (now - ifp->tstamp + ADDRCONF_TIMER_FUZZ_MINUS) / HZ; in addrconf_verify_rtnl()
4606 if ((ifp->flags&IFA_F_TEMPORARY) && in addrconf_verify_rtnl()
4607 !(ifp->flags&IFA_F_TENTATIVE) && in addrconf_verify_rtnl()
4608 ifp->prefered_lft != INFINITY_LIFE_TIME && in addrconf_verify_rtnl()
4609 !ifp->regen_count && ifp->ifpub) { in addrconf_verify_rtnl()
4612 unsigned long regen_advance = ifp->idev->cnf.regen_max_retry * in addrconf_verify_rtnl()
4613 ifp->idev->cnf.dad_transmits * in addrconf_verify_rtnl()
4614 max(NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME), HZ/100) / HZ; in addrconf_verify_rtnl()
4616 if (age + regen_advance >= ifp->prefered_lft) { in addrconf_verify_rtnl()
4617 struct inet6_ifaddr *ifpub = ifp->ifpub; in addrconf_verify_rtnl()
4618 if (time_before(ifp->tstamp + ifp->prefered_lft * HZ, next)) in addrconf_verify_rtnl()
4619 next = ifp->tstamp + ifp->prefered_lft * HZ; in addrconf_verify_rtnl()
4621 ifp->regen_count++; in addrconf_verify_rtnl()
4622 in6_ifa_hold(ifp); in addrconf_verify_rtnl()
4624 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
4632 in6_ifa_put(ifp); in addrconf_verify_rtnl()
4635 } else if (time_before(ifp->tstamp + ifp->prefered_lft * HZ - regen_advance * HZ, next)) in addrconf_verify_rtnl()
4636 next = ifp->tstamp + ifp->prefered_lft * HZ - regen_advance * HZ; in addrconf_verify_rtnl()
4639 if (ifp->valid_lft != INFINITY_LIFE_TIME && in addrconf_verify_rtnl()
4640 age >= ifp->valid_lft) { in addrconf_verify_rtnl()
4641 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
4642 in6_ifa_hold(ifp); in addrconf_verify_rtnl()
4644 ipv6_del_addr(ifp); in addrconf_verify_rtnl()
4647 } else if (ifp->prefered_lft == INFINITY_LIFE_TIME) { in addrconf_verify_rtnl()
4648 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
4650 } else if (age >= ifp->prefered_lft) { in addrconf_verify_rtnl()
4651 /* jiffies - ifp->tstamp > age >= ifp->prefered_lft */ in addrconf_verify_rtnl()
4654 if (!(ifp->flags&IFA_F_DEPRECATED)) { in addrconf_verify_rtnl()
4656 ifp->flags |= IFA_F_DEPRECATED; in addrconf_verify_rtnl()
4659 if ((ifp->valid_lft != INFINITY_LIFE_TIME) && in addrconf_verify_rtnl()
4660 (time_before(ifp->tstamp + ifp->valid_lft * HZ, next))) in addrconf_verify_rtnl()
4661 next = ifp->tstamp + ifp->valid_lft * HZ; in addrconf_verify_rtnl()
4663 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
4666 in6_ifa_hold(ifp); in addrconf_verify_rtnl()
4668 ipv6_ifa_notify(0, ifp); in addrconf_verify_rtnl()
4669 in6_ifa_put(ifp); in addrconf_verify_rtnl()
4673 /* ifp->prefered_lft <= ifp->valid_lft */ in addrconf_verify_rtnl()
4674 if (time_before(ifp->tstamp + ifp->prefered_lft * HZ, next)) in addrconf_verify_rtnl()
4675 next = ifp->tstamp + ifp->prefered_lft * HZ; in addrconf_verify_rtnl()
4676 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
4772 static int modify_prefix_route(struct inet6_ifaddr *ifp, in modify_prefix_route() argument
4779 f6i = addrconf_get_prefix_route(modify_peer ? &ifp->peer_addr : &ifp->addr, in modify_prefix_route()
4780 ifp->prefix_len, in modify_prefix_route()
4781 ifp->idev->dev, 0, RTF_DEFAULT, true); in modify_prefix_route()
4785 prio = ifp->rt_priority ? : IP6_RT_PRIO_ADDRCONF; in modify_prefix_route()
4788 ip6_del_rt(dev_net(ifp->idev->dev), f6i, false); in modify_prefix_route()
4791 addrconf_prefix_route(modify_peer ? &ifp->peer_addr : &ifp->addr, in modify_prefix_route()
4792 ifp->prefix_len, in modify_prefix_route()
4793 ifp->rt_priority, ifp->idev->dev, in modify_prefix_route()
4807 static int inet6_addr_modify(struct net *net, struct inet6_ifaddr *ifp, in inet6_addr_modify() argument
4823 (ifp->flags & IFA_F_TEMPORARY || ifp->prefix_len != 64)) in inet6_addr_modify()
4826 if (!(ifp->flags & IFA_F_TENTATIVE) || ifp->flags & IFA_F_DADFAILED) in inet6_addr_modify()
4848 memcmp(&ifp->peer_addr, cfg->peer_pfx, sizeof(struct in6_addr))) { in inet6_addr_modify()
4849 if (!ipv6_addr_any(&ifp->peer_addr)) in inet6_addr_modify()
4850 cleanup_prefix_route(ifp, expires, true, true); in inet6_addr_modify()
4854 spin_lock_bh(&ifp->lock); in inet6_addr_modify()
4855 was_managetempaddr = ifp->flags & IFA_F_MANAGETEMPADDR; in inet6_addr_modify()
4856 had_prefixroute = ifp->flags & IFA_F_PERMANENT && in inet6_addr_modify()
4857 !(ifp->flags & IFA_F_NOPREFIXROUTE); in inet6_addr_modify()
4858 ifp->flags &= ~(IFA_F_DEPRECATED | IFA_F_PERMANENT | IFA_F_NODAD | in inet6_addr_modify()
4861 ifp->flags |= cfg->ifa_flags; in inet6_addr_modify()
4862 ifp->tstamp = jiffies; in inet6_addr_modify()
4863 ifp->valid_lft = cfg->valid_lft; in inet6_addr_modify()
4864 ifp->prefered_lft = cfg->preferred_lft; in inet6_addr_modify()
4865 ifp->ifa_proto = cfg->ifa_proto; in inet6_addr_modify()
4867 if (cfg->rt_priority && cfg->rt_priority != ifp->rt_priority) in inet6_addr_modify()
4868 ifp->rt_priority = cfg->rt_priority; in inet6_addr_modify()
4871 ifp->peer_addr = *cfg->peer_pfx; in inet6_addr_modify()
4873 spin_unlock_bh(&ifp->lock); in inet6_addr_modify()
4874 if (!(ifp->flags&IFA_F_TENTATIVE)) in inet6_addr_modify()
4875 ipv6_ifa_notify(0, ifp); in inet6_addr_modify()
4881 rc = modify_prefix_route(ifp, expires, flags, false); in inet6_addr_modify()
4885 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, in inet6_addr_modify()
4886 ifp->rt_priority, ifp->idev->dev, in inet6_addr_modify()
4890 if (had_prefixroute && !ipv6_addr_any(&ifp->peer_addr)) in inet6_addr_modify()
4891 rc = modify_prefix_route(ifp, expires, flags, true); in inet6_addr_modify()
4893 if (rc == -ENOENT && !ipv6_addr_any(&ifp->peer_addr)) { in inet6_addr_modify()
4894 addrconf_prefix_route(&ifp->peer_addr, ifp->prefix_len, in inet6_addr_modify()
4895 ifp->rt_priority, ifp->idev->dev, in inet6_addr_modify()
4902 write_lock_bh(&ifp->idev->lock); in inet6_addr_modify()
4903 action = check_cleanup_prefix_route(ifp, &rt_expires); in inet6_addr_modify()
4904 write_unlock_bh(&ifp->idev->lock); in inet6_addr_modify()
4907 cleanup_prefix_route(ifp, rt_expires, in inet6_addr_modify()
4912 if (was_managetempaddr || ifp->flags & IFA_F_MANAGETEMPADDR) { in inet6_addr_modify()
4913 if (was_managetempaddr && !(ifp->flags & IFA_F_MANAGETEMPADDR)) in inet6_addr_modify()
4914 delete_tempaddrs(ifp->idev, ifp); in inet6_addr_modify()
4916 manage_tempaddrs(ifp->idev, ifp, cfg->valid_lft, in inet6_addr_modify()
5833 struct inet6_ifaddr *ifp; in inet6_set_iftoken() local
5899 list_for_each_entry(ifp, &idev->addr_list, if_list) { in inet6_set_iftoken()
5900 spin_lock(&ifp->lock); in inet6_set_iftoken()
5901 if (ifp->tokenized) { in inet6_set_iftoken()
5902 ifp->valid_lft = 0; in inet6_set_iftoken()
5903 ifp->prefered_lft = 0; in inet6_set_iftoken()
5905 spin_unlock(&ifp->lock); in inet6_set_iftoken()
6216 static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp) in __ipv6_ifa_notify() argument
6218 struct net *net = dev_net(ifp->idev->dev); in __ipv6_ifa_notify()
6223 inet6_ifa_notify(event ? : RTM_NEWADDR, ifp); in __ipv6_ifa_notify()
6235 if (ifp->rt && !rcu_access_pointer(ifp->rt->fib6_node)) { in __ipv6_ifa_notify()
6236 ip6_ins_rt(net, ifp->rt); in __ipv6_ifa_notify()
6237 } else if (!ifp->rt && (ifp->idev->dev->flags & IFF_UP)) { in __ipv6_ifa_notify()
6239 &ifp->addr, ifp->idev->dev->name); in __ipv6_ifa_notify()
6242 if (ifp->idev->cnf.forwarding) in __ipv6_ifa_notify()
6243 addrconf_join_anycast(ifp); in __ipv6_ifa_notify()
6244 if (!ipv6_addr_any(&ifp->peer_addr)) in __ipv6_ifa_notify()
6245 addrconf_prefix_route(&ifp->peer_addr, 128, in __ipv6_ifa_notify()
6246 ifp->rt_priority, ifp->idev->dev, in __ipv6_ifa_notify()
6250 if (ifp->idev->cnf.forwarding) in __ipv6_ifa_notify()
6251 addrconf_leave_anycast(ifp); in __ipv6_ifa_notify()
6252 addrconf_leave_solict(ifp->idev, &ifp->addr); in __ipv6_ifa_notify()
6253 if (!ipv6_addr_any(&ifp->peer_addr)) { in __ipv6_ifa_notify()
6256 rt = addrconf_get_prefix_route(&ifp->peer_addr, 128, in __ipv6_ifa_notify()
6257 ifp->idev->dev, 0, 0, in __ipv6_ifa_notify()
6262 if (ifp->rt) { in __ipv6_ifa_notify()
6263 ip6_del_rt(net, ifp->rt, false); in __ipv6_ifa_notify()
6264 ifp->rt = NULL; in __ipv6_ifa_notify()
6272 static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp) in ipv6_ifa_notify() argument
6274 if (likely(ifp->idev->dead == 0)) in ipv6_ifa_notify()
6275 __ipv6_ifa_notify(event, ifp); in ipv6_ifa_notify()