addrconf.c (eedf042a63ffef050ebc015de19b52dc065e830b) addrconf.c (e9d3e084975869754d16f639378675c353560be9)
1/*
2 * IPv6 Address [auto]configuration
3 * Linux INET6 implementation
4 *
5 * Authors:
6 * Pedro Roque <roque@di.fc.ul.pt>
7 * Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
8 *

--- 539 unchanged lines hidden (view full) ---

548 printk(KERN_DEBUG "inet6_ifa_finish_destroy\n");
549#endif
550
551 in6_dev_put(ifp->idev);
552
553 if (del_timer(&ifp->timer))
554 pr_notice("Timer is still running, when freeing ifa=%p\n", ifp);
555
1/*
2 * IPv6 Address [auto]configuration
3 * Linux INET6 implementation
4 *
5 * Authors:
6 * Pedro Roque <roque@di.fc.ul.pt>
7 * Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
8 *

--- 539 unchanged lines hidden (view full) ---

548 printk(KERN_DEBUG "inet6_ifa_finish_destroy\n");
549#endif
550
551 in6_dev_put(ifp->idev);
552
553 if (del_timer(&ifp->timer))
554 pr_notice("Timer is still running, when freeing ifa=%p\n", ifp);
555
556 if (!ifp->dead) {
556 if (ifp->state != INET6_IFADDR_STATE_DEAD) {
557 pr_warning("Freeing alive inet6 address %p\n", ifp);
558 return;
559 }
560 dst_release(&ifp->rt->u.dst);
561
562 call_rcu(&ifp->rcu, inet6_ifa_finish_destroy_rcu);
563}
564

--- 78 unchanged lines hidden (view full) ---

643 if (IS_ERR(rt)) {
644 err = PTR_ERR(rt);
645 goto out;
646 }
647
648 ipv6_addr_copy(&ifa->addr, addr);
649
650 spin_lock_init(&ifa->lock);
557 pr_warning("Freeing alive inet6 address %p\n", ifp);
558 return;
559 }
560 dst_release(&ifp->rt->u.dst);
561
562 call_rcu(&ifp->rcu, inet6_ifa_finish_destroy_rcu);
563}
564

--- 78 unchanged lines hidden (view full) ---

643 if (IS_ERR(rt)) {
644 err = PTR_ERR(rt);
645 goto out;
646 }
647
648 ipv6_addr_copy(&ifa->addr, addr);
649
650 spin_lock_init(&ifa->lock);
651 spin_lock_init(&ifa->state_lock);
651 init_timer(&ifa->timer);
652 INIT_HLIST_NODE(&ifa->addr_lst);
653 ifa->timer.data = (unsigned long) ifa;
654 ifa->scope = scope;
655 ifa->prefix_len = pfxlen;
656 ifa->flags = flags | IFA_F_TENTATIVE;
657 ifa->cstamp = ifa->tstamp = jiffies;
658

--- 56 unchanged lines hidden (view full) ---

715 struct inet6_ifaddr *ifa, *ifn;
716 struct inet6_dev *idev = ifp->idev;
717 int hash;
718 int deleted = 0, onlink = 0;
719 unsigned long expires = jiffies;
720
721 hash = ipv6_addr_hash(&ifp->addr);
722
652 init_timer(&ifa->timer);
653 INIT_HLIST_NODE(&ifa->addr_lst);
654 ifa->timer.data = (unsigned long) ifa;
655 ifa->scope = scope;
656 ifa->prefix_len = pfxlen;
657 ifa->flags = flags | IFA_F_TENTATIVE;
658 ifa->cstamp = ifa->tstamp = jiffies;
659

--- 56 unchanged lines hidden (view full) ---

716 struct inet6_ifaddr *ifa, *ifn;
717 struct inet6_dev *idev = ifp->idev;
718 int hash;
719 int deleted = 0, onlink = 0;
720 unsigned long expires = jiffies;
721
722 hash = ipv6_addr_hash(&ifp->addr);
723
723 ifp->dead = 1;
724 ifp->state = INET6_IFADDR_STATE_DEAD;
724
725 spin_lock_bh(&addrconf_hash_lock);
726 hlist_del_init_rcu(&ifp->addr_lst);
727 spin_unlock_bh(&addrconf_hash_lock);
728
729 write_lock_bh(&idev->lock);
730#ifdef CONFIG_IPV6_PRIVACY
731 if (ifp->flags&IFA_F_TEMPORARY) {

--- 1928 unchanged lines hidden (view full) ---

2660 if (how && del_timer(&idev->regen_timer))
2661 in6_dev_put(idev);
2662
2663 /* Step 3: clear tempaddr list */
2664 while (!list_empty(&idev->tempaddr_list)) {
2665 ifa = list_first_entry(&idev->tempaddr_list,
2666 struct inet6_ifaddr, tmp_list);
2667 list_del(&ifa->tmp_list);
725
726 spin_lock_bh(&addrconf_hash_lock);
727 hlist_del_init_rcu(&ifp->addr_lst);
728 spin_unlock_bh(&addrconf_hash_lock);
729
730 write_lock_bh(&idev->lock);
731#ifdef CONFIG_IPV6_PRIVACY
732 if (ifp->flags&IFA_F_TEMPORARY) {

--- 1928 unchanged lines hidden (view full) ---

2661 if (how && del_timer(&idev->regen_timer))
2662 in6_dev_put(idev);
2663
2664 /* Step 3: clear tempaddr list */
2665 while (!list_empty(&idev->tempaddr_list)) {
2666 ifa = list_first_entry(&idev->tempaddr_list,
2667 struct inet6_ifaddr, tmp_list);
2668 list_del(&ifa->tmp_list);
2668 ifa->dead = 1;
2669 ifa->state = INET6_IFADDR_STATE_DEAD;
2669 write_unlock_bh(&idev->lock);
2670 spin_lock_bh(&ifa->lock);
2671
2672 if (ifa->ifpub) {
2673 in6_ifa_put(ifa->ifpub);
2674 ifa->ifpub = NULL;
2675 }
2676 spin_unlock_bh(&ifa->lock);

--- 25 unchanged lines hidden (view full) ---

2702 continue;
2703
2704 /* Flag it for later restoration when link comes up */
2705 ifa->flags |= IFA_F_TENTATIVE;
2706 in6_ifa_hold(ifa);
2707 write_unlock_bh(&idev->lock);
2708 } else {
2709 list_del(&ifa->if_list);
2670 write_unlock_bh(&idev->lock);
2671 spin_lock_bh(&ifa->lock);
2672
2673 if (ifa->ifpub) {
2674 in6_ifa_put(ifa->ifpub);
2675 ifa->ifpub = NULL;
2676 }
2677 spin_unlock_bh(&ifa->lock);

--- 25 unchanged lines hidden (view full) ---

2703 continue;
2704
2705 /* Flag it for later restoration when link comes up */
2706 ifa->flags |= IFA_F_TENTATIVE;
2707 in6_ifa_hold(ifa);
2708 write_unlock_bh(&idev->lock);
2709 } else {
2710 list_del(&ifa->if_list);
2710 ifa->dead = 1;
2711 ifa->state = INET6_IFADDR_STATE_DEAD;
2711 write_unlock_bh(&idev->lock);
2712
2713 /* clear hash table */
2714 spin_lock_bh(&addrconf_hash_lock);
2715 hlist_del_init_rcu(&ifa->addr_lst);
2716 spin_unlock_bh(&addrconf_hash_lock);
2717 }
2718
2719 __ipv6_ifa_notify(RTM_DELADDR, ifa);
2712 write_unlock_bh(&idev->lock);
2713
2714 /* clear hash table */
2715 spin_lock_bh(&addrconf_hash_lock);
2716 hlist_del_init_rcu(&ifa->addr_lst);
2717 spin_unlock_bh(&addrconf_hash_lock);
2718 }
2719
2720 __ipv6_ifa_notify(RTM_DELADDR, ifa);
2720 if (ifa->dead)
2721 if (ifa->state == INET6_IFADDR_STATE_DEAD)
2721 atomic_notifier_call_chain(&inet6addr_chain,
2722 NETDEV_DOWN, ifa);
2723 in6_ifa_put(ifa);
2724
2725 write_lock_bh(&idev->lock);
2726 }
2727
2728 list_splice(&keep_list, &idev->addr_list);

