]>
Commit | Line | Data |
---|---|---|
f9e815b3 HW |
1 | #ifndef _NFNETLINK_H |
2 | #define _NFNETLINK_H | |
ac6d439d | 3 | |
080774a2 | 4 | #include <linux/netlink.h> |
f9e815b3 | 5 | #include <linux/capability.h> |
df6fb868 | 6 | #include <net/netlink.h> |
94d0ec58 | 7 | #include <uapi/linux/netfilter/nfnetlink.h> |
f9e815b3 | 8 | |
d94d9fee | 9 | struct nfnl_callback { |
7b8002a1 | 10 | int (*call)(struct net *net, struct sock *nl, struct sk_buff *skb, |
6b75e3e8 | 11 | const struct nlmsghdr *nlh, |
04ba724b PNA |
12 | const struct nlattr * const cda[], |
13 | struct netlink_ext_ack *extack); | |
7b8002a1 PNA |
14 | int (*call_rcu)(struct net *net, struct sock *nl, struct sk_buff *skb, |
15 | const struct nlmsghdr *nlh, | |
04ba724b PNA |
16 | const struct nlattr * const cda[], |
17 | struct netlink_ext_ack *extack); | |
633c9a84 | 18 | int (*call_batch)(struct net *net, struct sock *nl, struct sk_buff *skb, |
0628b123 | 19 | const struct nlmsghdr *nlh, |
04ba724b PNA |
20 | const struct nlattr * const cda[], |
21 | struct netlink_ext_ack *extack); | |
e3730578 PM |
22 | const struct nla_policy *policy; /* netlink attribute policy */ |
23 | const u_int16_t attr_count; /* number of nlattr's */ | |
f9e815b3 HW |
24 | }; |
25 | ||
d94d9fee | 26 | struct nfnetlink_subsystem { |
f9e815b3 | 27 | const char *name; |
7c8d4cb4 PM |
28 | __u8 subsys_id; /* nfnetlink subsystem ID */ |
29 | __u8 cb_count; /* number of callbacks */ | |
30 | const struct nfnl_callback *cb; /* callback for individual types */ | |
5913beaf PNA |
31 | int (*commit)(struct net *net, struct sk_buff *skb); |
32 | int (*abort)(struct net *net, struct sk_buff *skb); | |
8c4d4e8b | 33 | bool (*valid_genid)(struct net *net, u32 genid); |
f9e815b3 HW |
34 | }; |
35 | ||
a0f4ecf3 JP |
36 | int nfnetlink_subsys_register(const struct nfnetlink_subsystem *n); |
37 | int nfnetlink_subsys_unregister(const struct nfnetlink_subsystem *n); | |
38 | ||
39 | int nfnetlink_has_listeners(struct net *net, unsigned int group); | |
a0f4ecf3 JP |
40 | int nfnetlink_send(struct sk_buff *skb, struct net *net, u32 portid, |
41 | unsigned int group, int echo, gfp_t flags); | |
42 | int nfnetlink_set_err(struct net *net, u32 portid, u32 group, int error); | |
43 | int nfnetlink_unicast(struct sk_buff *skb, struct net *net, u32 portid, | |
44 | int flags); | |
45 | ||
dedb67c4 PNA |
46 | static inline u16 nfnl_msg_type(u8 subsys, u8 msg_type) |
47 | { | |
48 | return subsys << 8 | msg_type; | |
49 | } | |
50 | ||
a0f4ecf3 JP |
51 | void nfnl_lock(__u8 subsys_id); |
52 | void nfnl_unlock(__u8 subsys_id); | |
0eb5db7a | 53 | #ifdef CONFIG_PROVE_LOCKING |
875e0829 | 54 | bool lockdep_nfnl_is_held(__u8 subsys_id); |
0eb5db7a | 55 | #else |
875e0829 | 56 | static inline bool lockdep_nfnl_is_held(__u8 subsys_id) |
0eb5db7a | 57 | { |
875e0829 | 58 | return true; |
0eb5db7a PM |
59 | } |
60 | #endif /* CONFIG_PROVE_LOCKING */ | |
61 | ||
62 | /* | |
63 | * nfnl_dereference - fetch RCU pointer when updates are prevented by subsys mutex | |
64 | * | |
65 | * @p: The pointer to read, prior to dereferencing | |
66 | * @ss: The nfnetlink subsystem ID | |
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 the NFNL subsystem mutex. | |
71 | */ | |
72 | #define nfnl_dereference(p, ss) \ | |
73 | rcu_dereference_protected(p, lockdep_nfnl_is_held(ss)) | |
e6a7d3c0 | 74 | |
0ab43f84 HW |
75 | #define MODULE_ALIAS_NFNL_SUBSYS(subsys) \ |
76 | MODULE_ALIAS("nfnetlink-subsys-" __stringify(subsys)) | |
77 | ||
f9e815b3 | 78 | #endif /* _NFNETLINK_H */ |