Lines Matching refs:ifp

163 static void addrconf_join_anycast(struct inet6_ifaddr *ifp);
164 static void addrconf_leave_anycast(struct inet6_ifaddr *ifp);
176 static void addrconf_dad_start(struct inet6_ifaddr *ifp);
178 static void addrconf_dad_completed(struct inet6_ifaddr *ifp, bool bump_id,
312 static void addrconf_del_dad_work(struct inet6_ifaddr *ifp) in addrconf_del_dad_work() argument
314 if (cancel_delayed_work(&ifp->dad_work)) in addrconf_del_dad_work()
315 __in6_ifa_put(ifp); in addrconf_del_dad_work()
326 static void addrconf_mod_dad_work(struct inet6_ifaddr *ifp, in addrconf_mod_dad_work() argument
329 in6_ifa_hold(ifp); in addrconf_mod_dad_work()
330 if (mod_delayed_work(addrconf_wq, &ifp->dad_work, delay)) in addrconf_mod_dad_work()
331 in6_ifa_put(ifp); in addrconf_mod_dad_work()
964 void inet6_ifa_finish_destroy(struct inet6_ifaddr *ifp) in inet6_ifa_finish_destroy() argument
966 WARN_ON(!hlist_unhashed(&ifp->addr_lst)); in inet6_ifa_finish_destroy()
972 in6_dev_put(ifp->idev); in inet6_ifa_finish_destroy()
974 if (cancel_delayed_work(&ifp->dad_work)) in inet6_ifa_finish_destroy()
976 ifp); in inet6_ifa_finish_destroy()
978 if (ifp->state != INET6_IFADDR_STATE_DEAD) { in inet6_ifa_finish_destroy()
979 pr_warn("Freeing alive inet6 address %p\n", ifp); in inet6_ifa_finish_destroy()
983 kfree_rcu(ifp, rcu); in inet6_ifa_finish_destroy()
987 ipv6_link_dev_addr(struct inet6_dev *idev, struct inet6_ifaddr *ifp) in ipv6_link_dev_addr() argument
990 int ifp_scope = ipv6_addr_src_scope(&ifp->addr); in ipv6_link_dev_addr()
1003 list_add_tail_rcu(&ifp->if_list, p); in ipv6_link_dev_addr()
1016 struct inet6_ifaddr *ifp; in ipv6_chk_same_addr() local
1018 hlist_for_each_entry(ifp, &inet6_addr_lst[hash], addr_lst) { in ipv6_chk_same_addr()
1019 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_chk_same_addr()
1021 if (ipv6_addr_equal(&ifp->addr, addr)) { in ipv6_chk_same_addr()
1022 if (!dev || ifp->idev->dev == dev) in ipv6_chk_same_addr()
1202 check_cleanup_prefix_route(struct inet6_ifaddr *ifp, unsigned long *expires) in check_cleanup_prefix_route() argument
1205 struct inet6_dev *idev = ifp->idev; in check_cleanup_prefix_route()
1212 if (ifa == ifp) in check_cleanup_prefix_route()
1214 if (ifa->prefix_len != ifp->prefix_len || in check_cleanup_prefix_route()
1215 !ipv6_prefix_equal(&ifa->addr, &ifp->addr, in check_cleanup_prefix_route()
1216 ifp->prefix_len)) in check_cleanup_prefix_route()
1240 cleanup_prefix_route(struct inet6_ifaddr *ifp, unsigned long expires, in cleanup_prefix_route() argument
1245 f6i = addrconf_get_prefix_route(del_peer ? &ifp->peer_addr : &ifp->addr, in cleanup_prefix_route()
1246 ifp->prefix_len, in cleanup_prefix_route()
1247 ifp->idev->dev, 0, RTF_DEFAULT, true); in cleanup_prefix_route()
1250 ip6_del_rt(dev_net(ifp->idev->dev), f6i, false); in cleanup_prefix_route()
1262 static void ipv6_del_addr(struct inet6_ifaddr *ifp) in ipv6_del_addr() argument
1270 spin_lock_bh(&ifp->lock); in ipv6_del_addr()
1271 state = ifp->state; in ipv6_del_addr()
1272 ifp->state = INET6_IFADDR_STATE_DEAD; in ipv6_del_addr()
1273 spin_unlock_bh(&ifp->lock); in ipv6_del_addr()
1279 hlist_del_init_rcu(&ifp->addr_lst); in ipv6_del_addr()
1282 write_lock_bh(&ifp->idev->lock); in ipv6_del_addr()
1284 if (ifp->flags&IFA_F_TEMPORARY) { in ipv6_del_addr()
1285 list_del(&ifp->tmp_list); in ipv6_del_addr()
1286 if (ifp->ifpub) { in ipv6_del_addr()
1287 in6_ifa_put(ifp->ifpub); in ipv6_del_addr()
1288 ifp->ifpub = NULL; in ipv6_del_addr()
1290 __in6_ifa_put(ifp); in ipv6_del_addr()
1293 if (ifp->flags & IFA_F_PERMANENT && !(ifp->flags & IFA_F_NOPREFIXROUTE)) in ipv6_del_addr()
1294 action = check_cleanup_prefix_route(ifp, &expires); in ipv6_del_addr()
1296 list_del_rcu(&ifp->if_list); in ipv6_del_addr()
1297 __in6_ifa_put(ifp); in ipv6_del_addr()
1299 write_unlock_bh(&ifp->idev->lock); in ipv6_del_addr()
1301 addrconf_del_dad_work(ifp); in ipv6_del_addr()
1303 ipv6_ifa_notify(RTM_DELADDR, ifp); in ipv6_del_addr()
1305 inet6addr_notifier_call_chain(NETDEV_DOWN, ifp); in ipv6_del_addr()
1308 cleanup_prefix_route(ifp, expires, in ipv6_del_addr()
1313 rt6_remove_prefsrc(ifp); in ipv6_del_addr()
1315 in6_ifa_put(ifp); in ipv6_del_addr()
1318 static int ipv6_create_tempaddr(struct inet6_ifaddr *ifp, bool block) in ipv6_create_tempaddr() argument
1320 struct inet6_dev *idev = ifp->idev; in ipv6_create_tempaddr()
1342 spin_lock_bh(&ifp->lock); in ipv6_create_tempaddr()
1343 if (ifp->regen_count++ >= idev->cnf.regen_max_retry) { in ipv6_create_tempaddr()
1345 spin_unlock_bh(&ifp->lock); in ipv6_create_tempaddr()
1353 in6_ifa_hold(ifp); in ipv6_create_tempaddr()
1354 memcpy(addr.s6_addr, ifp->addr.s6_addr, 8); in ipv6_create_tempaddr()
1357 age = (now - ifp->tstamp) / HZ; in ipv6_create_tempaddr()
1382 cfg.valid_lft = min_t(__u32, ifp->valid_lft, in ipv6_create_tempaddr()
1385 cfg.preferred_lft = min_t(__u32, ifp->prefered_lft, cfg.preferred_lft); in ipv6_create_tempaddr()
1387 cfg.plen = ifp->prefix_len; in ipv6_create_tempaddr()
1388 tmp_tstamp = ifp->tstamp; in ipv6_create_tempaddr()
1389 spin_unlock_bh(&ifp->lock); in ipv6_create_tempaddr()
1402 in6_ifa_put(ifp); in ipv6_create_tempaddr()
1410 if (ifp->flags & IFA_F_OPTIMISTIC) in ipv6_create_tempaddr()
1418 in6_ifa_put(ifp); in ipv6_create_tempaddr()
1426 ift->ifpub = ifp; in ipv6_create_tempaddr()
1845 struct inet6_ifaddr *ifp; in __ipv6_get_lladdr() local
1848 list_for_each_entry_reverse(ifp, &idev->addr_list, if_list) { in __ipv6_get_lladdr()
1849 if (ifp->scope > IFA_LINK) in __ipv6_get_lladdr()
1851 if (ifp->scope == IFA_LINK && in __ipv6_get_lladdr()
1852 !(ifp->flags & banned_flags)) { in __ipv6_get_lladdr()
1853 *addr = ifp->addr; in __ipv6_get_lladdr()
1880 const struct inet6_ifaddr *ifp; in ipv6_count_addresses() local
1884 list_for_each_entry_rcu(ifp, &idev->addr_list, if_list) in ipv6_count_addresses()
1914 struct inet6_ifaddr *ifp; in __ipv6_chk_addr_and_flags() local
1923 hlist_for_each_entry_rcu(ifp, &inet6_addr_lst[hash], addr_lst) { in __ipv6_chk_addr_and_flags()
1924 ndev = ifp->idev->dev; in __ipv6_chk_addr_and_flags()
1934 ifp_flags = (ifp->flags&IFA_F_OPTIMISTIC) in __ipv6_chk_addr_and_flags()
1935 ? (ifp->flags&~IFA_F_TENTATIVE) in __ipv6_chk_addr_and_flags()
1936 : ifp->flags; in __ipv6_chk_addr_and_flags()
1937 if (ipv6_addr_equal(&ifp->addr, addr) && in __ipv6_chk_addr_and_flags()
1940 !(ifp->scope&(IFA_LINK|IFA_HOST) || strict))) { in __ipv6_chk_addr_and_flags()
2026 struct inet6_ifaddr *ifp, *result = NULL; in ipv6_get_ifaddr() local
2029 hlist_for_each_entry_rcu(ifp, &inet6_addr_lst[hash], addr_lst) { in ipv6_get_ifaddr()
2030 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_get_ifaddr()
2032 if (ipv6_addr_equal(&ifp->addr, addr)) { in ipv6_get_ifaddr()
2033 if (!dev || ifp->idev->dev == dev || in ipv6_get_ifaddr()
2034 !(ifp->scope&(IFA_LINK|IFA_HOST) || strict)) { in ipv6_get_ifaddr()
2035 result = ifp; in ipv6_get_ifaddr()
2036 in6_ifa_hold(ifp); in ipv6_get_ifaddr()
2048 static void addrconf_dad_stop(struct inet6_ifaddr *ifp, int dad_failed) in addrconf_dad_stop() argument
2051 ifp->flags |= IFA_F_DADFAILED; in addrconf_dad_stop()
2053 if (ifp->flags&IFA_F_TEMPORARY) { in addrconf_dad_stop()
2055 spin_lock_bh(&ifp->lock); in addrconf_dad_stop()
2056 ifpub = ifp->ifpub; in addrconf_dad_stop()
2059 spin_unlock_bh(&ifp->lock); in addrconf_dad_stop()
2063 spin_unlock_bh(&ifp->lock); in addrconf_dad_stop()
2065 ipv6_del_addr(ifp); in addrconf_dad_stop()
2066 } else if (ifp->flags&IFA_F_PERMANENT || !dad_failed) { in addrconf_dad_stop()
2067 spin_lock_bh(&ifp->lock); in addrconf_dad_stop()
2068 addrconf_del_dad_work(ifp); in addrconf_dad_stop()
2069 ifp->flags |= IFA_F_TENTATIVE; in addrconf_dad_stop()
2071 ifp->flags &= ~IFA_F_OPTIMISTIC; in addrconf_dad_stop()
2072 spin_unlock_bh(&ifp->lock); in addrconf_dad_stop()
2074 ipv6_ifa_notify(0, ifp); in addrconf_dad_stop()
2075 in6_ifa_put(ifp); in addrconf_dad_stop()
2077 ipv6_del_addr(ifp); in addrconf_dad_stop()
2081 static int addrconf_dad_end(struct inet6_ifaddr *ifp) in addrconf_dad_end() argument
2085 spin_lock_bh(&ifp->lock); in addrconf_dad_end()
2086 if (ifp->state == INET6_IFADDR_STATE_DAD) { in addrconf_dad_end()
2087 ifp->state = INET6_IFADDR_STATE_POSTDAD; in addrconf_dad_end()
2090 spin_unlock_bh(&ifp->lock); in addrconf_dad_end()
2095 void addrconf_dad_failure(struct sk_buff *skb, struct inet6_ifaddr *ifp) in addrconf_dad_failure() argument
2097 struct inet6_dev *idev = ifp->idev; in addrconf_dad_failure()
2098 struct net *net = dev_net(ifp->idev->dev); in addrconf_dad_failure()
2100 if (addrconf_dad_end(ifp)) { in addrconf_dad_failure()
2101 in6_ifa_put(ifp); in addrconf_dad_failure()
2106 ifp->idev->dev->name, &ifp->addr, eth_hdr(skb)->h_source); in addrconf_dad_failure()
2108 spin_lock_bh(&ifp->lock); in addrconf_dad_failure()
2110 if (ifp->flags & IFA_F_STABLE_PRIVACY) { in addrconf_dad_failure()
2113 int retries = ifp->stable_privacy_retry + 1; in addrconf_dad_failure()
2116 .plen = ifp->prefix_len, in addrconf_dad_failure()
2117 .ifa_flags = ifp->flags, in addrconf_dad_failure()
2118 .valid_lft = ifp->valid_lft, in addrconf_dad_failure()
2119 .preferred_lft = ifp->prefered_lft, in addrconf_dad_failure()
2120 .scope = ifp->scope, in addrconf_dad_failure()
2125 ifp->idev->dev->name); in addrconf_dad_failure()
2129 new_addr = ifp->addr; in addrconf_dad_failure()
2134 spin_unlock_bh(&ifp->lock); in addrconf_dad_failure()
2142 ifp->idev->dev->name); in addrconf_dad_failure()
2156 spin_lock_bh(&ifp->lock); in addrconf_dad_failure()
2161 ifp->state = INET6_IFADDR_STATE_ERRDAD; in addrconf_dad_failure()
2162 spin_unlock_bh(&ifp->lock); in addrconf_dad_failure()
2164 addrconf_mod_dad_work(ifp, 0); in addrconf_dad_failure()
2165 in6_ifa_put(ifp); in addrconf_dad_failure()
2194 static void addrconf_join_anycast(struct inet6_ifaddr *ifp) in addrconf_join_anycast() argument
2198 if (ifp->prefix_len >= 127) /* RFC 6164 */ in addrconf_join_anycast()
2200 ipv6_addr_prefix(&addr, &ifp->addr, ifp->prefix_len); in addrconf_join_anycast()
2203 __ipv6_dev_ac_inc(ifp->idev, &addr); in addrconf_join_anycast()
2207 static void addrconf_leave_anycast(struct inet6_ifaddr *ifp) in addrconf_leave_anycast() argument
2211 if (ifp->prefix_len >= 127) /* RFC 6164 */ in addrconf_leave_anycast()
2213 ipv6_addr_prefix(&addr, &ifp->addr, ifp->prefix_len); in addrconf_leave_anycast()
2216 __ipv6_dev_ac_dec(ifp->idev, &addr); in addrconf_leave_anycast()
2341 struct inet6_ifaddr *ifp; in ipv6_inherit_eui64() local
2344 list_for_each_entry_reverse(ifp, &idev->addr_list, if_list) { in ipv6_inherit_eui64()
2345 if (ifp->scope > IFA_LINK) in ipv6_inherit_eui64()
2347 if (ifp->scope == IFA_LINK && !(ifp->flags&IFA_F_TENTATIVE)) { in ipv6_inherit_eui64()
2348 memcpy(eui, ifp->addr.s6_addr+8, 8); in ipv6_inherit_eui64()
2531 struct inet6_ifaddr *ifp, in manage_tempaddrs() argument
2543 if (ifp != ift->ifpub) in manage_tempaddrs()
2591 ipv6_create_tempaddr(ifp, false); in manage_tempaddrs()
2610 struct inet6_ifaddr *ifp = ipv6_get_ifaddr(net, addr, dev, 1); in addrconf_prefix_rcv_add_addr() local
2613 if (!ifp && valid_lft) { in addrconf_prefix_rcv_add_addr()
2636 ifp = ipv6_add_addr(in6_dev, &cfg, false, NULL); in addrconf_prefix_rcv_add_addr()
2638 if (IS_ERR_OR_NULL(ifp)) in addrconf_prefix_rcv_add_addr()
2642 spin_lock_bh(&ifp->lock); in addrconf_prefix_rcv_add_addr()
2643 ifp->flags |= IFA_F_MANAGETEMPADDR; in addrconf_prefix_rcv_add_addr()
2644 ifp->cstamp = jiffies; in addrconf_prefix_rcv_add_addr()
2645 ifp->tokenized = tokenized; in addrconf_prefix_rcv_add_addr()
2646 spin_unlock_bh(&ifp->lock); in addrconf_prefix_rcv_add_addr()
2647 addrconf_dad_start(ifp); in addrconf_prefix_rcv_add_addr()
2650 if (ifp) { in addrconf_prefix_rcv_add_addr()
2656 spin_lock_bh(&ifp->lock); in addrconf_prefix_rcv_add_addr()
2658 if (ifp->valid_lft > (now - ifp->tstamp) / HZ) in addrconf_prefix_rcv_add_addr()
2659 stored_lft = ifp->valid_lft - (now - ifp->tstamp) / HZ; in addrconf_prefix_rcv_add_addr()
2681 ifp->valid_lft = valid_lft; in addrconf_prefix_rcv_add_addr()
2682 ifp->prefered_lft = prefered_lft; in addrconf_prefix_rcv_add_addr()
2683 ifp->tstamp = now; in addrconf_prefix_rcv_add_addr()
2684 flags = ifp->flags; in addrconf_prefix_rcv_add_addr()
2685 ifp->flags &= ~IFA_F_DEPRECATED; in addrconf_prefix_rcv_add_addr()
2686 spin_unlock_bh(&ifp->lock); in addrconf_prefix_rcv_add_addr()
2689 ipv6_ifa_notify(0, ifp); in addrconf_prefix_rcv_add_addr()
2691 spin_unlock_bh(&ifp->lock); in addrconf_prefix_rcv_add_addr()
2693 manage_tempaddrs(in6_dev, ifp, valid_lft, prefered_lft, in addrconf_prefix_rcv_add_addr()
2696 in6_ifa_put(ifp); in addrconf_prefix_rcv_add_addr()
2931 struct inet6_ifaddr *ifp; in inet6_addr_add() local
2986 ifp = ipv6_add_addr(idev, cfg, true, extack); in inet6_addr_add()
2987 if (!IS_ERR(ifp)) { in inet6_addr_add()
2989 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, in inet6_addr_add()
2990 ifp->rt_priority, dev, expires, in inet6_addr_add()
2997 if (!(ifp->flags & (IFA_F_OPTIMISTIC | IFA_F_NODAD))) in inet6_addr_add()
2998 ipv6_ifa_notify(0, ifp); in inet6_addr_add()
3004 addrconf_dad_start(ifp); in inet6_addr_add()
3006 manage_tempaddrs(idev, ifp, cfg->valid_lft, in inet6_addr_add()
3008 in6_ifa_put(ifp); in inet6_addr_add()
3016 return PTR_ERR(ifp); in inet6_addr_add()
3022 struct inet6_ifaddr *ifp; in inet6_addr_del() local
3038 list_for_each_entry(ifp, &idev->addr_list, if_list) { in inet6_addr_del()
3039 if (ifp->prefix_len == plen && in inet6_addr_del()
3040 ipv6_addr_equal(pfx, &ifp->addr)) { in inet6_addr_del()
3041 in6_ifa_hold(ifp); in inet6_addr_del()
3044 if (!(ifp->flags & IFA_F_TEMPORARY) && in inet6_addr_del()
3046 manage_tempaddrs(idev, ifp, 0, 0, false, in inet6_addr_del()
3048 ipv6_del_addr(ifp); in inet6_addr_del()
3108 struct inet6_ifaddr *ifp; in add_addr() local
3118 ifp = ipv6_add_addr(idev, &cfg, true, NULL); in add_addr()
3119 if (!IS_ERR(ifp)) { in add_addr()
3120 spin_lock_bh(&ifp->lock); in add_addr()
3121 ifp->flags &= ~IFA_F_TENTATIVE; in add_addr()
3122 spin_unlock_bh(&ifp->lock); in add_addr()
3124 ipv6_ifa_notify(RTM_NEWADDR, ifp); in add_addr()
3125 in6_ifa_put(ifp); in add_addr()
3217 struct inet6_ifaddr *ifp; in addrconf_add_linklocal() local
3226 ifp = ipv6_add_addr(idev, &cfg, true, NULL); in addrconf_add_linklocal()
3227 if (!IS_ERR(ifp)) { in addrconf_add_linklocal()
3228 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, 0, idev->dev, in addrconf_add_linklocal()
3230 addrconf_dad_start(ifp); in addrconf_add_linklocal()
3231 in6_ifa_put(ifp); in addrconf_add_linklocal()
3464 struct inet6_ifaddr *ifp) in fixup_permanent_addr() argument
3470 if (!ifp->rt || !ifp->rt->fib6_node) { in fixup_permanent_addr()
3473 f6i = addrconf_f6i_alloc(net, idev, &ifp->addr, false, in fixup_permanent_addr()
3479 spin_lock(&ifp->lock); in fixup_permanent_addr()
3480 prev = ifp->rt; in fixup_permanent_addr()
3481 ifp->rt = f6i; in fixup_permanent_addr()
3482 spin_unlock(&ifp->lock); in fixup_permanent_addr()
3487 if (!(ifp->flags & IFA_F_NOPREFIXROUTE)) { in fixup_permanent_addr()
3488 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, in fixup_permanent_addr()
3489 ifp->rt_priority, idev->dev, 0, 0, in fixup_permanent_addr()
3493 if (ifp->state == INET6_IFADDR_STATE_PREDAD) in fixup_permanent_addr()
3494 addrconf_dad_start(ifp); in fixup_permanent_addr()
3501 struct inet6_ifaddr *ifp, *tmp; in addrconf_permanent_addr() local
3510 list_for_each_entry_safe(ifp, tmp, &idev->addr_list, if_list) { in addrconf_permanent_addr()
3511 if ((ifp->flags & IFA_F_PERMANENT) && in addrconf_permanent_addr()
3512 fixup_permanent_addr(net, idev, ifp) < 0) { in addrconf_permanent_addr()
3514 in6_ifa_hold(ifp); in addrconf_permanent_addr()
3515 ipv6_del_addr(ifp); in addrconf_permanent_addr()
3519 idev->dev->name, &ifp->addr); in addrconf_permanent_addr()
3967 static void addrconf_dad_kick(struct inet6_ifaddr *ifp) in addrconf_dad_kick() argument
3970 struct inet6_dev *idev = ifp->idev; in addrconf_dad_kick()
3973 if (ifp->flags & IFA_F_OPTIMISTIC) in addrconf_dad_kick()
3985 ifp->dad_nonce = nonce; in addrconf_dad_kick()
3986 ifp->dad_probes = idev->cnf.dad_transmits; in addrconf_dad_kick()
3987 addrconf_mod_dad_work(ifp, rand_num); in addrconf_dad_kick()
3990 static void addrconf_dad_begin(struct inet6_ifaddr *ifp) in addrconf_dad_begin() argument
3992 struct inet6_dev *idev = ifp->idev; in addrconf_dad_begin()
3997 addrconf_join_solict(dev, &ifp->addr); in addrconf_dad_begin()
3999 prandom_seed((__force u32) ifp->addr.s6_addr32[3]); in addrconf_dad_begin()
4002 spin_lock(&ifp->lock); in addrconf_dad_begin()
4003 if (ifp->state == INET6_IFADDR_STATE_DEAD) in addrconf_dad_begin()
4010 !(ifp->flags&IFA_F_TENTATIVE) || in addrconf_dad_begin()
4011 ifp->flags & IFA_F_NODAD) { in addrconf_dad_begin()
4014 if (ifp->flags & IFA_F_TENTATIVE && in addrconf_dad_begin()
4015 !(ifp->flags & IFA_F_OPTIMISTIC)) in addrconf_dad_begin()
4017 bump_id = ifp->flags & IFA_F_TENTATIVE; in addrconf_dad_begin()
4018 ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED); in addrconf_dad_begin()
4019 spin_unlock(&ifp->lock); in addrconf_dad_begin()
4022 addrconf_dad_completed(ifp, bump_id, send_na); in addrconf_dad_begin()
4027 spin_unlock(&ifp->lock); in addrconf_dad_begin()
4034 in6_ifa_hold(ifp); in addrconf_dad_begin()
4035 addrconf_dad_stop(ifp, 0); in addrconf_dad_begin()
4043 if (ifp->flags & IFA_F_OPTIMISTIC) { in addrconf_dad_begin()
4044 ip6_ins_rt(net, ifp->rt); in addrconf_dad_begin()
4053 addrconf_dad_kick(ifp); in addrconf_dad_begin()
4055 spin_unlock(&ifp->lock); in addrconf_dad_begin()
4058 ipv6_ifa_notify(RTM_NEWADDR, ifp); in addrconf_dad_begin()
4061 static void addrconf_dad_start(struct inet6_ifaddr *ifp) in addrconf_dad_start() argument
4065 spin_lock_bh(&ifp->lock); in addrconf_dad_start()
4066 if (ifp->state != INET6_IFADDR_STATE_DEAD) { in addrconf_dad_start()
4067 ifp->state = INET6_IFADDR_STATE_PREDAD; in addrconf_dad_start()
4070 spin_unlock_bh(&ifp->lock); in addrconf_dad_start()
4073 addrconf_mod_dad_work(ifp, 0); in addrconf_dad_start()
4078 struct inet6_ifaddr *ifp = container_of(to_delayed_work(w), in addrconf_dad_work() local
4081 struct inet6_dev *idev = ifp->idev; in addrconf_dad_work()
4093 spin_lock_bh(&ifp->lock); in addrconf_dad_work()
4094 if (ifp->state == INET6_IFADDR_STATE_PREDAD) { in addrconf_dad_work()
4096 ifp->state = INET6_IFADDR_STATE_DAD; in addrconf_dad_work()
4097 } else if (ifp->state == INET6_IFADDR_STATE_ERRDAD) { in addrconf_dad_work()
4099 ifp->state = INET6_IFADDR_STATE_POSTDAD; in addrconf_dad_work()
4104 !(ifp->flags & IFA_F_STABLE_PRIVACY)) { in addrconf_dad_work()
4111 ipv6_addr_equal(&ifp->addr, &addr)) { in addrconf_dad_work()
4116 ifp->idev->dev->name); in addrconf_dad_work()
4121 spin_unlock_bh(&ifp->lock); in addrconf_dad_work()
4124 addrconf_dad_begin(ifp); in addrconf_dad_work()
4127 in6_ifa_hold(ifp); in addrconf_dad_work()
4128 addrconf_dad_stop(ifp, 1); in addrconf_dad_work()
4134 if (!ifp->dad_probes && addrconf_dad_end(ifp)) in addrconf_dad_work()
4143 spin_lock(&ifp->lock); in addrconf_dad_work()
4144 if (ifp->state == INET6_IFADDR_STATE_DEAD) { in addrconf_dad_work()
4145 spin_unlock(&ifp->lock); in addrconf_dad_work()
4150 if (ifp->dad_probes == 0) { in addrconf_dad_work()
4157 if (ifp->flags & IFA_F_TENTATIVE && in addrconf_dad_work()
4158 !(ifp->flags & IFA_F_OPTIMISTIC)) in addrconf_dad_work()
4160 bump_id = ifp->flags & IFA_F_TENTATIVE; in addrconf_dad_work()
4161 ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED); in addrconf_dad_work()
4162 spin_unlock(&ifp->lock); in addrconf_dad_work()
4165 addrconf_dad_completed(ifp, bump_id, send_na); in addrconf_dad_work()
4170 ifp->dad_probes--; in addrconf_dad_work()
4171 addrconf_mod_dad_work(ifp, in addrconf_dad_work()
4172 max(NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME), in addrconf_dad_work()
4174 spin_unlock(&ifp->lock); in addrconf_dad_work()
4178 addrconf_addr_solict_mult(&ifp->addr, &mcaddr); in addrconf_dad_work()
4179 ndisc_send_ns(ifp->idev->dev, &ifp->addr, &mcaddr, &in6addr_any, in addrconf_dad_work()
4180 ifp->dad_nonce); in addrconf_dad_work()
4182 in6_ifa_put(ifp); in addrconf_dad_work()
4187 static bool ipv6_lonely_lladdr(struct inet6_ifaddr *ifp) in ipv6_lonely_lladdr() argument
4190 struct inet6_dev *idev = ifp->idev; in ipv6_lonely_lladdr()
4195 if (ifp != ifpiter && ifpiter->scope == IFA_LINK && in ipv6_lonely_lladdr()
4204 static void addrconf_dad_completed(struct inet6_ifaddr *ifp, bool bump_id, in addrconf_dad_completed() argument
4207 struct net_device *dev = ifp->idev->dev; in addrconf_dad_completed()
4211 addrconf_del_dad_work(ifp); in addrconf_dad_completed()
4217 ipv6_ifa_notify(RTM_NEWADDR, ifp); in addrconf_dad_completed()
4223 read_lock_bh(&ifp->idev->lock); in addrconf_dad_completed()
4224 send_mld = ifp->scope == IFA_LINK && ipv6_lonely_lladdr(ifp); in addrconf_dad_completed()
4226 ipv6_accept_ra(ifp->idev) && in addrconf_dad_completed()
4227 ifp->idev->cnf.rtr_solicits != 0 && in addrconf_dad_completed()
4230 read_unlock_bh(&ifp->idev->lock); in addrconf_dad_completed()
4236 ipv6_mc_dad_complete(ifp->idev); in addrconf_dad_completed()
4240 (ifp->idev->cnf.ndisc_notify || in addrconf_dad_completed()
4242 ndisc_send_na(dev, &in6addr_linklocal_allnodes, &ifp->addr, in addrconf_dad_completed()
4243 /*router=*/ !!ifp->idev->cnf.forwarding, in addrconf_dad_completed()
4258 write_lock_bh(&ifp->idev->lock); in addrconf_dad_completed()
4259 spin_lock(&ifp->lock); in addrconf_dad_completed()
4260 ifp->idev->rs_interval = rfc3315_s14_backoff_init( in addrconf_dad_completed()
4261 ifp->idev->cnf.rtr_solicit_interval); in addrconf_dad_completed()
4262 ifp->idev->rs_probes = 1; in addrconf_dad_completed()
4263 ifp->idev->if_flags |= IF_RS_SENT; in addrconf_dad_completed()
4264 addrconf_mod_rs_timer(ifp->idev, ifp->idev->rs_interval); in addrconf_dad_completed()
4265 spin_unlock(&ifp->lock); in addrconf_dad_completed()
4266 write_unlock_bh(&ifp->idev->lock); in addrconf_dad_completed()
4275 if (ifp->flags & IFA_F_TEMPORARY) in addrconf_dad_completed()
4281 struct inet6_ifaddr *ifp; in addrconf_dad_run() local
4284 list_for_each_entry(ifp, &idev->addr_list, if_list) { in addrconf_dad_run()
4285 spin_lock(&ifp->lock); in addrconf_dad_run()
4286 if ((ifp->flags & IFA_F_TENTATIVE && in addrconf_dad_run()
4287 ifp->state == INET6_IFADDR_STATE_DAD) || restart) { in addrconf_dad_run()
4289 ifp->state = INET6_IFADDR_STATE_PREDAD; in addrconf_dad_run()
4290 addrconf_dad_kick(ifp); in addrconf_dad_run()
4292 spin_unlock(&ifp->lock); in addrconf_dad_run()
4387 struct inet6_ifaddr *ifp = (struct inet6_ifaddr *)v; in if6_seq_show() local
4389 &ifp->addr, in if6_seq_show()
4390 ifp->idev->dev->ifindex, in if6_seq_show()
4391 ifp->prefix_len, in if6_seq_show()
4392 ifp->scope, in if6_seq_show()
4393 (u8) ifp->flags, in if6_seq_show()
4394 ifp->idev->dev->name); in if6_seq_show()
4439 struct inet6_ifaddr *ifp = NULL; in ipv6_chk_home_addr() local
4443 hlist_for_each_entry_rcu(ifp, &inet6_addr_lst[hash], addr_lst) { in ipv6_chk_home_addr()
4444 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_chk_home_addr()
4446 if (ipv6_addr_equal(&ifp->addr, addr) && in ipv6_chk_home_addr()
4447 (ifp->flags & IFA_F_HOMEADDRESS)) { in ipv6_chk_home_addr()
4472 struct inet6_ifaddr *ifp; in ipv6_chk_rpl_srh_loop() local
4483 hlist_for_each_entry_rcu(ifp, &inet6_addr_lst[hash], addr_lst) { in ipv6_chk_rpl_srh_loop()
4484 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_chk_rpl_srh_loop()
4487 if (ipv6_addr_equal(&ifp->addr, addr)) { in ipv6_chk_rpl_srh_loop()
4517 struct inet6_ifaddr *ifp; in addrconf_verify_rtnl() local
4530 hlist_for_each_entry_rcu_bh(ifp, &inet6_addr_lst[i], addr_lst) { in addrconf_verify_rtnl()
4537 if ((ifp->flags & IFA_F_PERMANENT) && in addrconf_verify_rtnl()
4538 (ifp->prefered_lft == INFINITY_LIFE_TIME)) in addrconf_verify_rtnl()
4541 spin_lock(&ifp->lock); in addrconf_verify_rtnl()
4543 age = (now - ifp->tstamp + ADDRCONF_TIMER_FUZZ_MINUS) / HZ; in addrconf_verify_rtnl()
4545 if (ifp->valid_lft != INFINITY_LIFE_TIME && in addrconf_verify_rtnl()
4546 age >= ifp->valid_lft) { in addrconf_verify_rtnl()
4547 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
4548 in6_ifa_hold(ifp); in addrconf_verify_rtnl()
4549 ipv6_del_addr(ifp); in addrconf_verify_rtnl()
4551 } else if (ifp->prefered_lft == INFINITY_LIFE_TIME) { in addrconf_verify_rtnl()
4552 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
4554 } else if (age >= ifp->prefered_lft) { in addrconf_verify_rtnl()
4558 if (!(ifp->flags&IFA_F_DEPRECATED)) { in addrconf_verify_rtnl()
4560 ifp->flags |= IFA_F_DEPRECATED; in addrconf_verify_rtnl()
4563 if ((ifp->valid_lft != INFINITY_LIFE_TIME) && in addrconf_verify_rtnl()
4564 (time_before(ifp->tstamp + ifp->valid_lft * HZ, next))) in addrconf_verify_rtnl()
4565 next = ifp->tstamp + ifp->valid_lft * HZ; in addrconf_verify_rtnl()
4567 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
4570 in6_ifa_hold(ifp); in addrconf_verify_rtnl()
4572 ipv6_ifa_notify(0, ifp); in addrconf_verify_rtnl()
4573 in6_ifa_put(ifp); in addrconf_verify_rtnl()
4576 } else if ((ifp->flags&IFA_F_TEMPORARY) && in addrconf_verify_rtnl()
4577 !(ifp->flags&IFA_F_TENTATIVE)) { in addrconf_verify_rtnl()
4578 unsigned long regen_advance = ifp->idev->cnf.regen_max_retry * in addrconf_verify_rtnl()
4579 ifp->idev->cnf.dad_transmits * in addrconf_verify_rtnl()
4580 max(NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME), HZ/100) / HZ; in addrconf_verify_rtnl()
4582 if (age >= ifp->prefered_lft - regen_advance) { in addrconf_verify_rtnl()
4583 struct inet6_ifaddr *ifpub = ifp->ifpub; in addrconf_verify_rtnl()
4584 if (time_before(ifp->tstamp + ifp->prefered_lft * HZ, next)) in addrconf_verify_rtnl()
4585 next = ifp->tstamp + ifp->prefered_lft * HZ; in addrconf_verify_rtnl()
4586 if (!ifp->regen_count && ifpub) { in addrconf_verify_rtnl()
4587 ifp->regen_count++; in addrconf_verify_rtnl()
4588 in6_ifa_hold(ifp); in addrconf_verify_rtnl()
4590 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
4598 in6_ifa_put(ifp); in addrconf_verify_rtnl()
4602 } else if (time_before(ifp->tstamp + ifp->prefered_lft * HZ - regen_advance * HZ, next)) in addrconf_verify_rtnl()
4603 next = ifp->tstamp + ifp->prefered_lft * HZ - regen_advance * HZ; in addrconf_verify_rtnl()
4604 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
4607 if (time_before(ifp->tstamp + ifp->prefered_lft * HZ, next)) in addrconf_verify_rtnl()
4608 next = ifp->tstamp + ifp->prefered_lft * HZ; in addrconf_verify_rtnl()
4609 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
4701 static int modify_prefix_route(struct inet6_ifaddr *ifp, in modify_prefix_route() argument
4708 f6i = addrconf_get_prefix_route(modify_peer ? &ifp->peer_addr : &ifp->addr, in modify_prefix_route()
4709 ifp->prefix_len, in modify_prefix_route()
4710 ifp->idev->dev, 0, RTF_DEFAULT, true); in modify_prefix_route()
4714 prio = ifp->rt_priority ? : IP6_RT_PRIO_ADDRCONF; in modify_prefix_route()
4717 ip6_del_rt(dev_net(ifp->idev->dev), f6i, false); in modify_prefix_route()
4720 addrconf_prefix_route(modify_peer ? &ifp->peer_addr : &ifp->addr, in modify_prefix_route()
4721 ifp->prefix_len, in modify_prefix_route()
4722 ifp->rt_priority, ifp->idev->dev, in modify_prefix_route()
4736 static int inet6_addr_modify(struct inet6_ifaddr *ifp, struct ifa6_config *cfg) in inet6_addr_modify() argument
4751 (ifp->flags & IFA_F_TEMPORARY || ifp->prefix_len != 64)) in inet6_addr_modify()
4754 if (!(ifp->flags & IFA_F_TENTATIVE) || ifp->flags & IFA_F_DADFAILED) in inet6_addr_modify()
4776 memcmp(&ifp->peer_addr, cfg->peer_pfx, sizeof(struct in6_addr))) { in inet6_addr_modify()
4777 if (!ipv6_addr_any(&ifp->peer_addr)) in inet6_addr_modify()
4778 cleanup_prefix_route(ifp, expires, true, true); in inet6_addr_modify()
4782 spin_lock_bh(&ifp->lock); in inet6_addr_modify()
4783 was_managetempaddr = ifp->flags & IFA_F_MANAGETEMPADDR; in inet6_addr_modify()
4784 had_prefixroute = ifp->flags & IFA_F_PERMANENT && in inet6_addr_modify()
4785 !(ifp->flags & IFA_F_NOPREFIXROUTE); in inet6_addr_modify()
4786 ifp->flags &= ~(IFA_F_DEPRECATED | IFA_F_PERMANENT | IFA_F_NODAD | in inet6_addr_modify()
4789 ifp->flags |= cfg->ifa_flags; in inet6_addr_modify()
4790 ifp->tstamp = jiffies; in inet6_addr_modify()
4791 ifp->valid_lft = cfg->valid_lft; in inet6_addr_modify()
4792 ifp->prefered_lft = cfg->preferred_lft; in inet6_addr_modify()
4794 if (cfg->rt_priority && cfg->rt_priority != ifp->rt_priority) in inet6_addr_modify()
4795 ifp->rt_priority = cfg->rt_priority; in inet6_addr_modify()
4798 ifp->peer_addr = *cfg->peer_pfx; in inet6_addr_modify()
4800 spin_unlock_bh(&ifp->lock); in inet6_addr_modify()
4801 if (!(ifp->flags&IFA_F_TENTATIVE)) in inet6_addr_modify()
4802 ipv6_ifa_notify(0, ifp); in inet6_addr_modify()
4808 rc = modify_prefix_route(ifp, expires, flags, false); in inet6_addr_modify()
4812 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, in inet6_addr_modify()
4813 ifp->rt_priority, ifp->idev->dev, in inet6_addr_modify()
4817 if (had_prefixroute && !ipv6_addr_any(&ifp->peer_addr)) in inet6_addr_modify()
4818 rc = modify_prefix_route(ifp, expires, flags, true); in inet6_addr_modify()
4820 if (rc == -ENOENT && !ipv6_addr_any(&ifp->peer_addr)) { in inet6_addr_modify()
4821 addrconf_prefix_route(&ifp->peer_addr, ifp->prefix_len, in inet6_addr_modify()
4822 ifp->rt_priority, ifp->idev->dev, in inet6_addr_modify()
4829 write_lock_bh(&ifp->idev->lock); in inet6_addr_modify()
4830 action = check_cleanup_prefix_route(ifp, &rt_expires); in inet6_addr_modify()
4831 write_unlock_bh(&ifp->idev->lock); in inet6_addr_modify()
4834 cleanup_prefix_route(ifp, rt_expires, in inet6_addr_modify()
4839 if (was_managetempaddr || ifp->flags & IFA_F_MANAGETEMPADDR) { in inet6_addr_modify()
4841 !(ifp->flags & IFA_F_MANAGETEMPADDR)) { in inet6_addr_modify()
4845 manage_tempaddrs(ifp->idev, ifp, cfg->valid_lft, in inet6_addr_modify()
5736 struct inet6_ifaddr *ifp; in inet6_set_iftoken() local
5785 list_for_each_entry(ifp, &idev->addr_list, if_list) { in inet6_set_iftoken()
5786 spin_lock(&ifp->lock); in inet6_set_iftoken()
5787 if (ifp->tokenized) { in inet6_set_iftoken()
5788 ifp->valid_lft = 0; in inet6_set_iftoken()
5789 ifp->prefered_lft = 0; in inet6_set_iftoken()
5791 spin_unlock(&ifp->lock); in inet6_set_iftoken()
6100 static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp) in __ipv6_ifa_notify() argument
6102 struct net *net = dev_net(ifp->idev->dev); in __ipv6_ifa_notify()
6107 inet6_ifa_notify(event ? : RTM_NEWADDR, ifp); in __ipv6_ifa_notify()
6119 if (ifp->rt && !rcu_access_pointer(ifp->rt->fib6_node)) { in __ipv6_ifa_notify()
6120 ip6_ins_rt(net, ifp->rt); in __ipv6_ifa_notify()
6121 } else if (!ifp->rt && (ifp->idev->dev->flags & IFF_UP)) { in __ipv6_ifa_notify()
6123 &ifp->addr, ifp->idev->dev->name); in __ipv6_ifa_notify()
6126 if (ifp->idev->cnf.forwarding) in __ipv6_ifa_notify()
6127 addrconf_join_anycast(ifp); in __ipv6_ifa_notify()
6128 if (!ipv6_addr_any(&ifp->peer_addr)) in __ipv6_ifa_notify()
6129 addrconf_prefix_route(&ifp->peer_addr, 128, in __ipv6_ifa_notify()
6130 ifp->rt_priority, ifp->idev->dev, in __ipv6_ifa_notify()
6134 if (ifp->idev->cnf.forwarding) in __ipv6_ifa_notify()
6135 addrconf_leave_anycast(ifp); in __ipv6_ifa_notify()
6136 addrconf_leave_solict(ifp->idev, &ifp->addr); in __ipv6_ifa_notify()
6137 if (!ipv6_addr_any(&ifp->peer_addr)) { in __ipv6_ifa_notify()
6140 rt = addrconf_get_prefix_route(&ifp->peer_addr, 128, in __ipv6_ifa_notify()
6141 ifp->idev->dev, 0, 0, in __ipv6_ifa_notify()
6146 if (ifp->rt) { in __ipv6_ifa_notify()
6147 ip6_del_rt(net, ifp->rt, false); in __ipv6_ifa_notify()
6148 ifp->rt = NULL; in __ipv6_ifa_notify()
6156 static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp) in ipv6_ifa_notify() argument
6159 if (likely(ifp->idev->dead == 0)) in ipv6_ifa_notify()
6160 __ipv6_ifa_notify(event, ifp); in ipv6_ifa_notify()