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