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 bool lockdep_rtnl_is_held(void);
  37#else
  38static inline bool lockdep_rtnl_is_held(void)
  39{
  40        return true;
  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
  80struct netdev_queue *dev_ingress_queue_create(struct net_device *dev);
  81
  82#ifdef CONFIG_NET_INGRESS
  83void net_inc_ingress_queue(void);
  84void net_dec_ingress_queue(void);
  85#endif
  86
  87#ifdef CONFIG_NET_EGRESS
  88void net_inc_egress_queue(void);
  89void net_dec_egress_queue(void);
  90#endif
  91
  92extern void rtnetlink_init(void);
  93extern void __rtnl_unlock(void);
  94
  95#define ASSERT_RTNL() do { \
  96        if (unlikely(!rtnl_is_locked())) { \
  97                printk(KERN_ERR "RTNL: assertion failed at %s (%d)\n", \
  98                       __FILE__,  __LINE__); \
  99                dump_stack(); \
 100        } \
 101} while(0)
 102
 103extern int ndo_dflt_fdb_dump(struct sk_buff *skb,
 104                             struct netlink_callback *cb,
 105                             struct net_device *dev,
 106                             struct net_device *filter_dev,
 107                             int idx);
 108extern int ndo_dflt_fdb_add(struct ndmsg *ndm,
 109                            struct nlattr *tb[],
 110                            struct net_device *dev,
 111                            const unsigned char *addr,
 112                            u16 vid,
 113                            u16 flags);
 114extern int ndo_dflt_fdb_del(struct ndmsg *ndm,
 115                            struct nlattr *tb[],
 116                            struct net_device *dev,
 117                            const unsigned char *addr,
 118                            u16 vid);
 119
 120extern int ndo_dflt_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq,
 121                                   struct net_device *dev, u16 mode,
 122                                   u32 flags, u32 mask, int nlflags,
 123                                   u32 filter_mask,
 124                                   int (*vlan_fill)(struct sk_buff *skb,
 125                                                    struct net_device *dev,
 126                                                    u32 filter_mask));
 127#endif  /* __LINUX_RTNETLINK_H */
 128