Blame view

include/net/genetlink.h 9.87 KB
482a8524f   Thomas Graf   [NETLINK]: Generi...
1
2
3
4
5
  #ifndef __NET_GENERIC_NETLINK_H
  #define __NET_GENERIC_NETLINK_H
  
  #include <linux/genetlink.h>
  #include <net/netlink.h>
134e63756   Johannes Berg   genetlink: make n...
6
  #include <net/net_namespace.h>
482a8524f   Thomas Graf   [NETLINK]: Generi...
7
8
  
  /**
2dbba6f77   Johannes Berg   [GENETLINK]: Dyna...
9
10
11
12
13
14
15
   * struct genl_multicast_group - generic netlink multicast group
   * @name: name of the multicast group, names are per-family
   * @id: multicast group ID, assigned by the core, to use with
   *      genlmsg_multicast().
   * @list: list entry for linking
   * @family: pointer to family, need not be set before registering
   */
fd2c3ef76   Eric Dumazet   net: cleanup incl...
16
  struct genl_multicast_group {
2dbba6f77   Johannes Berg   [GENETLINK]: Dyna...
17
18
19
20
21
  	struct genl_family	*family;	/* private */
  	struct list_head	list;		/* private */
  	char			name[GENL_NAMSIZ];
  	u32			id;
  };
ff4c92d85   Johannes Berg   genetlink: introd...
22
23
  struct genl_ops;
  struct genl_info;
2dbba6f77   Johannes Berg   [GENETLINK]: Dyna...
24
  /**
482a8524f   Thomas Graf   [NETLINK]: Generi...
25
26
27
28
29
30
   * struct genl_family - generic netlink family
   * @id: protocol family idenfitier
   * @hdrsize: length of user specific header in bytes
   * @name: name of family
   * @version: protocol version
   * @maxattr: maximum number of attributes supported
134e63756   Johannes Berg   genetlink: make n...
31
32
   * @netnsok: set to true if the family can handle network
   *	namespaces and should be presented in all of them
ff4c92d85   Johannes Berg   genetlink: introd...
33
34
35
36
   * @pre_doit: called before an operation's doit callback, it may
   *	do additional, common, filtering and return an error
   * @post_doit: called after an operation's doit callback, it may
   *	undo operations done by pre_doit, for example release locks
482a8524f   Thomas Graf   [NETLINK]: Generi...
37
38
39
   * @attrbuf: buffer to store parsed attributes
   * @ops_list: list of all assigned operations
   * @family_list: family list
2dbba6f77   Johannes Berg   [GENETLINK]: Dyna...
40
   * @mcast_groups: multicast groups list
482a8524f   Thomas Graf   [NETLINK]: Generi...
41
   */
fd2c3ef76   Eric Dumazet   net: cleanup incl...
42
  struct genl_family {
482a8524f   Thomas Graf   [NETLINK]: Generi...
43
44
45
46
47
  	unsigned int		id;
  	unsigned int		hdrsize;
  	char			name[GENL_NAMSIZ];
  	unsigned int		version;
  	unsigned int		maxattr;
134e63756   Johannes Berg   genetlink: make n...
48
  	bool			netnsok;
ff4c92d85   Johannes Berg   genetlink: introd...
49
50
51
52
53
54
  	int			(*pre_doit)(struct genl_ops *ops,
  					    struct sk_buff *skb,
  					    struct genl_info *info);
  	void			(*post_doit)(struct genl_ops *ops,
  					     struct sk_buff *skb,
  					     struct genl_info *info);
482a8524f   Thomas Graf   [NETLINK]: Generi...
55
56
57
  	struct nlattr **	attrbuf;	/* private */
  	struct list_head	ops_list;	/* private */
  	struct list_head	family_list;	/* private */
2dbba6f77   Johannes Berg   [GENETLINK]: Dyna...
58
  	struct list_head	mcast_groups;	/* private */
482a8524f   Thomas Graf   [NETLINK]: Generi...
59
  };
