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 --- |