addrconf.c (f3d9832e56c48e4ca50bab0457e21bcaade4536d) addrconf.c (ff7883ea60e7b021bcd6539b8211879554c8db9a)
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 *

--- 979 unchanged lines hidden (view full) ---

988 const struct in6_addr *peer_addr, int pfxlen,
989 int scope, u32 flags, u32 valid_lft, u32 prefered_lft,
990 bool can_block)
991{
992 gfp_t gfp_flags = can_block ? GFP_KERNEL : GFP_ATOMIC;
993 struct net *net = dev_net(idev->dev);
994 struct inet6_ifaddr *ifa = NULL;
995 struct rt6_info *rt = 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 *

--- 979 unchanged lines hidden (view full) ---

988 const struct in6_addr *peer_addr, int pfxlen,
989 int scope, u32 flags, u32 valid_lft, u32 prefered_lft,
990 bool can_block)
991{
992 gfp_t gfp_flags = can_block ? GFP_KERNEL : GFP_ATOMIC;
993 struct net *net = dev_net(idev->dev);
994 struct inet6_ifaddr *ifa = NULL;
995 struct rt6_info *rt = NULL;
996 struct in6_validator_info i6vi;
997 int err = 0;
998 int addr_type = ipv6_addr_type(addr);
999
1000 if (addr_type == IPV6_ADDR_ANY ||
1001 addr_type & IPV6_ADDR_MULTICAST ||
1002 (!(idev->dev->flags & IFF_LOOPBACK) &&
1003 addr_type & IPV6_ADDR_LOOPBACK))
1004 return ERR_PTR(-EADDRNOTAVAIL);
1005
1006 if (idev->dead) {
1007 err = -ENODEV; /*XXX*/
1008 goto out;
1009 }
1010
1011 if (idev->cnf.disable_ipv6) {
1012 err = -EACCES;
1013 goto out;
1014 }
1015
996 int err = 0;
997 int addr_type = ipv6_addr_type(addr);
998
999 if (addr_type == IPV6_ADDR_ANY ||
1000 addr_type & IPV6_ADDR_MULTICAST ||
1001 (!(idev->dev->flags & IFF_LOOPBACK) &&
1002 addr_type & IPV6_ADDR_LOOPBACK))
1003 return ERR_PTR(-EADDRNOTAVAIL);
1004
1005 if (idev->dead) {
1006 err = -ENODEV; /*XXX*/
1007 goto out;
1008 }
1009
1010 if (idev->cnf.disable_ipv6) {
1011 err = -EACCES;
1012 goto out;
1013 }
1014
1016 i6vi.i6vi_addr = *addr;
1017 i6vi.i6vi_dev = idev;
1018 err = inet6addr_validator_notifier_call_chain(NETDEV_UP, &i6vi);
1019 err = notifier_to_errno(err);
1020 if (err < 0)
1021 goto out;
1015 /* validator notifier needs to be blocking;
1016 * do not call in atomic context
1017 */
1018 if (can_block) {
1019 struct in6_validator_info i6vi = {
1020 .i6vi_addr = *addr,
1021 .i6vi_dev = idev,
1022 };
1022
1023
1024 err = inet6addr_validator_notifier_call_chain(NETDEV_UP, &i6vi);
1025 err = notifier_to_errno(err);
1026 if (err < 0)
1027 goto out;
1028 }
1029
1023 ifa = kzalloc(sizeof(*ifa), gfp_flags);
1024 if (!ifa) {
1025 ADBG("ipv6_add_addr: malloc failed\n");
1026 err = -ENOBUFS;
1027 goto out;
1028 }
1029
1030 rt = addrconf_dst_alloc(idev, addr, false);

--- 5613 unchanged lines hidden ---
1030 ifa = kzalloc(sizeof(*ifa), gfp_flags);
1031 if (!ifa) {
1032 ADBG("ipv6_add_addr: malloc failed\n");
1033 err = -ENOBUFS;
1034 goto out;
1035 }
1036
1037 rt = addrconf_dst_alloc(idev, addr, false);

--- 5613 unchanged lines hidden ---