482a8524f   Thomas Graf   [NETLINK]: Generi...
60
61
62
63
64
65
66
67
  /**
   * struct genl_info - receiving information
   * @snd_seq: sending sequence number
   * @snd_pid: netlink pid of sender
   * @nlhdr: netlink message header
   * @genlhdr: generic netlink message header
   * @userhdr: user specific header
   * @attrs: netlink attributes
ff4c92d85   Johannes Berg   genetlink: introd...
68
69
   * @_net: network namespace
   * @user_ptr: user pointers
482a8524f   Thomas Graf   [NETLINK]: Generi...
70
   */
fd2c3ef76   Eric Dumazet   net: cleanup incl...
71
  struct genl_info {
482a8524f   Thomas Graf   [NETLINK]: Generi...
72
73
74
75
76
77
  	u32			snd_seq;
  	u32			snd_pid;
  	struct nlmsghdr *	nlhdr;
  	struct genlmsghdr *	genlhdr;
  	void *			userhdr;
  	struct nlattr **	attrs;
134e63756   Johannes Berg   genetlink: make n...
78
79
80
  #ifdef CONFIG_NET_NS
  	struct net *		_net;
  #endif
ff4c92d85   Johannes Berg   genetlink: introd...
81
  	void *			user_ptr[2];
482a8524f   Thomas Graf   [NETLINK]: Generi...
82
  };
134e63756   Johannes Berg   genetlink: make n...
83
84
  static inline struct net *genl_info_net(struct genl_info *info)
  {
c2d9ba9bc   Eric Dumazet   net: CONFIG_NET_N...
85
  	return read_pnet(&info->_net);
134e63756   Johannes Berg   genetlink: make n...
86
87
88
89
  }
  
  static inline void genl_info_net_set(struct genl_info *info, struct net *net)
  {
c2d9ba9bc   Eric Dumazet   net: CONFIG_NET_N...
90
  	write_pnet(&info->_net, net);
134e63756   Johannes Berg   genetlink: make n...
91
  }
134e63756   Johannes Berg   genetlink: make n...
92

482a8524f   Thomas Graf   [NETLINK]: Generi...
93
94
95
  /**
   * struct genl_ops - generic netlink operations
   * @cmd: command identifier
ff4c92d85   Johannes Berg   genetlink: introd...
96
   * @internal_flags: flags used by the family
482a8524f   Thomas Graf   [NETLINK]: Generi...
97
98
99
100
   * @flags: flags
   * @policy: attribute validation policy
   * @doit: standard command callback
   * @dumpit: callback for dumpers
a4d1366d5   Jamal Hadi Salim   [GENETLINK]: Add ...
101
   * @done: completion callback for dumps
482a8524f   Thomas Graf   [NETLINK]: Generi...
102
103
   * @ops_list: operations list
   */
fd2c3ef76   Eric Dumazet   net: cleanup incl...
104
  struct genl_ops {
b461d2f21   Per Liden   [NETLINK] genetli...
105
  	u8			cmd;
ff4c92d85   Johannes Berg   genetlink: introd...
106
  	u8			internal_flags;
482a8524f   Thomas Graf   [NETLINK]: Generi...
107
  	unsigned int		flags;
ef7c79ed6   Patrick McHardy   [NETLINK]: Mark n...
108
  	const struct nla_policy	*policy;
482a8524f   Thomas Graf   [NETLINK]: Generi...
109
110
111
112
  	int		       (*doit)(struct sk_buff *skb,
  				       struct genl_info *info);
  	int		       (*dumpit)(struct sk_buff *skb,
  					 struct netlink_callback *cb);
a4d1366d5   Jamal Hadi Salim   [GENETLINK]: Add ...
113
  	int		       (*done)(struct netlink_callback *cb);
482a8524f   Thomas Graf   [NETLINK]: Generi...
114
115
116
117
  	struct list_head	ops_list;
  };
  
  extern int genl_register_family(struct genl_family *family);
