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