Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
genetlink.h
Go to the documentation of this file.
1 #ifndef __NET_GENERIC_NETLINK_H
2 #define __NET_GENERIC_NETLINK_H
3 
4 #include <linux/genetlink.h>
5 #include <net/netlink.h>
6 #include <net/net_namespace.h>
7 
8 #define GENLMSG_DEFAULT_SIZE (NLMSG_DEFAULT_SIZE - GENL_HDRLEN)
9 
19  struct genl_family *family; /* private */
20  struct list_head list; /* private */
23 };
24 
25 struct genl_ops;
26 struct genl_info;
27 
46 struct genl_family {
47  unsigned int id;
48  unsigned int hdrsize;
50  unsigned int version;
51  unsigned int maxattr;
52  bool netnsok;
53  int (*pre_doit)(struct genl_ops *ops,
54  struct sk_buff *skb,
55  struct genl_info *info);
56  void (*post_doit)(struct genl_ops *ops,
57  struct sk_buff *skb,
58  struct genl_info *info);
59  struct nlattr ** attrbuf; /* private */
60  struct list_head ops_list; /* private */
61  struct list_head family_list; /* private */
62  struct list_head mcast_groups; /* private */
63 };
64 
76 struct genl_info {
79  struct nlmsghdr * nlhdr;
80  struct genlmsghdr * genlhdr;
81  void * userhdr;
82  struct nlattr ** attrs;
83 #ifdef CONFIG_NET_NS
84  struct net * _net;
85 #endif
86  void * user_ptr[2];
87 };
88 
89 static inline struct net *genl_info_net(struct genl_info *info)
90 {
91  return read_pnet(&info->_net);
92 }
93 
94 static inline void genl_info_net_set(struct genl_info *info, struct net *net)
95 {
96  write_pnet(&info->_net, net);
97 }
98 
110 struct genl_ops {
113  unsigned int flags;
114  const struct nla_policy *policy;
115  int (*doit)(struct sk_buff *skb,
116  struct genl_info *info);
117  int (*dumpit)(struct sk_buff *skb,
118  struct netlink_callback *cb);
121 };
122 
123 extern int genl_register_family(struct genl_family *family);
125  struct genl_ops *ops, size_t n_ops);
126 extern int genl_unregister_family(struct genl_family *family);
127 extern int genl_register_ops(struct genl_family *, struct genl_ops *ops);
128 extern int genl_unregister_ops(struct genl_family *, struct genl_ops *ops);
129 extern int genl_register_mc_group(struct genl_family *family,
130  struct genl_multicast_group *grp);
131 extern void genl_unregister_mc_group(struct genl_family *family,
132  struct genl_multicast_group *grp);
133 extern void genl_notify(struct sk_buff *skb, struct net *net, u32 portid,
134  u32 group, struct nlmsghdr *nlh, gfp_t flags);
135 
136 void *genlmsg_put(struct sk_buff *skb, u32 portid, u32 seq,
137  struct genl_family *family, int flags, u8 cmd);
138 
146 static inline struct nlmsghdr *genlmsg_nlhdr(void *user_hdr,
147  struct genl_family *family)
148 {
149  return (struct nlmsghdr *)((char *)user_hdr -
150  family->hdrsize -
151  GENL_HDRLEN -
152  NLMSG_HDRLEN);
153 }
154 
164 static inline void genl_dump_check_consistent(struct netlink_callback *cb,
165  void *user_hdr,
166  struct genl_family *family)
167 {
168  nl_dump_check_consistent(cb, genlmsg_nlhdr(user_hdr, family));
169 }
170 
181 static inline void *genlmsg_put_reply(struct sk_buff *skb,
182  struct genl_info *info,
183  struct genl_family *family,
184  int flags, u8 cmd)
185 {
186  return genlmsg_put(skb, info->snd_portid, info->snd_seq, family,
187  flags, cmd);
188 }
189 
195 static inline int genlmsg_end(struct sk_buff *skb, void *hdr)
196 {
197  return nlmsg_end(skb, hdr - GENL_HDRLEN - NLMSG_HDRLEN);
198 }
199 
205 static inline void genlmsg_cancel(struct sk_buff *skb, void *hdr)
206 {
207  if (hdr)
208  nlmsg_cancel(skb, hdr - GENL_HDRLEN - NLMSG_HDRLEN);
209 }
210 
219 static inline int genlmsg_multicast_netns(struct net *net, struct sk_buff *skb,
220  u32 portid, unsigned int group, gfp_t flags)
221 {
222  return nlmsg_multicast(net->genl_sock, skb, portid, group, flags);
223 }
224 
232 static inline int genlmsg_multicast(struct sk_buff *skb, u32 portid,
233  unsigned int group, gfp_t flags)
234 {
235  return genlmsg_multicast_netns(&init_net, skb, portid, group, flags);
236 }
237 
247 int genlmsg_multicast_allns(struct sk_buff *skb, u32 portid,
248  unsigned int group, gfp_t flags);
249 
255 static inline int genlmsg_unicast(struct net *net, struct sk_buff *skb, u32 portid)
256 {
257  return nlmsg_unicast(net->genl_sock, skb, portid);
258 }
259 
265 static inline int genlmsg_reply(struct sk_buff *skb, struct genl_info *info)
266 {
267  return genlmsg_unicast(genl_info_net(info), skb, info->snd_portid);
268 }
269 
274 static inline void *genlmsg_data(const struct genlmsghdr *gnlh)
275 {
276  return ((unsigned char *) gnlh + GENL_HDRLEN);
277 }
278 
283 static inline int genlmsg_len(const struct genlmsghdr *gnlh)
284 {
285  struct nlmsghdr *nlh = (struct nlmsghdr *)((unsigned char *)gnlh -
286  NLMSG_HDRLEN);
287  return (nlh->nlmsg_len - GENL_HDRLEN - NLMSG_HDRLEN);
288 }
289 
294 static inline int genlmsg_msg_size(int payload)
295 {
296  return GENL_HDRLEN + payload;
297 }
298 
303 static inline int genlmsg_total_size(int payload)
304 {
305  return NLMSG_ALIGN(genlmsg_msg_size(payload));
306 }
307 
313 static inline struct sk_buff *genlmsg_new(size_t payload, gfp_t flags)
314 {
315  return nlmsg_new(genlmsg_total_size(payload), flags);
316 }
317 
318 
319 #endif /* __NET_GENERIC_NETLINK_H */