genetlink.c 25.9 KB
Newer Older
1
2
3
4
5
/*
 * NETLINK      Generic Netlink Family
 *
 * 		Authors:	Jamal Hadi Salim
 * 				Thomas Graf <tgraf@suug.ch>
6
 *				Johannes Berg <johannes@sipsolutions.net>
7
8
9
10
 */

#include <linux/module.h>
#include <linux/kernel.h>
11
#include <linux/slab.h>
12
13
14
15
16
#include <linux/errno.h>
#include <linux/types.h>
#include <linux/socket.h>
#include <linux/string.h>
#include <linux/skbuff.h>
17
#include <linux/mutex.h>
18
#include <linux/bitmap.h>
19
#include <linux/rwsem.h>
20
21
22
#include <net/sock.h>
#include <net/genetlink.h>

23
static DEFINE_MUTEX(genl_mutex); /* serialization of message processing */
24
static DECLARE_RWSEM(cb_lock);
25

26
27
28
atomic_t genl_sk_destructing_cnt = ATOMIC_INIT(0);
DECLARE_WAIT_QUEUE_HEAD(genl_sk_destructing_waitq);

29
void genl_lock(void)
30
{
31
	mutex_lock(&genl_mutex);
32
}
33
EXPORT_SYMBOL(genl_lock);
34

35
void genl_unlock(void)
36
{
37
	mutex_unlock(&genl_mutex);
38
}
39
EXPORT_SYMBOL(genl_unlock);
40

41
#ifdef CONFIG_LOCKDEP
42
bool lockdep_genl_is_held(void)
43
44
45
46
47
48
{
	return lockdep_is_held(&genl_mutex);
}
EXPORT_SYMBOL(lockdep_genl_is_held);
#endif

49
50
51
52
53
54
55
56
57
58
59
60
static void genl_lock_all(void)
{
	down_write(&cb_lock);
	genl_lock();
}

static void genl_unlock_all(void)
{
	genl_unlock();
	up_write(&cb_lock);
}

61
62
63
64
#define GENL_FAM_TAB_SIZE	16
#define GENL_FAM_TAB_MASK	(GENL_FAM_TAB_SIZE - 1)

static struct list_head family_ht[GENL_FAM_TAB_SIZE];
65
66
67
68
69
70
/*
 * Bitmap of multicast groups that are currently in use.
 *
 * To avoid an allocation at boot of just one unsigned long,
 * declare it global instead.
 * Bit 0 is marked as already used since group 0 is invalid.
71
72
73
74
 * Bit 1 is marked as already used since the drop-monitor code
 * abuses the API and thinks it can statically use group 1.
 * That group will typically conflict with other groups that
 * any proper users use.
75
76
 * Bit 16 is marked as used since it's used for generic netlink
 * and the code no longer marks pre-reserved IDs as used.
77
78
79
 * Bit 17 is marked as already used since the VFS quota code
 * also abused this API and relied on family == group ID, we
 * cater to that by giving it a static family and group ID.
80
81
 * Bit 18 is marked as already used since the PMCRAID driver
 * did the same thing as the VFS quota code (maybe copied?)
82
 */
83
static unsigned long mc_group_start = 0x3 | BIT(GENL_ID_CTRL) |
84
85
				      BIT(GENL_ID_VFS_DQUOT) |
				      BIT(GENL_ID_PMCRAID);
86
87
static unsigned long *mc_groups = &mc_group_start;
static unsigned long mc_groups_longs = 1;
88

89
static int genl_ctrl_event(int event, struct genl_family *family,
90
91
			   const struct genl_multicast_group *grp,
			   int grp_id);
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126

static inline unsigned int genl_family_hash(unsigned int id)
{
	return id & GENL_FAM_TAB_MASK;
}

static inline struct list_head *genl_family_chain(unsigned int id)
{
	return &family_ht[genl_family_hash(id)];
}

static struct genl_family *genl_family_find_byid(unsigned int id)
{
	struct genl_family *f;

	list_for_each_entry(f, genl_family_chain(id), family_list)
		if (f->id == id)
			return f;

	return NULL;
}

static struct genl_family *genl_family_find_byname(char *name)
{
	struct genl_family *f;
	int i;

	for (i = 0; i < GENL_FAM_TAB_SIZE; i++)
		list_for_each_entry(f, genl_family_chain(i), family_list)
			if (strcmp(f->name, name) == 0)
				return f;

	return NULL;
}

127
static const struct genl_ops *genl_get_cmd(u8 cmd, struct genl_family *family)
128
{
129
	int i;
130

131
132
133
	for (i = 0; i < family->n_ops; i++)
		if (family->ops[i].cmd == cmd)
			return &family->ops[i];
134
135
136
137
138
139
140

	return NULL;
}