a7b11d738   Michał Mirosław   genetlink: Introd...
118
119
  extern int genl_register_family_with_ops(struct genl_family *family,
  	struct genl_ops *ops, size_t n_ops);
482a8524f   Thomas Graf   [NETLINK]: Generi...
120
121
122
  extern int genl_unregister_family(struct genl_family *family);
  extern int genl_register_ops(struct genl_family *, struct genl_ops *ops);
  extern int genl_unregister_ops(struct genl_family *, struct genl_ops *ops);
2dbba6f77   Johannes Berg   [GENETLINK]: Dyna...
123
124
125
126
  extern int genl_register_mc_group(struct genl_family *family,
  				  struct genl_multicast_group *grp);
  extern void genl_unregister_mc_group(struct genl_family *family,
  				     struct genl_multicast_group *grp);
263ba61d3   Pravin B Shelar   genetlink: Add ge...
127
128
  extern void genl_notify(struct sk_buff *skb, struct net *net, u32 pid,
  			u32 group, struct nlmsghdr *nlh, gfp_t flags);
482a8524f   Thomas Graf   [NETLINK]: Generi...
129

482a8524f   Thomas Graf   [NETLINK]: Generi...
130
131
132
133
134
  /**
   * genlmsg_put - Add generic netlink header to netlink message
   * @skb: socket buffer holding the message
   * @pid: netlink pid the message is addressed to
   * @seq: sequence number (usually the one of the sender)
17c157c88   Thomas Graf   [GENL]: Add genlm...
135
   * @family: generic netlink family
482a8524f   Thomas Graf   [NETLINK]: Generi...
136
137
   * @flags netlink message flags
   * @cmd: generic netlink command
482a8524f   Thomas Graf   [NETLINK]: Generi...
138
139
140
141
   *
   * Returns pointer to user specific header
   */
  static inline void *genlmsg_put(struct sk_buff *skb, u32 pid, u32 seq,
17c157c88   Thomas Graf   [GENL]: Add genlm...
142
  				struct genl_family *family, int flags, u8 cmd)
482a8524f   Thomas Graf   [NETLINK]: Generi...
143
144
145
  {
  	struct nlmsghdr *nlh;
  	struct genlmsghdr *hdr;
17c157c88   Thomas Graf   [GENL]: Add genlm...
146
147
  	nlh = nlmsg_put(skb, pid, seq, family->id, GENL_HDRLEN +
  			family->hdrsize, flags);
482a8524f   Thomas Graf   [NETLINK]: Generi...
148
149
150
151
152
  	if (nlh == NULL)
  		return NULL;
  
  	hdr = nlmsg_data(nlh);
  	hdr->cmd = cmd;
17c157c88   Thomas Graf   [GENL]: Add genlm...
153
  	hdr->version = family->version;
482a8524f   Thomas Graf   [NETLINK]: Generi...
154
155
156
157
158
159
  	hdr->reserved = 0;
  
  	return (char *) hdr + GENL_HDRLEN;
  }
  
  /**
670dc2833   Johannes Berg   netlink: advertis...
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
   * genlmsg_nlhdr - Obtain netlink header from user specified header
   * @user_hdr: user header as returned from genlmsg_put()
   * @family: generic netlink family
   *
   * Returns pointer to netlink header.
   */
  static inline struct nlmsghdr *genlmsg_nlhdr(void *user_hdr,
  					     struct genl_family *family)
  {
  	return (struct nlmsghdr *)((char *)user_hdr -
  				   family->hdrsize -
  				   GENL_HDRLEN -
  				   NLMSG_HDRLEN);
  }
  
  /**
   * genl_dump_check_consistent - check if sequence is consistent and advertise if not
   * @cb: netlink callback structure that stores the sequence number
   * @user_hdr: user header as returned from genlmsg_put()
   * @family: generic netlink family
   *
   * Cf. nl_dump_check_consistent(), this just provides a wrapper to make it
   * simpler to use with generic netlink.
   */
  static inline void genl_dump_check_consistent(struct netlink_callback *cb,
  					      void *user_hdr,
  					      struct genl_family *family)
  {
  	nl_dump_check_consistent(cb, genlmsg_nlhdr(user_hdr, family));
  }
  
  /**
17c157c88   Thomas Graf   [GENL]: Add genlm...
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
   * genlmsg_put_reply - Add generic netlink header to a reply message
   * @skb: socket buffer holding the message
   * @info: receiver info
   * @family: generic netlink family
   * @flags: netlink message flags
   * @cmd: generic netlink command
   *
   * Returns pointer to user specific header
   */
  static inline void *genlmsg_put_reply(struct sk_buff *skb,
  				      struct genl_info *info,
  				      struct genl_family *family,
  				      int flags, u8 cmd)
  {
  	return genlmsg_put(skb, info->snd_pid, info->snd_seq, family,
  			   flags, cmd);
  }
  
  /**
482a8524f   Thomas Graf   [NETLINK]: Generi...
211
212
213
214
215
216
217
218
219
220
221
222
223
224
   * genlmsg_end - Finalize a generic netlink message
   * @skb: socket buffer the message is stored in
   * @hdr: user specific header
   */
  static inline int genlmsg_end(struct sk_buff *skb, void *hdr)
  {
  	return nlmsg_end(skb, hdr - GENL_HDRLEN - NLMSG_HDRLEN);
  }
  
  /**
   * genlmsg_cancel - Cancel construction of a generic netlink message
   * @skb: socket buffer the message is stored in
   * @hdr: generic netlink message header
   */
