Lines Matching refs:ifp
162 static void addrconf_join_anycast(struct inet6_ifaddr *ifp);
163 static void addrconf_leave_anycast(struct inet6_ifaddr *ifp);
175 static void addrconf_dad_start(struct inet6_ifaddr *ifp);
177 static void addrconf_dad_completed(struct inet6_ifaddr *ifp, bool bump_id,
307 static void addrconf_del_dad_work(struct inet6_ifaddr *ifp) in addrconf_del_dad_work() argument
309 if (cancel_delayed_work(&ifp->dad_work)) in addrconf_del_dad_work()
310 __in6_ifa_put(ifp); in addrconf_del_dad_work()
321 static void addrconf_mod_dad_work(struct inet6_ifaddr *ifp, in addrconf_mod_dad_work() argument
324 in6_ifa_hold(ifp); in addrconf_mod_dad_work()
325 if (mod_delayed_work(addrconf_wq, &ifp->dad_work, delay)) in addrconf_mod_dad_work()
326 in6_ifa_put(ifp); in addrconf_mod_dad_work()
949 void inet6_ifa_finish_destroy(struct inet6_ifaddr *ifp) in inet6_ifa_finish_destroy() argument
951 WARN_ON(!hlist_unhashed(&ifp->addr_lst)); in inet6_ifa_finish_destroy()
957 in6_dev_put(ifp->idev); in inet6_ifa_finish_destroy()
959 if (cancel_delayed_work(&ifp->dad_work)) in inet6_ifa_finish_destroy()
961 ifp); in inet6_ifa_finish_destroy()
963 if (ifp->state != INET6_IFADDR_STATE_DEAD) { in inet6_ifa_finish_destroy()
964 pr_warn("Freeing alive inet6 address %p\n", ifp); in inet6_ifa_finish_destroy()
968 kfree_rcu(ifp, rcu); in inet6_ifa_finish_destroy()
972 ipv6_link_dev_addr(struct inet6_dev *idev, struct inet6_ifaddr *ifp) in ipv6_link_dev_addr() argument
975 int ifp_scope = ipv6_addr_src_scope(&ifp->addr); in ipv6_link_dev_addr()
988 list_add_tail_rcu(&ifp->if_list, p); in ipv6_link_dev_addr()
1001 struct inet6_ifaddr *ifp; in ipv6_chk_same_addr() local
1003 hlist_for_each_entry(ifp, &inet6_addr_lst[hash], addr_lst) { in ipv6_chk_same_addr()
1004 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_chk_same_addr()
1006 if (ipv6_addr_equal(&ifp->addr, addr)) { in ipv6_chk_same_addr()
1007 if (!dev || ifp->idev->dev == dev) in ipv6_chk_same_addr()
1191 check_cleanup_prefix_route(struct inet6_ifaddr *ifp, unsigned long *expires) in check_cleanup_prefix_route() argument
1194 struct inet6_dev *idev = ifp->idev; in check_cleanup_prefix_route()
1201 if (ifa == ifp) in check_cleanup_prefix_route()
1203 if (ifa->prefix_len != ifp->prefix_len || in check_cleanup_prefix_route()
1204 !ipv6_prefix_equal(&ifa->addr, &ifp->addr, in check_cleanup_prefix_route()
1205 ifp->prefix_len)) in check_cleanup_prefix_route()
1229 cleanup_prefix_route(struct inet6_ifaddr *ifp, unsigned long expires, bool del_rt) in cleanup_prefix_route() argument
1233 f6i = addrconf_get_prefix_route(&ifp->addr, ifp->prefix_len, in cleanup_prefix_route()
1234 ifp->idev->dev, 0, RTF_DEFAULT, true); in cleanup_prefix_route()
1237 ip6_del_rt(dev_net(ifp->idev->dev), f6i); in cleanup_prefix_route()
1249 static void ipv6_del_addr(struct inet6_ifaddr *ifp) in ipv6_del_addr() argument
1257 spin_lock_bh(&ifp->lock); in ipv6_del_addr()
1258 state = ifp->state; in ipv6_del_addr()
1259 ifp->state = INET6_IFADDR_STATE_DEAD; in ipv6_del_addr()
1260 spin_unlock_bh(&ifp->lock); in ipv6_del_addr()
1266 hlist_del_init_rcu(&ifp->addr_lst); in ipv6_del_addr()
1269 write_lock_bh(&ifp->idev->lock); in ipv6_del_addr()
1271 if (ifp->flags&IFA_F_TEMPORARY) { in ipv6_del_addr()
1272 list_del(&ifp->tmp_list); in ipv6_del_addr()
1273 if (ifp->ifpub) { in ipv6_del_addr()
1274 in6_ifa_put(ifp->ifpub); in ipv6_del_addr()
1275 ifp->ifpub = NULL; in ipv6_del_addr()
1277 __in6_ifa_put(ifp); in ipv6_del_addr()
1280 if (ifp->flags & IFA_F_PERMANENT && !(ifp->flags & IFA_F_NOPREFIXROUTE)) in ipv6_del_addr()
1281 action = check_cleanup_prefix_route(ifp, &expires); in ipv6_del_addr()
1283 list_del_rcu(&ifp->if_list); in ipv6_del_addr()
1284 __in6_ifa_put(ifp); in ipv6_del_addr()
1286 write_unlock_bh(&ifp->idev->lock); in ipv6_del_addr()
1288 addrconf_del_dad_work(ifp); in ipv6_del_addr()
1290 ipv6_ifa_notify(RTM_DELADDR, ifp); in ipv6_del_addr()
1292 inet6addr_notifier_call_chain(NETDEV_DOWN, ifp); in ipv6_del_addr()
1295 cleanup_prefix_route(ifp, expires, in ipv6_del_addr()
1300 rt6_remove_prefsrc(ifp); in ipv6_del_addr()
1302 in6_ifa_put(ifp); in ipv6_del_addr()
1305 static int ipv6_create_tempaddr(struct inet6_ifaddr *ifp, in ipv6_create_tempaddr() argument
1309 struct inet6_dev *idev = ifp->idev; in ipv6_create_tempaddr()
1337 spin_lock_bh(&ifp->lock); in ipv6_create_tempaddr()
1338 if (ifp->regen_count++ >= idev->cnf.regen_max_retry) { in ipv6_create_tempaddr()
1340 spin_unlock_bh(&ifp->lock); in ipv6_create_tempaddr()
1348 in6_ifa_hold(ifp); in ipv6_create_tempaddr()
1349 memcpy(addr.s6_addr, ifp->addr.s6_addr, 8); in ipv6_create_tempaddr()
1352 age = (now - ifp->tstamp) / HZ; in ipv6_create_tempaddr()
1377 cfg.valid_lft = min_t(__u32, ifp->valid_lft, in ipv6_create_tempaddr()
1380 cfg.preferred_lft = min_t(__u32, ifp->prefered_lft, cfg.preferred_lft); in ipv6_create_tempaddr()
1382 cfg.plen = ifp->prefix_len; in ipv6_create_tempaddr()
1383 tmp_tstamp = ifp->tstamp; in ipv6_create_tempaddr()
1384 spin_unlock_bh(&ifp->lock); in ipv6_create_tempaddr()
1397 in6_ifa_put(ifp); in ipv6_create_tempaddr()
1405 if (ifp->flags & IFA_F_OPTIMISTIC) in ipv6_create_tempaddr()
1413 in6_ifa_put(ifp); in ipv6_create_tempaddr()
1422 ift->ifpub = ifp; in ipv6_create_tempaddr()
1841 struct inet6_ifaddr *ifp; in __ipv6_get_lladdr() local
1844 list_for_each_entry_reverse(ifp, &idev->addr_list, if_list) { in __ipv6_get_lladdr()
1845 if (ifp->scope > IFA_LINK) in __ipv6_get_lladdr()
1847 if (ifp->scope == IFA_LINK && in __ipv6_get_lladdr()
1848 !(ifp->flags & banned_flags)) { in __ipv6_get_lladdr()
1849 *addr = ifp->addr; in __ipv6_get_lladdr()
1876 const struct inet6_ifaddr *ifp; in ipv6_count_addresses() local
1880 list_for_each_entry_rcu(ifp, &idev->addr_list, if_list) in ipv6_count_addresses()
1909 struct inet6_ifaddr *ifp; in ipv6_chk_addr_and_flags() local
1918 hlist_for_each_entry_rcu(ifp, &inet6_addr_lst[hash], addr_lst) { in ipv6_chk_addr_and_flags()
1919 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_chk_addr_and_flags()
1922 if (l3mdev_master_dev_rcu(ifp->idev->dev) != l3mdev) in ipv6_chk_addr_and_flags()
1928 ifp_flags = (ifp->flags&IFA_F_OPTIMISTIC) in ipv6_chk_addr_and_flags()
1929 ? (ifp->flags&~IFA_F_TENTATIVE) in ipv6_chk_addr_and_flags()
1930 : ifp->flags; in ipv6_chk_addr_and_flags()
1931 if (ipv6_addr_equal(&ifp->addr, addr) && in ipv6_chk_addr_and_flags()
1933 (!dev || ifp->idev->dev == dev || in ipv6_chk_addr_and_flags()
1934 !(ifp->scope&(IFA_LINK|IFA_HOST) || strict))) { in ipv6_chk_addr_and_flags()
1997 struct inet6_ifaddr *ifp, *result = NULL; in ipv6_get_ifaddr() local
2000 hlist_for_each_entry_rcu(ifp, &inet6_addr_lst[hash], addr_lst) { in ipv6_get_ifaddr()
2001 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_get_ifaddr()
2003 if (ipv6_addr_equal(&ifp->addr, addr)) { in ipv6_get_ifaddr()
2004 if (!dev || ifp->idev->dev == dev || in ipv6_get_ifaddr()
2005 !(ifp->scope&(IFA_LINK|IFA_HOST) || strict)) { in ipv6_get_ifaddr()
2006 result = ifp; in ipv6_get_ifaddr()
2007 in6_ifa_hold(ifp); in ipv6_get_ifaddr()
2019 static void addrconf_dad_stop(struct inet6_ifaddr *ifp, int dad_failed) in addrconf_dad_stop() argument
2022 ifp->flags |= IFA_F_DADFAILED; in addrconf_dad_stop()
2024 if (ifp->flags&IFA_F_TEMPORARY) { in addrconf_dad_stop()
2026 spin_lock_bh(&ifp->lock); in addrconf_dad_stop()
2027 ifpub = ifp->ifpub; in addrconf_dad_stop()
2030 spin_unlock_bh(&ifp->lock); in addrconf_dad_stop()
2031 ipv6_create_tempaddr(ifpub, ifp, true); in addrconf_dad_stop()
2034 spin_unlock_bh(&ifp->lock); in addrconf_dad_stop()
2036 ipv6_del_addr(ifp); in addrconf_dad_stop()
2037 } else if (ifp->flags&IFA_F_PERMANENT || !dad_failed) { in addrconf_dad_stop()
2038 spin_lock_bh(&ifp->lock); in addrconf_dad_stop()
2039 addrconf_del_dad_work(ifp); in addrconf_dad_stop()
2040 ifp->flags |= IFA_F_TENTATIVE; in addrconf_dad_stop()
2042 ifp->flags &= ~IFA_F_OPTIMISTIC; in addrconf_dad_stop()
2043 spin_unlock_bh(&ifp->lock); in addrconf_dad_stop()
2045 ipv6_ifa_notify(0, ifp); in addrconf_dad_stop()
2046 in6_ifa_put(ifp); in addrconf_dad_stop()
2048 ipv6_del_addr(ifp); in addrconf_dad_stop()
2052 static int addrconf_dad_end(struct inet6_ifaddr *ifp) in addrconf_dad_end() argument
2056 spin_lock_bh(&ifp->lock); in addrconf_dad_end()
2057 if (ifp->state == INET6_IFADDR_STATE_DAD) { in addrconf_dad_end()
2058 ifp->state = INET6_IFADDR_STATE_POSTDAD; in addrconf_dad_end()
2061 spin_unlock_bh(&ifp->lock); in addrconf_dad_end()
2066 void addrconf_dad_failure(struct sk_buff *skb, struct inet6_ifaddr *ifp) in addrconf_dad_failure() argument
2068 struct inet6_dev *idev = ifp->idev; in addrconf_dad_failure()
2069 struct net *net = dev_net(ifp->idev->dev); in addrconf_dad_failure()
2071 if (addrconf_dad_end(ifp)) { in addrconf_dad_failure()
2072 in6_ifa_put(ifp); in addrconf_dad_failure()
2077 ifp->idev->dev->name, &ifp->addr, eth_hdr(skb)->h_source); in addrconf_dad_failure()
2079 spin_lock_bh(&ifp->lock); in addrconf_dad_failure()
2081 if (ifp->flags & IFA_F_STABLE_PRIVACY) { in addrconf_dad_failure()
2084 int retries = ifp->stable_privacy_retry + 1; in addrconf_dad_failure()
2087 .plen = ifp->prefix_len, in addrconf_dad_failure()
2088 .ifa_flags = ifp->flags, in addrconf_dad_failure()
2089 .valid_lft = ifp->valid_lft, in addrconf_dad_failure()
2090 .preferred_lft = ifp->prefered_lft, in addrconf_dad_failure()
2091 .scope = ifp->scope, in addrconf_dad_failure()
2096 ifp->idev->dev->name); in addrconf_dad_failure()
2100 new_addr = ifp->addr; in addrconf_dad_failure()
2105 spin_unlock_bh(&ifp->lock); in addrconf_dad_failure()
2113 ifp->idev->dev->name); in addrconf_dad_failure()
2127 spin_lock_bh(&ifp->lock); in addrconf_dad_failure()
2132 ifp->state = INET6_IFADDR_STATE_ERRDAD; in addrconf_dad_failure()
2133 spin_unlock_bh(&ifp->lock); in addrconf_dad_failure()
2135 addrconf_mod_dad_work(ifp, 0); in addrconf_dad_failure()
2136 in6_ifa_put(ifp); in addrconf_dad_failure()
2165 static void addrconf_join_anycast(struct inet6_ifaddr *ifp) in addrconf_join_anycast() argument
2169 if (ifp->prefix_len >= 127) /* RFC 6164 */ in addrconf_join_anycast()
2171 ipv6_addr_prefix(&addr, &ifp->addr, ifp->prefix_len); in addrconf_join_anycast()
2174 __ipv6_dev_ac_inc(ifp->idev, &addr); in addrconf_join_anycast()
2178 static void addrconf_leave_anycast(struct inet6_ifaddr *ifp) in addrconf_leave_anycast() argument
2182 if (ifp->prefix_len >= 127) /* RFC 6164 */ in addrconf_leave_anycast()
2184 ipv6_addr_prefix(&addr, &ifp->addr, ifp->prefix_len); in addrconf_leave_anycast()
2187 __ipv6_dev_ac_dec(ifp->idev, &addr); in addrconf_leave_anycast()
2312 struct inet6_ifaddr *ifp; in ipv6_inherit_eui64() local
2315 list_for_each_entry_reverse(ifp, &idev->addr_list, if_list) { in ipv6_inherit_eui64()
2316 if (ifp->scope > IFA_LINK) in ipv6_inherit_eui64()
2318 if (ifp->scope == IFA_LINK && !(ifp->flags&IFA_F_TENTATIVE)) { in ipv6_inherit_eui64()
2319 memcpy(eui, ifp->addr.s6_addr+8, 8); in ipv6_inherit_eui64()
2483 struct inet6_ifaddr *ifp, in manage_tempaddrs() argument
2495 if (ifp != ift->ifpub) in manage_tempaddrs()
2543 ipv6_create_tempaddr(ifp, NULL, false); in manage_tempaddrs()
2562 struct inet6_ifaddr *ifp = ipv6_get_ifaddr(net, addr, dev, 1); in addrconf_prefix_rcv_add_addr() local
2565 if (!ifp && valid_lft) { in addrconf_prefix_rcv_add_addr()
2588 ifp = ipv6_add_addr(in6_dev, &cfg, false, NULL); in addrconf_prefix_rcv_add_addr()
2590 if (IS_ERR_OR_NULL(ifp)) in addrconf_prefix_rcv_add_addr()
2594 spin_lock_bh(&ifp->lock); in addrconf_prefix_rcv_add_addr()
2595 ifp->flags |= IFA_F_MANAGETEMPADDR; in addrconf_prefix_rcv_add_addr()
2596 ifp->cstamp = jiffies; in addrconf_prefix_rcv_add_addr()
2597 ifp->tokenized = tokenized; in addrconf_prefix_rcv_add_addr()
2598 spin_unlock_bh(&ifp->lock); in addrconf_prefix_rcv_add_addr()
2599 addrconf_dad_start(ifp); in addrconf_prefix_rcv_add_addr()
2602 if (ifp) { in addrconf_prefix_rcv_add_addr()
2608 spin_lock_bh(&ifp->lock); in addrconf_prefix_rcv_add_addr()
2610 if (ifp->valid_lft > (now - ifp->tstamp) / HZ) in addrconf_prefix_rcv_add_addr()
2611 stored_lft = ifp->valid_lft - (now - ifp->tstamp) / HZ; in addrconf_prefix_rcv_add_addr()
2633 ifp->valid_lft = valid_lft; in addrconf_prefix_rcv_add_addr()
2634 ifp->prefered_lft = prefered_lft; in addrconf_prefix_rcv_add_addr()
2635 ifp->tstamp = now; in addrconf_prefix_rcv_add_addr()
2636 flags = ifp->flags; in addrconf_prefix_rcv_add_addr()
2637 ifp->flags &= ~IFA_F_DEPRECATED; in addrconf_prefix_rcv_add_addr()
2638 spin_unlock_bh(&ifp->lock); in addrconf_prefix_rcv_add_addr()
2641 ipv6_ifa_notify(0, ifp); in addrconf_prefix_rcv_add_addr()
2643 spin_unlock_bh(&ifp->lock); in addrconf_prefix_rcv_add_addr()
2645 manage_tempaddrs(in6_dev, ifp, valid_lft, prefered_lft, in addrconf_prefix_rcv_add_addr()
2648 in6_ifa_put(ifp); in addrconf_prefix_rcv_add_addr()
2898 struct inet6_ifaddr *ifp; in inet6_addr_add() local
2953 ifp = ipv6_add_addr(idev, cfg, true, extack); in inet6_addr_add()
2954 if (!IS_ERR(ifp)) { in inet6_addr_add()
2956 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, in inet6_addr_add()
2957 ifp->rt_priority, dev, expires, in inet6_addr_add()
2964 if (!(ifp->flags & (IFA_F_OPTIMISTIC | IFA_F_NODAD))) in inet6_addr_add()
2965 ipv6_ifa_notify(0, ifp); in inet6_addr_add()
2971 addrconf_dad_start(ifp); in inet6_addr_add()
2973 manage_tempaddrs(idev, ifp, cfg->valid_lft, in inet6_addr_add()
2975 in6_ifa_put(ifp); in inet6_addr_add()
2983 return PTR_ERR(ifp); in inet6_addr_add()
2989 struct inet6_ifaddr *ifp; in inet6_addr_del() local
3005 list_for_each_entry(ifp, &idev->addr_list, if_list) { in inet6_addr_del()
3006 if (ifp->prefix_len == plen && in inet6_addr_del()
3007 ipv6_addr_equal(pfx, &ifp->addr)) { in inet6_addr_del()
3008 in6_ifa_hold(ifp); in inet6_addr_del()
3011 if (!(ifp->flags & IFA_F_TEMPORARY) && in inet6_addr_del()
3013 manage_tempaddrs(idev, ifp, 0, 0, false, in inet6_addr_del()
3015 ipv6_del_addr(ifp); in inet6_addr_del()
3075 struct inet6_ifaddr *ifp; in add_addr() local
3085 ifp = ipv6_add_addr(idev, &cfg, true, NULL); in add_addr()
3086 if (!IS_ERR(ifp)) { in add_addr()
3087 spin_lock_bh(&ifp->lock); in add_addr()
3088 ifp->flags &= ~IFA_F_TENTATIVE; in add_addr()
3089 spin_unlock_bh(&ifp->lock); in add_addr()
3091 ipv6_ifa_notify(RTM_NEWADDR, ifp); in add_addr()
3092 in6_ifa_put(ifp); in add_addr()
3181 struct inet6_ifaddr *ifp; in addrconf_add_linklocal() local
3190 ifp = ipv6_add_addr(idev, &cfg, true, NULL); in addrconf_add_linklocal()
3191 if (!IS_ERR(ifp)) { in addrconf_add_linklocal()
3192 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, 0, idev->dev, in addrconf_add_linklocal()
3194 addrconf_dad_start(ifp); in addrconf_add_linklocal()
3195 in6_ifa_put(ifp); in addrconf_add_linklocal()
3415 struct inet6_ifaddr *ifp) in fixup_permanent_addr() argument
3421 if (!ifp->rt || !ifp->rt->fib6_node) { in fixup_permanent_addr()
3424 f6i = addrconf_f6i_alloc(net, idev, &ifp->addr, false, in fixup_permanent_addr()
3430 spin_lock(&ifp->lock); in fixup_permanent_addr()
3431 prev = ifp->rt; in fixup_permanent_addr()
3432 ifp->rt = f6i; in fixup_permanent_addr()
3433 spin_unlock(&ifp->lock); in fixup_permanent_addr()
3438 if (!(ifp->flags & IFA_F_NOPREFIXROUTE)) { in fixup_permanent_addr()
3439 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, in fixup_permanent_addr()
3440 ifp->rt_priority, idev->dev, 0, 0, in fixup_permanent_addr()
3444 if (ifp->state == INET6_IFADDR_STATE_PREDAD) in fixup_permanent_addr()
3445 addrconf_dad_start(ifp); in fixup_permanent_addr()
3452 struct inet6_ifaddr *ifp, *tmp; in addrconf_permanent_addr() local
3461 list_for_each_entry_safe(ifp, tmp, &idev->addr_list, if_list) { in addrconf_permanent_addr()
3462 if ((ifp->flags & IFA_F_PERMANENT) && in addrconf_permanent_addr()
3463 fixup_permanent_addr(net, idev, ifp) < 0) { in addrconf_permanent_addr()
3465 in6_ifa_hold(ifp); in addrconf_permanent_addr()
3466 ipv6_del_addr(ifp); in addrconf_permanent_addr()
3470 idev->dev->name, &ifp->addr); in addrconf_permanent_addr()
3909 static void addrconf_dad_kick(struct inet6_ifaddr *ifp) in addrconf_dad_kick() argument
3912 struct inet6_dev *idev = ifp->idev; in addrconf_dad_kick()
3915 if (ifp->flags & IFA_F_OPTIMISTIC) in addrconf_dad_kick()
3927 ifp->dad_nonce = nonce; in addrconf_dad_kick()
3928 ifp->dad_probes = idev->cnf.dad_transmits; in addrconf_dad_kick()
3929 addrconf_mod_dad_work(ifp, rand_num); in addrconf_dad_kick()
3932 static void addrconf_dad_begin(struct inet6_ifaddr *ifp) in addrconf_dad_begin() argument
3934 struct inet6_dev *idev = ifp->idev; in addrconf_dad_begin()
3939 addrconf_join_solict(dev, &ifp->addr); in addrconf_dad_begin()
3941 prandom_seed((__force u32) ifp->addr.s6_addr32[3]); in addrconf_dad_begin()
3944 spin_lock(&ifp->lock); in addrconf_dad_begin()
3945 if (ifp->state == INET6_IFADDR_STATE_DEAD) in addrconf_dad_begin()
3952 !(ifp->flags&IFA_F_TENTATIVE) || in addrconf_dad_begin()
3953 ifp->flags & IFA_F_NODAD) { in addrconf_dad_begin()
3956 if (ifp->flags & IFA_F_TENTATIVE && in addrconf_dad_begin()
3957 !(ifp->flags & IFA_F_OPTIMISTIC)) in addrconf_dad_begin()
3959 bump_id = ifp->flags & IFA_F_TENTATIVE; in addrconf_dad_begin()
3960 ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED); in addrconf_dad_begin()
3961 spin_unlock(&ifp->lock); in addrconf_dad_begin()
3964 addrconf_dad_completed(ifp, bump_id, send_na); in addrconf_dad_begin()
3969 spin_unlock(&ifp->lock); in addrconf_dad_begin()
3976 in6_ifa_hold(ifp); in addrconf_dad_begin()
3977 addrconf_dad_stop(ifp, 0); in addrconf_dad_begin()
3985 if (ifp->flags & IFA_F_OPTIMISTIC) { in addrconf_dad_begin()
3986 ip6_ins_rt(net, ifp->rt); in addrconf_dad_begin()
3995 addrconf_dad_kick(ifp); in addrconf_dad_begin()
3997 spin_unlock(&ifp->lock); in addrconf_dad_begin()
4000 ipv6_ifa_notify(RTM_NEWADDR, ifp); in addrconf_dad_begin()
4003 static void addrconf_dad_start(struct inet6_ifaddr *ifp) in addrconf_dad_start() argument
4007 spin_lock_bh(&ifp->lock); in addrconf_dad_start()
4008 if (ifp->state != INET6_IFADDR_STATE_DEAD) { in addrconf_dad_start()
4009 ifp->state = INET6_IFADDR_STATE_PREDAD; in addrconf_dad_start()
4012 spin_unlock_bh(&ifp->lock); in addrconf_dad_start()
4015 addrconf_mod_dad_work(ifp, 0); in addrconf_dad_start()
4020 struct inet6_ifaddr *ifp = container_of(to_delayed_work(w), in addrconf_dad_work() local
4023 struct inet6_dev *idev = ifp->idev; in addrconf_dad_work()
4035 spin_lock_bh(&ifp->lock); in addrconf_dad_work()
4036 if (ifp->state == INET6_IFADDR_STATE_PREDAD) { in addrconf_dad_work()
4038 ifp->state = INET6_IFADDR_STATE_DAD; in addrconf_dad_work()
4039 } else if (ifp->state == INET6_IFADDR_STATE_ERRDAD) { in addrconf_dad_work()
4041 ifp->state = INET6_IFADDR_STATE_POSTDAD; in addrconf_dad_work()
4046 !(ifp->flags & IFA_F_STABLE_PRIVACY)) { in addrconf_dad_work()
4053 ipv6_addr_equal(&ifp->addr, &addr)) { in addrconf_dad_work()
4058 ifp->idev->dev->name); in addrconf_dad_work()
4063 spin_unlock_bh(&ifp->lock); in addrconf_dad_work()
4066 addrconf_dad_begin(ifp); in addrconf_dad_work()
4069 in6_ifa_hold(ifp); in addrconf_dad_work()
4070 addrconf_dad_stop(ifp, 1); in addrconf_dad_work()
4076 if (!ifp->dad_probes && addrconf_dad_end(ifp)) in addrconf_dad_work()
4085 spin_lock(&ifp->lock); in addrconf_dad_work()
4086 if (ifp->state == INET6_IFADDR_STATE_DEAD) { in addrconf_dad_work()
4087 spin_unlock(&ifp->lock); in addrconf_dad_work()
4092 if (ifp->dad_probes == 0) { in addrconf_dad_work()
4099 if (ifp->flags & IFA_F_TENTATIVE && in addrconf_dad_work()
4100 !(ifp->flags & IFA_F_OPTIMISTIC)) in addrconf_dad_work()
4102 bump_id = ifp->flags & IFA_F_TENTATIVE; in addrconf_dad_work()
4103 ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED); in addrconf_dad_work()
4104 spin_unlock(&ifp->lock); in addrconf_dad_work()
4107 addrconf_dad_completed(ifp, bump_id, send_na); in addrconf_dad_work()
4112 ifp->dad_probes--; in addrconf_dad_work()
4113 addrconf_mod_dad_work(ifp, in addrconf_dad_work()
4114 NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME)); in addrconf_dad_work()
4115 spin_unlock(&ifp->lock); in addrconf_dad_work()
4119 addrconf_addr_solict_mult(&ifp->addr, &mcaddr); in addrconf_dad_work()
4120 ndisc_send_ns(ifp->idev->dev, &ifp->addr, &mcaddr, &in6addr_any, in addrconf_dad_work()
4121 ifp->dad_nonce); in addrconf_dad_work()
4123 in6_ifa_put(ifp); in addrconf_dad_work()
4128 static bool ipv6_lonely_lladdr(struct inet6_ifaddr *ifp) in ipv6_lonely_lladdr() argument
4131 struct inet6_dev *idev = ifp->idev; in ipv6_lonely_lladdr()
4136 if (ifp != ifpiter && ifpiter->scope == IFA_LINK && in ipv6_lonely_lladdr()
4145 static void addrconf_dad_completed(struct inet6_ifaddr *ifp, bool bump_id, in addrconf_dad_completed() argument
4148 struct net_device *dev = ifp->idev->dev; in addrconf_dad_completed()
4152 addrconf_del_dad_work(ifp); in addrconf_dad_completed()
4158 ipv6_ifa_notify(RTM_NEWADDR, ifp); in addrconf_dad_completed()
4164 read_lock_bh(&ifp->idev->lock); in addrconf_dad_completed()
4165 send_mld = ifp->scope == IFA_LINK && ipv6_lonely_lladdr(ifp); in addrconf_dad_completed()
4167 ipv6_accept_ra(ifp->idev) && in addrconf_dad_completed()
4168 ifp->idev->cnf.rtr_solicits != 0 && in addrconf_dad_completed()
4170 read_unlock_bh(&ifp->idev->lock); in addrconf_dad_completed()
4176 ipv6_mc_dad_complete(ifp->idev); in addrconf_dad_completed()
4180 (ifp->idev->cnf.ndisc_notify || in addrconf_dad_completed()
4182 ndisc_send_na(dev, &in6addr_linklocal_allnodes, &ifp->addr, in addrconf_dad_completed()
4183 /*router=*/ !!ifp->idev->cnf.forwarding, in addrconf_dad_completed()
4198 write_lock_bh(&ifp->idev->lock); in addrconf_dad_completed()
4199 spin_lock(&ifp->lock); in addrconf_dad_completed()
4200 ifp->idev->rs_interval = rfc3315_s14_backoff_init( in addrconf_dad_completed()
4201 ifp->idev->cnf.rtr_solicit_interval); in addrconf_dad_completed()
4202 ifp->idev->rs_probes = 1; in addrconf_dad_completed()
4203 ifp->idev->if_flags |= IF_RS_SENT; in addrconf_dad_completed()
4204 addrconf_mod_rs_timer(ifp->idev, ifp->idev->rs_interval); in addrconf_dad_completed()
4205 spin_unlock(&ifp->lock); in addrconf_dad_completed()
4206 write_unlock_bh(&ifp->idev->lock); in addrconf_dad_completed()
4215 if (ifp->flags & IFA_F_TEMPORARY) in addrconf_dad_completed()
4221 struct inet6_ifaddr *ifp; in addrconf_dad_run() local
4224 list_for_each_entry(ifp, &idev->addr_list, if_list) { in addrconf_dad_run()
4225 spin_lock(&ifp->lock); in addrconf_dad_run()
4226 if ((ifp->flags & IFA_F_TENTATIVE && in addrconf_dad_run()
4227 ifp->state == INET6_IFADDR_STATE_DAD) || restart) { in addrconf_dad_run()
4229 ifp->state = INET6_IFADDR_STATE_PREDAD; in addrconf_dad_run()
4230 addrconf_dad_kick(ifp); in addrconf_dad_run()
4232 spin_unlock(&ifp->lock); in addrconf_dad_run()
4327 struct inet6_ifaddr *ifp = (struct inet6_ifaddr *)v; in if6_seq_show() local
4329 &ifp->addr, in if6_seq_show()
4330 ifp->idev->dev->ifindex, in if6_seq_show()
4331 ifp->prefix_len, in if6_seq_show()
4332 ifp->scope, in if6_seq_show()
4333 (u8) ifp->flags, in if6_seq_show()
4334 ifp->idev->dev->name); in if6_seq_show()
4379 struct inet6_ifaddr *ifp = NULL; in ipv6_chk_home_addr() local
4383 hlist_for_each_entry_rcu(ifp, &inet6_addr_lst[hash], addr_lst) { in ipv6_chk_home_addr()
4384 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_chk_home_addr()
4386 if (ipv6_addr_equal(&ifp->addr, addr) && in ipv6_chk_home_addr()
4387 (ifp->flags & IFA_F_HOMEADDRESS)) { in ipv6_chk_home_addr()
4404 struct inet6_ifaddr *ifp; in addrconf_verify_rtnl() local
4417 hlist_for_each_entry_rcu_bh(ifp, &inet6_addr_lst[i], addr_lst) { in addrconf_verify_rtnl()
4424 if ((ifp->flags & IFA_F_PERMANENT) && in addrconf_verify_rtnl()
4425 (ifp->prefered_lft == INFINITY_LIFE_TIME)) in addrconf_verify_rtnl()
4428 spin_lock(&ifp->lock); in addrconf_verify_rtnl()
4430 age = (now - ifp->tstamp + ADDRCONF_TIMER_FUZZ_MINUS) / HZ; in addrconf_verify_rtnl()
4432 if (ifp->valid_lft != INFINITY_LIFE_TIME && in addrconf_verify_rtnl()
4433 age >= ifp->valid_lft) { in addrconf_verify_rtnl()
4434 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
4435 in6_ifa_hold(ifp); in addrconf_verify_rtnl()
4436 ipv6_del_addr(ifp); in addrconf_verify_rtnl()
4438 } else if (ifp->prefered_lft == INFINITY_LIFE_TIME) { in addrconf_verify_rtnl()
4439 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
4441 } else if (age >= ifp->prefered_lft) { in addrconf_verify_rtnl()
4445 if (!(ifp->flags&IFA_F_DEPRECATED)) { in addrconf_verify_rtnl()
4447 ifp->flags |= IFA_F_DEPRECATED; in addrconf_verify_rtnl()
4450 if ((ifp->valid_lft != INFINITY_LIFE_TIME) && in addrconf_verify_rtnl()
4451 (time_before(ifp->tstamp + ifp->valid_lft * HZ, next))) in addrconf_verify_rtnl()
4452 next = ifp->tstamp + ifp->valid_lft * HZ; in addrconf_verify_rtnl()
4454 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
4457 in6_ifa_hold(ifp); in addrconf_verify_rtnl()
4459 ipv6_ifa_notify(0, ifp); in addrconf_verify_rtnl()
4460 in6_ifa_put(ifp); in addrconf_verify_rtnl()
4463 } else if ((ifp->flags&IFA_F_TEMPORARY) && in addrconf_verify_rtnl()
4464 !(ifp->flags&IFA_F_TENTATIVE)) { in addrconf_verify_rtnl()
4465 unsigned long regen_advance = ifp->idev->cnf.regen_max_retry * in addrconf_verify_rtnl()
4466 ifp->idev->cnf.dad_transmits * in addrconf_verify_rtnl()
4467 NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME) / HZ; in addrconf_verify_rtnl()
4469 if (age >= ifp->prefered_lft - regen_advance) { in addrconf_verify_rtnl()
4470 struct inet6_ifaddr *ifpub = ifp->ifpub; in addrconf_verify_rtnl()
4471 if (time_before(ifp->tstamp + ifp->prefered_lft * HZ, next)) in addrconf_verify_rtnl()
4472 next = ifp->tstamp + ifp->prefered_lft * HZ; in addrconf_verify_rtnl()
4473 if (!ifp->regen_count && ifpub) { in addrconf_verify_rtnl()
4474 ifp->regen_count++; in addrconf_verify_rtnl()
4475 in6_ifa_hold(ifp); in addrconf_verify_rtnl()
4477 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
4483 ipv6_create_tempaddr(ifpub, ifp, true); in addrconf_verify_rtnl()
4485 in6_ifa_put(ifp); in addrconf_verify_rtnl()
4489 } else if (time_before(ifp->tstamp + ifp->prefered_lft * HZ - regen_advance * HZ, next)) in addrconf_verify_rtnl()
4490 next = ifp->tstamp + ifp->prefered_lft * HZ - regen_advance * HZ; in addrconf_verify_rtnl()
4491 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
4494 if (time_before(ifp->tstamp + ifp->prefered_lft * HZ, next)) in addrconf_verify_rtnl()
4495 next = ifp->tstamp + ifp->prefered_lft * HZ; in addrconf_verify_rtnl()
4496 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
4588 static int modify_prefix_route(struct inet6_ifaddr *ifp, in modify_prefix_route() argument
4594 f6i = addrconf_get_prefix_route(&ifp->addr, ifp->prefix_len, in modify_prefix_route()
4595 ifp->idev->dev, 0, RTF_DEFAULT, true); in modify_prefix_route()
4599 prio = ifp->rt_priority ? : IP6_RT_PRIO_ADDRCONF; in modify_prefix_route()
4602 ip6_del_rt(dev_net(ifp->idev->dev), f6i); in modify_prefix_route()
4605 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, in modify_prefix_route()
4606 ifp->rt_priority, ifp->idev->dev, in modify_prefix_route()
4620 static int inet6_addr_modify(struct inet6_ifaddr *ifp, struct ifa6_config *cfg) in inet6_addr_modify() argument
4634 (ifp->flags & IFA_F_TEMPORARY || ifp->prefix_len != 64)) in inet6_addr_modify()
4637 if (!(ifp->flags & IFA_F_TENTATIVE) || ifp->flags & IFA_F_DADFAILED) in inet6_addr_modify()
4658 spin_lock_bh(&ifp->lock); in inet6_addr_modify()
4659 was_managetempaddr = ifp->flags & IFA_F_MANAGETEMPADDR; in inet6_addr_modify()
4660 had_prefixroute = ifp->flags & IFA_F_PERMANENT && in inet6_addr_modify()
4661 !(ifp->flags & IFA_F_NOPREFIXROUTE); in inet6_addr_modify()
4662 ifp->flags &= ~(IFA_F_DEPRECATED | IFA_F_PERMANENT | IFA_F_NODAD | in inet6_addr_modify()
4665 ifp->flags |= cfg->ifa_flags; in inet6_addr_modify()
4666 ifp->tstamp = jiffies; in inet6_addr_modify()
4667 ifp->valid_lft = cfg->valid_lft; in inet6_addr_modify()
4668 ifp->prefered_lft = cfg->preferred_lft; in inet6_addr_modify()
4670 if (cfg->rt_priority && cfg->rt_priority != ifp->rt_priority) in inet6_addr_modify()
4671 ifp->rt_priority = cfg->rt_priority; in inet6_addr_modify()
4673 spin_unlock_bh(&ifp->lock); in inet6_addr_modify()
4674 if (!(ifp->flags&IFA_F_TENTATIVE)) in inet6_addr_modify()
4675 ipv6_ifa_notify(0, ifp); in inet6_addr_modify()
4681 rc = modify_prefix_route(ifp, expires, flags); in inet6_addr_modify()
4685 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, in inet6_addr_modify()
4686 ifp->rt_priority, ifp->idev->dev, in inet6_addr_modify()
4693 write_lock_bh(&ifp->idev->lock); in inet6_addr_modify()
4694 action = check_cleanup_prefix_route(ifp, &rt_expires); in inet6_addr_modify()
4695 write_unlock_bh(&ifp->idev->lock); in inet6_addr_modify()
4698 cleanup_prefix_route(ifp, rt_expires, in inet6_addr_modify()
4703 if (was_managetempaddr || ifp->flags & IFA_F_MANAGETEMPADDR) { in inet6_addr_modify()
4705 !(ifp->flags & IFA_F_MANAGETEMPADDR)) { in inet6_addr_modify()
4709 manage_tempaddrs(ifp->idev, ifp, cfg->valid_lft, in inet6_addr_modify()
5594 struct inet6_ifaddr *ifp; in inet6_set_iftoken() local
5643 list_for_each_entry(ifp, &idev->addr_list, if_list) { in inet6_set_iftoken()
5644 spin_lock(&ifp->lock); in inet6_set_iftoken()
5645 if (ifp->tokenized) { in inet6_set_iftoken()
5646 ifp->valid_lft = 0; in inet6_set_iftoken()
5647 ifp->prefered_lft = 0; in inet6_set_iftoken()
5649 spin_unlock(&ifp->lock); in inet6_set_iftoken()
5955 static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp) in __ipv6_ifa_notify() argument
5957 struct net *net = dev_net(ifp->idev->dev); in __ipv6_ifa_notify()
5962 inet6_ifa_notify(event ? : RTM_NEWADDR, ifp); in __ipv6_ifa_notify()
5974 if (ifp->rt && !rcu_access_pointer(ifp->rt->fib6_node)) { in __ipv6_ifa_notify()
5975 ip6_ins_rt(net, ifp->rt); in __ipv6_ifa_notify()
5976 } else if (!ifp->rt && (ifp->idev->dev->flags & IFF_UP)) { in __ipv6_ifa_notify()
5978 &ifp->addr, ifp->idev->dev->name); in __ipv6_ifa_notify()
5981 if (ifp->idev->cnf.forwarding) in __ipv6_ifa_notify()
5982 addrconf_join_anycast(ifp); in __ipv6_ifa_notify()
5983 if (!ipv6_addr_any(&ifp->peer_addr)) in __ipv6_ifa_notify()
5984 addrconf_prefix_route(&ifp->peer_addr, 128, 0, in __ipv6_ifa_notify()
5985 ifp->idev->dev, 0, 0, in __ipv6_ifa_notify()
5989 if (ifp->idev->cnf.forwarding) in __ipv6_ifa_notify()
5990 addrconf_leave_anycast(ifp); in __ipv6_ifa_notify()
5991 addrconf_leave_solict(ifp->idev, &ifp->addr); in __ipv6_ifa_notify()
5992 if (!ipv6_addr_any(&ifp->peer_addr)) { in __ipv6_ifa_notify()
5995 rt = addrconf_get_prefix_route(&ifp->peer_addr, 128, in __ipv6_ifa_notify()
5996 ifp->idev->dev, 0, 0, in __ipv6_ifa_notify()
6001 if (ifp->rt) { in __ipv6_ifa_notify()
6002 ip6_del_rt(net, ifp->rt); in __ipv6_ifa_notify()
6003 ifp->rt = NULL; in __ipv6_ifa_notify()
6011 static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp) in ipv6_ifa_notify() argument
6014 if (likely(ifp->idev->dead == 0)) in ipv6_ifa_notify()
6015 __ipv6_ifa_notify(event, ifp); in ipv6_ifa_notify()