/* Of course we are going to have problems once we hit
 * 2^16 alive types, but that can only happen by year 2K
*/
141
static u16 genl_generate_id(void)
142
{
143
144
	static u16 id_gen_idx = GENL_MIN_ID;
	int i;
145

146
	for (i = 0; i <= GENL_MAX_ID - GENL_MIN_ID; i++) {
147
		if (id_gen_idx != GENL_ID_VFS_DQUOT &&
148
		    id_gen_idx != GENL_ID_PMCRAID &&
149
		    !genl_family_find_byid(id_gen_idx))
150
151
			return id_gen_idx;
		if (++id_gen_idx > GENL_MAX_ID)
152
			id_gen_idx = GENL_MIN_ID;
153
	}
154

155
	return 0;
156
157
}

158
static int genl_allocate_reserve_groups(int n_groups, int *first_id)
159
160
{
	unsigned long *new_groups;
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
	int start = 0;
	int i;
	int id;
	bool fits;

	do {
		if (start == 0)
			id = find_first_zero_bit(mc_groups,
						 mc_groups_longs *
						 BITS_PER_LONG);
		else
			id = find_next_zero_bit(mc_groups,
						mc_groups_longs * BITS_PER_LONG,
						start);

		fits = true;
		for (i = id;
		     i < min_t(int, id + n_groups,
			       mc_groups_longs * BITS_PER_LONG);
		     i++) {
			if (test_bit(i, mc_groups)) {
				start = i;
				fits = false;
				break;
			}
		}
187

188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
		if (id >= mc_groups_longs * BITS_PER_LONG) {
			unsigned long new_longs = mc_groups_longs +
						  BITS_TO_LONGS(n_groups);
			size_t nlen = new_longs * sizeof(unsigned long);

			if (mc_groups == &mc_group_start) {
				new_groups = kzalloc(nlen, GFP_KERNEL);
				if (!new_groups)
					return -ENOMEM;
				mc_groups = new_groups;
				*mc_groups = mc_group_start;
			} else {
				new_groups = krealloc(mc_groups, nlen,
						      GFP_KERNEL);
				if (!new_groups)
					return -ENOMEM;
				mc_groups = new_groups;
				for (i = 0; i < BITS_TO_LONGS(n_groups); i++)
					mc_groups[mc_groups_longs + i] = 0;
			}
			mc_groups_longs = new_longs;
		}
	} while (!fits);
211

212
213
214
215
216
217
218
219
220
221
222
223
	for (i = id; i < id + n_groups; i++)
		set_bit(i, mc_groups);
	*first_id = id;
	return 0;
}

static struct genl_family genl_ctrl;

static int genl_validate_assign_mc_groups(struct genl_family *family)
{
	int first_id;
	int n_groups = family->n_mcgrps;
224
	int err = 0, i;
225
226
227
228
229
230
231
232
233
234
235
236
237
	bool groups_allocated = false;

	if (!n_groups)
		return 0;

	for (i = 0; i < n_groups; i++) {
		const struct genl_multicast_group *grp = &family->mcgrps[i];

		if (WARN_ON(grp->name[0] == '\0'))
			return -EINVAL;
		if (WARN_ON(memchr(grp->name, '\0', GENL_NAMSIZ) == NULL))
			return -EINVAL;
	}
238

239
	/* special-case our own group and hacks */
240
241
242
243
244
245
	if (family == &genl_ctrl) {
		first_id = GENL_ID_CTRL;
		BUG_ON(n_groups != 1);
	} else if (strcmp(family->name, "NET_DM") == 0) {
		first_id = 1;
		BUG_ON(n_groups != 1);
246
	} else if (family->id == GENL_ID_VFS_DQUOT) {
247
248
		first_id = GENL_ID_VFS_DQUOT;
		BUG_ON(n_groups != 1);
249
250
251
	} else if (family->id == GENL_ID_PMCRAID) {
		first_id = GENL_ID_PMCRAID;
		BUG_ON(n_groups != 1);
252
253
254
255
256
	} else {
		groups_allocated = true;
		err = genl_allocate_reserve_groups(n_groups, &first_id);
		if (err)
			return err;
257
258
	}

259
260
261
262
263
264
	family->mcgrp_offset = first_id;

	/* if still initializing, can't and don't need to to realloc bitmaps */
	if (!init_net.genl_sock)
		return 0;

Johannes Berg's avatar
Johannes Berg committed
265
266
267
	if (family->netnsok) {
		struct net *net;

268
		netlink_table_grab();
Johannes Berg's avatar
Johannes Berg committed
269
270
		rcu_read_lock();
		for_each_net_rcu(net) {
271
			err = __netlink_change_ngroups(net->genl_sock,
Johannes Berg's avatar
Johannes Berg committed
272
273
274
275
276
277
278
279
					mc_groups_longs * BITS_PER_LONG);
			if (err) {
				/*
				 * No need to roll back, can only fail if
				 * memory allocation fails and then the
				 * number of _possible_ groups has been
				 * increased on some sockets which is ok.
				 */
280
				break;
Johannes Berg's avatar
Johannes Berg committed
281
282
283
			}
		}
		rcu_read_unlock();
284
		netlink_table_ungrab();
Johannes Berg's avatar
Johannes Berg committed
285
286
287
288
	} else {
		err = netlink_change_ngroups(init_net.genl_sock,
					     mc_groups_longs * BITS_PER_LONG);
	}
289

290
291
292
293
	if (groups_allocated && err) {
		for (i = 0; i < family->n_mcgrps; i++)
			clear_bit(family->mcgrp_offset + i, mc_groups);
	}
294

295
	return err;
296
297
}

