Lines Matching refs:ifp

152 static void addrconf_join_anycast(struct inet6_ifaddr *ifp);
153 static void addrconf_leave_anycast(struct inet6_ifaddr *ifp);
164 static void addrconf_dad_start(struct inet6_ifaddr *ifp);
166 static void addrconf_dad_completed(struct inet6_ifaddr *ifp);
277 static void addrconf_del_dad_work(struct inet6_ifaddr *ifp) in addrconf_del_dad_work() argument
279 if (cancel_delayed_work(&ifp->dad_work)) in addrconf_del_dad_work()
280 __in6_ifa_put(ifp); in addrconf_del_dad_work()
291 static void addrconf_mod_dad_work(struct inet6_ifaddr *ifp, in addrconf_mod_dad_work() argument
294 if (!delayed_work_pending(&ifp->dad_work)) in addrconf_mod_dad_work()
295 in6_ifa_hold(ifp); in addrconf_mod_dad_work()
296 mod_delayed_work(addrconf_wq, &ifp->dad_work, delay); in addrconf_mod_dad_work()
848 void inet6_ifa_finish_destroy(struct inet6_ifaddr *ifp) in inet6_ifa_finish_destroy() argument
850 WARN_ON(!hlist_unhashed(&ifp->addr_lst)); in inet6_ifa_finish_destroy()
856 in6_dev_put(ifp->idev); in inet6_ifa_finish_destroy()
858 if (cancel_delayed_work(&ifp->dad_work)) in inet6_ifa_finish_destroy()
860 ifp); in inet6_ifa_finish_destroy()
862 if (ifp->state != INET6_IFADDR_STATE_DEAD) { in inet6_ifa_finish_destroy()
863 pr_warn("Freeing alive inet6 address %p\n", ifp); in inet6_ifa_finish_destroy()
866 ip6_rt_put(ifp->rt); in inet6_ifa_finish_destroy()
868 kfree_rcu(ifp, rcu); in inet6_ifa_finish_destroy()
872 ipv6_link_dev_addr(struct inet6_dev *idev, struct inet6_ifaddr *ifp) in ipv6_link_dev_addr() argument
875 int ifp_scope = ipv6_addr_src_scope(&ifp->addr); in ipv6_link_dev_addr()
888 list_add_tail(&ifp->if_list, p); in ipv6_link_dev_addr()
1031 check_cleanup_prefix_route(struct inet6_ifaddr *ifp, unsigned long *expires) in check_cleanup_prefix_route() argument
1034 struct inet6_dev *idev = ifp->idev; in check_cleanup_prefix_route()
1041 if (ifa == ifp) in check_cleanup_prefix_route()
1043 if (!ipv6_prefix_equal(&ifa->addr, &ifp->addr, in check_cleanup_prefix_route()
1044 ifp->prefix_len)) in check_cleanup_prefix_route()
1068 cleanup_prefix_route(struct inet6_ifaddr *ifp, unsigned long expires, bool del_rt) in cleanup_prefix_route() argument
1072 rt = addrconf_get_prefix_route(&ifp->addr, in cleanup_prefix_route()
1073 ifp->prefix_len, in cleanup_prefix_route()
1074 ifp->idev->dev, in cleanup_prefix_route()
1090 static void ipv6_del_addr(struct inet6_ifaddr *ifp) in ipv6_del_addr() argument
1098 spin_lock_bh(&ifp->lock); in ipv6_del_addr()
1099 state = ifp->state; in ipv6_del_addr()
1100 ifp->state = INET6_IFADDR_STATE_DEAD; in ipv6_del_addr()
1101 spin_unlock_bh(&ifp->lock); in ipv6_del_addr()
1107 hlist_del_init_rcu(&ifp->addr_lst); in ipv6_del_addr()
1110 write_lock_bh(&ifp->idev->lock); in ipv6_del_addr()
1112 if (ifp->flags&IFA_F_TEMPORARY) { in ipv6_del_addr()
1113 list_del(&ifp->tmp_list); in ipv6_del_addr()
1114 if (ifp->ifpub) { in ipv6_del_addr()
1115 in6_ifa_put(ifp->ifpub); in ipv6_del_addr()
1116 ifp->ifpub = NULL; in ipv6_del_addr()
1118 __in6_ifa_put(ifp); in ipv6_del_addr()
1121 if (ifp->flags & IFA_F_PERMANENT && !(ifp->flags & IFA_F_NOPREFIXROUTE)) in ipv6_del_addr()
1122 action = check_cleanup_prefix_route(ifp, &expires); in ipv6_del_addr()
1124 list_del_init(&ifp->if_list); in ipv6_del_addr()
1125 __in6_ifa_put(ifp); in ipv6_del_addr()
1127 write_unlock_bh(&ifp->idev->lock); in ipv6_del_addr()
1129 addrconf_del_dad_work(ifp); in ipv6_del_addr()
1131 ipv6_ifa_notify(RTM_DELADDR, ifp); in ipv6_del_addr()
1133 inet6addr_notifier_call_chain(NETDEV_DOWN, ifp); in ipv6_del_addr()
1136 cleanup_prefix_route(ifp, expires, in ipv6_del_addr()
1141 rt6_remove_prefsrc(ifp); in ipv6_del_addr()
1143 in6_ifa_put(ifp); in ipv6_del_addr()
1146 static int ipv6_create_tempaddr(struct inet6_ifaddr *ifp, struct inet6_ifaddr *ift) in ipv6_create_tempaddr() argument
1148 struct inet6_dev *idev = ifp->idev; in ipv6_create_tempaddr()
1175 spin_lock_bh(&ifp->lock); in ipv6_create_tempaddr()
1176 if (ifp->regen_count++ >= idev->cnf.regen_max_retry) { in ipv6_create_tempaddr()
1178 spin_unlock_bh(&ifp->lock); in ipv6_create_tempaddr()
1186 in6_ifa_hold(ifp); in ipv6_create_tempaddr()
1187 memcpy(addr.s6_addr, ifp->addr.s6_addr, 8); in ipv6_create_tempaddr()
1190 age = (now - ifp->tstamp) / HZ; in ipv6_create_tempaddr()
1192 ifp->valid_lft, in ipv6_create_tempaddr()
1195 ifp->prefered_lft, in ipv6_create_tempaddr()
1198 tmp_plen = ifp->prefix_len; in ipv6_create_tempaddr()
1199 tmp_tstamp = ifp->tstamp; in ipv6_create_tempaddr()
1200 spin_unlock_bh(&ifp->lock); in ipv6_create_tempaddr()
1216 in6_ifa_put(ifp); in ipv6_create_tempaddr()
1224 if (ifp->flags & IFA_F_OPTIMISTIC) in ipv6_create_tempaddr()
1231 in6_ifa_put(ifp); in ipv6_create_tempaddr()
1240 ift->ifpub = ifp; in ipv6_create_tempaddr()
1595 struct inet6_ifaddr *ifp; in __ipv6_get_lladdr() local
1598 list_for_each_entry_reverse(ifp, &idev->addr_list, if_list) { in __ipv6_get_lladdr()
1599 if (ifp->scope > IFA_LINK) in __ipv6_get_lladdr()
1601 if (ifp->scope == IFA_LINK && in __ipv6_get_lladdr()
1602 !(ifp->flags & banned_flags)) { in __ipv6_get_lladdr()
1603 *addr = ifp->addr; in __ipv6_get_lladdr()
1631 struct inet6_ifaddr *ifp; in ipv6_count_addresses() local
1634 list_for_each_entry(ifp, &idev->addr_list, if_list) in ipv6_count_addresses()
1651 struct inet6_ifaddr *ifp; in ipv6_chk_addr_and_flags() local
1656 hlist_for_each_entry_rcu(ifp, &inet6_addr_lst[hash], addr_lst) { in ipv6_chk_addr_and_flags()
1657 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_chk_addr_and_flags()
1662 ifp_flags = (ifp->flags&IFA_F_OPTIMISTIC) in ipv6_chk_addr_and_flags()
1663 ? (ifp->flags&~IFA_F_TENTATIVE) in ipv6_chk_addr_and_flags()
1664 : ifp->flags; in ipv6_chk_addr_and_flags()
1665 if (ipv6_addr_equal(&ifp->addr, addr) && in ipv6_chk_addr_and_flags()
1667 (!dev || ifp->idev->dev == dev || in ipv6_chk_addr_and_flags()
1668 !(ifp->scope&(IFA_LINK|IFA_HOST) || strict))) { in ipv6_chk_addr_and_flags()
1683 struct inet6_ifaddr *ifp; in ipv6_chk_same_addr() local
1685 hlist_for_each_entry(ifp, &inet6_addr_lst[hash], addr_lst) { in ipv6_chk_same_addr()
1686 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_chk_same_addr()
1688 if (ipv6_addr_equal(&ifp->addr, addr)) { in ipv6_chk_same_addr()
1689 if (!dev || ifp->idev->dev == dev) in ipv6_chk_same_addr()
1750 struct inet6_ifaddr *ifp, *result = NULL; in ipv6_get_ifaddr() local
1754 hlist_for_each_entry_rcu_bh(ifp, &inet6_addr_lst[hash], addr_lst) { in ipv6_get_ifaddr()
1755 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_get_ifaddr()
1757 if (ipv6_addr_equal(&ifp->addr, addr)) { in ipv6_get_ifaddr()
1758 if (!dev || ifp->idev->dev == dev || in ipv6_get_ifaddr()
1759 !(ifp->scope&(IFA_LINK|IFA_HOST) || strict)) { in ipv6_get_ifaddr()
1760 result = ifp; in ipv6_get_ifaddr()
1761 in6_ifa_hold(ifp); in ipv6_get_ifaddr()
1773 static void addrconf_dad_stop(struct inet6_ifaddr *ifp, int dad_failed) in addrconf_dad_stop() argument
1775 if (ifp->flags&IFA_F_PERMANENT) { in addrconf_dad_stop()
1776 spin_lock_bh(&ifp->lock); in addrconf_dad_stop()
1777 addrconf_del_dad_work(ifp); in addrconf_dad_stop()
1778 ifp->flags |= IFA_F_TENTATIVE; in addrconf_dad_stop()
1780 ifp->flags |= IFA_F_DADFAILED; in addrconf_dad_stop()
1781 spin_unlock_bh(&ifp->lock); in addrconf_dad_stop()
1783 ipv6_ifa_notify(0, ifp); in addrconf_dad_stop()
1784 in6_ifa_put(ifp); in addrconf_dad_stop()
1785 } else if (ifp->flags&IFA_F_TEMPORARY) { in addrconf_dad_stop()
1787 spin_lock_bh(&ifp->lock); in addrconf_dad_stop()
1788 ifpub = ifp->ifpub; in addrconf_dad_stop()
1791 spin_unlock_bh(&ifp->lock); in addrconf_dad_stop()
1792 ipv6_create_tempaddr(ifpub, ifp); in addrconf_dad_stop()
1795 spin_unlock_bh(&ifp->lock); in addrconf_dad_stop()
1797 ipv6_del_addr(ifp); in addrconf_dad_stop()
1799 ipv6_del_addr(ifp); in addrconf_dad_stop()
1803 static int addrconf_dad_end(struct inet6_ifaddr *ifp) in addrconf_dad_end() argument
1807 spin_lock_bh(&ifp->lock); in addrconf_dad_end()
1808 if (ifp->state == INET6_IFADDR_STATE_DAD) { in addrconf_dad_end()
1809 ifp->state = INET6_IFADDR_STATE_POSTDAD; in addrconf_dad_end()
1812 spin_unlock_bh(&ifp->lock); in addrconf_dad_end()
1817 void addrconf_dad_failure(struct inet6_ifaddr *ifp) in addrconf_dad_failure() argument
1820 struct inet6_dev *idev = ifp->idev; in addrconf_dad_failure()
1821 struct net *net = dev_net(ifp->idev->dev); in addrconf_dad_failure()
1823 if (addrconf_dad_end(ifp)) { in addrconf_dad_failure()
1824 in6_ifa_put(ifp); in addrconf_dad_failure()
1829 ifp->idev->dev->name, &ifp->addr); in addrconf_dad_failure()
1831 spin_lock_bh(&ifp->lock); in addrconf_dad_failure()
1833 if (ifp->flags & IFA_F_STABLE_PRIVACY) { in addrconf_dad_failure()
1834 int scope = ifp->scope; in addrconf_dad_failure()
1835 u32 flags = ifp->flags; in addrconf_dad_failure()
1839 int pfxlen = ifp->prefix_len; in addrconf_dad_failure()
1840 int retries = ifp->stable_privacy_retry + 1; in addrconf_dad_failure()
1844 ifp->idev->dev->name); in addrconf_dad_failure()
1848 new_addr = ifp->addr; in addrconf_dad_failure()
1853 valid_lft = ifp->valid_lft; in addrconf_dad_failure()
1854 preferred_lft = ifp->prefered_lft; in addrconf_dad_failure()
1856 spin_unlock_bh(&ifp->lock); in addrconf_dad_failure()
1864 ifp->idev->dev->name); in addrconf_dad_failure()
1880 spin_lock_bh(&ifp->lock); in addrconf_dad_failure()
1886 ipv6_addr_equal(&ifp->addr, &addr)) { in addrconf_dad_failure()
1891 ifp->idev->dev->name); in addrconf_dad_failure()
1897 ifp->state = INET6_IFADDR_STATE_ERRDAD; in addrconf_dad_failure()
1898 spin_unlock_bh(&ifp->lock); in addrconf_dad_failure()
1900 addrconf_mod_dad_work(ifp, 0); in addrconf_dad_failure()
1929 static void addrconf_join_anycast(struct inet6_ifaddr *ifp) in addrconf_join_anycast() argument
1933 if (ifp->prefix_len >= 127) /* RFC 6164 */ in addrconf_join_anycast()
1935 ipv6_addr_prefix(&addr, &ifp->addr, ifp->prefix_len); in addrconf_join_anycast()
1938 __ipv6_dev_ac_inc(ifp->idev, &addr); in addrconf_join_anycast()
1942 static void addrconf_leave_anycast(struct inet6_ifaddr *ifp) in addrconf_leave_anycast() argument
1946 if (ifp->prefix_len >= 127) /* RFC 6164 */ in addrconf_leave_anycast()
1948 ipv6_addr_prefix(&addr, &ifp->addr, ifp->prefix_len); in addrconf_leave_anycast()
1951 __ipv6_dev_ac_dec(ifp->idev, &addr); in addrconf_leave_anycast()
2063 struct inet6_ifaddr *ifp; in ipv6_inherit_eui64() local
2066 list_for_each_entry_reverse(ifp, &idev->addr_list, if_list) { in ipv6_inherit_eui64()
2067 if (ifp->scope > IFA_LINK) in ipv6_inherit_eui64()
2069 if (ifp->scope == IFA_LINK && !(ifp->flags&IFA_F_TENTATIVE)) { in ipv6_inherit_eui64()
2070 memcpy(eui, ifp->addr.s6_addr+8, 8); in ipv6_inherit_eui64()
2257 struct inet6_ifaddr *ifp, in manage_tempaddrs() argument
2269 if (ifp != ift->ifpub) in manage_tempaddrs()
2317 ipv6_create_tempaddr(ifp, NULL); in manage_tempaddrs()
2422 struct inet6_ifaddr *ifp; in addrconf_prefix_rcv() local
2456 ifp = ipv6_get_ifaddr(net, &addr, dev, 1); in addrconf_prefix_rcv()
2458 if (!ifp && valid_lft) { in addrconf_prefix_rcv()
2472 ifp = ipv6_add_addr(in6_dev, &addr, NULL, in addrconf_prefix_rcv()
2478 if (IS_ERR_OR_NULL(ifp)) { in addrconf_prefix_rcv()
2485 spin_lock_bh(&ifp->lock); in addrconf_prefix_rcv()
2486 ifp->flags |= IFA_F_MANAGETEMPADDR; in addrconf_prefix_rcv()
2487 ifp->cstamp = jiffies; in addrconf_prefix_rcv()
2488 ifp->tokenized = tokenized; in addrconf_prefix_rcv()
2489 spin_unlock_bh(&ifp->lock); in addrconf_prefix_rcv()
2490 addrconf_dad_start(ifp); in addrconf_prefix_rcv()
2493 if (ifp) { in addrconf_prefix_rcv()
2499 spin_lock_bh(&ifp->lock); in addrconf_prefix_rcv()
2501 if (ifp->valid_lft > (now - ifp->tstamp) / HZ) in addrconf_prefix_rcv()
2502 stored_lft = ifp->valid_lft - (now - ifp->tstamp) / HZ; in addrconf_prefix_rcv()
2524 ifp->valid_lft = valid_lft; in addrconf_prefix_rcv()
2525 ifp->prefered_lft = prefered_lft; in addrconf_prefix_rcv()
2526 ifp->tstamp = now; in addrconf_prefix_rcv()
2527 flags = ifp->flags; in addrconf_prefix_rcv()
2528 ifp->flags &= ~IFA_F_DEPRECATED; in addrconf_prefix_rcv()
2529 spin_unlock_bh(&ifp->lock); in addrconf_prefix_rcv()
2532 ipv6_ifa_notify(0, ifp); in addrconf_prefix_rcv()
2534 spin_unlock_bh(&ifp->lock); in addrconf_prefix_rcv()
2536 manage_tempaddrs(in6_dev, ifp, valid_lft, prefered_lft, in addrconf_prefix_rcv()
2539 in6_ifa_put(ifp); in addrconf_prefix_rcv()
2639 struct inet6_ifaddr *ifp; in inet6_addr_add() local
2695 ifp = ipv6_add_addr(idev, pfx, peer_pfx, plen, scope, ifa_flags, in inet6_addr_add()
2698 if (!IS_ERR(ifp)) { in inet6_addr_add()
2700 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, dev, in inet6_addr_add()
2709 addrconf_dad_start(ifp); in inet6_addr_add()
2711 manage_tempaddrs(idev, ifp, valid_lft, prefered_lft, in inet6_addr_add()
2713 in6_ifa_put(ifp); in inet6_addr_add()
2721 return PTR_ERR(ifp); in inet6_addr_add()
2727 struct inet6_ifaddr *ifp; in inet6_addr_del() local
2743 list_for_each_entry(ifp, &idev->addr_list, if_list) { in inet6_addr_del()
2744 if (ifp->prefix_len == plen && in inet6_addr_del()
2745 ipv6_addr_equal(pfx, &ifp->addr)) { in inet6_addr_del()
2746 in6_ifa_hold(ifp); in inet6_addr_del()
2749 if (!(ifp->flags & IFA_F_TEMPORARY) && in inet6_addr_del()
2751 manage_tempaddrs(idev, ifp, 0, 0, false, in inet6_addr_del()
2753 ipv6_del_addr(ifp); in inet6_addr_del()
2807 struct inet6_ifaddr *ifp; in add_addr() local
2809 ifp = ipv6_add_addr(idev, addr, NULL, plen, in add_addr()
2812 if (!IS_ERR(ifp)) { in add_addr()
2813 spin_lock_bh(&ifp->lock); in add_addr()
2814 ifp->flags &= ~IFA_F_TENTATIVE; in add_addr()
2815 spin_unlock_bh(&ifp->lock); in add_addr()
2816 ipv6_ifa_notify(RTM_NEWADDR, ifp); in add_addr()
2817 in6_ifa_put(ifp); in add_addr()
2941 struct inet6_ifaddr *ifp; in addrconf_add_linklocal() local
2950 ifp = ipv6_add_addr(idev, addr, NULL, 64, IFA_LINK, addr_flags, in addrconf_add_linklocal()
2952 if (!IS_ERR(ifp)) { in addrconf_add_linklocal()
2953 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, idev->dev, 0, 0); in addrconf_add_linklocal()
2954 addrconf_dad_start(ifp); in addrconf_add_linklocal()
2955 in6_ifa_put(ifp); in addrconf_add_linklocal()
3491 static void addrconf_dad_kick(struct inet6_ifaddr *ifp) in addrconf_dad_kick() argument
3494 struct inet6_dev *idev = ifp->idev; in addrconf_dad_kick()
3496 if (ifp->flags & IFA_F_OPTIMISTIC) in addrconf_dad_kick()
3501 ifp->dad_probes = idev->cnf.dad_transmits; in addrconf_dad_kick()
3502 addrconf_mod_dad_work(ifp, rand_num); in addrconf_dad_kick()
3505 static void addrconf_dad_begin(struct inet6_ifaddr *ifp) in addrconf_dad_begin() argument
3507 struct inet6_dev *idev = ifp->idev; in addrconf_dad_begin()
3511 addrconf_join_solict(dev, &ifp->addr); in addrconf_dad_begin()
3513 prandom_seed((__force u32) ifp->addr.s6_addr32[3]); in addrconf_dad_begin()
3516 spin_lock(&ifp->lock); in addrconf_dad_begin()
3517 if (ifp->state == INET6_IFADDR_STATE_DEAD) in addrconf_dad_begin()
3522 !(ifp->flags&IFA_F_TENTATIVE) || in addrconf_dad_begin()
3523 ifp->flags & IFA_F_NODAD) { in addrconf_dad_begin()
3524 ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED); in addrconf_dad_begin()
3525 spin_unlock(&ifp->lock); in addrconf_dad_begin()
3528 addrconf_dad_completed(ifp); in addrconf_dad_begin()
3533 spin_unlock(&ifp->lock); in addrconf_dad_begin()
3540 in6_ifa_hold(ifp); in addrconf_dad_begin()
3541 addrconf_dad_stop(ifp, 0); in addrconf_dad_begin()
3549 if (ifp->flags & IFA_F_OPTIMISTIC) { in addrconf_dad_begin()
3550 ip6_ins_rt(ifp->rt); in addrconf_dad_begin()
3559 addrconf_dad_kick(ifp); in addrconf_dad_begin()
3561 spin_unlock(&ifp->lock); in addrconf_dad_begin()
3564 ipv6_ifa_notify(RTM_NEWADDR, ifp); in addrconf_dad_begin()
3567 static void addrconf_dad_start(struct inet6_ifaddr *ifp) in addrconf_dad_start() argument
3571 spin_lock_bh(&ifp->lock); in addrconf_dad_start()
3572 if (ifp->state != INET6_IFADDR_STATE_DEAD) { in addrconf_dad_start()
3573 ifp->state = INET6_IFADDR_STATE_PREDAD; in addrconf_dad_start()
3576 spin_unlock_bh(&ifp->lock); in addrconf_dad_start()
3579 addrconf_mod_dad_work(ifp, 0); in addrconf_dad_start()
3584 struct inet6_ifaddr *ifp = container_of(to_delayed_work(w), in addrconf_dad_work() local
3587 struct inet6_dev *idev = ifp->idev; in addrconf_dad_work()
3598 spin_lock_bh(&ifp->lock); in addrconf_dad_work()
3599 if (ifp->state == INET6_IFADDR_STATE_PREDAD) { in addrconf_dad_work()
3601 ifp->state = INET6_IFADDR_STATE_DAD; in addrconf_dad_work()
3602 } else if (ifp->state == INET6_IFADDR_STATE_ERRDAD) { in addrconf_dad_work()
3604 ifp->state = INET6_IFADDR_STATE_POSTDAD; in addrconf_dad_work()
3606 spin_unlock_bh(&ifp->lock); in addrconf_dad_work()
3609 addrconf_dad_begin(ifp); in addrconf_dad_work()
3612 addrconf_dad_stop(ifp, 1); in addrconf_dad_work()
3616 if (!ifp->dad_probes && addrconf_dad_end(ifp)) in addrconf_dad_work()
3625 spin_lock(&ifp->lock); in addrconf_dad_work()
3626 if (ifp->state == INET6_IFADDR_STATE_DEAD) { in addrconf_dad_work()
3627 spin_unlock(&ifp->lock); in addrconf_dad_work()
3632 if (ifp->dad_probes == 0) { in addrconf_dad_work()
3637 ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED); in addrconf_dad_work()
3638 spin_unlock(&ifp->lock); in addrconf_dad_work()
3641 addrconf_dad_completed(ifp); in addrconf_dad_work()
3646 ifp->dad_probes--; in addrconf_dad_work()
3647 addrconf_mod_dad_work(ifp, in addrconf_dad_work()
3648 NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME)); in addrconf_dad_work()
3649 spin_unlock(&ifp->lock); in addrconf_dad_work()
3653 addrconf_addr_solict_mult(&ifp->addr, &mcaddr); in addrconf_dad_work()
3654 ndisc_send_ns(ifp->idev->dev, &ifp->addr, &mcaddr, &in6addr_any); in addrconf_dad_work()
3656 in6_ifa_put(ifp); in addrconf_dad_work()
3661 static bool ipv6_lonely_lladdr(struct inet6_ifaddr *ifp) in ipv6_lonely_lladdr() argument
3664 struct inet6_dev *idev = ifp->idev; in ipv6_lonely_lladdr()
3669 if (ifp != ifpiter && ifpiter->scope == IFA_LINK && in ipv6_lonely_lladdr()
3678 static void addrconf_dad_completed(struct inet6_ifaddr *ifp) in addrconf_dad_completed() argument
3680 struct net_device *dev = ifp->idev->dev; in addrconf_dad_completed()
3684 addrconf_del_dad_work(ifp); in addrconf_dad_completed()
3690 ipv6_ifa_notify(RTM_NEWADDR, ifp); in addrconf_dad_completed()
3696 read_lock_bh(&ifp->idev->lock); in addrconf_dad_completed()
3697 send_mld = ifp->scope == IFA_LINK && ipv6_lonely_lladdr(ifp); in addrconf_dad_completed()
3699 ipv6_accept_ra(ifp->idev) && in addrconf_dad_completed()
3700 ifp->idev->cnf.rtr_solicits > 0 && in addrconf_dad_completed()
3702 read_unlock_bh(&ifp->idev->lock); in addrconf_dad_completed()
3708 ipv6_mc_dad_complete(ifp->idev); in addrconf_dad_completed()
3720 write_lock_bh(&ifp->idev->lock); in addrconf_dad_completed()
3721 spin_lock(&ifp->lock); in addrconf_dad_completed()
3722 ifp->idev->rs_probes = 1; in addrconf_dad_completed()
3723 ifp->idev->if_flags |= IF_RS_SENT; in addrconf_dad_completed()
3724 addrconf_mod_rs_timer(ifp->idev, in addrconf_dad_completed()
3725 ifp->idev->cnf.rtr_solicit_interval); in addrconf_dad_completed()
3726 spin_unlock(&ifp->lock); in addrconf_dad_completed()
3727 write_unlock_bh(&ifp->idev->lock); in addrconf_dad_completed()
3733 struct inet6_ifaddr *ifp; in addrconf_dad_run() local
3736 list_for_each_entry(ifp, &idev->addr_list, if_list) { in addrconf_dad_run()
3737 spin_lock(&ifp->lock); in addrconf_dad_run()
3738 if (ifp->flags & IFA_F_TENTATIVE && in addrconf_dad_run()
3739 ifp->state == INET6_IFADDR_STATE_DAD) in addrconf_dad_run()
3740 addrconf_dad_kick(ifp); in addrconf_dad_run()
3741 spin_unlock(&ifp->lock); in addrconf_dad_run()
3838 struct inet6_ifaddr *ifp = (struct inet6_ifaddr *)v; in if6_seq_show() local
3840 &ifp->addr, in if6_seq_show()
3841 ifp->idev->dev->ifindex, in if6_seq_show()
3842 ifp->prefix_len, in if6_seq_show()
3843 ifp->scope, in if6_seq_show()
3844 (u8) ifp->flags, in if6_seq_show()
3845 ifp->idev->dev->name); in if6_seq_show()
3903 struct inet6_ifaddr *ifp = NULL; in ipv6_chk_home_addr() local
3907 hlist_for_each_entry_rcu_bh(ifp, &inet6_addr_lst[hash], addr_lst) { in ipv6_chk_home_addr()
3908 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_chk_home_addr()
3910 if (ipv6_addr_equal(&ifp->addr, addr) && in ipv6_chk_home_addr()
3911 (ifp->flags & IFA_F_HOMEADDRESS)) { in ipv6_chk_home_addr()
3928 struct inet6_ifaddr *ifp; in addrconf_verify_rtnl() local
3941 hlist_for_each_entry_rcu_bh(ifp, &inet6_addr_lst[i], addr_lst) { in addrconf_verify_rtnl()
3948 if ((ifp->flags & IFA_F_PERMANENT) && in addrconf_verify_rtnl()
3949 (ifp->prefered_lft == INFINITY_LIFE_TIME)) in addrconf_verify_rtnl()
3952 spin_lock(&ifp->lock); in addrconf_verify_rtnl()
3954 age = (now - ifp->tstamp + ADDRCONF_TIMER_FUZZ_MINUS) / HZ; in addrconf_verify_rtnl()
3956 if (ifp->valid_lft != INFINITY_LIFE_TIME && in addrconf_verify_rtnl()
3957 age >= ifp->valid_lft) { in addrconf_verify_rtnl()
3958 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
3959 in6_ifa_hold(ifp); in addrconf_verify_rtnl()
3960 ipv6_del_addr(ifp); in addrconf_verify_rtnl()
3962 } else if (ifp->prefered_lft == INFINITY_LIFE_TIME) { in addrconf_verify_rtnl()
3963 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
3965 } else if (age >= ifp->prefered_lft) { in addrconf_verify_rtnl()
3969 if (!(ifp->flags&IFA_F_DEPRECATED)) { in addrconf_verify_rtnl()
3971 ifp->flags |= IFA_F_DEPRECATED; in addrconf_verify_rtnl()
3974 if ((ifp->valid_lft != INFINITY_LIFE_TIME) && in addrconf_verify_rtnl()
3975 (time_before(ifp->tstamp + ifp->valid_lft * HZ, next))) in addrconf_verify_rtnl()
3976 next = ifp->tstamp + ifp->valid_lft * HZ; in addrconf_verify_rtnl()
3978 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
3981 in6_ifa_hold(ifp); in addrconf_verify_rtnl()
3983 ipv6_ifa_notify(0, ifp); in addrconf_verify_rtnl()
3984 in6_ifa_put(ifp); in addrconf_verify_rtnl()
3987 } else if ((ifp->flags&IFA_F_TEMPORARY) && in addrconf_verify_rtnl()
3988 !(ifp->flags&IFA_F_TENTATIVE)) { in addrconf_verify_rtnl()
3989 unsigned long regen_advance = ifp->idev->cnf.regen_max_retry * in addrconf_verify_rtnl()
3990 ifp->idev->cnf.dad_transmits * in addrconf_verify_rtnl()
3991 NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME) / HZ; in addrconf_verify_rtnl()
3993 if (age >= ifp->prefered_lft - regen_advance) { in addrconf_verify_rtnl()
3994 struct inet6_ifaddr *ifpub = ifp->ifpub; in addrconf_verify_rtnl()
3995 if (time_before(ifp->tstamp + ifp->prefered_lft * HZ, next)) in addrconf_verify_rtnl()
3996 next = ifp->tstamp + ifp->prefered_lft * HZ; in addrconf_verify_rtnl()
3997 if (!ifp->regen_count && ifpub) { in addrconf_verify_rtnl()
3998 ifp->regen_count++; in addrconf_verify_rtnl()
3999 in6_ifa_hold(ifp); in addrconf_verify_rtnl()
4001 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
4006 ipv6_create_tempaddr(ifpub, ifp); in addrconf_verify_rtnl()
4008 in6_ifa_put(ifp); in addrconf_verify_rtnl()
4011 } else if (time_before(ifp->tstamp + ifp->prefered_lft * HZ - regen_advance * HZ, next)) in addrconf_verify_rtnl()
4012 next = ifp->tstamp + ifp->prefered_lft * HZ - regen_advance * HZ; in addrconf_verify_rtnl()
4013 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
4016 if (time_before(ifp->tstamp + ifp->prefered_lft * HZ, next)) in addrconf_verify_rtnl()
4017 next = ifp->tstamp + ifp->prefered_lft * HZ; in addrconf_verify_rtnl()
4018 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
4106 static int inet6_addr_modify(struct inet6_ifaddr *ifp, u32 ifa_flags, in inet6_addr_modify() argument
4121 (ifp->flags & IFA_F_TEMPORARY || ifp->prefix_len != 64)) in inet6_addr_modify()
4142 spin_lock_bh(&ifp->lock); in inet6_addr_modify()
4143 was_managetempaddr = ifp->flags & IFA_F_MANAGETEMPADDR; in inet6_addr_modify()
4144 had_prefixroute = ifp->flags & IFA_F_PERMANENT && in inet6_addr_modify()
4145 !(ifp->flags & IFA_F_NOPREFIXROUTE); in inet6_addr_modify()
4146 ifp->flags &= ~(IFA_F_DEPRECATED | IFA_F_PERMANENT | IFA_F_NODAD | in inet6_addr_modify()
4149 ifp->flags |= ifa_flags; in inet6_addr_modify()
4150 ifp->tstamp = jiffies; in inet6_addr_modify()
4151 ifp->valid_lft = valid_lft; in inet6_addr_modify()
4152 ifp->prefered_lft = prefered_lft; in inet6_addr_modify()
4154 spin_unlock_bh(&ifp->lock); in inet6_addr_modify()
4155 if (!(ifp->flags&IFA_F_TENTATIVE)) in inet6_addr_modify()
4156 ipv6_ifa_notify(0, ifp); in inet6_addr_modify()
4159 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, ifp->idev->dev, in inet6_addr_modify()
4165 write_lock_bh(&ifp->idev->lock); in inet6_addr_modify()
4166 action = check_cleanup_prefix_route(ifp, &rt_expires); in inet6_addr_modify()
4167 write_unlock_bh(&ifp->idev->lock); in inet6_addr_modify()
4170 cleanup_prefix_route(ifp, rt_expires, in inet6_addr_modify()
4175 if (was_managetempaddr || ifp->flags & IFA_F_MANAGETEMPADDR) { in inet6_addr_modify()
4176 if (was_managetempaddr && !(ifp->flags & IFA_F_MANAGETEMPADDR)) in inet6_addr_modify()
4178 manage_tempaddrs(ifp->idev, ifp, valid_lft, prefered_lft, in inet6_addr_modify()
4834 struct inet6_ifaddr *ifp; in inet6_set_iftoken() local
4879 list_for_each_entry(ifp, &idev->addr_list, if_list) { in inet6_set_iftoken()
4880 spin_lock(&ifp->lock); in inet6_set_iftoken()
4881 if (ifp->tokenized) { in inet6_set_iftoken()
4882 ifp->valid_lft = 0; in inet6_set_iftoken()
4883 ifp->prefered_lft = 0; in inet6_set_iftoken()
4885 spin_unlock(&ifp->lock); in inet6_set_iftoken()
5128 static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp) in __ipv6_ifa_notify() argument
5130 struct net *net = dev_net(ifp->idev->dev); in __ipv6_ifa_notify()
5135 inet6_ifa_notify(event ? : RTM_NEWADDR, ifp); in __ipv6_ifa_notify()
5145 if (!(ifp->rt->rt6i_node)) in __ipv6_ifa_notify()
5146 ip6_ins_rt(ifp->rt); in __ipv6_ifa_notify()
5147 if (ifp->idev->cnf.forwarding) in __ipv6_ifa_notify()
5148 addrconf_join_anycast(ifp); in __ipv6_ifa_notify()
5149 if (!ipv6_addr_any(&ifp->peer_addr)) in __ipv6_ifa_notify()
5150 addrconf_prefix_route(&ifp->peer_addr, 128, in __ipv6_ifa_notify()
5151 ifp->idev->dev, 0, 0); in __ipv6_ifa_notify()
5154 if (ifp->idev->cnf.forwarding) in __ipv6_ifa_notify()
5155 addrconf_leave_anycast(ifp); in __ipv6_ifa_notify()
5156 addrconf_leave_solict(ifp->idev, &ifp->addr); in __ipv6_ifa_notify()
5157 if (!ipv6_addr_any(&ifp->peer_addr)) { in __ipv6_ifa_notify()
5160 rt = addrconf_get_prefix_route(&ifp->peer_addr, 128, in __ipv6_ifa_notify()
5161 ifp->idev->dev, 0, 0); in __ipv6_ifa_notify()
5165 dst_hold(&ifp->rt->dst); in __ipv6_ifa_notify()
5167 ip6_del_rt(ifp->rt); in __ipv6_ifa_notify()
5175 static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp) in ipv6_ifa_notify() argument
5178 if (likely(ifp->idev->dead == 0)) in ipv6_ifa_notify()
5179 __ipv6_ifa_notify(event, ifp); in ipv6_ifa_notify()