--- 81 unchanged lines hidden (view full) ---

2810 struct inet6_dev *idev = ifp->idev;
2811 struct net_device *dev = idev->dev;
2812
2813 addrconf_join_solict(dev, &ifp->addr);
2814
2815 net_srandom(ifp->addr.s6_addr32[3]);
2816
2817 read_lock_bh(&idev->lock);
2722 atomic_notifier_call_chain(&inet6addr_chain,
2723 NETDEV_DOWN, ifa);
2724 in6_ifa_put(ifa);
2725
2726 write_lock_bh(&idev->lock);
2727 }
2728
2729 list_splice(&keep_list, &idev->addr_list);

--- 81 unchanged lines hidden (view full) ---

2811 struct inet6_dev *idev = ifp->idev;
2812 struct net_device *dev = idev->dev;
2813
2814 addrconf_join_solict(dev, &ifp->addr);
2815
2816 net_srandom(ifp->addr.s6_addr32[3]);
2817
2818 read_lock_bh(&idev->lock);
2818 if (ifp->dead)
2819 if (ifp->state == INET6_IFADDR_STATE_DEAD)
2819 goto out;
2820
2821 spin_lock(&ifp->lock);
2822 if (dev->flags&(IFF_NOARP|IFF_LOOPBACK) ||
2823 idev->cnf.accept_dad < 1 ||
2824 !(ifp->flags&IFA_F_TENTATIVE) ||
2825 ifp->flags & IFA_F_NODAD) {
2826 ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED);

