1
2#ifndef _NFNETLINK_H
3#define _NFNETLINK_H
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 struct netlink_ext_ack *extack);
15 int (*call_rcu)(struct net *net, struct sock *nl, struct sk_buff *skb,
16 const struct nlmsghdr *nlh,
17 const struct nlattr * const cda[],
18 struct netlink_ext_ack *extack);
19 int (*call_batch)(struct net *net, struct sock *nl, struct sk_buff *skb,
20 const struct nlmsghdr *nlh,
21 const struct nlattr * const cda[],
22 struct netlink_ext_ack *extack);
23 const struct nla_policy *policy;
24 const u_int16_t attr_count;
25};
26
27struct nfnetlink_subsystem {
28 const char *name;
29 __u8 subsys_id;
30 __u8 cb_count;
31 const struct nfnl_callback *cb;
32 int (*commit)(struct net *net, struct sk_buff *skb);
33 int (*abort)(struct net *net, struct sk_buff *skb);
34 bool (*valid_genid)(struct net *net, u32 genid);
35};
36
37int nfnetlink_subsys_register(const struct nfnetlink_subsystem *n);
38int nfnetlink_subsys_unregister(const struct nfnetlink_subsystem *n);
39
40int nfnetlink_has_listeners(struct net *net, unsigned int group);
41int nfnetlink_send(struct sk_buff *skb, struct net *net, u32 portid,
42 unsigned int group, int echo, gfp_t flags);
43int nfnetlink_set_err(struct net *net, u32 portid, u32 group, int error);
44int nfnetlink_unicast(struct sk_buff *skb, struct net *net, u32 portid,
45 int flags);
46
47static inline u16 nfnl_msg_type(u8 subsys, u8 msg_type)
48{
49 return subsys << 8 | msg_type;
50}
51
52void nfnl_lock(__u8 subsys_id);
53void nfnl_unlock(__u8 subsys_id);
54#ifdef CONFIG_PROVE_LOCKING
55bool lockdep_nfnl_is_held(__u8 subsys_id);
56#else
57static inline bool lockdep_nfnl_is_held(__u8 subsys_id)
58{
59 return true;
60}
61#endif
62
63
64
65
66
67
68
69
70
71
72
73#define nfnl_dereference(p, ss) \
74 rcu_dereference_protected(p, lockdep_nfnl_is_held(ss))
75
76#define MODULE_ALIAS_NFNL_SUBSYS(subsys) \
77 MODULE_ALIAS("nfnetlink-subsys-" __stringify(subsys))
78
79#endif
80