298
static void genl_unregister_mc_groups(struct genl_family *family)
299
{
Johannes Berg's avatar
Johannes Berg committed
300
	struct net *net;
301
	int i;
Johannes Berg's avatar
Johannes Berg committed
302

303
	netlink_table_grab();
Johannes Berg's avatar
Johannes Berg committed
304
	rcu_read_lock();
305
306
307
308
309
	for_each_net_rcu(net) {
		for (i = 0; i < family->n_mcgrps; i++)
			__netlink_clear_multicast_users(
				net->genl_sock, family->mcgrp_offset + i);
	}
Johannes Berg's avatar
Johannes Berg committed
310
	rcu_read_unlock();
311
	netlink_table_ungrab();
Johannes Berg's avatar
Johannes Berg committed
312

313
314
	for (i = 0; i < family->n_mcgrps; i++) {
		int grp_id = family->mcgrp_offset + i;
315

316
317
318
319
320
		if (grp_id != 1)
			clear_bit(grp_id, mc_groups);
		genl_ctrl_event(CTRL_CMD_DELMCAST_GRP, family,
				&family->mcgrps[i], grp_id);
	}
321
322
}

323
static int genl_validate_ops(const struct genl_family *family)
324
{
325
326
	const struct genl_ops *ops = family->ops;
	unsigned int n_ops = family->n_ops;
327
328
	int i, j;

329
330
331
332
333
334
	if (WARN_ON(n_ops && !ops))
		return -EINVAL;

	if (!n_ops)
		return 0;

335
336
337
338
339
340
	for (i = 0; i < n_ops; i++) {
		if (ops[i].dumpit == NULL && ops[i].doit == NULL)
			return -EINVAL;
		for (j = i + 1; j < n_ops; j++)
			if (ops[i].cmd == ops[j].cmd)
				return -EINVAL;
341
342
	}

343
	return 0;
344
345
346
}

/**
347
 * __genl_register_family - register a generic netlink family
348
349
350
351
352
353
354
 * @family: generic netlink family
 *
 * Registers the specified family after validating it first. Only one
 * family may be registered with the same family name or identifier.
 * The family id may equal GENL_ID_GENERATE causing an unique id to
 * be automatically generated and assigned.
 *
355
356
357
 * The family's ops array must already be assigned, you can use the
 * genl_register_family_with_ops() helper function.
 *
358
359
 * Return 0 on success or a negative error code.
 */
360
int __genl_register_family(struct genl_family *family)
361
{
362
	int err = -EINVAL, i;
363
364
365
366
367
368
369

	if (family->id && family->id < GENL_MIN_ID)
		goto errout;

	if (family->id > GENL_MAX_ID)
		goto errout;

370
371
372
373
	err = genl_validate_ops(family);
	if (err)
		return err;

374
	genl_lock_all();
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389

	if (genl_family_find_byname(family->name)) {
		err = -EEXIST;
		goto errout_locked;
	}

	if (family->id == GENL_ID_GENERATE) {
		u16 newid = genl_generate_id();

		if (!newid) {
			err = -ENOMEM;
			goto errout_locked;
		}

		family->id = newid;
390
391
392
	} else if (genl_family_find_byid(family->id)) {
		err = -EEXIST;
		goto errout_locked;
393
394
	}

395
	if (family->maxattr && !family->parallel_ops) {
396
397
398
399
		family->attrbuf = kmalloc((family->maxattr+1) *
					sizeof(struct nlattr *), GFP_KERNEL);
		if (family->attrbuf == NULL) {
			err = -ENOMEM;
400
			goto errout_locked;
401
402
403
404
		}
	} else
		family->attrbuf = NULL;

405
406
407
408
	err = genl_validate_assign_mc_groups(family);
	if (err)
		goto errout_locked;

409
	list_add_tail(&family->family_list, genl_family_chain(family->id));
410
	genl_unlock_all();
411

412
413
414
415
416
	/* send all events */
	genl_ctrl_event(CTRL_CMD_NEWFAMILY, family, NULL, 0);
	for (i = 0; i < family->n_mcgrps; i++)
		genl_ctrl_event(CTRL_CMD_NEWMCAST_GRP, family,
				&family->mcgrps[i], family->mcgrp_offset + i);
417
418
419
420

	return 0;

errout_locked:
421
	genl_unlock_all();
422
423
424
errout:
	return err;
}
425
EXPORT_SYMBOL(__genl_register_family);
426
427
428
429
430
431
432
433
434
435
436
437
438

