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