Lines Matching refs:ifp
151 static void addrconf_join_anycast(struct inet6_ifaddr *ifp);
152 static void addrconf_leave_anycast(struct inet6_ifaddr *ifp);
163 static void addrconf_dad_start(struct inet6_ifaddr *ifp);
165 static void addrconf_dad_completed(struct inet6_ifaddr *ifp);
272 static void addrconf_del_dad_work(struct inet6_ifaddr *ifp) in addrconf_del_dad_work() argument
274 if (cancel_delayed_work(&ifp->dad_work)) in addrconf_del_dad_work()
275 __in6_ifa_put(ifp); in addrconf_del_dad_work()
286 static void addrconf_mod_dad_work(struct inet6_ifaddr *ifp, in addrconf_mod_dad_work() argument
289 if (!delayed_work_pending(&ifp->dad_work)) in addrconf_mod_dad_work()
290 in6_ifa_hold(ifp); in addrconf_mod_dad_work()
291 mod_delayed_work(addrconf_wq, &ifp->dad_work, delay); in addrconf_mod_dad_work()
777 void inet6_ifa_finish_destroy(struct inet6_ifaddr *ifp) in inet6_ifa_finish_destroy() argument
779 WARN_ON(!hlist_unhashed(&ifp->addr_lst)); in inet6_ifa_finish_destroy()
785 in6_dev_put(ifp->idev); in inet6_ifa_finish_destroy()
787 if (cancel_delayed_work(&ifp->dad_work)) in inet6_ifa_finish_destroy()
789 ifp); in inet6_ifa_finish_destroy()
791 if (ifp->state != INET6_IFADDR_STATE_DEAD) { in inet6_ifa_finish_destroy()
792 pr_warn("Freeing alive inet6 address %p\n", ifp); in inet6_ifa_finish_destroy()
795 ip6_rt_put(ifp->rt); in inet6_ifa_finish_destroy()
797 kfree_rcu(ifp, rcu); in inet6_ifa_finish_destroy()
801 ipv6_link_dev_addr(struct inet6_dev *idev, struct inet6_ifaddr *ifp) in ipv6_link_dev_addr() argument
804 int ifp_scope = ipv6_addr_src_scope(&ifp->addr); in ipv6_link_dev_addr()
817 list_add_tail(&ifp->if_list, p); in ipv6_link_dev_addr()
960 check_cleanup_prefix_route(struct inet6_ifaddr *ifp, unsigned long *expires) in check_cleanup_prefix_route() argument
963 struct inet6_dev *idev = ifp->idev; in check_cleanup_prefix_route()
970 if (ifa == ifp) in check_cleanup_prefix_route()
972 if (!ipv6_prefix_equal(&ifa->addr, &ifp->addr, in check_cleanup_prefix_route()
973 ifp->prefix_len)) in check_cleanup_prefix_route()
997 cleanup_prefix_route(struct inet6_ifaddr *ifp, unsigned long expires, bool del_rt) in cleanup_prefix_route() argument
1001 rt = addrconf_get_prefix_route(&ifp->addr, in cleanup_prefix_route()
1002 ifp->prefix_len, in cleanup_prefix_route()
1003 ifp->idev->dev, in cleanup_prefix_route()
1019 static void ipv6_del_addr(struct inet6_ifaddr *ifp) in ipv6_del_addr() argument
1027 spin_lock_bh(&ifp->lock); in ipv6_del_addr()
1028 state = ifp->state; in ipv6_del_addr()
1029 ifp->state = INET6_IFADDR_STATE_DEAD; in ipv6_del_addr()
1030 spin_unlock_bh(&ifp->lock); in ipv6_del_addr()
1036 hlist_del_init_rcu(&ifp->addr_lst); in ipv6_del_addr()
1039 write_lock_bh(&ifp->idev->lock); in ipv6_del_addr()
1041 if (ifp->flags&IFA_F_TEMPORARY) { in ipv6_del_addr()
1042 list_del(&ifp->tmp_list); in ipv6_del_addr()
1043 if (ifp->ifpub) { in ipv6_del_addr()
1044 in6_ifa_put(ifp->ifpub); in ipv6_del_addr()
1045 ifp->ifpub = NULL; in ipv6_del_addr()
1047 __in6_ifa_put(ifp); in ipv6_del_addr()
1050 if (ifp->flags & IFA_F_PERMANENT && !(ifp->flags & IFA_F_NOPREFIXROUTE)) in ipv6_del_addr()
1051 action = check_cleanup_prefix_route(ifp, &expires); in ipv6_del_addr()
1053 list_del_init(&ifp->if_list); in ipv6_del_addr()
1054 __in6_ifa_put(ifp); in ipv6_del_addr()
1056 write_unlock_bh(&ifp->idev->lock); in ipv6_del_addr()
1058 addrconf_del_dad_work(ifp); in ipv6_del_addr()
1060 ipv6_ifa_notify(RTM_DELADDR, ifp); in ipv6_del_addr()
1062 inet6addr_notifier_call_chain(NETDEV_DOWN, ifp); in ipv6_del_addr()
1065 cleanup_prefix_route(ifp, expires, in ipv6_del_addr()
1070 rt6_remove_prefsrc(ifp); in ipv6_del_addr()
1072 in6_ifa_put(ifp); in ipv6_del_addr()
1075 static int ipv6_create_tempaddr(struct inet6_ifaddr *ifp, struct inet6_ifaddr *ift) in ipv6_create_tempaddr() argument
1077 struct inet6_dev *idev = ifp->idev; in ipv6_create_tempaddr()
1104 spin_lock_bh(&ifp->lock); in ipv6_create_tempaddr()
1105 if (ifp->regen_count++ >= idev->cnf.regen_max_retry) { in ipv6_create_tempaddr()
1107 spin_unlock_bh(&ifp->lock); in ipv6_create_tempaddr()
1115 in6_ifa_hold(ifp); in ipv6_create_tempaddr()
1116 memcpy(addr.s6_addr, ifp->addr.s6_addr, 8); in ipv6_create_tempaddr()
1119 age = (now - ifp->tstamp) / HZ; in ipv6_create_tempaddr()
1121 ifp->valid_lft, in ipv6_create_tempaddr()
1124 ifp->prefered_lft, in ipv6_create_tempaddr()
1127 tmp_plen = ifp->prefix_len; in ipv6_create_tempaddr()
1128 tmp_tstamp = ifp->tstamp; in ipv6_create_tempaddr()
1129 spin_unlock_bh(&ifp->lock); in ipv6_create_tempaddr()
1145 in6_ifa_put(ifp); in ipv6_create_tempaddr()
1153 if (ifp->flags & IFA_F_OPTIMISTIC) in ipv6_create_tempaddr()
1160 in6_ifa_put(ifp); in ipv6_create_tempaddr()
1169 ift->ifpub = ifp; in ipv6_create_tempaddr()
1498 struct inet6_ifaddr *ifp; in __ipv6_get_lladdr() local
1501 list_for_each_entry_reverse(ifp, &idev->addr_list, if_list) { in __ipv6_get_lladdr()
1502 if (ifp->scope > IFA_LINK) in __ipv6_get_lladdr()
1504 if (ifp->scope == IFA_LINK && in __ipv6_get_lladdr()
1505 !(ifp->flags & banned_flags)) { in __ipv6_get_lladdr()
1506 *addr = ifp->addr; in __ipv6_get_lladdr()
1534 struct inet6_ifaddr *ifp; in ipv6_count_addresses() local
1537 list_for_each_entry(ifp, &idev->addr_list, if_list) in ipv6_count_addresses()
1554 struct inet6_ifaddr *ifp; in ipv6_chk_addr_and_flags() local
1559 hlist_for_each_entry_rcu(ifp, &inet6_addr_lst[hash], addr_lst) { in ipv6_chk_addr_and_flags()
1560 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_chk_addr_and_flags()
1565 ifp_flags = (ifp->flags&IFA_F_OPTIMISTIC) in ipv6_chk_addr_and_flags()
1566 ? (ifp->flags&~IFA_F_TENTATIVE) in ipv6_chk_addr_and_flags()
1567 : ifp->flags; in ipv6_chk_addr_and_flags()
1568 if (ipv6_addr_equal(&ifp->addr, addr) && in ipv6_chk_addr_and_flags()
1570 (!dev || ifp->idev->dev == dev || in ipv6_chk_addr_and_flags()
1571 !(ifp->scope&(IFA_LINK|IFA_HOST) || strict))) { in ipv6_chk_addr_and_flags()
1586 struct inet6_ifaddr *ifp; in ipv6_chk_same_addr() local
1588 hlist_for_each_entry(ifp, &inet6_addr_lst[hash], addr_lst) { in ipv6_chk_same_addr()
1589 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_chk_same_addr()
1591 if (ipv6_addr_equal(&ifp->addr, addr)) { in ipv6_chk_same_addr()
1592 if (!dev || ifp->idev->dev == dev) in ipv6_chk_same_addr()
1653 struct inet6_ifaddr *ifp, *result = NULL; in ipv6_get_ifaddr() local
1657 hlist_for_each_entry_rcu_bh(ifp, &inet6_addr_lst[hash], addr_lst) { in ipv6_get_ifaddr()
1658 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_get_ifaddr()
1660 if (ipv6_addr_equal(&ifp->addr, addr)) { in ipv6_get_ifaddr()
1661 if (!dev || ifp->idev->dev == dev || in ipv6_get_ifaddr()
1662 !(ifp->scope&(IFA_LINK|IFA_HOST) || strict)) { in ipv6_get_ifaddr()
1663 result = ifp; in ipv6_get_ifaddr()
1664 in6_ifa_hold(ifp); in ipv6_get_ifaddr()
1676 static void addrconf_dad_stop(struct inet6_ifaddr *ifp, int dad_failed) in addrconf_dad_stop() argument
1678 if (ifp->flags&IFA_F_PERMANENT) { in addrconf_dad_stop()
1679 spin_lock_bh(&ifp->lock); in addrconf_dad_stop()
1680 addrconf_del_dad_work(ifp); in addrconf_dad_stop()
1681 ifp->flags |= IFA_F_TENTATIVE; in addrconf_dad_stop()
1683 ifp->flags |= IFA_F_DADFAILED; in addrconf_dad_stop()
1684 spin_unlock_bh(&ifp->lock); in addrconf_dad_stop()
1686 ipv6_ifa_notify(0, ifp); in addrconf_dad_stop()
1687 in6_ifa_put(ifp); in addrconf_dad_stop()
1688 } else if (ifp->flags&IFA_F_TEMPORARY) { in addrconf_dad_stop()
1690 spin_lock_bh(&ifp->lock); in addrconf_dad_stop()
1691 ifpub = ifp->ifpub; in addrconf_dad_stop()
1694 spin_unlock_bh(&ifp->lock); in addrconf_dad_stop()
1695 ipv6_create_tempaddr(ifpub, ifp); in addrconf_dad_stop()
1698 spin_unlock_bh(&ifp->lock); in addrconf_dad_stop()
1700 ipv6_del_addr(ifp); in addrconf_dad_stop()
1702 ipv6_del_addr(ifp); in addrconf_dad_stop()
1706 static int addrconf_dad_end(struct inet6_ifaddr *ifp) in addrconf_dad_end() argument
1710 spin_lock_bh(&ifp->lock); in addrconf_dad_end()
1711 if (ifp->state == INET6_IFADDR_STATE_DAD) { in addrconf_dad_end()
1712 ifp->state = INET6_IFADDR_STATE_POSTDAD; in addrconf_dad_end()
1715 spin_unlock_bh(&ifp->lock); in addrconf_dad_end()
1720 void addrconf_dad_failure(struct inet6_ifaddr *ifp) in addrconf_dad_failure() argument
1723 struct inet6_dev *idev = ifp->idev; in addrconf_dad_failure()
1724 struct net *net = dev_net(ifp->idev->dev); in addrconf_dad_failure()
1726 if (addrconf_dad_end(ifp)) { in addrconf_dad_failure()
1727 in6_ifa_put(ifp); in addrconf_dad_failure()
1732 ifp->idev->dev->name, &ifp->addr); in addrconf_dad_failure()
1734 spin_lock_bh(&ifp->lock); in addrconf_dad_failure()
1736 if (ifp->flags & IFA_F_STABLE_PRIVACY) { in addrconf_dad_failure()
1737 int scope = ifp->scope; in addrconf_dad_failure()
1738 u32 flags = ifp->flags; in addrconf_dad_failure()
1742 int pfxlen = ifp->prefix_len; in addrconf_dad_failure()
1743 int retries = ifp->stable_privacy_retry + 1; in addrconf_dad_failure()
1747 ifp->idev->dev->name); in addrconf_dad_failure()
1751 new_addr = ifp->addr; in addrconf_dad_failure()
1756 valid_lft = ifp->valid_lft; in addrconf_dad_failure()
1757 preferred_lft = ifp->prefered_lft; in addrconf_dad_failure()
1759 spin_unlock_bh(&ifp->lock); in addrconf_dad_failure()
1767 ifp->idev->dev->name); in addrconf_dad_failure()
1783 spin_lock_bh(&ifp->lock); in addrconf_dad_failure()
1789 ipv6_addr_equal(&ifp->addr, &addr)) { in addrconf_dad_failure()
1794 ifp->idev->dev->name); in addrconf_dad_failure()
1800 ifp->state = INET6_IFADDR_STATE_ERRDAD; in addrconf_dad_failure()
1801 spin_unlock_bh(&ifp->lock); in addrconf_dad_failure()
1803 addrconf_mod_dad_work(ifp, 0); in addrconf_dad_failure()
1832 static void addrconf_join_anycast(struct inet6_ifaddr *ifp) in addrconf_join_anycast() argument
1836 if (ifp->prefix_len >= 127) /* RFC 6164 */ in addrconf_join_anycast()
1838 ipv6_addr_prefix(&addr, &ifp->addr, ifp->prefix_len); in addrconf_join_anycast()
1841 __ipv6_dev_ac_inc(ifp->idev, &addr); in addrconf_join_anycast()
1845 static void addrconf_leave_anycast(struct inet6_ifaddr *ifp) in addrconf_leave_anycast() argument
1849 if (ifp->prefix_len >= 127) /* RFC 6164 */ in addrconf_leave_anycast()
1851 ipv6_addr_prefix(&addr, &ifp->addr, ifp->prefix_len); in addrconf_leave_anycast()
1854 __ipv6_dev_ac_dec(ifp->idev, &addr); in addrconf_leave_anycast()
1997 struct inet6_ifaddr *ifp; in ipv6_inherit_eui64() local
2000 list_for_each_entry_reverse(ifp, &idev->addr_list, if_list) { in ipv6_inherit_eui64()
2001 if (ifp->scope > IFA_LINK) in ipv6_inherit_eui64()
2003 if (ifp->scope == IFA_LINK && !(ifp->flags&IFA_F_TENTATIVE)) { in ipv6_inherit_eui64()
2004 memcpy(eui, ifp->addr.s6_addr+8, 8); in ipv6_inherit_eui64()
2188 struct inet6_ifaddr *ifp, in manage_tempaddrs() argument
2200 if (ifp != ift->ifpub) in manage_tempaddrs()
2248 ipv6_create_tempaddr(ifp, NULL); in manage_tempaddrs()
2353 struct inet6_ifaddr *ifp; in addrconf_prefix_rcv() local
2387 ifp = ipv6_get_ifaddr(net, &addr, dev, 1); in addrconf_prefix_rcv()
2389 if (!ifp && valid_lft) { in addrconf_prefix_rcv()
2403 ifp = ipv6_add_addr(in6_dev, &addr, NULL, in addrconf_prefix_rcv()
2409 if (IS_ERR_OR_NULL(ifp)) { in addrconf_prefix_rcv()
2416 spin_lock_bh(&ifp->lock); in addrconf_prefix_rcv()
2417 ifp->flags |= IFA_F_MANAGETEMPADDR; in addrconf_prefix_rcv()
2418 ifp->cstamp = jiffies; in addrconf_prefix_rcv()
2419 ifp->tokenized = tokenized; in addrconf_prefix_rcv()
2420 spin_unlock_bh(&ifp->lock); in addrconf_prefix_rcv()
2421 addrconf_dad_start(ifp); in addrconf_prefix_rcv()
2424 if (ifp) { in addrconf_prefix_rcv()
2430 spin_lock_bh(&ifp->lock); in addrconf_prefix_rcv()
2432 if (ifp->valid_lft > (now - ifp->tstamp) / HZ) in addrconf_prefix_rcv()
2433 stored_lft = ifp->valid_lft - (now - ifp->tstamp) / HZ; in addrconf_prefix_rcv()
2455 ifp->valid_lft = valid_lft; in addrconf_prefix_rcv()
2456 ifp->prefered_lft = prefered_lft; in addrconf_prefix_rcv()
2457 ifp->tstamp = now; in addrconf_prefix_rcv()
2458 flags = ifp->flags; in addrconf_prefix_rcv()
2459 ifp->flags &= ~IFA_F_DEPRECATED; in addrconf_prefix_rcv()
2460 spin_unlock_bh(&ifp->lock); in addrconf_prefix_rcv()
2463 ipv6_ifa_notify(0, ifp); in addrconf_prefix_rcv()
2465 spin_unlock_bh(&ifp->lock); in addrconf_prefix_rcv()
2467 manage_tempaddrs(in6_dev, ifp, valid_lft, prefered_lft, in addrconf_prefix_rcv()
2470 in6_ifa_put(ifp); in addrconf_prefix_rcv()
2570 struct inet6_ifaddr *ifp; in inet6_addr_add() local
2626 ifp = ipv6_add_addr(idev, pfx, peer_pfx, plen, scope, ifa_flags, in inet6_addr_add()
2629 if (!IS_ERR(ifp)) { in inet6_addr_add()
2631 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, dev, in inet6_addr_add()
2640 addrconf_dad_start(ifp); in inet6_addr_add()
2642 manage_tempaddrs(idev, ifp, valid_lft, prefered_lft, in inet6_addr_add()
2644 in6_ifa_put(ifp); in inet6_addr_add()
2652 return PTR_ERR(ifp); in inet6_addr_add()
2658 struct inet6_ifaddr *ifp; in inet6_addr_del() local
2674 list_for_each_entry(ifp, &idev->addr_list, if_list) { in inet6_addr_del()
2675 if (ifp->prefix_len == plen && in inet6_addr_del()
2676 ipv6_addr_equal(pfx, &ifp->addr)) { in inet6_addr_del()
2677 in6_ifa_hold(ifp); in inet6_addr_del()
2680 if (!(ifp->flags & IFA_F_TEMPORARY) && in inet6_addr_del()
2682 manage_tempaddrs(idev, ifp, 0, 0, false, in inet6_addr_del()
2684 ipv6_del_addr(ifp); in inet6_addr_del()
2738 struct inet6_ifaddr *ifp; in add_addr() local
2740 ifp = ipv6_add_addr(idev, addr, NULL, plen, in add_addr()
2743 if (!IS_ERR(ifp)) { in add_addr()
2744 spin_lock_bh(&ifp->lock); in add_addr()
2745 ifp->flags &= ~IFA_F_TENTATIVE; in add_addr()
2746 spin_unlock_bh(&ifp->lock); in add_addr()
2747 ipv6_ifa_notify(RTM_NEWADDR, ifp); in add_addr()
2748 in6_ifa_put(ifp); in add_addr()
2872 struct inet6_ifaddr *ifp; in addrconf_add_linklocal() local
2881 ifp = ipv6_add_addr(idev, addr, NULL, 64, IFA_LINK, addr_flags, in addrconf_add_linklocal()
2883 if (!IS_ERR(ifp)) { in addrconf_add_linklocal()
2884 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, idev->dev, 0, 0); in addrconf_add_linklocal()
2885 addrconf_dad_start(ifp); in addrconf_add_linklocal()
2886 in6_ifa_put(ifp); in addrconf_add_linklocal()
3408 static void addrconf_dad_kick(struct inet6_ifaddr *ifp) in addrconf_dad_kick() argument
3411 struct inet6_dev *idev = ifp->idev; in addrconf_dad_kick()
3413 if (ifp->flags & IFA_F_OPTIMISTIC) in addrconf_dad_kick()
3418 ifp->dad_probes = idev->cnf.dad_transmits; in addrconf_dad_kick()
3419 addrconf_mod_dad_work(ifp, rand_num); in addrconf_dad_kick()
3422 static void addrconf_dad_begin(struct inet6_ifaddr *ifp) in addrconf_dad_begin() argument
3424 struct inet6_dev *idev = ifp->idev; in addrconf_dad_begin()
3428 addrconf_join_solict(dev, &ifp->addr); in addrconf_dad_begin()
3430 prandom_seed((__force u32) ifp->addr.s6_addr32[3]); in addrconf_dad_begin()
3433 spin_lock(&ifp->lock); in addrconf_dad_begin()
3434 if (ifp->state == INET6_IFADDR_STATE_DEAD) in addrconf_dad_begin()
3439 !(ifp->flags&IFA_F_TENTATIVE) || in addrconf_dad_begin()
3440 ifp->flags & IFA_F_NODAD) { in addrconf_dad_begin()
3441 ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED); in addrconf_dad_begin()
3442 spin_unlock(&ifp->lock); in addrconf_dad_begin()
3445 addrconf_dad_completed(ifp); in addrconf_dad_begin()
3450 spin_unlock(&ifp->lock); in addrconf_dad_begin()
3457 in6_ifa_hold(ifp); in addrconf_dad_begin()
3458 addrconf_dad_stop(ifp, 0); in addrconf_dad_begin()
3466 if (ifp->flags & IFA_F_OPTIMISTIC) { in addrconf_dad_begin()
3467 ip6_ins_rt(ifp->rt); in addrconf_dad_begin()
3476 addrconf_dad_kick(ifp); in addrconf_dad_begin()
3478 spin_unlock(&ifp->lock); in addrconf_dad_begin()
3481 ipv6_ifa_notify(RTM_NEWADDR, ifp); in addrconf_dad_begin()
3484 static void addrconf_dad_start(struct inet6_ifaddr *ifp) in addrconf_dad_start() argument
3488 spin_lock_bh(&ifp->lock); in addrconf_dad_start()
3489 if (ifp->state != INET6_IFADDR_STATE_DEAD) { in addrconf_dad_start()
3490 ifp->state = INET6_IFADDR_STATE_PREDAD; in addrconf_dad_start()
3493 spin_unlock_bh(&ifp->lock); in addrconf_dad_start()
3496 addrconf_mod_dad_work(ifp, 0); in addrconf_dad_start()
3501 struct inet6_ifaddr *ifp = container_of(to_delayed_work(w), in addrconf_dad_work() local
3504 struct inet6_dev *idev = ifp->idev; in addrconf_dad_work()
3515 spin_lock_bh(&ifp->lock); in addrconf_dad_work()
3516 if (ifp->state == INET6_IFADDR_STATE_PREDAD) { in addrconf_dad_work()
3518 ifp->state = INET6_IFADDR_STATE_DAD; in addrconf_dad_work()
3519 } else if (ifp->state == INET6_IFADDR_STATE_ERRDAD) { in addrconf_dad_work()
3521 ifp->state = INET6_IFADDR_STATE_POSTDAD; in addrconf_dad_work()
3523 spin_unlock_bh(&ifp->lock); in addrconf_dad_work()
3526 addrconf_dad_begin(ifp); in addrconf_dad_work()
3529 addrconf_dad_stop(ifp, 1); in addrconf_dad_work()
3533 if (!ifp->dad_probes && addrconf_dad_end(ifp)) in addrconf_dad_work()
3542 spin_lock(&ifp->lock); in addrconf_dad_work()
3543 if (ifp->state == INET6_IFADDR_STATE_DEAD) { in addrconf_dad_work()
3544 spin_unlock(&ifp->lock); in addrconf_dad_work()
3549 if (ifp->dad_probes == 0) { in addrconf_dad_work()
3554 ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED); in addrconf_dad_work()
3555 spin_unlock(&ifp->lock); in addrconf_dad_work()
3558 addrconf_dad_completed(ifp); in addrconf_dad_work()
3563 ifp->dad_probes--; in addrconf_dad_work()
3564 addrconf_mod_dad_work(ifp, in addrconf_dad_work()
3565 NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME)); in addrconf_dad_work()
3566 spin_unlock(&ifp->lock); in addrconf_dad_work()
3570 addrconf_addr_solict_mult(&ifp->addr, &mcaddr); in addrconf_dad_work()
3571 ndisc_send_ns(ifp->idev->dev, NULL, &ifp->addr, &mcaddr, &in6addr_any); in addrconf_dad_work()
3573 in6_ifa_put(ifp); in addrconf_dad_work()
3578 static bool ipv6_lonely_lladdr(struct inet6_ifaddr *ifp) in ipv6_lonely_lladdr() argument
3581 struct inet6_dev *idev = ifp->idev; in ipv6_lonely_lladdr()
3586 if (ifp != ifpiter && ifpiter->scope == IFA_LINK && in ipv6_lonely_lladdr()
3595 static void addrconf_dad_completed(struct inet6_ifaddr *ifp) in addrconf_dad_completed() argument
3597 struct net_device *dev = ifp->idev->dev; in addrconf_dad_completed()
3601 addrconf_del_dad_work(ifp); in addrconf_dad_completed()
3607 ipv6_ifa_notify(RTM_NEWADDR, ifp); in addrconf_dad_completed()
3613 read_lock_bh(&ifp->idev->lock); in addrconf_dad_completed()
3614 send_mld = ifp->scope == IFA_LINK && ipv6_lonely_lladdr(ifp); in addrconf_dad_completed()
3616 ipv6_accept_ra(ifp->idev) && in addrconf_dad_completed()
3617 ifp->idev->cnf.rtr_solicits > 0 && in addrconf_dad_completed()
3619 read_unlock_bh(&ifp->idev->lock); in addrconf_dad_completed()
3625 ipv6_mc_dad_complete(ifp->idev); in addrconf_dad_completed()
3637 write_lock_bh(&ifp->idev->lock); in addrconf_dad_completed()
3638 spin_lock(&ifp->lock); in addrconf_dad_completed()
3639 ifp->idev->rs_probes = 1; in addrconf_dad_completed()
3640 ifp->idev->if_flags |= IF_RS_SENT; in addrconf_dad_completed()
3641 addrconf_mod_rs_timer(ifp->idev, in addrconf_dad_completed()
3642 ifp->idev->cnf.rtr_solicit_interval); in addrconf_dad_completed()
3643 spin_unlock(&ifp->lock); in addrconf_dad_completed()
3644 write_unlock_bh(&ifp->idev->lock); in addrconf_dad_completed()
3650 struct inet6_ifaddr *ifp; in addrconf_dad_run() local
3653 list_for_each_entry(ifp, &idev->addr_list, if_list) { in addrconf_dad_run()
3654 spin_lock(&ifp->lock); in addrconf_dad_run()
3655 if (ifp->flags & IFA_F_TENTATIVE && in addrconf_dad_run()
3656 ifp->state == INET6_IFADDR_STATE_DAD) in addrconf_dad_run()
3657 addrconf_dad_kick(ifp); in addrconf_dad_run()
3658 spin_unlock(&ifp->lock); in addrconf_dad_run()
3755 struct inet6_ifaddr *ifp = (struct inet6_ifaddr *)v; in if6_seq_show() local
3757 &ifp->addr, in if6_seq_show()
3758 ifp->idev->dev->ifindex, in if6_seq_show()
3759 ifp->prefix_len, in if6_seq_show()
3760 ifp->scope, in if6_seq_show()
3761 (u8) ifp->flags, in if6_seq_show()
3762 ifp->idev->dev->name); in if6_seq_show()
3820 struct inet6_ifaddr *ifp = NULL; in ipv6_chk_home_addr() local
3824 hlist_for_each_entry_rcu_bh(ifp, &inet6_addr_lst[hash], addr_lst) { in ipv6_chk_home_addr()
3825 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_chk_home_addr()
3827 if (ipv6_addr_equal(&ifp->addr, addr) && in ipv6_chk_home_addr()
3828 (ifp->flags & IFA_F_HOMEADDRESS)) { in ipv6_chk_home_addr()
3845 struct inet6_ifaddr *ifp; in addrconf_verify_rtnl() local
3858 hlist_for_each_entry_rcu_bh(ifp, &inet6_addr_lst[i], addr_lst) { in addrconf_verify_rtnl()
3865 if ((ifp->flags & IFA_F_PERMANENT) && in addrconf_verify_rtnl()
3866 (ifp->prefered_lft == INFINITY_LIFE_TIME)) in addrconf_verify_rtnl()
3869 spin_lock(&ifp->lock); in addrconf_verify_rtnl()
3871 age = (now - ifp->tstamp + ADDRCONF_TIMER_FUZZ_MINUS) / HZ; in addrconf_verify_rtnl()
3873 if (ifp->valid_lft != INFINITY_LIFE_TIME && in addrconf_verify_rtnl()
3874 age >= ifp->valid_lft) { in addrconf_verify_rtnl()
3875 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
3876 in6_ifa_hold(ifp); in addrconf_verify_rtnl()
3877 ipv6_del_addr(ifp); in addrconf_verify_rtnl()
3879 } else if (ifp->prefered_lft == INFINITY_LIFE_TIME) { in addrconf_verify_rtnl()
3880 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
3882 } else if (age >= ifp->prefered_lft) { in addrconf_verify_rtnl()
3886 if (!(ifp->flags&IFA_F_DEPRECATED)) { in addrconf_verify_rtnl()
3888 ifp->flags |= IFA_F_DEPRECATED; in addrconf_verify_rtnl()
3891 if ((ifp->valid_lft != INFINITY_LIFE_TIME) && in addrconf_verify_rtnl()
3892 (time_before(ifp->tstamp + ifp->valid_lft * HZ, next))) in addrconf_verify_rtnl()
3893 next = ifp->tstamp + ifp->valid_lft * HZ; in addrconf_verify_rtnl()
3895 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
3898 in6_ifa_hold(ifp); in addrconf_verify_rtnl()
3900 ipv6_ifa_notify(0, ifp); in addrconf_verify_rtnl()
3901 in6_ifa_put(ifp); in addrconf_verify_rtnl()
3904 } else if ((ifp->flags&IFA_F_TEMPORARY) && in addrconf_verify_rtnl()
3905 !(ifp->flags&IFA_F_TENTATIVE)) { in addrconf_verify_rtnl()
3906 unsigned long regen_advance = ifp->idev->cnf.regen_max_retry * in addrconf_verify_rtnl()
3907 ifp->idev->cnf.dad_transmits * in addrconf_verify_rtnl()
3908 NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME) / HZ; in addrconf_verify_rtnl()
3910 if (age >= ifp->prefered_lft - regen_advance) { in addrconf_verify_rtnl()
3911 struct inet6_ifaddr *ifpub = ifp->ifpub; in addrconf_verify_rtnl()
3912 if (time_before(ifp->tstamp + ifp->prefered_lft * HZ, next)) in addrconf_verify_rtnl()
3913 next = ifp->tstamp + ifp->prefered_lft * HZ; in addrconf_verify_rtnl()
3914 if (!ifp->regen_count && ifpub) { in addrconf_verify_rtnl()
3915 ifp->regen_count++; in addrconf_verify_rtnl()
3916 in6_ifa_hold(ifp); in addrconf_verify_rtnl()
3918 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
3923 ipv6_create_tempaddr(ifpub, ifp); in addrconf_verify_rtnl()
3925 in6_ifa_put(ifp); in addrconf_verify_rtnl()
3928 } else if (time_before(ifp->tstamp + ifp->prefered_lft * HZ - regen_advance * HZ, next)) in addrconf_verify_rtnl()
3929 next = ifp->tstamp + ifp->prefered_lft * HZ - regen_advance * HZ; in addrconf_verify_rtnl()
3930 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
3933 if (time_before(ifp->tstamp + ifp->prefered_lft * HZ, next)) in addrconf_verify_rtnl()
3934 next = ifp->tstamp + ifp->prefered_lft * HZ; in addrconf_verify_rtnl()
3935 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
4023 static int inet6_addr_modify(struct inet6_ifaddr *ifp, u32 ifa_flags, in inet6_addr_modify() argument
4038 (ifp->flags & IFA_F_TEMPORARY || ifp->prefix_len != 64)) in inet6_addr_modify()
4059 spin_lock_bh(&ifp->lock); in inet6_addr_modify()
4060 was_managetempaddr = ifp->flags & IFA_F_MANAGETEMPADDR; in inet6_addr_modify()
4061 had_prefixroute = ifp->flags & IFA_F_PERMANENT && in inet6_addr_modify()
4062 !(ifp->flags & IFA_F_NOPREFIXROUTE); in inet6_addr_modify()
4063 ifp->flags &= ~(IFA_F_DEPRECATED | IFA_F_PERMANENT | IFA_F_NODAD | in inet6_addr_modify()
4066 ifp->flags |= ifa_flags; in inet6_addr_modify()
4067 ifp->tstamp = jiffies; in inet6_addr_modify()
4068 ifp->valid_lft = valid_lft; in inet6_addr_modify()
4069 ifp->prefered_lft = prefered_lft; in inet6_addr_modify()
4071 spin_unlock_bh(&ifp->lock); in inet6_addr_modify()
4072 if (!(ifp->flags&IFA_F_TENTATIVE)) in inet6_addr_modify()
4073 ipv6_ifa_notify(0, ifp); in inet6_addr_modify()
4076 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, ifp->idev->dev, in inet6_addr_modify()
4082 write_lock_bh(&ifp->idev->lock); in inet6_addr_modify()
4083 action = check_cleanup_prefix_route(ifp, &rt_expires); in inet6_addr_modify()
4084 write_unlock_bh(&ifp->idev->lock); in inet6_addr_modify()
4087 cleanup_prefix_route(ifp, rt_expires, in inet6_addr_modify()
4092 if (was_managetempaddr || ifp->flags & IFA_F_MANAGETEMPADDR) { in inet6_addr_modify()
4093 if (was_managetempaddr && !(ifp->flags & IFA_F_MANAGETEMPADDR)) in inet6_addr_modify()
4095 manage_tempaddrs(ifp->idev, ifp, valid_lft, prefered_lft, in inet6_addr_modify()
4736 struct inet6_ifaddr *ifp; in inet6_set_iftoken() local
4781 list_for_each_entry(ifp, &idev->addr_list, if_list) { in inet6_set_iftoken()
4782 spin_lock(&ifp->lock); in inet6_set_iftoken()
4783 if (ifp->tokenized) { in inet6_set_iftoken()
4784 ifp->valid_lft = 0; in inet6_set_iftoken()
4785 ifp->prefered_lft = 0; in inet6_set_iftoken()
4787 spin_unlock(&ifp->lock); in inet6_set_iftoken()
5028 static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp) in __ipv6_ifa_notify() argument
5030 struct net *net = dev_net(ifp->idev->dev); in __ipv6_ifa_notify()
5035 inet6_ifa_notify(event ? : RTM_NEWADDR, ifp); in __ipv6_ifa_notify()
5045 if (!(ifp->rt->rt6i_node)) in __ipv6_ifa_notify()
5046 ip6_ins_rt(ifp->rt); in __ipv6_ifa_notify()
5047 if (ifp->idev->cnf.forwarding) in __ipv6_ifa_notify()
5048 addrconf_join_anycast(ifp); in __ipv6_ifa_notify()
5049 if (!ipv6_addr_any(&ifp->peer_addr)) in __ipv6_ifa_notify()
5050 addrconf_prefix_route(&ifp->peer_addr, 128, in __ipv6_ifa_notify()
5051 ifp->idev->dev, 0, 0); in __ipv6_ifa_notify()
5054 if (ifp->idev->cnf.forwarding) in __ipv6_ifa_notify()
5055 addrconf_leave_anycast(ifp); in __ipv6_ifa_notify()
5056 addrconf_leave_solict(ifp->idev, &ifp->addr); in __ipv6_ifa_notify()
5057 if (!ipv6_addr_any(&ifp->peer_addr)) { in __ipv6_ifa_notify()
5060 rt = addrconf_get_prefix_route(&ifp->peer_addr, 128, in __ipv6_ifa_notify()
5061 ifp->idev->dev, 0, 0); in __ipv6_ifa_notify()
5065 dst_hold(&ifp->rt->dst); in __ipv6_ifa_notify()
5067 if (ip6_del_rt(ifp->rt)) in __ipv6_ifa_notify()
5068 dst_free(&ifp->rt->dst); in __ipv6_ifa_notify()
5076 static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp) in ipv6_ifa_notify() argument
5079 if (likely(ifp->idev->dead == 0)) in ipv6_ifa_notify()
5080 __ipv6_ifa_notify(event, ifp); in ipv6_ifa_notify()