/**
 * genl_unregister_family - unregister generic netlink family
 * @family: generic netlink family
 *
 * Unregisters the specified family.
 *
 * Returns 0 on success or a negative error code.
 */
int genl_unregister_family(struct genl_family *family)
{
	struct genl_family *rc;

439
	genl_lock_all();
440
441
442
443
444

	list_for_each_entry(rc, genl_family_chain(family->id), family_list) {
		if (family->id != rc->id || strcmp(rc->name, family->name))
			continue;

445
446
		genl_unregister_mc_groups(family);

447
		list_del(&rc->family_list);
448
		family->n_ops = 0;
449
450
451
452
		up_write(&cb_lock);
		wait_event(genl_sk_destructing_waitq,
			   atomic_read(&genl_sk_destructing_cnt) == 0);
		genl_unlock();
453
454

		kfree(family->attrbuf);
455
		genl_ctrl_event(CTRL_CMD_DELFAMILY, family, NULL, 0);
456
457
458
		return 0;
	}

459
	genl_unlock_all();
460
461
462

	return -ENOENT;
}
463
EXPORT_SYMBOL(genl_unregister_family);
464

465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
/**
 * genlmsg_new_unicast - Allocate generic netlink message for unicast
 * @payload: size of the message payload
 * @info: information on destination
 * @flags: the type of memory to allocate
 *
 * Allocates a new sk_buff large enough to cover the specified payload
 * plus required Netlink headers. Will check receiving socket for
 * memory mapped i/o capability and use it if enabled. Will fall back
 * to non-mapped skb if message size exceeds the frame size of the ring.
 */
struct sk_buff *genlmsg_new_unicast(size_t payload, struct genl_info *info,
				    gfp_t flags)
{
	size_t len = nlmsg_total_size(genlmsg_total_size(payload));

	return netlink_alloc_skb(info->dst_sk, len, info->snd_portid, flags);
}
EXPORT_SYMBOL_GPL(genlmsg_new_unicast);

485
486
487
/**
 * genlmsg_put - Add generic netlink header to netlink message
 * @skb: socket buffer holding the message
488
 * @portid: netlink portid the message is addressed to
489
490
 * @seq: sequence number (usually the one of the sender)
 * @family: generic netlink family
491
 * @flags: netlink message flags
492
493
494
495
 * @cmd: generic netlink command
 *
 * Returns pointer to user specific header
 */
496
void *genlmsg_put(struct sk_buff *skb, u32 portid, u32 seq,
497
498
499
500
501
				struct genl_family *family, int flags, u8 cmd)
{
	struct nlmsghdr *nlh;
	struct genlmsghdr *hdr;

502
	nlh = nlmsg_put(skb, portid, seq, family->id, GENL_HDRLEN +
503
504
505
506
507
508
509
510
511
512
513
514
515
			family->hdrsize, flags);
	if (nlh == NULL)
		return NULL;

	hdr = nlmsg_data(nlh);
	hdr->cmd = cmd;
	hdr->version = family->version;
	hdr->reserved = 0;

	return (char *) hdr + GENL_HDRLEN;
}
EXPORT_SYMBOL(genlmsg_put);

516
517
static int genl_lock_dumpit(struct sk_buff *skb, struct netlink_callback *cb)
{
518
519
	/* our ops are always const - netlink API doesn't propagate that */
	const struct genl_ops *ops = cb->data;
520
521
522
523
524
525
526
527
528
529
	int rc;

	genl_lock();
	rc = ops->dumpit(skb, cb);
	genl_unlock();
	return rc;
}

static int genl_lock_done(struct netlink_callback *cb)
{
530
531
	/* our ops are always const - netlink API doesn't propagate that */
	const struct genl_ops *ops = cb->data;
532
533
534
535
536
537
538
539
540
541
	int rc = 0;

	if (ops->done) {
		genl_lock();
		rc = ops->done(cb);
		genl_unlock();
	}
	return rc;
}

542
543
544
static int genl_family_rcv_msg(struct genl_family *family,
			       struct sk_buff *skb,
			       struct nlmsghdr *nlh)