bc3ed28ca   Thomas Graf   netlink: Improve ...
225
  static inline void genlmsg_cancel(struct sk_buff *skb, void *hdr)
482a8524f   Thomas Graf   [NETLINK]: Generi...
226
  {
38db9e1db   Julia Lawall   include/net/genet...
227
228
  	if (hdr)
  		nlmsg_cancel(skb, hdr - GENL_HDRLEN - NLMSG_HDRLEN);
482a8524f   Thomas Graf   [NETLINK]: Generi...
229
230
231
  }
  
  /**
134e63756   Johannes Berg   genetlink: make n...
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
   * genlmsg_multicast_netns - multicast a netlink message to a specific netns
   * @net: the net namespace
   * @skb: netlink message as socket buffer
   * @pid: own netlink pid to avoid sending to yourself
   * @group: multicast group id
   * @flags: allocation flags
   */
  static inline int genlmsg_multicast_netns(struct net *net, struct sk_buff *skb,
  					  u32 pid, unsigned int group, gfp_t flags)
  {
  	return nlmsg_multicast(net->genl_sock, skb, pid, group, flags);
  }
  
  /**
   * genlmsg_multicast - multicast a netlink message to the default netns
482a8524f   Thomas Graf   [NETLINK]: Generi...
247
248
249
   * @skb: netlink message as socket buffer
   * @pid: own netlink pid to avoid sending to yourself
   * @group: multicast group id
d387f6ad1   Thomas Graf   [NETLINK]: Add no...
250
   * @flags: allocation flags
482a8524f   Thomas Graf   [NETLINK]: Generi...
251
252
   */
  static inline int genlmsg_multicast(struct sk_buff *skb, u32 pid,
d387f6ad1   Thomas Graf   [NETLINK]: Add no...
253
  				    unsigned int group, gfp_t flags)
