addrconf.c (f2344a131bccdbfc5338e17fa71a807dee7944fa) addrconf.c (622ccdf107bcb49c4d8fb65512652566d4c8928a)
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 *

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

2848 struct inet6_dev *idev = ifp->idev;
2849 struct net_device *dev = idev->dev;
2850
2851 addrconf_join_solict(dev, &ifp->addr);
2852
2853 net_srandom(ifp->addr.s6_addr32[3]);
2854
2855 read_lock_bh(&idev->lock);
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 *

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

2848 struct inet6_dev *idev = ifp->idev;
2849 struct net_device *dev = idev->dev;
2850
2851 addrconf_join_solict(dev, &ifp->addr);
2852
2853 net_srandom(ifp->addr.s6_addr32[3]);
2854
2855 read_lock_bh(&idev->lock);
2856 spin_lock(&ifp->lock);
2856 if (ifp->state == INET6_IFADDR_STATE_DEAD)
2857 goto out;
2858
2857 if (ifp->state == INET6_IFADDR_STATE_DEAD)
2858 goto out;
2859
2859 spin_lock(&ifp->lock);
2860 if (dev->flags&(IFF_NOARP|IFF_LOOPBACK) ||
2861 idev->cnf.accept_dad < 1 ||
2862 !(ifp->flags&IFA_F_TENTATIVE) ||
2863 ifp->flags & IFA_F_NODAD) {
2864 ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED);
2865 spin_unlock(&ifp->lock);
2866 read_unlock_bh(&idev->lock);
2867

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

2885 /*
2886 * Optimistic nodes can start receiving
2887 * Frames right away
2888 */
2889 if (ifp->flags & IFA_F_OPTIMISTIC)
2890 ip6_ins_rt(ifp->rt);
2891
2892 addrconf_dad_kick(ifp);
2860 if (dev->flags&(IFF_NOARP|IFF_LOOPBACK) ||
2861 idev->cnf.accept_dad < 1 ||
2862 !(ifp->flags&IFA_F_TENTATIVE) ||
2863 ifp->flags & IFA_F_NODAD) {
2864 ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED);
2865 spin_unlock(&ifp->lock);
2866 read_unlock_bh(&idev->lock);
2867

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

2885 /*
2886 * Optimistic nodes can start receiving
2887 * Frames right away
2888 */
2889 if (ifp->flags & IFA_F_OPTIMISTIC)
2890 ip6_ins_rt(ifp->rt);
2891
2892 addrconf_dad_kick(ifp);
2893 spin_unlock(&ifp->lock);
2894out:
2893out:
2894 spin_unlock(&ifp->lock);
2895 read_unlock_bh(&idev->lock);
2896}
2897
2898static void addrconf_dad_timer(unsigned long data)
2899{
2900 struct inet6_ifaddr *ifp = (struct inet6_ifaddr *) data;
2901 struct inet6_dev *idev = ifp->idev;
2902 struct in6_addr mcaddr;
2903
2904 if (!ifp->probes && addrconf_dad_end(ifp))
2905 goto out;
2906
2907 read_lock(&idev->lock);
2908 if (idev->dead || !(idev->if_flags & IF_READY)) {
2909 read_unlock(&idev->lock);
2910 goto out;
2911 }
2912
2913 spin_lock(&ifp->lock);
2895 read_unlock_bh(&idev->lock);
2896}
2897
2898static void addrconf_dad_timer(unsigned long data)
2899{
2900 struct inet6_ifaddr *ifp = (struct inet6_ifaddr *) data;
2901 struct inet6_dev *idev = ifp->idev;
2902 struct in6_addr mcaddr;
2903
2904 if (!ifp->probes && addrconf_dad_end(ifp))
2905 goto out;
2906
2907 read_lock(&idev->lock);
2908 if (idev->dead || !(idev->if_flags & IF_READY)) {
2909 read_unlock(&idev->lock);
2910 goto out;
2911 }
2912
2913 spin_lock(&ifp->lock);
2914 if (ifp->state == INET6_IFADDR_STATE_DEAD) {
2915 spin_unlock(&ifp->lock);
2916 read_unlock(&idev->lock);
2917 goto out;
2918 }
2919
2914 if (ifp->probes == 0) {
2915 /*
2916 * DAD was successful
2917 */
2918
2919 ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED);
2920 spin_unlock(&ifp->lock);
2921 read_unlock(&idev->lock);

--- 1773 unchanged lines hidden ---
2920 if (ifp->probes == 0) {
2921 /*
2922 * DAD was successful
2923 */
2924
2925 ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED);
2926 spin_unlock(&ifp->lock);
2927 read_unlock(&idev->lock);

--- 1773 unchanged lines hidden ---