545
{
546
	const struct genl_ops *ops;
Johannes Berg's avatar
Johannes Berg committed
547
	struct net *net = sock_net(skb->sk);
548
549
	struct genl_info info;
	struct genlmsghdr *hdr = nlmsg_data(nlh);
550
	struct nlattr **attrbuf;
551
	int hdrlen, err;
552

Johannes Berg's avatar
Johannes Berg committed
553
554
555
556
	/* this family doesn't exist in this netns */
	if (!family->netnsok && !net_eq(net, &init_net))
		return -ENOENT;

557
558
	hdrlen = GENL_HDRLEN + family->hdrsize;
	if (nlh->nlmsg_len < nlmsg_msg_size(hdrlen))
559
		return -EINVAL;
560
561

	ops = genl_get_cmd(hdr->cmd, family);
562
563
	if (ops == NULL)
		return -EOPNOTSUPP;
564

565
	if ((ops->flags & GENL_ADMIN_PERM) &&
566
	    !netlink_capable(skb, CAP_NET_ADMIN))
567
		return -EPERM;
568

569
	if ((nlh->nlmsg_flags & NLM_F_DUMP) == NLM_F_DUMP) {
570
		int rc;
571

572
573
		if (ops->dumpit == NULL)
			return -EOPNOTSUPP;
574

575
576
		if (!family->parallel_ops) {
			struct netlink_dump_control c = {
577
				.module = family->module,
578
579
				/* we have const, but the netlink API doesn't */
				.data = (void *)ops,
580
581
582
583
584
				.dump = genl_lock_dumpit,
				.done = genl_lock_done,
			};

			genl_unlock();
585
			rc = __netlink_dump_start(net->genl_sock, skb, nlh, &c);
586
587
588
589
			genl_lock();

		} else {
			struct netlink_dump_control c = {
590
				.module = family->module,
591
592
593
594
				.dump = ops->dumpit,
				.done = ops->done,
			};

595
			rc = __netlink_dump_start(net->genl_sock, skb, nlh, &c);
596
597
598
		}

		return rc;
599
600
	}

601
602
	if (ops->doit == NULL)
		return -EOPNOTSUPP;
603

604
605
606
607
608
609
610
611
612
613
	if (family->maxattr && family->parallel_ops) {
		attrbuf = kmalloc((family->maxattr+1) *
					sizeof(struct nlattr *), GFP_KERNEL);
		if (attrbuf == NULL)
			return -ENOMEM;
	} else
		attrbuf = family->attrbuf;

	if (attrbuf) {
		err = nlmsg_parse(nlh, hdrlen, attrbuf, family->maxattr,
614
615
				  ops->policy);
		if (err < 0)
616
			goto out;
617
618
619
	}

	info.snd_seq = nlh->nlmsg_seq;
620
	info.snd_portid = NETLINK_CB(skb).portid;
621
622
623
	info.nlhdr = nlh;
	info.genlhdr = nlmsg_data(nlh);
	info.userhdr = nlmsg_data(nlh) + GENL_HDRLEN;
624
	info.attrs = attrbuf;
625
	info.dst_sk = skb->sk;
Johannes Berg's avatar
Johannes Berg committed
626
	genl_info_net_set(&info, net);
627
	memset(&info.user_ptr, 0, sizeof(info.user_ptr));
628

629
630
631
	if (family->pre_doit) {
		err = family->pre_doit(ops, skb, &info);
		if (err)
632
			goto out;
633
634
635
636
637
638
639
	}

	err = ops->doit(skb, &info);

	if (family->post_doit)
		family->post_doit(ops, skb, &info);

640
out:
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
	if (family->parallel_ops)
		kfree(attrbuf);

	return err;
}

static int genl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
{
	struct genl_family *family;
	int err;

	family = genl_family_find_byid(nlh->nlmsg_type);
	if (family == NULL)
		return -ENOENT;

	if (!family->parallel_ops)
		genl_lock();

	err = genl_family_rcv_msg(family, skb, nlh);

	if (!family->parallel_ops)
		genl_unlock();

664
	return err;
665
666
}

667
static void genl_rcv(struct sk_buff *skb)
668
{
669
	down_read(&cb_lock);
670
	netlink_rcv_skb(skb, &genl_rcv_msg);
671
	up_read(&cb_lock);
672
673
674
675
676
677
}

/**************************************************************************
 * Controller
 **************************************************************************/

678
679
680
static struct genl_family genl_ctrl = {
	.id = GENL_ID_CTRL,
	.name = "nlctrl",
681
	.version = 0x2,
682
	.maxattr = CTRL_ATTR_MAX,
Johannes Berg's avatar
Johannes Berg committed
683
	.netnsok = true,
684
685
};

