addrconf.c (93c2fb253d177a0b8f4f93592441f88c9b7d6245) | addrconf.c (360a9887c8c01a715b2b4b131f7c7462f7cce576) |
---|---|
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 * --- 980 unchanged lines hidden (view full) --- 989ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr, 990 const struct in6_addr *peer_addr, int pfxlen, 991 int scope, u32 flags, u32 valid_lft, u32 prefered_lft, 992 bool can_block, struct netlink_ext_ack *extack) 993{ 994 gfp_t gfp_flags = can_block ? GFP_KERNEL : GFP_ATOMIC; 995 struct net *net = dev_net(idev->dev); 996 struct inet6_ifaddr *ifa = NULL; | 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 * --- 980 unchanged lines hidden (view full) --- 989ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr, 990 const struct in6_addr *peer_addr, int pfxlen, 991 int scope, u32 flags, u32 valid_lft, u32 prefered_lft, 992 bool can_block, struct netlink_ext_ack *extack) 993{ 994 gfp_t gfp_flags = can_block ? GFP_KERNEL : GFP_ATOMIC; 995 struct net *net = dev_net(idev->dev); 996 struct inet6_ifaddr *ifa = NULL; |
997 struct fib6_info *rt = NULL; | 997 struct fib6_info *f6i = NULL; |
998 int err = 0; 999 int addr_type = ipv6_addr_type(addr); 1000 1001 if (addr_type == IPV6_ADDR_ANY || 1002 addr_type & IPV6_ADDR_MULTICAST || 1003 (!(idev->dev->flags & IFF_LOOPBACK) && 1004 addr_type & IPV6_ADDR_LOOPBACK)) 1005 return ERR_PTR(-EADDRNOTAVAIL); --- 25 unchanged lines hidden (view full) --- 1031 } 1032 1033 ifa = kzalloc(sizeof(*ifa), gfp_flags); 1034 if (!ifa) { 1035 err = -ENOBUFS; 1036 goto out; 1037 } 1038 | 998 int err = 0; 999 int addr_type = ipv6_addr_type(addr); 1000 1001 if (addr_type == IPV6_ADDR_ANY || 1002 addr_type & IPV6_ADDR_MULTICAST || 1003 (!(idev->dev->flags & IFF_LOOPBACK) && 1004 addr_type & IPV6_ADDR_LOOPBACK)) 1005 return ERR_PTR(-EADDRNOTAVAIL); --- 25 unchanged lines hidden (view full) --- 1031 } 1032 1033 ifa = kzalloc(sizeof(*ifa), gfp_flags); 1034 if (!ifa) { 1035 err = -ENOBUFS; 1036 goto out; 1037 } 1038 |
1039 rt = addrconf_dst_alloc(net, idev, addr, false, gfp_flags); 1040 if (IS_ERR(rt)) { 1041 err = PTR_ERR(rt); 1042 rt = NULL; | 1039 f6i = addrconf_f6i_alloc(net, idev, addr, false, gfp_flags); 1040 if (IS_ERR(f6i)) { 1041 err = PTR_ERR(f6i); 1042 f6i = NULL; |
1043 goto out; 1044 } 1045 1046 if (net->ipv6.devconf_all->disable_policy || 1047 idev->cnf.disable_policy) | 1043 goto out; 1044 } 1045 1046 if (net->ipv6.devconf_all->disable_policy || 1047 idev->cnf.disable_policy) |
1048 rt->dst_nopolicy = true; | 1048 f6i->dst_nopolicy = true; |
1049 1050 neigh_parms_data_state_setall(idev->nd_parms); 1051 1052 ifa->addr = *addr; 1053 if (peer_addr) 1054 ifa->peer_addr = *peer_addr; 1055 1056 spin_lock_init(&ifa->lock); --- 5 unchanged lines hidden (view full) --- 1062 /* No need to add the TENTATIVE flag for addresses with NODAD */ 1063 if (!(flags & IFA_F_NODAD)) 1064 ifa->flags |= IFA_F_TENTATIVE; 1065 ifa->valid_lft = valid_lft; 1066 ifa->prefered_lft = prefered_lft; 1067 ifa->cstamp = ifa->tstamp = jiffies; 1068 ifa->tokenized = false; 1069 | 1049 1050 neigh_parms_data_state_setall(idev->nd_parms); 1051 1052 ifa->addr = *addr; 1053 if (peer_addr) 1054 ifa->peer_addr = *peer_addr; 1055 1056 spin_lock_init(&ifa->lock); --- 5 unchanged lines hidden (view full) --- 1062 /* No need to add the TENTATIVE flag for addresses with NODAD */ 1063 if (!(flags & IFA_F_NODAD)) 1064 ifa->flags |= IFA_F_TENTATIVE; 1065 ifa->valid_lft = valid_lft; 1066 ifa->prefered_lft = prefered_lft; 1067 ifa->cstamp = ifa->tstamp = jiffies; 1068 ifa->tokenized = false; 1069 |
1070 ifa->rt = rt; | 1070 ifa->rt = f6i; |
1071 1072 ifa->idev = idev; 1073 in6_dev_hold(idev); 1074 1075 /* For caller */ 1076 refcount_set(&ifa->refcnt, 1); 1077 1078 rcu_read_lock_bh(); --- 17 unchanged lines hidden (view full) --- 1096 in6_ifa_hold(ifa); 1097 write_unlock(&idev->lock); 1098 1099 rcu_read_unlock_bh(); 1100 1101 inet6addr_notifier_call_chain(NETDEV_UP, ifa); 1102out: 1103 if (unlikely(err < 0)) { | 1071 1072 ifa->idev = idev; 1073 in6_dev_hold(idev); 1074 1075 /* For caller */ 1076 refcount_set(&ifa->refcnt, 1); 1077 1078 rcu_read_lock_bh(); --- 17 unchanged lines hidden (view full) --- 1096 in6_ifa_hold(ifa); 1097 write_unlock(&idev->lock); 1098 1099 rcu_read_unlock_bh(); 1100 1101 inet6addr_notifier_call_chain(NETDEV_UP, ifa); 1102out: 1103 if (unlikely(err < 0)) { |
1104 fib6_info_release(rt); | 1104 fib6_info_release(f6i); |
1105 1106 if (ifa) { 1107 if (ifa->idev) 1108 in6_dev_put(ifa->idev); 1109 kfree(ifa); 1110 } 1111 ifa = ERR_PTR(err); 1112 } --- 2228 unchanged lines hidden (view full) --- 3341 struct inet6_dev *idev, 3342 struct inet6_ifaddr *ifp) 3343{ 3344 /* !fib6_node means the host route was removed from the 3345 * FIB, for example, if 'lo' device is taken down. In that 3346 * case regenerate the host route. 3347 */ 3348 if (!ifp->rt || !ifp->rt->fib6_node) { | 1105 1106 if (ifa) { 1107 if (ifa->idev) 1108 in6_dev_put(ifa->idev); 1109 kfree(ifa); 1110 } 1111 ifa = ERR_PTR(err); 1112 } --- 2228 unchanged lines hidden (view full) --- 3341 struct inet6_dev *idev, 3342 struct inet6_ifaddr *ifp) 3343{ 3344 /* !fib6_node means the host route was removed from the 3345 * FIB, for example, if 'lo' device is taken down. In that 3346 * case regenerate the host route. 3347 */ 3348 if (!ifp->rt || !ifp->rt->fib6_node) { |
3349 struct fib6_info *rt, *prev; | 3349 struct fib6_info *f6i, *prev; |
3350 | 3350 |
3351 rt = addrconf_dst_alloc(net, idev, &ifp->addr, false, 3352 GFP_ATOMIC); 3353 if (IS_ERR(rt)) 3354 return PTR_ERR(rt); | 3351 f6i = addrconf_f6i_alloc(net, idev, &ifp->addr, false, 3352 GFP_ATOMIC); 3353 if (IS_ERR(f6i)) 3354 return PTR_ERR(f6i); |
3355 3356 /* ifp->rt can be accessed outside of rtnl */ 3357 spin_lock(&ifp->lock); 3358 prev = ifp->rt; | 3355 3356 /* ifp->rt can be accessed outside of rtnl */ 3357 spin_lock(&ifp->lock); 3358 prev = ifp->rt; |
3359 ifp->rt = rt; | 3359 ifp->rt = f6i; |
3360 spin_unlock(&ifp->lock); 3361 3362 fib6_info_release(prev); 3363 } 3364 3365 if (!(ifp->flags & IFA_F_NOPREFIXROUTE)) { 3366 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, 3367 idev->dev, 0, 0, GFP_ATOMIC); --- 3389 unchanged lines hidden --- | 3360 spin_unlock(&ifp->lock); 3361 3362 fib6_info_release(prev); 3363 } 3364 3365 if (!(ifp->flags & IFA_F_NOPREFIXROUTE)) { 3366 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, 3367 idev->dev, 0, 0, GFP_ATOMIC); --- 3389 unchanged lines hidden --- |