linux/include/linux/rtnetlink.h
<<
>>
Prefs
   1#ifndef __LINUX_RTNETLINK_H
   2#define __LINUX_RTNETLINK_H
   3
   4
   5#include <linux/mutex.h>
   6#include <linux/netdevice.h>
   7#include <linux/wait.h>
   8#include <uapi/linux/rtnetlink.h>
   9
  10extern int rtnetlink_send(struct sk_buff *skb, struct net *net, u32 pid, u32 group, int echo);
  11extern int rtnl_unicast(struct sk_buff *skb, struct net *net, u32 pid);
  12extern void rtnl_notify(struct sk_buff *skb, struct net *net, u32 pid,
  13                        u32 group, struct nlmsghdr *nlh, gfp_t flags);
  14extern void rtnl_set_sk_err(struct net *net, u32 group, int error);
  15extern int rtnetlink_put_metrics(struct sk_buff *skb, u32 *metrics);
  16extern int rtnl_put_cacheinfo(struct sk_buff *skb, struct dst_entry *dst,
  17                              u32 id, long expires, u32 error);
  18
  19void rtmsg_ifinfo(int type, struct net_device *dev, unsigned change, gfp_t flags);
  20struct sk_buff *rtmsg_ifinfo_build_skb(int type, struct net_device *dev,
  21                                       unsigned change, gfp_t flags);
  22void rtmsg_ifinfo_send(struct sk_buff *skb, struct net_device *dev,
  23                       gfp_t flags);
  24
  25
  26/* RTNL is used as a global lock for all changes to network configuration  */
  27extern void rtnl_lock(void);
  28extern void rtnl_unlock(void);
  29extern int rtnl_trylock(void);
  30extern int rtnl_is_locked(void);
  31
  32extern wait_queue_head_t netdev_unregistering_wq;
  33extern struct mutex net_mutex;
  34
  35#ifdef CONFIG_PROVE_LOCKING
  36extern int lockdep_rtnl_is_held(void);
  37#else
  38static inline int lockdep_rtnl_is_held(void)
  39{
  40        return 1;
  41}
  42#endif /* #ifdef CONFIG_PROVE_LOCKING */
  43
  44/**
  45 * rcu_dereference_rtnl - rcu_dereference with debug checking
  46 * @p: The pointer to read, prior to dereferencing
  47 *
  48 * Do an rcu_dereference(p), but check caller either holds rcu_read_lock()
  49 * or RTNL. Note : Please prefer rtnl_dereference() or rcu_dereference()
  50 */
  51#define rcu_dereference_rtnl(p)                                 \
  52        rcu_dereference_check(p, lockdep_rtnl_is_held())
  53
  54/**
  55 * rcu_dereference_bh_rtnl - rcu_dereference_bh with debug checking
  56 * @p: The pointer to read, prior to dereference
  57 *
  58 * Do an rcu_dereference_bh(p), but check caller either holds rcu_read_lock_bh()
  59 * or RTNL. Note : Please prefer rtnl_dereference() or rcu_dereference_bh()
  60 */
  61#define rcu_dereference_bh_rtnl(p)                              \
  62        rcu_dereference_bh_check(p, lockdep_rtnl_is_held())
  63
  64/**
  65 * rtnl_dereference - fetch RCU pointer when updates are prevented by RTNL
  66 * @p: The pointer to read, prior to dereferencing
  67 *
  68 * Return the value of the specified RCU-protected pointer, but omit
  69 * both the smp_read_barrier_depends() and the ACCESS_ONCE(), because
  70 * caller holds RTNL.
  71 */
  72#define rtnl_dereference(p)                                     \
  73        rcu_dereference_protected(p, lockdep_rtnl_is_held())
  74
  75static inline struct netdev_queue *dev_ingress_queue(struct net_device *dev)
  76{
  77        return rtnl_dereference(dev->ingress_queue);
  78}
  79
  80extern struct netdev_queue *dev_ingress_queue_create(struct net_device *dev);
  81
  82extern void rtnetlink_init(void);
  83extern void __rtnl_unlock(void);
  84
  85#define ASSERT_RTNL() do { \
  86        if (unlikely(!rtnl_is_locked())) { \
  87                printk(KERN_ERR "RTNL: assertion failed at %s (%d)\n", \
  88                       __FILE__,  __LINE__); \
  89                dump_stack(); \
  90        } \
  91} while(0)
  92
  93extern int ndo_dflt_fdb_dump(struct sk_buff *skb,
  94                             struct netlink_callback *cb,
  95                             struct net_device *dev,
  96                             struct net_device *filter_dev,
  97                             int idx);
  98extern int ndo_dflt_fdb_add(struct ndmsg *ndm,
  99                            struct nlattr *tb[],
 100                            struct net_device *dev,
 101                            const unsigned char *addr,
 102                            u16 vid,
 103                            u16 flags);
 104extern int ndo_dflt_fdb_del(struct ndmsg *ndm,
 105                            struct nlattr *tb[],
 106                            struct net_device *dev,
 107                            const unsigned char *addr,
 108                            u16 vid);
 109
 110extern int ndo_dflt_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq,
 111                                   struct net_device *dev, u16 mode,
 112                                   u32 flags, u32 mask);
 113#endif  /* __LINUX_RTNETLINK_H */
 114