686
static int ctrl_fill_info(struct genl_family *family, u32 portid, u32 seq,
687
688
689
690
			  u32 flags, struct sk_buff *skb, u8 cmd)
{
	void *hdr;

691
	hdr = genlmsg_put(skb, portid, seq, &genl_ctrl, flags, cmd);
692
693
694
	if (hdr == NULL)
		return -1;

695
696
697
698
699
700
	if (nla_put_string(skb, CTRL_ATTR_FAMILY_NAME, family->name) ||
	    nla_put_u16(skb, CTRL_ATTR_FAMILY_ID, family->id) ||
	    nla_put_u32(skb, CTRL_ATTR_VERSION, family->version) ||
	    nla_put_u32(skb, CTRL_ATTR_HDRSIZE, family->hdrsize) ||
	    nla_put_u32(skb, CTRL_ATTR_MAXATTR, family->maxattr))
		goto nla_put_failure;
701

702
	if (family->n_ops) {
703
		struct nlattr *nla_ops;
704
		int i;
705

706
707
		nla_ops = nla_nest_start(skb, CTRL_ATTR_OPS);
		if (nla_ops == NULL)
708
709
			goto nla_put_failure;

710
		for (i = 0; i < family->n_ops; i++) {
711
			struct nlattr *nest;
712
			const struct genl_ops *ops = &family->ops[i];
713
			u32 op_flags = ops->flags;
714
715

			if (ops->dumpit)
716
				op_flags |= GENL_CMD_CAP_DUMP;
717
			if (ops->doit)
718
				op_flags |= GENL_CMD_CAP_DO;
719
			if (ops->policy)
720
				op_flags |= GENL_CMD_CAP_HASPOL;
721

722
			nest = nla_nest_start(skb, i + 1);
723
724
			if (nest == NULL)
				goto nla_put_failure;
725

726
			if (nla_put_u32(skb, CTRL_ATTR_OP_ID, ops->cmd) ||
727
			    nla_put_u32(skb, CTRL_ATTR_OP_FLAGS, op_flags))
728
				goto nla_put_failure;
729

730
731
732
733
734
			nla_nest_end(skb, nest);
		}

		nla_nest_end(skb, nla_ops);
	}
735

736
	if (family->n_mcgrps) {
737
		struct nlattr *nla_grps;
738
		int i;
739
740
741
742
743

		nla_grps = nla_nest_start(skb, CTRL_ATTR_MCAST_GROUPS);
		if (nla_grps == NULL)
			goto nla_put_failure;

744
		for (i = 0; i < family->n_mcgrps; i++) {
745
			struct nlattr *nest;
746
			const struct genl_multicast_group *grp;
747

748
749
750
			grp = &family->mcgrps[i];

			nest = nla_nest_start(skb, i + 1);
751
752
753
			if (nest == NULL)
				goto nla_put_failure;

754
755
			if (nla_put_u32(skb, CTRL_ATTR_MCAST_GRP_ID,
					family->mcgrp_offset + i) ||
756
757
758
			    nla_put_string(skb, CTRL_ATTR_MCAST_GRP_NAME,
					   grp->name))
				goto nla_put_failure;
759
760
761
762
763
764

			nla_nest_end(skb, nest);
		}
		nla_nest_end(skb, nla_grps);
	}

765
766
	genlmsg_end(skb, hdr);
	return 0;
767
768

nla_put_failure:
769
770
	genlmsg_cancel(skb, hdr);
	return -EMSGSIZE;
771
772
}

773
static int ctrl_fill_mcgrp_info(struct genl_family *family,
774
775
776
				const struct genl_multicast_group *grp,
				int grp_id, u32 portid, u32 seq, u32 flags,
				struct sk_buff *skb, u8 cmd)
777
778
779
780
781
{
	void *hdr;
	struct nlattr *nla_grps;
	struct nlattr *nest;

782
	hdr = genlmsg_put(skb, portid, seq, &genl_ctrl, flags, cmd);
783
784
785
	if (hdr == NULL)
		return -1;

786
787
	if (nla_put_string(skb, CTRL_ATTR_FAMILY_NAME, family->name) ||
	    nla_put_u16(skb, CTRL_ATTR_FAMILY_ID, family->id))
788
		goto nla_put_failure;
789
790
791
792
793
794
795
796
797

	nla_grps = nla_nest_start(skb, CTRL_ATTR_MCAST_GROUPS);
	if (nla_grps == NULL)
		goto nla_put_failure;

	nest = nla_nest_start(skb, 1);
	if (nest == NULL)
		goto nla_put_failure;

798
	if (nla_put_u32(skb, CTRL_ATTR_MCAST_GRP_ID, grp_id) ||
799
800
801
	    nla_put_string(skb, CTRL_ATTR_MCAST_GRP_NAME,
			   grp->name))
		goto nla_put_failure;
802
803
804
805

	nla_nest_end(skb, nest);
	nla_nest_end(skb, nla_grps);

806
807
	genlmsg_end(skb, hdr);
	return 0;
808
809

nla_put_failure:
810
811
	genlmsg_cancel(skb, hdr);
	return -EMSGSIZE;
812
813
814
815
816
817
818
}