482a8524f   Thomas Graf   [NETLINK]: Generi...
254
  {
134e63756   Johannes Berg   genetlink: make n...
255
  	return genlmsg_multicast_netns(&init_net, skb, pid, group, flags);
482a8524f   Thomas Graf   [NETLINK]: Generi...
256
257
258
  }
  
  /**
134e63756   Johannes Berg   genetlink: make n...
259
260
261
262
263
264
265
266
267
268
269
270
   * genlmsg_multicast_allns - multicast a netlink message to all net namespaces
   * @skb: netlink message as socket buffer
   * @pid: own netlink pid to avoid sending to yourself
   * @group: multicast group id
   * @flags: allocation flags
   *
   * This function must hold the RTNL or rcu_read_lock().
   */
  int genlmsg_multicast_allns(struct sk_buff *skb, u32 pid,
  			    unsigned int group, gfp_t flags);
  
  /**
482a8524f   Thomas Graf   [NETLINK]: Generi...
271
272
273
274
   * genlmsg_unicast - unicast a netlink message
   * @skb: netlink message as socket buffer
   * @pid: netlink pid of the destination socket
   */
134e63756   Johannes Berg   genetlink: make n...
275
  static inline int genlmsg_unicast(struct net *net, struct sk_buff *skb, u32 pid)
482a8524f   Thomas Graf   [NETLINK]: Generi...
276
  {
134e63756   Johannes Berg   genetlink: make n...
277
  	return nlmsg_unicast(net->genl_sock, skb, pid);
482a8524f   Thomas Graf   [NETLINK]: Generi...
278
  }
fb0ba6bd0   Balbir Singh   [PATCH] per-task-...
279
  /**
81878d27f   Thomas Graf   [GENL]: Add genlm...
280
281
282
283
284
285
   * genlmsg_reply - reply to a request
   * @skb: netlink message to be sent back
   * @info: receiver information
   */
  static inline int genlmsg_reply(struct sk_buff *skb, struct genl_info *info)
  {
134e63756   Johannes Berg   genetlink: make n...
286
  	return genlmsg_unicast(genl_info_net(info), skb, info->snd_pid);
81878d27f   Thomas Graf   [GENL]: Add genlm...
287
288
289
  }
  
  /**
fb0ba6bd0   Balbir Singh   [PATCH] per-task-...
290
   * gennlmsg_data - head of message payload
70f23fd66   Justin P. Mattock   treewide: fix a f...
291
   * @gnlh: genetlink message header
fb0ba6bd0   Balbir Singh   [PATCH] per-task-...
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
   */
  static inline void *genlmsg_data(const struct genlmsghdr *gnlh)
  {
  	return ((unsigned char *) gnlh + GENL_HDRLEN);
  }
  
  /**
   * genlmsg_len - length of message payload
   * @gnlh: genetlink message header
   */
  static inline int genlmsg_len(const struct genlmsghdr *gnlh)
  {
  	struct nlmsghdr *nlh = (struct nlmsghdr *)((unsigned char *)gnlh -
  							NLMSG_HDRLEN);
  	return (nlh->nlmsg_len - GENL_HDRLEN - NLMSG_HDRLEN);
  }
17db952cd   Balbir Singh   [PATCH] Add genet...
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
  /**
   * genlmsg_msg_size - length of genetlink message not including padding
   * @payload: length of message payload
   */
  static inline int genlmsg_msg_size(int payload)
  {
  	return GENL_HDRLEN + payload;
  }
  
  /**
   * genlmsg_total_size - length of genetlink message including padding
   * @payload: length of message payload
   */
  static inline int genlmsg_total_size(int payload)
  {
  	return NLMSG_ALIGN(genlmsg_msg_size(payload));
  }
3dabc7157   Thomas Graf   [GENL]: Add genlm...
325
326
327
328
329
330
331
332
333
  /**
   * genlmsg_new - Allocate a new generic netlink message
   * @payload: size of the message payload
   * @flags: the type of memory to allocate.
   */
  static inline struct sk_buff *genlmsg_new(size_t payload, gfp_t flags)
  {
  	return nlmsg_new(genlmsg_total_size(payload), flags);
  }
482a8524f   Thomas Graf   [NETLINK]: Generi...
334
  #endif	/* __NET_GENERIC_NETLINK_H */