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