]>
Commit | Line | Data |
---|---|---|
064af421 BP |
1 | #ifndef __NET_GENERIC_NETLINK_WRAPPER_H |
2 | #define __NET_GENERIC_NETLINK_WRAPPER_H 1 | |
3 | ||
aaff4b55 | 4 | #include <linux/version.h> |
064af421 | 5 | #include <linux/netlink.h> |
8ce41058 | 6 | #include <net/net_namespace.h> |
b3dcb73c | 7 | #include_next <net/genetlink.h> |
aaff4b55 | 8 | |
13dd4a97 | 9 | #ifndef HAVE_GENL_NOTIFY_TAKES_FAMILY |
cb25142c PS |
10 | struct rpl_genl_family { |
11 | struct genl_family compat_family; | |
12 | unsigned int id; | |
13 | unsigned int hdrsize; | |
14 | char name[GENL_NAMSIZ]; | |
15 | unsigned int version; | |
16 | unsigned int maxattr; | |
17 | bool netnsok; | |
18 | bool parallel_ops; | |
19 | int (*pre_doit)(const struct genl_ops *ops, | |
20 | struct sk_buff *skb, | |
21 | struct genl_info *info); | |
22 | void (*post_doit)(const struct genl_ops *ops, | |
23 | struct sk_buff *skb, | |
24 | struct genl_info *info); | |
25 | struct nlattr ** attrbuf; /* private */ | |
26 | const struct genl_ops * ops; /* private */ | |
27 | const struct genl_multicast_group *mcgrps; /* private */ | |
28 | unsigned int n_ops; /* private */ | |
29 | unsigned int n_mcgrps; /* private */ | |
30 | unsigned int mcgrp_offset; /* private */ | |
31 | struct list_head family_list; /* private */ | |
32 | struct module *module; | |
33 | }; | |
34 | ||
35 | #define genl_family rpl_genl_family | |
cb25142c PS |
36 | static inline void *rpl_genlmsg_put(struct sk_buff *skb, u32 portid, u32 seq, |
37 | struct genl_family *family, int flags, u8 cmd) | |
38 | { | |
39 | return genlmsg_put(skb, portid, seq, &family->compat_family, flags, cmd); | |
40 | } | |
41 | ||
42 | #define genlmsg_put rpl_genlmsg_put | |
43 | ||
44 | static inline int rpl_genl_unregister_family(struct genl_family *family) | |
45 | { | |
46 | return genl_unregister_family(&family->compat_family); | |
47 | } | |
48 | #define genl_unregister_family rpl_genl_unregister_family | |
49 | ||
50 | #define genl_set_err rpl_genl_set_err | |
51 | static inline int genl_set_err(struct genl_family *family, struct net *net, | |
52 | u32 portid, u32 group, int code) | |
53 | { | |
6dbd98e6 | 54 | #ifdef HAVE_VOID_NETLINK_SET_ERR |
cb25142c PS |
55 | netlink_set_err(net->genl_sock, portid, group, code); |
56 | return 0; | |
57 | #else | |
58 | return netlink_set_err(net->genl_sock, portid, group, code); | |
59 | #endif | |
60 | } | |
61 | ||
62 | #define genlmsg_multicast_netns rpl_genlmsg_multicast_netns | |
63 | static inline int genlmsg_multicast_netns(struct genl_family *family, | |
64 | struct net *net, struct sk_buff *skb, | |
65 | u32 portid, unsigned int group, gfp_t flags) | |
66 | { | |
67 | return nlmsg_multicast(net->genl_sock, skb, portid, group, flags); | |
68 | } | |
69 | ||
70 | ||
71 | #define __genl_register_family rpl___genl_register_family | |
72 | int rpl___genl_register_family(struct genl_family *family); | |
73 | ||
74 | #define genl_register_family rpl_genl_register_family | |
75 | static inline int rpl_genl_register_family(struct genl_family *family) | |
76 | { | |
77 | family->module = THIS_MODULE; | |
78 | return rpl___genl_register_family(family); | |
79 | } | |
0643a78b | 80 | #endif |
cb25142c | 81 | |
0643a78b PS |
82 | #ifdef HAVE_GENL_NOTIFY_TAKES_NET |
83 | #define genl_notify rpl_genl_notify | |
84 | void rpl_genl_notify(struct genl_family *family, struct sk_buff *skb, | |
85 | struct genl_info *info , u32 group, gfp_t flags); | |
cb25142c | 86 | #endif |
aaff4b55 | 87 | |
114fce23 SG |
88 | #ifndef HAVE_GENL_HAS_LISTENERS |
89 | static inline int genl_has_listeners(struct genl_family *family, | |
6233a1bd | 90 | struct net *net, unsigned int group) |
114fce23 SG |
91 | { |
92 | #ifdef HAVE_MCGRP_OFFSET | |
93 | if (WARN_ON_ONCE(group >= family->n_mcgrps)) | |
94 | return -EINVAL; | |
95 | group = family->mcgrp_offset + group; | |
114fce23 | 96 | #endif |
6233a1bd | 97 | return netlink_has_listeners(net->genl_sock, group); |
114fce23 | 98 | } |
6233a1bd TG |
99 | #else |
100 | ||
101 | #ifndef HAVE_GENL_HAS_LISTENERS_TAKES_NET | |
102 | static inline int rpl_genl_has_listeners(struct genl_family *family, | |
103 | struct net *net, unsigned int group) | |
104 | { | |
13dd4a97 | 105 | #ifdef HAVE_GENL_NOTIFY_TAKES_FAMILY |
6233a1bd | 106 | return genl_has_listeners(family, net->genl_sock, group); |
13dd4a97 JS |
107 | #else |
108 | return genl_has_listeners(&family->compat_family, net->genl_sock, group); | |
109 | #endif | |
6233a1bd TG |
110 | } |
111 | ||
112 | #define genl_has_listeners rpl_genl_has_listeners | |
114fce23 SG |
113 | #endif |
114 | ||
6233a1bd TG |
115 | #endif /* HAVE_GENL_HAS_LISTENERS */ |
116 | ||
15702dc9 JB |
117 | #ifndef HAVE_NETLINK_EXT_ACK |
118 | struct netlink_ext_ack; | |
119 | ||
120 | static inline int rpl_genlmsg_parse(const struct nlmsghdr *nlh, | |
121 | const struct genl_family *family, | |
122 | struct nlattr *tb[], int maxtype, | |
123 | const struct nla_policy *policy, | |
124 | struct netlink_ext_ack *extack) | |
c623ba49 | 125 | { |
15702dc9 JB |
126 | #ifdef HAVE_GENLMSG_PARSE |
127 | return genlmsg_parse(nlh, family, tb, maxtype, policy); | |
128 | #else | |
c623ba49 JS |
129 | return nlmsg_parse(nlh, family->hdrsize + GENL_HDRLEN, tb, maxtype, |
130 | policy); | |
15702dc9 | 131 | #endif |
c623ba49 | 132 | } |
15702dc9 | 133 | #define genlmsg_parse rpl_genlmsg_parse |
c623ba49 JS |
134 | #endif |
135 | ||
064af421 | 136 | #endif /* genetlink.h */ |