--- 1218 unchanged lines hidden (view full) ---

4045 addrconf_join_anycast(ifp);
4046 break;
4047 case RTM_DELADDR:
4048 if (ifp->idev->cnf.forwarding)
4049 addrconf_leave_anycast(ifp);
4050 addrconf_leave_solict(ifp->idev, &ifp->addr);
4051 dst_hold(&ifp->rt->u.dst);
4052
2820 goto out;
2821
2822 spin_lock(&ifp->lock);
2823 if (dev->flags&(IFF_NOARP|IFF_LOOPBACK) ||
2824 idev->cnf.accept_dad < 1 ||
2825 !(ifp->flags&IFA_F_TENTATIVE) ||
2826 ifp->flags & IFA_F_NODAD) {
2827 ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED);

--- 1218 unchanged lines hidden (view full) ---

4046 addrconf_join_anycast(ifp);
4047 break;
4048 case RTM_DELADDR:
4049 if (ifp->idev->cnf.forwarding)
4050 addrconf_leave_anycast(ifp);
4051 addrconf_leave_solict(ifp->idev, &ifp->addr);
4052 dst_hold(&ifp->rt->u.dst);
4053
4053 if (ifp->dead && ip6_del_rt(ifp->rt))
4054 if (ifp->state == INET6_IFADDR_STATE_DEAD &&
4055 ip6_del_rt(ifp->rt))
4054 dst_free(&ifp->rt->u.dst);
4055 break;
4056 }
4057}
4058
4059static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp)
4060{
4061 rcu_read_lock_bh();

--- 593 unchanged lines hidden ---
4056 dst_free(&ifp->rt->u.dst);
4057 break;
4058 }
4059}
4060
4061static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp)
4062{
4063 rcu_read_lock_bh();

--- 593 unchanged lines hidden ---