linux/include/linux/netfilter/nfnetlink.h
<<
>>
Prefs
   1#ifndef _NFNETLINK_H
   2#define _NFNETLINK_H
   3
   4
   5#include <linux/netlink.h>
   6#include <linux/capability.h>
   7#include <net/netlink.h>
   8#include <uapi/linux/netfilter/nfnetlink.h>
   9
  10struct nfnl_callback {
  11        int (*call)(struct net *net, struct sock *nl, struct sk_buff *skb,
  12                    const struct nlmsghdr *nlh,
  13                    const struct nlattr * const cda[]);
  14        int (*call_rcu)(struct net *net, struct sock *nl, struct sk_buff *skb,
  15                        const struct nlmsghdr *nlh,
  16                        const struct nlattr * const cda[]);
  17        int (*call_batch)(struct net *net, struct sock *nl, struct sk_buff *skb,
  18                          const struct nlmsghdr *nlh,
  19                          const struct nlattr * const cda[]);
  20        const struct nla_policy *policy;        /* netlink attribute policy */
  21        const u_int16_t attr_count;             /* number of nlattr's */
  22};
  23
  24struct nfnetlink_subsystem {
  25        const char *name;
  26        __u8 subsys_id;                 /* nfnetlink subsystem ID */
  27        __u8 cb_count;                  /* number of callbacks */
  28        const struct nfnl_callback *cb; /* callback for individual types */
  29        int (*commit)(struct net *net, struct sk_buff *skb);
  30        int (*abort)(struct net *net, struct sk_buff *skb);
  31};
  32
  33int nfnetlink_subsys_register(const struct nfnetlink_subsystem *n);
  34int nfnetlink_subsys_unregister(const struct nfnetlink_subsystem *n);
  35
  36int nfnetlink_has_listeners(struct net *net, unsigned int group);
  37int nfnetlink_send(struct sk_buff *skb, struct net *net, u32 portid,
  38                   unsigned int group, int echo, gfp_t flags);
  39int nfnetlink_set_err(struct net *net, u32 portid, u32 group, int error);
  40int nfnetlink_unicast(struct sk_buff *skb, struct net *net, u32 portid,
  41                      int flags);
  42
  43void nfnl_lock(__u8 subsys_id);
  44void nfnl_unlock(__u8 subsys_id);
  45#ifdef CONFIG_PROVE_LOCKING
  46bool lockdep_nfnl_is_held(__u8 subsys_id);
  47#else
  48static inline bool lockdep_nfnl_is_held(__u8 subsys_id)
  49{
  50        return true;
  51}
  52#endif /* CONFIG_PROVE_LOCKING */
  53
  54/*
  55 * nfnl_dereference - fetch RCU pointer when updates are prevented by subsys mutex
  56 *
  57 * @p: The pointer to read, prior to dereferencing
  58 * @ss: The nfnetlink subsystem ID
  59 *
  60 * Return the value of the specified RCU-protected pointer, but omit
  61 * both the smp_read_barrier_depends() and the ACCESS_ONCE(), because
  62 * caller holds the NFNL subsystem mutex.
  63 */
  64#define nfnl_dereference(p, ss)                                 \
  65        rcu_dereference_protected(p, lockdep_nfnl_is_held(ss))
  66
  67#define MODULE_ALIAS_NFNL_SUBSYS(subsys) \
  68        MODULE_ALIAS("nfnetlink-subsys-" __stringify(subsys))
  69
  70#endif  /* _NFNETLINK_H */
  71