static int ctrl_dumpfamily(struct sk_buff *skb, struct netlink_callback *cb)
{

	int i, n = 0;
	struct genl_family *rt;
Johannes Berg's avatar
Johannes Berg committed
819
	struct net *net = sock_net(skb->sk);
820
821
822
	int chains_to_skip = cb->args[0];
	int fams_to_skip = cb->args[1];

823
	for (i = chains_to_skip; i < GENL_FAM_TAB_SIZE; i++) {
824
825
		n = 0;
		list_for_each_entry(rt, genl_family_chain(i), family_list) {
Johannes Berg's avatar
Johannes Berg committed
826
827
			if (!rt->netnsok && !net_eq(net, &init_net))
				continue;
828
829
			if (++n < fams_to_skip)
				continue;
830
			if (ctrl_fill_info(rt, NETLINK_CB(cb->skb).portid,
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
					   cb->nlh->nlmsg_seq, NLM_F_MULTI,
					   skb, CTRL_CMD_NEWFAMILY) < 0)
				goto errout;
		}

		fams_to_skip = 0;
	}

errout:
	cb->args[0] = i;
	cb->args[1] = n;

	return skb->len;
}

846
static struct sk_buff *ctrl_build_family_msg(struct genl_family *family,
847
					     u32 portid, int seq, u8 cmd)
848
849
850
851
{
	struct sk_buff *skb;
	int err;

852
	skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
853
854
855
	if (skb == NULL)
		return ERR_PTR(-ENOBUFS);

856
	err = ctrl_fill_info(family, portid, seq, 0, skb, cmd);
857
858
859
860
861
862
863
864
	if (err < 0) {
		nlmsg_free(skb);
		return ERR_PTR(err);
	}

	return skb;
}

865
866
867
868
static struct sk_buff *
ctrl_build_mcgrp_msg(struct genl_family *family,
		     const struct genl_multicast_group *grp,
		     int grp_id, u32 portid, int seq, u8 cmd)
869
870
871
872
873
874
875
876
{
	struct sk_buff *skb;
	int err;

	skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
	if (skb == NULL)
		return ERR_PTR(-ENOBUFS);

877
878
	err = ctrl_fill_mcgrp_info(family, grp, grp_id, portid,
				   seq, 0, skb, cmd);
879
880
881
882
883
884
885
886
	if (err < 0) {
		nlmsg_free(skb);
		return ERR_PTR(err);
	}

	return skb;
}

887
static const struct nla_policy ctrl_policy[CTRL_ATTR_MAX+1] = {
888
	[CTRL_ATTR_FAMILY_ID]	= { .type = NLA_U16 },
889
890
	[CTRL_ATTR_FAMILY_NAME]	= { .type = NLA_NUL_STRING,
				    .len = GENL_NAMSIZ - 1 },
891
892
893
894
895
896
897
898
899
900
901
};

static int ctrl_getfamily(struct sk_buff *skb, struct genl_info *info)
{
	struct sk_buff *msg;
	struct genl_family *res = NULL;
	int err = -EINVAL;

	if (info->attrs[CTRL_ATTR_FAMILY_ID]) {
		u16 id = nla_get_u16(info->attrs[CTRL_ATTR_FAMILY_ID]);
		res = genl_family_find_byid(id);
Johannes Berg's avatar
Johannes Berg committed
902
		err = -ENOENT;
903
904
905
	}

	if (info->attrs[CTRL_ATTR_FAMILY_NAME]) {
906
		char *name;
907

908
		name = nla_data(info->attrs[CTRL_ATTR_FAMILY_NAME]);
909
		res = genl_family_find_byname(name);
910
911
912
#ifdef CONFIG_MODULES
		if (res == NULL) {
			genl_unlock();
913
			up_read(&cb_lock);
914
			request_module("net-pf-%d-proto-%d-family-%s",
915
				       PF_NETLINK, NETLINK_GENERIC, name);
916
			down_read(&cb_lock);
917
918
919
920
			genl_lock();
			res = genl_family_find_byname(name);
		}
#endif
Johannes Berg's avatar
Johannes Berg committed
921
		err = -ENOENT;
922
923
	}

Johannes Berg's avatar
Johannes Berg committed
924
925
926
927
928
929
	if (res == NULL)
		return err;

	if (!res->netnsok && !net_eq(genl_info_net(info), &init_net)) {
		/* family doesn't exist here */
		return -ENOENT;
930
931
	}

932
	msg = ctrl_build_family_msg(res, info->snd_portid, info->snd_seq,
933
				    CTRL_CMD_NEWFAMILY);
Johannes Berg's avatar
Johannes Berg committed
934
935
	if (IS_ERR(msg))
		return PTR_ERR(msg);
936

Johannes Berg's avatar
Johannes Berg committed
937
	return genlmsg_reply(msg, info);
938
939
}

