addrconf.c (b3e0d3d7bab14f2544a3314bec53a23dc7dd2206) | addrconf.c (cc9da6cc4f56e05cc9e591459fe0192727ff58b3) |
---|---|
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 * --- 2305 unchanged lines hidden (view full) --- 2314 */ 2315 read_unlock_bh(&idev->lock); 2316 ipv6_create_tempaddr(ifp, NULL); 2317 } else { 2318 read_unlock_bh(&idev->lock); 2319 } 2320} 2321 | 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 * --- 2305 unchanged lines hidden (view full) --- 2314 */ 2315 read_unlock_bh(&idev->lock); 2316 ipv6_create_tempaddr(ifp, NULL); 2317 } else { 2318 read_unlock_bh(&idev->lock); 2319 } 2320} 2321 |
2322static bool is_addr_mode_generate_stable(struct inet6_dev *idev) 2323{ 2324 return idev->addr_gen_mode == IN6_ADDR_GEN_MODE_STABLE_PRIVACY || 2325 idev->addr_gen_mode == IN6_ADDR_GEN_MODE_RANDOM; 2326} 2327 |
|
2322void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len, bool sllao) 2323{ 2324 struct prefix_info *pinfo; 2325 __u32 valid_lft; 2326 __u32 prefered_lft; 2327 int addr_type; 2328 u32 addr_flags = 0; 2329 struct inet6_dev *in6_dev; --- 97 unchanged lines hidden (view full) --- 2427 memcpy(&addr, &pinfo->prefix, 8); 2428 2429 if (!ipv6_addr_any(&in6_dev->token)) { 2430 read_lock_bh(&in6_dev->lock); 2431 memcpy(addr.s6_addr + 8, 2432 in6_dev->token.s6_addr + 8, 8); 2433 read_unlock_bh(&in6_dev->lock); 2434 tokenized = true; | 2328void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len, bool sllao) 2329{ 2330 struct prefix_info *pinfo; 2331 __u32 valid_lft; 2332 __u32 prefered_lft; 2333 int addr_type; 2334 u32 addr_flags = 0; 2335 struct inet6_dev *in6_dev; --- 97 unchanged lines hidden (view full) --- 2433 memcpy(&addr, &pinfo->prefix, 8); 2434 2435 if (!ipv6_addr_any(&in6_dev->token)) { 2436 read_lock_bh(&in6_dev->lock); 2437 memcpy(addr.s6_addr + 8, 2438 in6_dev->token.s6_addr + 8, 8); 2439 read_unlock_bh(&in6_dev->lock); 2440 tokenized = true; |
2435 } else if (in6_dev->addr_gen_mode == 2436 IN6_ADDR_GEN_MODE_STABLE_PRIVACY && | 2441 } else if (is_addr_mode_generate_stable(in6_dev) && |
2437 !ipv6_generate_stable_address(&addr, 0, 2438 in6_dev)) { 2439 addr_flags |= IFA_F_STABLE_PRIVACY; 2440 goto ok; 2441 } else if (ipv6_generate_eui64(addr.s6_addr + 8, dev) && 2442 ipv6_inherit_eui64(addr.s6_addr + 8, in6_dev)) { 2443 in6_dev_put(in6_dev); 2444 return; --- 583 unchanged lines hidden (view full) --- 3028 return -1; 3029 goto retry; 3030 } 3031 3032 *address = temp; 3033 return 0; 3034} 3035 | 2442 !ipv6_generate_stable_address(&addr, 0, 2443 in6_dev)) { 2444 addr_flags |= IFA_F_STABLE_PRIVACY; 2445 goto ok; 2446 } else if (ipv6_generate_eui64(addr.s6_addr + 8, dev) && 2447 ipv6_inherit_eui64(addr.s6_addr + 8, in6_dev)) { 2448 in6_dev_put(in6_dev); 2449 return; --- 583 unchanged lines hidden (view full) --- 3033 return -1; 3034 goto retry; 3035 } 3036 3037 *address = temp; 3038 return 0; 3039} 3040 |
3041static void ipv6_gen_mode_random_init(struct inet6_dev *idev) 3042{ 3043 struct ipv6_stable_secret *s = &idev->cnf.stable_secret; 3044 3045 if (s->initialized) 3046 return; 3047 s = &idev->cnf.stable_secret; 3048 get_random_bytes(&s->secret, sizeof(s->secret)); 3049 s->initialized = true; 3050} 3051 |
|
3036static void addrconf_addr_gen(struct inet6_dev *idev, bool prefix_route) 3037{ 3038 struct in6_addr addr; 3039 3040 /* no link local addresses on L3 master devices */ 3041 if (netif_is_l3_master(idev->dev)) 3042 return; 3043 3044 ipv6_addr_set(&addr, htonl(0xFE800000), 0, 0, 0); 3045 | 3052static void addrconf_addr_gen(struct inet6_dev *idev, bool prefix_route) 3053{ 3054 struct in6_addr addr; 3055 3056 /* no link local addresses on L3 master devices */ 3057 if (netif_is_l3_master(idev->dev)) 3058 return; 3059 3060 ipv6_addr_set(&addr, htonl(0xFE800000), 0, 0, 0); 3061 |
3046 if (idev->addr_gen_mode == IN6_ADDR_GEN_MODE_STABLE_PRIVACY) { | 3062 switch (idev->addr_gen_mode) { 3063 case IN6_ADDR_GEN_MODE_RANDOM: 3064 ipv6_gen_mode_random_init(idev); 3065 /* fallthrough */ 3066 case IN6_ADDR_GEN_MODE_STABLE_PRIVACY: |
3047 if (!ipv6_generate_stable_address(&addr, 0, idev)) 3048 addrconf_add_linklocal(idev, &addr, 3049 IFA_F_STABLE_PRIVACY); 3050 else if (prefix_route) 3051 addrconf_prefix_route(&addr, 64, idev->dev, 0, 0); | 3067 if (!ipv6_generate_stable_address(&addr, 0, idev)) 3068 addrconf_add_linklocal(idev, &addr, 3069 IFA_F_STABLE_PRIVACY); 3070 else if (prefix_route) 3071 addrconf_prefix_route(&addr, 64, idev->dev, 0, 0); |
3052 } else if (idev->addr_gen_mode == IN6_ADDR_GEN_MODE_EUI64) { | 3072 break; 3073 case IN6_ADDR_GEN_MODE_EUI64: |
3053 /* addrconf_add_linklocal also adds a prefix_route and we 3054 * only need to care about prefix routes if ipv6_generate_eui64 3055 * couldn't generate one. 3056 */ 3057 if (ipv6_generate_eui64(addr.s6_addr + 8, idev->dev) == 0) 3058 addrconf_add_linklocal(idev, &addr, 0); 3059 else if (prefix_route) 3060 addrconf_prefix_route(&addr, 64, idev->dev, 0, 0); | 3074 /* addrconf_add_linklocal also adds a prefix_route and we 3075 * only need to care about prefix routes if ipv6_generate_eui64 3076 * couldn't generate one. 3077 */ 3078 if (ipv6_generate_eui64(addr.s6_addr + 8, idev->dev) == 0) 3079 addrconf_add_linklocal(idev, &addr, 0); 3080 else if (prefix_route) 3081 addrconf_prefix_route(&addr, 64, idev->dev, 0, 0); |
3082 break; 3083 case IN6_ADDR_GEN_MODE_NONE: 3084 default: 3085 /* will not add any link local address */ 3086 break; |
|
3061 } 3062} 3063 3064static void addrconf_dev_config(struct net_device *dev) 3065{ 3066 struct inet6_dev *idev; 3067 3068 ASSERT_RTNL(); 3069 3070 if ((dev->type != ARPHRD_ETHER) && 3071 (dev->type != ARPHRD_FDDI) && 3072 (dev->type != ARPHRD_ARCNET) && 3073 (dev->type != ARPHRD_INFINIBAND) && 3074 (dev->type != ARPHRD_IEEE1394) && 3075 (dev->type != ARPHRD_TUNNEL6) && | 3087 } 3088} 3089 3090static void addrconf_dev_config(struct net_device *dev) 3091{ 3092 struct inet6_dev *idev; 3093 3094 ASSERT_RTNL(); 3095 3096 if ((dev->type != ARPHRD_ETHER) && 3097 (dev->type != ARPHRD_FDDI) && 3098 (dev->type != ARPHRD_ARCNET) && 3099 (dev->type != ARPHRD_INFINIBAND) && 3100 (dev->type != ARPHRD_IEEE1394) && 3101 (dev->type != ARPHRD_TUNNEL6) && |
3076 (dev->type != ARPHRD_6LOWPAN)) { | 3102 (dev->type != ARPHRD_6LOWPAN) && 3103 (dev->type != ARPHRD_NONE)) { |
3077 /* Alas, we support only Ethernet autoconfiguration. */ 3078 return; 3079 } 3080 3081 idev = addrconf_add_dev(dev); 3082 if (IS_ERR(idev)) 3083 return; 3084 | 3104 /* Alas, we support only Ethernet autoconfiguration. */ 3105 return; 3106 } 3107 3108 idev = addrconf_add_dev(dev); 3109 if (IS_ERR(idev)) 3110 return; 3111 |
3112 /* this device type has no EUI support */ 3113 if (dev->type == ARPHRD_NONE && 3114 idev->addr_gen_mode == IN6_ADDR_GEN_MODE_EUI64) 3115 idev->addr_gen_mode = IN6_ADDR_GEN_MODE_RANDOM; 3116 |
|
3085 addrconf_addr_gen(idev, false); 3086} 3087 3088#if IS_ENABLED(CONFIG_IPV6_SIT) 3089static void addrconf_sit_config(struct net_device *dev) 3090{ 3091 struct inet6_dev *idev; 3092 --- 1828 unchanged lines hidden (view full) --- 4921 return err; 4922 } 4923 4924 if (tb[IFLA_INET6_ADDR_GEN_MODE]) { 4925 u8 mode = nla_get_u8(tb[IFLA_INET6_ADDR_GEN_MODE]); 4926 4927 if (mode != IN6_ADDR_GEN_MODE_EUI64 && 4928 mode != IN6_ADDR_GEN_MODE_NONE && | 3117 addrconf_addr_gen(idev, false); 3118} 3119 3120#if IS_ENABLED(CONFIG_IPV6_SIT) 3121static void addrconf_sit_config(struct net_device *dev) 3122{ 3123 struct inet6_dev *idev; 3124 --- 1828 unchanged lines hidden (view full) --- 4953 return err; 4954 } 4955 4956 if (tb[IFLA_INET6_ADDR_GEN_MODE]) { 4957 u8 mode = nla_get_u8(tb[IFLA_INET6_ADDR_GEN_MODE]); 4958 4959 if (mode != IN6_ADDR_GEN_MODE_EUI64 && 4960 mode != IN6_ADDR_GEN_MODE_NONE && |
4929 mode != IN6_ADDR_GEN_MODE_STABLE_PRIVACY) | 4961 mode != IN6_ADDR_GEN_MODE_STABLE_PRIVACY && 4962 mode != IN6_ADDR_GEN_MODE_RANDOM) |
4930 return -EINVAL; 4931 4932 if (mode == IN6_ADDR_GEN_MODE_STABLE_PRIVACY && 4933 !idev->cnf.stable_secret.initialized && 4934 !dev_net(dev)->ipv6.devconf_dflt->stable_secret.initialized) 4935 return -EINVAL; 4936 4937 idev->addr_gen_mode = mode; --- 1093 unchanged lines hidden --- | 4963 return -EINVAL; 4964 4965 if (mode == IN6_ADDR_GEN_MODE_STABLE_PRIVACY && 4966 !idev->cnf.stable_secret.initialized && 4967 !dev_net(dev)->ipv6.devconf_dflt->stable_secret.initialized) 4968 return -EINVAL; 4969 4970 idev->addr_gen_mode = mode; --- 1093 unchanged lines hidden --- |