addrconf.c (1aaaa9acaea1dd2878d6c92b45e4c117ef425baf) | addrconf.c (85b51b12115c79cce7ea1ced6c0bd0339a165d3f) |
---|---|
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 * --- 1858 unchanged lines hidden (view full) --- 1867 } 1868 spin_unlock_bh(&ifp->lock); 1869 1870 return err; 1871} 1872 1873void addrconf_dad_failure(struct inet6_ifaddr *ifp) 1874{ | 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 * --- 1858 unchanged lines hidden (view full) --- 1867 } 1868 spin_unlock_bh(&ifp->lock); 1869 1870 return err; 1871} 1872 1873void addrconf_dad_failure(struct inet6_ifaddr *ifp) 1874{ |
1875 struct in6_addr addr; | |
1876 struct inet6_dev *idev = ifp->idev; 1877 struct net *net = dev_net(ifp->idev->dev); 1878 1879 if (addrconf_dad_end(ifp)) { 1880 in6_ifa_put(ifp); 1881 return; 1882 } 1883 --- 45 unchanged lines hidden (view full) --- 1929 ifp2->stable_privacy_retry = retries; 1930 ifp2->state = INET6_IFADDR_STATE_PREDAD; 1931 spin_unlock_bh(&ifp2->lock); 1932 1933 addrconf_mod_dad_work(ifp2, net->ipv6.sysctl.idgen_delay); 1934 in6_ifa_put(ifp2); 1935lock_errdad: 1936 spin_lock_bh(&ifp->lock); | 1875 struct inet6_dev *idev = ifp->idev; 1876 struct net *net = dev_net(ifp->idev->dev); 1877 1878 if (addrconf_dad_end(ifp)) { 1879 in6_ifa_put(ifp); 1880 return; 1881 } 1882 --- 45 unchanged lines hidden (view full) --- 1928 ifp2->stable_privacy_retry = retries; 1929 ifp2->state = INET6_IFADDR_STATE_PREDAD; 1930 spin_unlock_bh(&ifp2->lock); 1931 1932 addrconf_mod_dad_work(ifp2, net->ipv6.sysctl.idgen_delay); 1933 in6_ifa_put(ifp2); 1934lock_errdad: 1935 spin_lock_bh(&ifp->lock); |
1937 } else if (idev->cnf.accept_dad > 1 && !idev->cnf.disable_ipv6) { 1938 addr.s6_addr32[0] = htonl(0xfe800000); 1939 addr.s6_addr32[1] = 0; 1940 1941 if (!ipv6_generate_eui64(addr.s6_addr + 8, idev->dev) && 1942 ipv6_addr_equal(&ifp->addr, &addr)) { 1943 /* DAD failed for link-local based on MAC address */ 1944 idev->cnf.disable_ipv6 = 1; 1945 1946 pr_info("%s: IPv6 being disabled!\n", 1947 ifp->idev->dev->name); 1948 } | |
1949 } 1950 1951errdad: 1952 /* transition from _POSTDAD to _ERRDAD */ 1953 ifp->state = INET6_IFADDR_STATE_ERRDAD; 1954 spin_unlock_bh(&ifp->lock); 1955 1956 addrconf_mod_dad_work(ifp, 0); --- 1859 unchanged lines hidden (view full) --- 3816 3817static void addrconf_dad_work(struct work_struct *w) 3818{ 3819 struct inet6_ifaddr *ifp = container_of(to_delayed_work(w), 3820 struct inet6_ifaddr, 3821 dad_work); 3822 struct inet6_dev *idev = ifp->idev; 3823 struct in6_addr mcaddr; | 1936 } 1937 1938errdad: 1939 /* transition from _POSTDAD to _ERRDAD */ 1940 ifp->state = INET6_IFADDR_STATE_ERRDAD; 1941 spin_unlock_bh(&ifp->lock); 1942 1943 addrconf_mod_dad_work(ifp, 0); --- 1859 unchanged lines hidden (view full) --- 3803 3804static void addrconf_dad_work(struct work_struct *w) 3805{ 3806 struct inet6_ifaddr *ifp = container_of(to_delayed_work(w), 3807 struct inet6_ifaddr, 3808 dad_work); 3809 struct inet6_dev *idev = ifp->idev; 3810 struct in6_addr mcaddr; |
3811 bool disable_ipv6 = false; |
|
3824 3825 enum { 3826 DAD_PROCESS, 3827 DAD_BEGIN, 3828 DAD_ABORT, 3829 } action = DAD_PROCESS; 3830 3831 rtnl_lock(); 3832 3833 spin_lock_bh(&ifp->lock); 3834 if (ifp->state == INET6_IFADDR_STATE_PREDAD) { 3835 action = DAD_BEGIN; 3836 ifp->state = INET6_IFADDR_STATE_DAD; 3837 } else if (ifp->state == INET6_IFADDR_STATE_ERRDAD) { 3838 action = DAD_ABORT; 3839 ifp->state = INET6_IFADDR_STATE_POSTDAD; | 3812 3813 enum { 3814 DAD_PROCESS, 3815 DAD_BEGIN, 3816 DAD_ABORT, 3817 } action = DAD_PROCESS; 3818 3819 rtnl_lock(); 3820 3821 spin_lock_bh(&ifp->lock); 3822 if (ifp->state == INET6_IFADDR_STATE_PREDAD) { 3823 action = DAD_BEGIN; 3824 ifp->state = INET6_IFADDR_STATE_DAD; 3825 } else if (ifp->state == INET6_IFADDR_STATE_ERRDAD) { 3826 action = DAD_ABORT; 3827 ifp->state = INET6_IFADDR_STATE_POSTDAD; |
3828 3829 if (idev->cnf.accept_dad > 1 && !idev->cnf.disable_ipv6 && 3830 !(ifp->flags & IFA_F_STABLE_PRIVACY)) { 3831 struct in6_addr addr; 3832 3833 addr.s6_addr32[0] = htonl(0xfe800000); 3834 addr.s6_addr32[1] = 0; 3835 3836 if (!ipv6_generate_eui64(addr.s6_addr + 8, idev->dev) && 3837 ipv6_addr_equal(&ifp->addr, &addr)) { 3838 /* DAD failed for link-local based on MAC */ 3839 idev->cnf.disable_ipv6 = 1; 3840 3841 pr_info("%s: IPv6 being disabled!\n", 3842 ifp->idev->dev->name); 3843 disable_ipv6 = true; 3844 } 3845 } |
|
3840 } 3841 spin_unlock_bh(&ifp->lock); 3842 3843 if (action == DAD_BEGIN) { 3844 addrconf_dad_begin(ifp); 3845 goto out; 3846 } else if (action == DAD_ABORT) { 3847 addrconf_dad_stop(ifp, 1); | 3846 } 3847 spin_unlock_bh(&ifp->lock); 3848 3849 if (action == DAD_BEGIN) { 3850 addrconf_dad_begin(ifp); 3851 goto out; 3852 } else if (action == DAD_ABORT) { 3853 addrconf_dad_stop(ifp, 1); |
3854 if (disable_ipv6) 3855 addrconf_ifdown(idev->dev, 0); |
|
3848 goto out; 3849 } 3850 3851 if (!ifp->dad_probes && addrconf_dad_end(ifp)) 3852 goto out; 3853 3854 write_lock_bh(&idev->lock); 3855 if (idev->dead || !(idev->if_flags & IF_READY)) { --- 2429 unchanged lines hidden --- | 3856 goto out; 3857 } 3858 3859 if (!ifp->dad_probes && addrconf_dad_end(ifp)) 3860 goto out; 3861 3862 write_lock_bh(&idev->lock); 3863 if (idev->dead || !(idev->if_flags & IF_READY)) { --- 2429 unchanged lines hidden --- |