940
static int genl_ctrl_event(int event, struct genl_family *family,
941
942
			   const struct genl_multicast_group *grp,
			   int grp_id)
943
944
945
{
	struct sk_buff *msg;

Johannes Berg's avatar
Johannes Berg committed
946
947
	/* genl is still initialising */
	if (!init_net.genl_sock)
948
949
950
951
952
		return 0;

	switch (event) {
	case CTRL_CMD_NEWFAMILY:
	case CTRL_CMD_DELFAMILY:
953
		WARN_ON(grp);
Johannes Berg's avatar
Johannes Berg committed
954
		msg = ctrl_build_family_msg(family, 0, 0, event);
955
956
957
		break;
	case CTRL_CMD_NEWMCAST_GRP:
	case CTRL_CMD_DELMCAST_GRP:
958
		BUG_ON(!grp);
959
		msg = ctrl_build_mcgrp_msg(family, grp, grp_id, 0, 0, event);
960
		break;
Johannes Berg's avatar
Johannes Berg committed
961
962
963
964
965
966
967
968
	default:
		return -EINVAL;
	}

	if (IS_ERR(msg))
		return PTR_ERR(msg);

	if (!family->netnsok) {
969
		genlmsg_multicast_netns(&genl_ctrl, &init_net, msg, 0,
970
					0, GFP_KERNEL);
Johannes Berg's avatar
Johannes Berg committed
971
972
	} else {
		rcu_read_lock();
973
		genlmsg_multicast_allns(&genl_ctrl, msg, 0,
974
					0, GFP_ATOMIC);
Johannes Berg's avatar
Johannes Berg committed
975
		rcu_read_unlock();
976
977
978
979
980
	}

	return 0;
}

981
982
983
984
985
986
987
static struct genl_ops genl_ctrl_ops[] = {
	{
		.cmd		= CTRL_CMD_GETFAMILY,
		.doit		= ctrl_getfamily,
		.dumpit		= ctrl_dumpfamily,
		.policy		= ctrl_policy,
	},
988
989
};

990
991
static struct genl_multicast_group genl_ctrl_groups[] = {
	{ .name = "notify", },
992
993
};

994
static int genl_bind(struct net *net, int group)
995
{
996
	int i, err = -ENOENT;
997
998
999
1000
1001
1002
1003
1004
1005
1006

	down_read(&cb_lock);
	for (i = 0; i < GENL_FAM_TAB_SIZE; i++) {
		struct genl_family *f;

		list_for_each_entry(f, genl_family_chain(i), family_list) {
			if (group >= f->mcgrp_offset &&
			    group < f->mcgrp_offset + f->n_mcgrps) {
				int fam_grp = group - f->mcgrp_offset;

1007
1008
1009
1010
				if (!f->netnsok && net != &init_net)
					err = -ENOENT;
				else if (f->mcast_bind)
					err = f->mcast_bind(net, fam_grp);
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
				else
					err = 0;
				break;
			}
		}
	}
	up_read(&cb_lock);

	return err;
}

1022
static void genl_unbind(struct net *net, int group)
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
{
	int i;

	down_read(&cb_lock);
	for (i = 0; i < GENL_FAM_TAB_SIZE; i++) {
		struct genl_family *f;

		list_for_each_entry(f, genl_family_chain(i), family_list) {
			if (group >= f->mcgrp_offset &&
			    group < f->mcgrp_offset + f->n_mcgrps) {
				int fam_grp = group - f->mcgrp_offset;

				if (f->mcast_unbind)
1036
					f->mcast_unbind(net, fam_grp);
1037
1038
1039
1040
1041
1042
1043
				break;
			}
		}
	}
	up_read(&cb_lock);
}

Johannes Berg's avatar
Johannes Berg committed
1044
1045
static int __net_init genl_pernet_init(struct net *net)
{
1046
1047
	struct netlink_kernel_cfg cfg = {
		.input		= genl_rcv,
1048
		.flags		= NL_CFG_F_NONROOT_RECV,
1049
1050
		.bind		= genl_bind,
		.unbind		= genl_unbind,
1051
1052
	};

Johannes Berg's avatar
Johannes Berg committed
1053
	/* we'll bump the group number right afterwards */
1054
	net->genl_sock = netlink_kernel_create(net, NETLINK_GENERIC, &cfg);
Johannes Berg's avatar
Johannes Berg committed
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075

	if (!net->genl_sock && net_eq(net, &init_net))
		panic("GENL: Cannot initialize generic netlink\n");

	if (!net->genl_sock)
		return -ENOMEM;

	return 0;
}

static void __net_exit genl_pernet_exit(struct net *net)
{
	netlink_kernel_release(net->genl_sock);
	net->genl_sock = NULL;
}

static struct pernet_operations genl_pernet_ops = {
	.init = genl_pernet_init,
	.exit = genl_pernet_exit,
};