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