mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 12:11:40 +00:00
ipv6: addrconf.h cleanups
- Use rcu_dereference_rtnl() in __in6_dev_get - kerneldoc for __in6_dev_get() and in6_dev_get() - Use inline functions instead of macros Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
756e64a0b1
commit
48daa3bb84
@ -174,20 +174,32 @@ extern int ipv6_chk_acast_addr(struct net *net, struct net_device *dev,
|
||||
extern int register_inet6addr_notifier(struct notifier_block *nb);
|
||||
extern int unregister_inet6addr_notifier(struct notifier_block *nb);
|
||||
|
||||
static inline struct inet6_dev *
|
||||
__in6_dev_get(struct net_device *dev)
|
||||
/**
|
||||
* __in6_dev_get - get inet6_dev pointer from netdevice
|
||||
* @dev: network device
|
||||
*
|
||||
* Caller must hold rcu_read_lock or RTNL, because this function
|
||||
* does not take a reference on the inet6_dev.
|
||||
*/
|
||||
static inline struct inet6_dev *__in6_dev_get(const struct net_device *dev)
|
||||
{
|
||||
return rcu_dereference_check(dev->ip6_ptr,
|
||||
rcu_read_lock_held() ||
|
||||
lockdep_rtnl_is_held());
|
||||
return rcu_dereference_rtnl(dev->ip6_ptr);
|
||||
}
|
||||
|
||||
static inline struct inet6_dev *
|
||||
in6_dev_get(struct net_device *dev)
|
||||
/**
|
||||
* in6_dev_get - get inet6_dev pointer from netdevice
|
||||
* @dev: network device
|
||||
*
|
||||
* This version can be used in any context, and takes a reference
|
||||
* on the inet6_dev. Callers must use in6_dev_put() later to
|
||||
* release this reference.
|
||||
*/
|
||||
static inline struct inet6_dev *in6_dev_get(const struct net_device *dev)
|
||||
{
|
||||
struct inet6_dev *idev = NULL;
|
||||
struct inet6_dev *idev;
|
||||
|
||||
rcu_read_lock();
|
||||
idev = __in6_dev_get(dev);
|
||||
idev = rcu_dereference(dev->ip6_ptr);
|
||||
if (idev)
|
||||
atomic_inc(&idev->refcnt);
|
||||
rcu_read_unlock();
|
||||
@ -196,16 +208,21 @@ in6_dev_get(struct net_device *dev)
|
||||
|
||||
extern void in6_dev_finish_destroy(struct inet6_dev *idev);
|
||||
|
||||
static inline void
|
||||
in6_dev_put(struct inet6_dev *idev)
|
||||
static inline void in6_dev_put(struct inet6_dev *idev)
|
||||
{
|
||||
if (atomic_dec_and_test(&idev->refcnt))
|
||||
in6_dev_finish_destroy(idev);
|
||||
}
|
||||
|
||||
#define __in6_dev_put(idev) atomic_dec(&(idev)->refcnt)
|
||||
#define in6_dev_hold(idev) atomic_inc(&(idev)->refcnt)
|
||||
static inline void __in6_dev_put(struct inet6_dev *idev)
|
||||
{
|
||||
atomic_dec(&idev->refcnt);
|
||||
}
|
||||
|
||||
static inline void in6_dev_hold(struct inet6_dev *idev)
|
||||
{
|
||||
atomic_inc(&idev->refcnt);
|
||||
}
|
||||
|
||||
extern void inet6_ifa_finish_destroy(struct inet6_ifaddr *ifp);
|
||||
|
||||
@ -215,9 +232,15 @@ static inline void in6_ifa_put(struct inet6_ifaddr *ifp)
|
||||
inet6_ifa_finish_destroy(ifp);
|
||||
}
|
||||
|
||||
#define __in6_ifa_put(ifp) atomic_dec(&(ifp)->refcnt)
|
||||
#define in6_ifa_hold(ifp) atomic_inc(&(ifp)->refcnt)
|
||||
static inline void __in6_ifa_put(struct inet6_ifaddr *ifp)
|
||||
{
|
||||
atomic_dec(&ifp->refcnt);
|
||||
}
|
||||
|
||||
static inline void in6_ifa_hold(struct inet6_ifaddr *ifp)
|
||||
{
|
||||
atomic_inc(&ifp->refcnt);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
@ -240,23 +263,23 @@ static inline int ipv6_addr_is_multicast(const struct in6_addr *addr)
|
||||
|
||||
static inline int ipv6_addr_is_ll_all_nodes(const struct in6_addr *addr)
|
||||
{
|
||||
return (((addr->s6_addr32[0] ^ htonl(0xff020000)) |
|
||||
return ((addr->s6_addr32[0] ^ htonl(0xff020000)) |
|
||||
addr->s6_addr32[1] | addr->s6_addr32[2] |
|
||||
(addr->s6_addr32[3] ^ htonl(0x00000001))) == 0);
|
||||
(addr->s6_addr32[3] ^ htonl(0x00000001))) == 0;
|
||||
}
|
||||
|
||||
static inline int ipv6_addr_is_ll_all_routers(const struct in6_addr *addr)
|
||||
{
|
||||
return (((addr->s6_addr32[0] ^ htonl(0xff020000)) |
|
||||
return ((addr->s6_addr32[0] ^ htonl(0xff020000)) |
|
||||
addr->s6_addr32[1] | addr->s6_addr32[2] |
|
||||
(addr->s6_addr32[3] ^ htonl(0x00000002))) == 0);
|
||||
(addr->s6_addr32[3] ^ htonl(0x00000002))) == 0;
|
||||
}
|
||||
|
||||
extern int __ipv6_isatap_ifid(u8 *eui, __be32 addr);
|
||||
|
||||
static inline int ipv6_addr_is_isatap(const struct in6_addr *addr)
|
||||
{
|
||||
return ((addr->s6_addr32[2] | htonl(0x02000000)) == htonl(0x02005EFE));
|
||||
return (addr->s6_addr32[2] | htonl(0x02000000)) == htonl(0x02005EFE);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
|
Loading…
Reference in New Issue
Block a user