addrconf.c (275d38585c742acdd6b8ab20f2588552f04c5d31) | addrconf.c (76f793e3a47139d340185cbc1a314740c09b13d3) |
---|---|
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 * --- 810 unchanged lines hidden (view full) --- 819 in6_ifa_put(ifp); 820} 821 822#ifdef CONFIG_IPV6_PRIVACY 823static int ipv6_create_tempaddr(struct inet6_ifaddr *ifp, struct inet6_ifaddr *ift) 824{ 825 struct inet6_dev *idev = ifp->idev; 826 struct in6_addr addr, *tmpaddr; | 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 * --- 810 unchanged lines hidden (view full) --- 819 in6_ifa_put(ifp); 820} 821 822#ifdef CONFIG_IPV6_PRIVACY 823static int ipv6_create_tempaddr(struct inet6_ifaddr *ifp, struct inet6_ifaddr *ift) 824{ 825 struct inet6_dev *idev = ifp->idev; 826 struct in6_addr addr, *tmpaddr; |
827 unsigned long tmp_prefered_lft, tmp_valid_lft, tmp_cstamp, tmp_tstamp, age; | 827 unsigned long tmp_prefered_lft, tmp_valid_lft, tmp_tstamp, age; |
828 unsigned long regen_advance; 829 int tmp_plen; 830 int ret = 0; 831 int max_addresses; 832 u32 addr_flags; | 828 unsigned long regen_advance; 829 int tmp_plen; 830 int ret = 0; 831 int max_addresses; 832 u32 addr_flags; |
833 unsigned long now = jiffies; |
|
833 834 write_lock(&idev->lock); 835 if (ift) { 836 spin_lock_bh(&ift->lock); 837 memcpy(&addr.s6_addr[8], &ift->addr.s6_addr[8], 8); 838 spin_unlock_bh(&ift->lock); 839 tmpaddr = &addr; 840 } else { --- 28 unchanged lines hidden (view full) --- 869 printk(KERN_WARNING 870 "ipv6_create_tempaddr(): regeneration of randomized interface id failed.\n"); 871 in6_ifa_put(ifp); 872 in6_dev_put(idev); 873 ret = -1; 874 goto out; 875 } 876 memcpy(&addr.s6_addr[8], idev->rndid, 8); | 834 835 write_lock(&idev->lock); 836 if (ift) { 837 spin_lock_bh(&ift->lock); 838 memcpy(&addr.s6_addr[8], &ift->addr.s6_addr[8], 8); 839 spin_unlock_bh(&ift->lock); 840 tmpaddr = &addr; 841 } else { --- 28 unchanged lines hidden (view full) --- 870 printk(KERN_WARNING 871 "ipv6_create_tempaddr(): regeneration of randomized interface id failed.\n"); 872 in6_ifa_put(ifp); 873 in6_dev_put(idev); 874 ret = -1; 875 goto out; 876 } 877 memcpy(&addr.s6_addr[8], idev->rndid, 8); |
877 age = (jiffies - ifp->tstamp) / HZ; | 878 age = (now - ifp->tstamp) / HZ; |
878 tmp_valid_lft = min_t(__u32, 879 ifp->valid_lft, 880 idev->cnf.temp_valid_lft + age); 881 tmp_prefered_lft = min_t(__u32, 882 ifp->prefered_lft, 883 idev->cnf.temp_prefered_lft + age - 884 idev->cnf.max_desync_factor); 885 tmp_plen = ifp->prefix_len; 886 max_addresses = idev->cnf.max_addresses; | 879 tmp_valid_lft = min_t(__u32, 880 ifp->valid_lft, 881 idev->cnf.temp_valid_lft + age); 882 tmp_prefered_lft = min_t(__u32, 883 ifp->prefered_lft, 884 idev->cnf.temp_prefered_lft + age - 885 idev->cnf.max_desync_factor); 886 tmp_plen = ifp->prefix_len; 887 max_addresses = idev->cnf.max_addresses; |
887 tmp_cstamp = ifp->cstamp; | |
888 tmp_tstamp = ifp->tstamp; 889 spin_unlock_bh(&ifp->lock); 890 891 regen_advance = idev->cnf.regen_max_retry * 892 idev->cnf.dad_transmits * 893 idev->nd_parms->retrans_time / HZ; 894 write_unlock(&idev->lock); 895 --- 28 unchanged lines hidden (view full) --- 924 write_lock(&idev->lock); 925 goto retry; 926 } 927 928 spin_lock_bh(&ift->lock); 929 ift->ifpub = ifp; 930 ift->valid_lft = tmp_valid_lft; 931 ift->prefered_lft = tmp_prefered_lft; | 888 tmp_tstamp = ifp->tstamp; 889 spin_unlock_bh(&ifp->lock); 890 891 regen_advance = idev->cnf.regen_max_retry * 892 idev->cnf.dad_transmits * 893 idev->nd_parms->retrans_time / HZ; 894 write_unlock(&idev->lock); 895 --- 28 unchanged lines hidden (view full) --- 924 write_lock(&idev->lock); 925 goto retry; 926 } 927 928 spin_lock_bh(&ift->lock); 929 ift->ifpub = ifp; 930 ift->valid_lft = tmp_valid_lft; 931 ift->prefered_lft = tmp_prefered_lft; |
932 ift->cstamp = tmp_cstamp; | 932 ift->cstamp = now; |
933 ift->tstamp = tmp_tstamp; 934 spin_unlock_bh(&ift->lock); 935 936 addrconf_dad_start(ift, 0); 937 in6_ifa_put(ift); 938 in6_dev_put(idev); 939out: 940 return ret; --- 1053 unchanged lines hidden (view full) --- 1994 if (!(flags&IFA_F_TENTATIVE)) 1995 ipv6_ifa_notify(0, ifp); 1996 } else 1997 spin_unlock(&ifp->lock); 1998 1999#ifdef CONFIG_IPV6_PRIVACY 2000 read_lock_bh(&in6_dev->lock); 2001 /* update all temporary addresses in the list */ | 933 ift->tstamp = tmp_tstamp; 934 spin_unlock_bh(&ift->lock); 935 936 addrconf_dad_start(ift, 0); 937 in6_ifa_put(ift); 938 in6_dev_put(idev); 939out: 940 return ret; --- 1053 unchanged lines hidden (view full) --- 1994 if (!(flags&IFA_F_TENTATIVE)) 1995 ipv6_ifa_notify(0, ifp); 1996 } else 1997 spin_unlock(&ifp->lock); 1998 1999#ifdef CONFIG_IPV6_PRIVACY 2000 read_lock_bh(&in6_dev->lock); 2001 /* update all temporary addresses in the list */ |
2002 list_for_each_entry(ift, &in6_dev->tempaddr_list, tmp_list) { 2003 /* 2004 * When adjusting the lifetimes of an existing 2005 * temporary address, only lower the lifetimes. 2006 * Implementations must not increase the 2007 * lifetimes of an existing temporary address 2008 * when processing a Prefix Information Option. 2009 */ | 2002 list_for_each_entry(ift, &in6_dev->tempaddr_list, 2003 tmp_list) { 2004 int age, max_valid, max_prefered; 2005 |
2010 if (ifp != ift->ifpub) 2011 continue; 2012 | 2006 if (ifp != ift->ifpub) 2007 continue; 2008 |
2009 /* 2010 * RFC 4941 section 3.3: 2011 * If a received option will extend the lifetime 2012 * of a public address, the lifetimes of 2013 * temporary addresses should be extended, 2014 * subject to the overall constraint that no 2015 * temporary addresses should ever remain 2016 * "valid" or "preferred" for a time longer than 2017 * (TEMP_VALID_LIFETIME) or 2018 * (TEMP_PREFERRED_LIFETIME - DESYNC_FACTOR), 2019 * respectively. 2020 */ 2021 age = (now - ift->cstamp) / HZ; 2022 max_valid = in6_dev->cnf.temp_valid_lft - age; 2023 if (max_valid < 0) 2024 max_valid = 0; 2025 2026 max_prefered = in6_dev->cnf.temp_prefered_lft - 2027 in6_dev->cnf.max_desync_factor - 2028 age; 2029 if (max_prefered < 0) 2030 max_prefered = 0; 2031 2032 if (valid_lft > max_valid) 2033 valid_lft = max_valid; 2034 2035 if (prefered_lft > max_prefered) 2036 prefered_lft = max_prefered; 2037 |
|
2013 spin_lock(&ift->lock); 2014 flags = ift->flags; | 2038 spin_lock(&ift->lock); 2039 flags = ift->flags; |
2015 if (ift->valid_lft > valid_lft && 2016 ift->valid_lft - valid_lft > (jiffies - ift->tstamp) / HZ) 2017 ift->valid_lft = valid_lft + (jiffies - ift->tstamp) / HZ; 2018 if (ift->prefered_lft > prefered_lft && 2019 ift->prefered_lft - prefered_lft > (jiffies - ift->tstamp) / HZ) 2020 ift->prefered_lft = prefered_lft + (jiffies - ift->tstamp) / HZ; | 2040 ift->valid_lft = valid_lft; 2041 ift->prefered_lft = prefered_lft; 2042 ift->tstamp = now; 2043 if (prefered_lft > 0) 2044 ift->flags &= ~IFA_F_DEPRECATED; 2045 |
2021 spin_unlock(&ift->lock); 2022 if (!(flags&IFA_F_TENTATIVE)) 2023 ipv6_ifa_notify(0, ift); 2024 } 2025 2026 if ((create || list_empty(&in6_dev->tempaddr_list)) && in6_dev->cnf.use_tempaddr > 0) { 2027 /* | 2046 spin_unlock(&ift->lock); 2047 if (!(flags&IFA_F_TENTATIVE)) 2048 ipv6_ifa_notify(0, ift); 2049 } 2050 2051 if ((create || list_empty(&in6_dev->tempaddr_list)) && in6_dev->cnf.use_tempaddr > 0) { 2052 /* |
2028 * When a new public address is created as described in [ADDRCONF], 2029 * also create a new temporary address. Also create a temporary 2030 * address if it's enabled but no temporary address currently exists. | 2053 * When a new public address is created as 2054 * described in [ADDRCONF], also create a new 2055 * temporary address. Also create a temporary 2056 * address if it's enabled but no temporary 2057 * address currently exists. |
2031 */ 2032 read_unlock_bh(&in6_dev->lock); 2033 ipv6_create_tempaddr(ifp, NULL); 2034 } else { 2035 read_unlock_bh(&in6_dev->lock); 2036 } 2037#endif 2038 in6_ifa_put(ifp); --- 2757 unchanged lines hidden --- | 2058 */ 2059 read_unlock_bh(&in6_dev->lock); 2060 ipv6_create_tempaddr(ifp, NULL); 2061 } else { 2062 read_unlock_bh(&in6_dev->lock); 2063 } 2064#endif 2065 in6_ifa_put(ifp); --- 2757 unchanged lines hidden --- |