drop_monitor/genetlink: use proper genetlink multicast APIs
[deliverable/linux.git] / net / netlink / genetlink.c
CommitLineData
482a8524
TG
1/*
2 * NETLINK Generic Netlink Family
3 *
4 * Authors: Jamal Hadi Salim
5 * Thomas Graf <tgraf@suug.ch>
2dbba6f7 6 * Johannes Berg <johannes@sipsolutions.net>
482a8524
TG
7 */
8
482a8524
TG
9#include <linux/module.h>
10#include <linux/kernel.h>
5a0e3ad6 11#include <linux/slab.h>
482a8524
TG
12#include <linux/errno.h>
13#include <linux/types.h>
14#include <linux/socket.h>
15#include <linux/string.h>
16#include <linux/skbuff.h>
14cc3e2b 17#include <linux/mutex.h>
2dbba6f7 18#include <linux/bitmap.h>
def31174 19#include <linux/rwsem.h>
482a8524
TG
20#include <net/sock.h>
21#include <net/genetlink.h>
22
14cc3e2b 23static DEFINE_MUTEX(genl_mutex); /* serialization of message processing */
def31174 24static DECLARE_RWSEM(cb_lock);
482a8524 25
f408e0ce 26void genl_lock(void)
482a8524 27{
14cc3e2b 28 mutex_lock(&genl_mutex);
482a8524 29}
f408e0ce 30EXPORT_SYMBOL(genl_lock);
482a8524 31
f408e0ce 32void genl_unlock(void)
482a8524 33{
14cc3e2b 34 mutex_unlock(&genl_mutex);
482a8524 35}
f408e0ce 36EXPORT_SYMBOL(genl_unlock);
482a8524 37
320f5ea0 38#ifdef CONFIG_LOCKDEP
86b1309c
PS
39int lockdep_genl_is_held(void)
40{
41 return lockdep_is_held(&genl_mutex);
42}
43EXPORT_SYMBOL(lockdep_genl_is_held);
44#endif
45
def31174
PS
46static void genl_lock_all(void)
47{
48 down_write(&cb_lock);
49 genl_lock();
50}
51
52static void genl_unlock_all(void)
53{
54 genl_unlock();
55 up_write(&cb_lock);
56}
57
482a8524
TG
58#define GENL_FAM_TAB_SIZE 16
59#define GENL_FAM_TAB_MASK (GENL_FAM_TAB_SIZE - 1)
60
61static struct list_head family_ht[GENL_FAM_TAB_SIZE];
2dbba6f7
JB
62/*
63 * Bitmap of multicast groups that are currently in use.
64 *
65 * To avoid an allocation at boot of just one unsigned long,
66 * declare it global instead.
67 * Bit 0 is marked as already used since group 0 is invalid.
e5dcecba
JB
68 * Bit 1 is marked as already used since the drop-monitor code
69 * abuses the API and thinks it can statically use group 1.
70 * That group will typically conflict with other groups that
71 * any proper users use.
2dbba6f7 72 */
e5dcecba 73static unsigned long mc_group_start = 0x3;
2dbba6f7
JB
74static unsigned long *mc_groups = &mc_group_start;
75static unsigned long mc_groups_longs = 1;
482a8524
TG
76
77static int genl_ctrl_event(int event, void *data);
78
79static inline unsigned int genl_family_hash(unsigned int id)
80{
81 return id & GENL_FAM_TAB_MASK;
82}
83
84static inline struct list_head *genl_family_chain(unsigned int id)
85{
86 return &family_ht[genl_family_hash(id)];
87}
88
89static struct genl_family *genl_family_find_byid(unsigned int id)
90{
91 struct genl_family *f;
92
93 list_for_each_entry(f, genl_family_chain(id), family_list)
94 if (f->id == id)
95 return f;
96
97 return NULL;
98}
99
100static struct genl_family *genl_family_find_byname(char *name)
101{
102 struct genl_family *f;
103 int i;
104
105 for (i = 0; i < GENL_FAM_TAB_SIZE; i++)
106 list_for_each_entry(f, genl_family_chain(i), family_list)
107 if (strcmp(f->name, name) == 0)
108 return f;
109
110 return NULL;
111}
112
f84f771d 113static const struct genl_ops *genl_get_cmd(u8 cmd, struct genl_family *family)
482a8524 114{
d91824c0 115 int i;
482a8524 116
d91824c0
JB
117 for (i = 0; i < family->n_ops; i++)
118 if (family->ops[i].cmd == cmd)
119 return &family->ops[i];
482a8524
TG
120
121 return NULL;
122}
123
124/* Of course we are going to have problems once we hit
125 * 2^16 alive types, but that can only happen by year 2K
126*/
b57ef81f 127static u16 genl_generate_id(void)
482a8524 128{
988ade6b
KK
129 static u16 id_gen_idx = GENL_MIN_ID;
130 int i;
482a8524 131
988ade6b
KK
132 for (i = 0; i <= GENL_MAX_ID - GENL_MIN_ID; i++) {
133 if (!genl_family_find_byid(id_gen_idx))
134 return id_gen_idx;
135 if (++id_gen_idx > GENL_MAX_ID)
482a8524 136 id_gen_idx = GENL_MIN_ID;
988ade6b 137 }
482a8524 138
988ade6b 139 return 0;
482a8524
TG
140}
141
2dbba6f7
JB
142static struct genl_multicast_group notify_grp;
143
144/**
145 * genl_register_mc_group - register a multicast group
146 *
147 * Registers the specified multicast group and notifies userspace
148 * about the new group.
149 *
150 * Returns 0 on success or a negative error code.
151 *
152 * @family: The generic netlink family the group shall be registered for.
153 * @grp: The group to register, must have a name.
154 */
155int genl_register_mc_group(struct genl_family *family,
156 struct genl_multicast_group *grp)
157{
158 int id;
159 unsigned long *new_groups;
b1f57195 160 int err = 0;
2dbba6f7
JB
161
162 BUG_ON(grp->name[0] == '\0');
f1e79e20 163 BUG_ON(memchr(grp->name, '\0', GENL_NAMSIZ) == NULL);
2dbba6f7 164
def31174 165 genl_lock_all();
2dbba6f7 166
e5dcecba 167 /* special-case our own group and hacks */
2dbba6f7
JB
168 if (grp == &notify_grp)
169 id = GENL_ID_CTRL;
e5dcecba
JB
170 else if (strcmp(family->name, "NET_DM") == 0)
171 id = 1;
2dbba6f7
JB
172 else
173 id = find_first_zero_bit(mc_groups,
174 mc_groups_longs * BITS_PER_LONG);
175
176
177 if (id >= mc_groups_longs * BITS_PER_LONG) {
178 size_t nlen = (mc_groups_longs + 1) * sizeof(unsigned long);
179
180 if (mc_groups == &mc_group_start) {
181 new_groups = kzalloc(nlen, GFP_KERNEL);
182 if (!new_groups) {
183 err = -ENOMEM;
184 goto out;
185 }
186 mc_groups = new_groups;
187 *mc_groups = mc_group_start;
188 } else {
189 new_groups = krealloc(mc_groups, nlen, GFP_KERNEL);
190 if (!new_groups) {
191 err = -ENOMEM;
192 goto out;
193 }
194 mc_groups = new_groups;
195 mc_groups[mc_groups_longs] = 0;
196 }
197 mc_groups_longs++;
198 }
199
134e6375
JB
200 if (family->netnsok) {
201 struct net *net;
202
d136f1bd 203 netlink_table_grab();
134e6375
JB
204 rcu_read_lock();
205 for_each_net_rcu(net) {
d136f1bd 206 err = __netlink_change_ngroups(net->genl_sock,
134e6375
JB
207 mc_groups_longs * BITS_PER_LONG);
208 if (err) {
209 /*
210 * No need to roll back, can only fail if
211 * memory allocation fails and then the
212 * number of _possible_ groups has been
213 * increased on some sockets which is ok.
214 */
215 rcu_read_unlock();
d136f1bd 216 netlink_table_ungrab();
134e6375
JB
217 goto out;
218 }
219 }
220 rcu_read_unlock();
d136f1bd 221 netlink_table_ungrab();
134e6375
JB
222 } else {
223 err = netlink_change_ngroups(init_net.genl_sock,
224 mc_groups_longs * BITS_PER_LONG);
225 if (err)
226 goto out;
227 }
2dbba6f7
JB
228
229 grp->id = id;
230 set_bit(id, mc_groups);
231 list_add_tail(&grp->list, &family->mcast_groups);
232 grp->family = family;
233
234 genl_ctrl_event(CTRL_CMD_NEWMCAST_GRP, grp);
235 out:
def31174 236 genl_unlock_all();
79d310d0 237 return err;
2dbba6f7
JB
238}
239EXPORT_SYMBOL(genl_register_mc_group);
240
79dc4386
TG
241static void __genl_unregister_mc_group(struct genl_family *family,
242 struct genl_multicast_group *grp)
243{
134e6375 244 struct net *net;
79dc4386 245 BUG_ON(grp->family != family);
134e6375 246
b8273570 247 netlink_table_grab();
134e6375
JB
248 rcu_read_lock();
249 for_each_net_rcu(net)
b8273570 250 __netlink_clear_multicast_users(net->genl_sock, grp->id);
134e6375 251 rcu_read_unlock();
b8273570 252 netlink_table_ungrab();
134e6375 253
e5dcecba
JB
254 if (grp->id != 1)
255 clear_bit(grp->id, mc_groups);
79dc4386
TG
256 list_del(&grp->list);
257 genl_ctrl_event(CTRL_CMD_DELMCAST_GRP, grp);
258 grp->id = 0;
259 grp->family = NULL;
260}
261
2dbba6f7
JB
262/**
263 * genl_unregister_mc_group - unregister a multicast group
264 *
265 * Unregisters the specified multicast group and notifies userspace
266 * about it. All current listeners on the group are removed.
267 *
268 * Note: It is not necessary to unregister all multicast groups before
269 * unregistering the family, unregistering the family will cause
270 * all assigned multicast groups to be unregistered automatically.
271 *
272 * @family: Generic netlink family the group belongs to.
273 * @grp: The group to unregister, must have been registered successfully
274 * previously.
275 */
276void genl_unregister_mc_group(struct genl_family *family,
277 struct genl_multicast_group *grp)
278{
def31174 279 genl_lock_all();
79dc4386 280 __genl_unregister_mc_group(family, grp);
def31174 281 genl_unlock_all();
2dbba6f7 282}
3efb40c2 283EXPORT_SYMBOL(genl_unregister_mc_group);
2dbba6f7
JB
284
285static void genl_unregister_mc_groups(struct genl_family *family)
286{
287 struct genl_multicast_group *grp, *tmp;
288
289 list_for_each_entry_safe(grp, tmp, &family->mcast_groups, list)
79dc4386 290 __genl_unregister_mc_group(family, grp);
2dbba6f7
JB
291}
292
568508aa 293static int genl_validate_ops(struct genl_family *family)
482a8524 294{
568508aa
JB
295 const struct genl_ops *ops = family->ops;
296 unsigned int n_ops = family->n_ops;
d91824c0
JB
297 int i, j;
298
568508aa
JB
299 if (WARN_ON(n_ops && !ops))
300 return -EINVAL;
301
302 if (!n_ops)
303 return 0;
304
d91824c0
JB
305 for (i = 0; i < n_ops; i++) {
306 if (ops[i].dumpit == NULL && ops[i].doit == NULL)
307 return -EINVAL;
308 for (j = i + 1; j < n_ops; j++)
309 if (ops[i].cmd == ops[j].cmd)
310 return -EINVAL;
482a8524
TG
311 }
312
d91824c0
JB
313 /* family is not registered yet, so no locking needed */
314 family->ops = ops;
315 family->n_ops = n_ops;
482a8524 316
d91824c0 317 return 0;
482a8524 318}
482a8524
TG
319
320/**
33c6b1f6 321 * __genl_register_family - register a generic netlink family
482a8524
TG
322 * @family: generic netlink family
323 *
324 * Registers the specified family after validating it first. Only one
325 * family may be registered with the same family name or identifier.
326 * The family id may equal GENL_ID_GENERATE causing an unique id to
327 * be automatically generated and assigned.
328 *
568508aa
JB
329 * The family's ops array must already be assigned, you can use the
330 * genl_register_family_with_ops() helper function.
331 *
482a8524
TG
332 * Return 0 on success or a negative error code.
333 */
33c6b1f6 334int __genl_register_family(struct genl_family *family)
482a8524
TG
335{
336 int err = -EINVAL;
337
338 if (family->id && family->id < GENL_MIN_ID)
339 goto errout;
340
341 if (family->id > GENL_MAX_ID)
342 goto errout;
343
568508aa
JB
344 err = genl_validate_ops(family);
345 if (err)
346 return err;
347
2dbba6f7 348 INIT_LIST_HEAD(&family->mcast_groups);
482a8524 349
def31174 350 genl_lock_all();
482a8524
TG
351
352 if (genl_family_find_byname(family->name)) {
353 err = -EEXIST;
354 goto errout_locked;
355 }
356
482a8524
TG
357 if (family->id == GENL_ID_GENERATE) {
358 u16 newid = genl_generate_id();
359
360 if (!newid) {
361 err = -ENOMEM;
362 goto errout_locked;
363 }
364
365 family->id = newid;
93860b08
KK
366 } else if (genl_family_find_byid(family->id)) {
367 err = -EEXIST;
368 goto errout_locked;
482a8524
TG
369 }
370
def31174 371 if (family->maxattr && !family->parallel_ops) {
482a8524
TG
372 family->attrbuf = kmalloc((family->maxattr+1) *
373 sizeof(struct nlattr *), GFP_KERNEL);
374 if (family->attrbuf == NULL) {
375 err = -ENOMEM;
e200bd80 376 goto errout_locked;
482a8524
TG
377 }
378 } else
379 family->attrbuf = NULL;
380
381 list_add_tail(&family->family_list, genl_family_chain(family->id));
def31174 382 genl_unlock_all();
482a8524
TG
383
384 genl_ctrl_event(CTRL_CMD_NEWFAMILY, family);
385
386 return 0;
387
388errout_locked:
def31174 389 genl_unlock_all();
482a8524
TG
390errout:
391 return err;
392}
33c6b1f6 393EXPORT_SYMBOL(__genl_register_family);
482a8524
TG
394
395/**
396 * genl_unregister_family - unregister generic netlink family
397 * @family: generic netlink family
398 *
399 * Unregisters the specified family.
400 *
401 * Returns 0 on success or a negative error code.
402 */
403int genl_unregister_family(struct genl_family *family)
404{
405 struct genl_family *rc;
406
def31174 407 genl_lock_all();
482a8524 408
910d6c32
PE
409 genl_unregister_mc_groups(family);
410
482a8524
TG
411 list_for_each_entry(rc, genl_family_chain(family->id), family_list) {
412 if (family->id != rc->id || strcmp(rc->name, family->name))
413 continue;
414
415 list_del(&rc->family_list);
d91824c0 416 family->n_ops = 0;
def31174 417 genl_unlock_all();
482a8524 418
482a8524
TG
419 kfree(family->attrbuf);
420 genl_ctrl_event(CTRL_CMD_DELFAMILY, family);
421 return 0;
422 }
423
def31174 424 genl_unlock_all();
482a8524
TG
425
426 return -ENOENT;
427}
416c2f9c 428EXPORT_SYMBOL(genl_unregister_family);
482a8524 429
a46621a3
DV
430/**
431 * genlmsg_put - Add generic netlink header to netlink message
432 * @skb: socket buffer holding the message
15e47304 433 * @portid: netlink portid the message is addressed to
a46621a3
DV
434 * @seq: sequence number (usually the one of the sender)
435 * @family: generic netlink family
2c53040f 436 * @flags: netlink message flags
a46621a3
DV
437 * @cmd: generic netlink command
438 *
439 * Returns pointer to user specific header
440 */
15e47304 441void *genlmsg_put(struct sk_buff *skb, u32 portid, u32 seq,
a46621a3
DV
442 struct genl_family *family, int flags, u8 cmd)
443{
444 struct nlmsghdr *nlh;
445 struct genlmsghdr *hdr;
446
15e47304 447 nlh = nlmsg_put(skb, portid, seq, family->id, GENL_HDRLEN +
a46621a3
DV
448 family->hdrsize, flags);
449 if (nlh == NULL)
450 return NULL;
451
452 hdr = nlmsg_data(nlh);
453 hdr->cmd = cmd;
454 hdr->version = family->version;
455 hdr->reserved = 0;
456
457 return (char *) hdr + GENL_HDRLEN;
458}
459EXPORT_SYMBOL(genlmsg_put);
460
9b96309c
PS
461static int genl_lock_dumpit(struct sk_buff *skb, struct netlink_callback *cb)
462{
f84f771d
JB
463 /* our ops are always const - netlink API doesn't propagate that */
464 const struct genl_ops *ops = cb->data;
9b96309c
PS
465 int rc;
466
467 genl_lock();
468 rc = ops->dumpit(skb, cb);
469 genl_unlock();
470 return rc;
471}
472
473static int genl_lock_done(struct netlink_callback *cb)
474{
f84f771d
JB
475 /* our ops are always const - netlink API doesn't propagate that */
476 const struct genl_ops *ops = cb->data;
9b96309c
PS
477 int rc = 0;
478
479 if (ops->done) {
480 genl_lock();
481 rc = ops->done(cb);
482 genl_unlock();
483 }
484 return rc;
485}
486
def31174
PS
487static int genl_family_rcv_msg(struct genl_family *family,
488 struct sk_buff *skb,
489 struct nlmsghdr *nlh)
482a8524 490{
f84f771d 491 const struct genl_ops *ops;
134e6375 492 struct net *net = sock_net(skb->sk);
482a8524
TG
493 struct genl_info info;
494 struct genlmsghdr *hdr = nlmsg_data(nlh);
def31174 495 struct nlattr **attrbuf;
1d00a4eb 496 int hdrlen, err;
482a8524 497
134e6375
JB
498 /* this family doesn't exist in this netns */
499 if (!family->netnsok && !net_eq(net, &init_net))
500 return -ENOENT;
501
482a8524
TG
502 hdrlen = GENL_HDRLEN + family->hdrsize;
503 if (nlh->nlmsg_len < nlmsg_msg_size(hdrlen))
1d00a4eb 504 return -EINVAL;
482a8524
TG
505
506 ops = genl_get_cmd(hdr->cmd, family);
1d00a4eb
TG
507 if (ops == NULL)
508 return -EOPNOTSUPP;
482a8524 509
1d00a4eb 510 if ((ops->flags & GENL_ADMIN_PERM) &&
fd778461 511 !capable(CAP_NET_ADMIN))
1d00a4eb 512 return -EPERM;
482a8524 513
e1ee3673 514 if ((nlh->nlmsg_flags & NLM_F_DUMP) == NLM_F_DUMP) {
9b96309c 515 int rc;
def31174 516
1d00a4eb
TG
517 if (ops->dumpit == NULL)
518 return -EOPNOTSUPP;
482a8524 519
9b96309c
PS
520 if (!family->parallel_ops) {
521 struct netlink_dump_control c = {
33c6b1f6 522 .module = family->module,
f84f771d
JB
523 /* we have const, but the netlink API doesn't */
524 .data = (void *)ops,
9b96309c
PS
525 .dump = genl_lock_dumpit,
526 .done = genl_lock_done,
527 };
528
529 genl_unlock();
33c6b1f6 530 rc = __netlink_dump_start(net->genl_sock, skb, nlh, &c);
9b96309c
PS
531 genl_lock();
532
533 } else {
534 struct netlink_dump_control c = {
33c6b1f6 535 .module = family->module,
9b96309c
PS
536 .dump = ops->dumpit,
537 .done = ops->done,
538 };
539
33c6b1f6 540 rc = __netlink_dump_start(net->genl_sock, skb, nlh, &c);
9b96309c
PS
541 }
542
543 return rc;
482a8524
TG
544 }
545
1d00a4eb
TG
546 if (ops->doit == NULL)
547 return -EOPNOTSUPP;
482a8524 548
def31174
PS
549 if (family->maxattr && family->parallel_ops) {
550 attrbuf = kmalloc((family->maxattr+1) *
551 sizeof(struct nlattr *), GFP_KERNEL);
552 if (attrbuf == NULL)
553 return -ENOMEM;
554 } else
555 attrbuf = family->attrbuf;
556
557 if (attrbuf) {
558 err = nlmsg_parse(nlh, hdrlen, attrbuf, family->maxattr,
482a8524
TG
559 ops->policy);
560 if (err < 0)
50754d21 561 goto out;
482a8524
TG
562 }
563
564 info.snd_seq = nlh->nlmsg_seq;
15e47304 565 info.snd_portid = NETLINK_CB(skb).portid;
482a8524
TG
566 info.nlhdr = nlh;
567 info.genlhdr = nlmsg_data(nlh);
568 info.userhdr = nlmsg_data(nlh) + GENL_HDRLEN;
def31174 569 info.attrs = attrbuf;
134e6375 570 genl_info_net_set(&info, net);
ff4c92d8 571 memset(&info.user_ptr, 0, sizeof(info.user_ptr));
482a8524 572
ff4c92d8
JB
573 if (family->pre_doit) {
574 err = family->pre_doit(ops, skb, &info);
575 if (err)
50754d21 576 goto out;
ff4c92d8
JB
577 }
578
579 err = ops->doit(skb, &info);
580
581 if (family->post_doit)
582 family->post_doit(ops, skb, &info);
583
50754d21 584out:
def31174
PS
585 if (family->parallel_ops)
586 kfree(attrbuf);
587
588 return err;
589}
590
591static int genl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
592{
593 struct genl_family *family;
594 int err;
595
596 family = genl_family_find_byid(nlh->nlmsg_type);
597 if (family == NULL)
598 return -ENOENT;
599
600 if (!family->parallel_ops)
601 genl_lock();
602
603 err = genl_family_rcv_msg(family, skb, nlh);
604
605 if (!family->parallel_ops)
606 genl_unlock();
607
ff4c92d8 608 return err;
482a8524
TG
609}
610
cd40b7d3 611static void genl_rcv(struct sk_buff *skb)
482a8524 612{
def31174 613 down_read(&cb_lock);
cd40b7d3 614 netlink_rcv_skb(skb, &genl_rcv_msg);
def31174 615 up_read(&cb_lock);
482a8524
TG
616}
617
618/**************************************************************************
619 * Controller
620 **************************************************************************/
621
17c157c8
TG
622static struct genl_family genl_ctrl = {
623 .id = GENL_ID_CTRL,
624 .name = "nlctrl",
334c29a6 625 .version = 0x2,
17c157c8 626 .maxattr = CTRL_ATTR_MAX,
134e6375 627 .netnsok = true,
17c157c8
TG
628};
629
15e47304 630static int ctrl_fill_info(struct genl_family *family, u32 portid, u32 seq,
482a8524
TG
631 u32 flags, struct sk_buff *skb, u8 cmd)
632{
633 void *hdr;
634
15e47304 635 hdr = genlmsg_put(skb, portid, seq, &genl_ctrl, flags, cmd);
482a8524
TG
636 if (hdr == NULL)
637 return -1;
638
444653f6
DM
639 if (nla_put_string(skb, CTRL_ATTR_FAMILY_NAME, family->name) ||
640 nla_put_u16(skb, CTRL_ATTR_FAMILY_ID, family->id) ||
641 nla_put_u32(skb, CTRL_ATTR_VERSION, family->version) ||
642 nla_put_u32(skb, CTRL_ATTR_HDRSIZE, family->hdrsize) ||
643 nla_put_u32(skb, CTRL_ATTR_MAXATTR, family->maxattr))
644 goto nla_put_failure;
eb328111 645
d91824c0 646 if (family->n_ops) {
e94ef682 647 struct nlattr *nla_ops;
d91824c0 648 int i;
eb328111 649
e94ef682
TG
650 nla_ops = nla_nest_start(skb, CTRL_ATTR_OPS);
651 if (nla_ops == NULL)
eb328111
TG
652 goto nla_put_failure;
653
d91824c0 654 for (i = 0; i < family->n_ops; i++) {
e94ef682 655 struct nlattr *nest;
f84f771d 656 const struct genl_ops *ops = &family->ops[i];
029b234f 657 u32 op_flags = ops->flags;
f84f771d
JB
658
659 if (ops->dumpit)
029b234f 660 op_flags |= GENL_CMD_CAP_DUMP;
f84f771d 661 if (ops->doit)
029b234f 662 op_flags |= GENL_CMD_CAP_DO;
f84f771d 663 if (ops->policy)
029b234f 664 op_flags |= GENL_CMD_CAP_HASPOL;
eb328111 665
d91824c0 666 nest = nla_nest_start(skb, i + 1);
e94ef682
TG
667 if (nest == NULL)
668 goto nla_put_failure;
eb328111 669
444653f6 670 if (nla_put_u32(skb, CTRL_ATTR_OP_ID, ops->cmd) ||
029b234f 671 nla_put_u32(skb, CTRL_ATTR_OP_FLAGS, op_flags))
444653f6 672 goto nla_put_failure;
eb328111 673
e94ef682
TG
674 nla_nest_end(skb, nest);
675 }
676
677 nla_nest_end(skb, nla_ops);
678 }
482a8524 679
2dbba6f7
JB
680 if (!list_empty(&family->mcast_groups)) {
681 struct genl_multicast_group *grp;
682 struct nlattr *nla_grps;
683 int idx = 1;
684
685 nla_grps = nla_nest_start(skb, CTRL_ATTR_MCAST_GROUPS);
686 if (nla_grps == NULL)
687 goto nla_put_failure;
688
689 list_for_each_entry(grp, &family->mcast_groups, list) {
690 struct nlattr *nest;
691
692 nest = nla_nest_start(skb, idx++);
693 if (nest == NULL)
694 goto nla_put_failure;
695
444653f6
DM
696 if (nla_put_u32(skb, CTRL_ATTR_MCAST_GRP_ID, grp->id) ||
697 nla_put_string(skb, CTRL_ATTR_MCAST_GRP_NAME,
698 grp->name))
699 goto nla_put_failure;
2dbba6f7
JB
700
701 nla_nest_end(skb, nest);
702 }
703 nla_nest_end(skb, nla_grps);
704 }
705
706 return genlmsg_end(skb, hdr);
707
708nla_put_failure:
bc3ed28c
TG
709 genlmsg_cancel(skb, hdr);
710 return -EMSGSIZE;
2dbba6f7
JB
711}
712
15e47304 713static int ctrl_fill_mcgrp_info(struct genl_multicast_group *grp, u32 portid,
2dbba6f7
JB
714 u32 seq, u32 flags, struct sk_buff *skb,
715 u8 cmd)
716{
717 void *hdr;
718 struct nlattr *nla_grps;
719 struct nlattr *nest;
720
15e47304 721 hdr = genlmsg_put(skb, portid, seq, &genl_ctrl, flags, cmd);
2dbba6f7
JB
722 if (hdr == NULL)
723 return -1;
724
444653f6
DM
725 if (nla_put_string(skb, CTRL_ATTR_FAMILY_NAME, grp->family->name) ||
726 nla_put_u16(skb, CTRL_ATTR_FAMILY_ID, grp->family->id))
727 goto nla_put_failure;
2dbba6f7
JB
728
729 nla_grps = nla_nest_start(skb, CTRL_ATTR_MCAST_GROUPS);
730 if (nla_grps == NULL)
731 goto nla_put_failure;
732
733 nest = nla_nest_start(skb, 1);
734 if (nest == NULL)
735 goto nla_put_failure;
736
444653f6
DM
737 if (nla_put_u32(skb, CTRL_ATTR_MCAST_GRP_ID, grp->id) ||
738 nla_put_string(skb, CTRL_ATTR_MCAST_GRP_NAME,
739 grp->name))
740 goto nla_put_failure;
2dbba6f7
JB
741
742 nla_nest_end(skb, nest);
743 nla_nest_end(skb, nla_grps);
744
482a8524
TG
745 return genlmsg_end(skb, hdr);
746
747nla_put_failure:
bc3ed28c
TG
748 genlmsg_cancel(skb, hdr);
749 return -EMSGSIZE;
482a8524
TG
750}
751
752static int ctrl_dumpfamily(struct sk_buff *skb, struct netlink_callback *cb)
753{
754
755 int i, n = 0;
756 struct genl_family *rt;
134e6375 757 struct net *net = sock_net(skb->sk);
482a8524
TG
758 int chains_to_skip = cb->args[0];
759 int fams_to_skip = cb->args[1];
760
e1d5a010 761 for (i = chains_to_skip; i < GENL_FAM_TAB_SIZE; i++) {
482a8524
TG
762 n = 0;
763 list_for_each_entry(rt, genl_family_chain(i), family_list) {
134e6375
JB
764 if (!rt->netnsok && !net_eq(net, &init_net))
765 continue;
482a8524
TG
766 if (++n < fams_to_skip)
767 continue;
15e47304 768 if (ctrl_fill_info(rt, NETLINK_CB(cb->skb).portid,
482a8524
TG
769 cb->nlh->nlmsg_seq, NLM_F_MULTI,
770 skb, CTRL_CMD_NEWFAMILY) < 0)
771 goto errout;
772 }
773
774 fams_to_skip = 0;
775 }
776
777errout:
778 cb->args[0] = i;
779 cb->args[1] = n;
780
781 return skb->len;
782}
783
2dbba6f7 784static struct sk_buff *ctrl_build_family_msg(struct genl_family *family,
15e47304 785 u32 portid, int seq, u8 cmd)
482a8524
TG
786{
787 struct sk_buff *skb;
788 int err;
789
339bf98f 790 skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
482a8524
TG
791 if (skb == NULL)
792 return ERR_PTR(-ENOBUFS);
793
15e47304 794 err = ctrl_fill_info(family, portid, seq, 0, skb, cmd);
482a8524
TG
795 if (err < 0) {
796 nlmsg_free(skb);
797 return ERR_PTR(err);
798 }
799
800 return skb;
801}
802
2dbba6f7 803static struct sk_buff *ctrl_build_mcgrp_msg(struct genl_multicast_group *grp,
15e47304 804 u32 portid, int seq, u8 cmd)
2dbba6f7
JB
805{
806 struct sk_buff *skb;
807 int err;
808
809 skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
810 if (skb == NULL)
811 return ERR_PTR(-ENOBUFS);
812
15e47304 813 err = ctrl_fill_mcgrp_info(grp, portid, seq, 0, skb, cmd);
2dbba6f7
JB
814 if (err < 0) {
815 nlmsg_free(skb);
816 return ERR_PTR(err);
817 }
818
819 return skb;
820}
821
ef7c79ed 822static const struct nla_policy ctrl_policy[CTRL_ATTR_MAX+1] = {
482a8524 823 [CTRL_ATTR_FAMILY_ID] = { .type = NLA_U16 },
5176f91e
TG
824 [CTRL_ATTR_FAMILY_NAME] = { .type = NLA_NUL_STRING,
825 .len = GENL_NAMSIZ - 1 },
482a8524
TG
826};
827
828static int ctrl_getfamily(struct sk_buff *skb, struct genl_info *info)
829{
830 struct sk_buff *msg;
831 struct genl_family *res = NULL;
832 int err = -EINVAL;
833
834 if (info->attrs[CTRL_ATTR_FAMILY_ID]) {
835 u16 id = nla_get_u16(info->attrs[CTRL_ATTR_FAMILY_ID]);
836 res = genl_family_find_byid(id);
134e6375 837 err = -ENOENT;
482a8524
TG
838 }
839
840 if (info->attrs[CTRL_ATTR_FAMILY_NAME]) {
5176f91e 841 char *name;
482a8524 842
5176f91e 843 name = nla_data(info->attrs[CTRL_ATTR_FAMILY_NAME]);
482a8524 844 res = genl_family_find_byname(name);
fa843095
SH
845#ifdef CONFIG_MODULES
846 if (res == NULL) {
847 genl_unlock();
c74f2b26 848 up_read(&cb_lock);
e9412c37 849 request_module("net-pf-%d-proto-%d-family-%s",
fa843095 850 PF_NETLINK, NETLINK_GENERIC, name);
c74f2b26 851 down_read(&cb_lock);
fa843095
SH
852 genl_lock();
853 res = genl_family_find_byname(name);
854 }
855#endif
134e6375 856 err = -ENOENT;
482a8524
TG
857 }
858
134e6375
JB
859 if (res == NULL)
860 return err;
861
862 if (!res->netnsok && !net_eq(genl_info_net(info), &init_net)) {
863 /* family doesn't exist here */
864 return -ENOENT;
482a8524
TG
865 }
866
15e47304 867 msg = ctrl_build_family_msg(res, info->snd_portid, info->snd_seq,
2dbba6f7 868 CTRL_CMD_NEWFAMILY);
134e6375
JB
869 if (IS_ERR(msg))
870 return PTR_ERR(msg);
482a8524 871
134e6375 872 return genlmsg_reply(msg, info);
482a8524
TG
873}
874
875static int genl_ctrl_event(int event, void *data)
876{
877 struct sk_buff *msg;
134e6375
JB
878 struct genl_family *family;
879 struct genl_multicast_group *grp;
482a8524 880
134e6375
JB
881 /* genl is still initialising */
882 if (!init_net.genl_sock)
482a8524
TG
883 return 0;
884
885 switch (event) {
886 case CTRL_CMD_NEWFAMILY:
887 case CTRL_CMD_DELFAMILY:
134e6375
JB
888 family = data;
889 msg = ctrl_build_family_msg(family, 0, 0, event);
2dbba6f7
JB
890 break;
891 case CTRL_CMD_NEWMCAST_GRP:
892 case CTRL_CMD_DELMCAST_GRP:
134e6375
JB
893 grp = data;
894 family = grp->family;
2dbba6f7 895 msg = ctrl_build_mcgrp_msg(data, 0, 0, event);
482a8524 896 break;
134e6375
JB
897 default:
898 return -EINVAL;
899 }
900
901 if (IS_ERR(msg))
902 return PTR_ERR(msg);
903
904 if (!family->netnsok) {
905 genlmsg_multicast_netns(&init_net, msg, 0,
906 GENL_ID_CTRL, GFP_KERNEL);
907 } else {
908 rcu_read_lock();
909 genlmsg_multicast_allns(msg, 0, GENL_ID_CTRL, GFP_ATOMIC);
910 rcu_read_unlock();
482a8524
TG
911 }
912
913 return 0;
914}
915
c53ed742
JB
916static struct genl_ops genl_ctrl_ops[] = {
917 {
918 .cmd = CTRL_CMD_GETFAMILY,
919 .doit = ctrl_getfamily,
920 .dumpit = ctrl_dumpfamily,
921 .policy = ctrl_policy,
922 },
482a8524
TG
923};
924
2dbba6f7
JB
925static struct genl_multicast_group notify_grp = {
926 .name = "notify",
927};
928
134e6375
JB
929static int __net_init genl_pernet_init(struct net *net)
930{
a31f2d17
PNA
931 struct netlink_kernel_cfg cfg = {
932 .input = genl_rcv,
9785e10a 933 .flags = NL_CFG_F_NONROOT_RECV,
a31f2d17
PNA
934 };
935
134e6375 936 /* we'll bump the group number right afterwards */
9f00d977 937 net->genl_sock = netlink_kernel_create(net, NETLINK_GENERIC, &cfg);
134e6375
JB
938
939 if (!net->genl_sock && net_eq(net, &init_net))
940 panic("GENL: Cannot initialize generic netlink\n");
941
942 if (!net->genl_sock)
943 return -ENOMEM;
944
945 return 0;
946}
947
948static void __net_exit genl_pernet_exit(struct net *net)
949{
950 netlink_kernel_release(net->genl_sock);
951 net->genl_sock = NULL;
952}
953
954static struct pernet_operations genl_pernet_ops = {
955 .init = genl_pernet_init,
956 .exit = genl_pernet_exit,
957};
958
482a8524
TG
959static int __init genl_init(void)
960{
961 int i, err;
962
963 for (i = 0; i < GENL_FAM_TAB_SIZE; i++)
964 INIT_LIST_HEAD(&family_ht[i]);
965
c53ed742 966 err = genl_register_family_with_ops(&genl_ctrl, genl_ctrl_ops);
482a8524 967 if (err < 0)
134e6375 968 goto problem;
482a8524 969
134e6375
JB
970 err = register_pernet_subsys(&genl_pernet_ops);
971 if (err)
972 goto problem;
482a8524 973
2dbba6f7
JB
974 err = genl_register_mc_group(&genl_ctrl, &notify_grp);
975 if (err < 0)
134e6375 976 goto problem;
2dbba6f7 977
482a8524
TG
978 return 0;
979
134e6375 980problem:
482a8524 981 panic("GENL: Cannot register controller: %d\n", err);
482a8524
TG
982}
983
984subsys_initcall(genl_init);
985
15e47304 986static int genlmsg_mcast(struct sk_buff *skb, u32 portid, unsigned long group,
134e6375
JB
987 gfp_t flags)
988{
989 struct sk_buff *tmp;
990 struct net *net, *prev = NULL;
991 int err;
992
993 for_each_net_rcu(net) {
994 if (prev) {
995 tmp = skb_clone(skb, flags);
996 if (!tmp) {
997 err = -ENOMEM;
998 goto error;
999 }
1000 err = nlmsg_multicast(prev->genl_sock, tmp,
15e47304 1001 portid, group, flags);
134e6375
JB
1002 if (err)
1003 goto error;
1004 }
1005
1006 prev = net;
1007 }
1008
15e47304 1009 return nlmsg_multicast(prev->genl_sock, skb, portid, group, flags);
134e6375
JB
1010 error:
1011 kfree_skb(skb);
1012 return err;
1013}
1014
15e47304 1015int genlmsg_multicast_allns(struct sk_buff *skb, u32 portid, unsigned int group,
134e6375
JB
1016 gfp_t flags)
1017{
15e47304 1018 return genlmsg_mcast(skb, portid, group, flags);
134e6375
JB
1019}
1020EXPORT_SYMBOL(genlmsg_multicast_allns);
263ba61d 1021
15e47304 1022void genl_notify(struct sk_buff *skb, struct net *net, u32 portid, u32 group,
263ba61d
PS
1023 struct nlmsghdr *nlh, gfp_t flags)
1024{
1025 struct sock *sk = net->genl_sock;
1026 int report = 0;
1027
1028 if (nlh)
1029 report = nlmsg_report(nlh);
1030
15e47304 1031 nlmsg_notify(sk, skb, portid, group, report, flags);
263ba61d
PS
1032}
1033EXPORT_SYMBOL(genl_notify);
This page took 0.690372 seconds and 5 git commands to generate.