genetlink.c 25.6 KB
Newer Older
1
// SPDX-License-Identifier: GPL-2.0
T
Thomas Graf 已提交
2 3 4 5 6
/*
 * NETLINK      Generic Netlink Family
 *
 * 		Authors:	Jamal Hadi Salim
 * 				Thomas Graf <tgraf@suug.ch>
7
 *				Johannes Berg <johannes@sipsolutions.net>
T
Thomas Graf 已提交
8 9 10 11
 */

#include <linux/module.h>
#include <linux/kernel.h>
12
#include <linux/slab.h>
T
Thomas Graf 已提交
13 14 15 16 17
#include <linux/errno.h>
#include <linux/types.h>
#include <linux/socket.h>
#include <linux/string.h>
#include <linux/skbuff.h>
18
#include <linux/mutex.h>
19
#include <linux/bitmap.h>
20
#include <linux/rwsem.h>
21
#include <linux/idr.h>
T
Thomas Graf 已提交
22 23 24
#include <net/sock.h>
#include <net/genetlink.h>

25
static DEFINE_MUTEX(genl_mutex); /* serialization of message processing */
26
static DECLARE_RWSEM(cb_lock);
T
Thomas Graf 已提交
27

28 29 30
atomic_t genl_sk_destructing_cnt = ATOMIC_INIT(0);
DECLARE_WAIT_QUEUE_HEAD(genl_sk_destructing_waitq);

31
void genl_lock(void)
T
Thomas Graf 已提交
32
{
33
	mutex_lock(&genl_mutex);
T
Thomas Graf 已提交
34
}
35
EXPORT_SYMBOL(genl_lock);
T
Thomas Graf 已提交
36

37
void genl_unlock(void)
T
Thomas Graf 已提交
38
{
39
	mutex_unlock(&genl_mutex);
T
Thomas Graf 已提交
40
}
41
EXPORT_SYMBOL(genl_unlock);
T
Thomas Graf 已提交
42

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

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

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

63
static DEFINE_IDR(genl_fam_idr);
T
Thomas Graf 已提交
64

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;
T
Thomas Graf 已提交
88

89
static int genl_ctrl_event(int event, const struct genl_family *family,
90 91
			   const struct genl_multicast_group *grp,
			   int grp_id);
T
Thomas Graf 已提交
92

93
static const struct genl_family *genl_family_find_byid(unsigned int id)
T
Thomas Graf 已提交
94
{
95
	return idr_find(&genl_fam_idr, id);
T
Thomas Graf 已提交
96 97
}

98
static const struct genl_family *genl_family_find_byname(char *name)
T
Thomas Graf 已提交
99
{
100 101
	const struct genl_family *family;
	unsigned int id;
T
Thomas Graf 已提交
102

103 104 105
	idr_for_each_entry(&genl_fam_idr, family, id)
		if (strcmp(family->name, name) == 0)
			return family;
T
Thomas Graf 已提交
106 107 108 109

	return NULL;
}

110 111
static const struct genl_ops *genl_get_cmd(u8 cmd,
					   const struct genl_family *family)
T
Thomas Graf 已提交
112
{
113
	int i;
T
Thomas Graf 已提交
114

115 116 117
	for (i = 0; i < family->n_ops; i++)
		if (family->ops[i].cmd == cmd)
			return &family->ops[i];
T
Thomas Graf 已提交
118 119 120 121

	return NULL;
}

122
static int genl_allocate_reserve_groups(int n_groups, int *first_id)
123 124
{
	unsigned long *new_groups;
125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
	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;
			}
		}
151

152
		if (id + n_groups > mc_groups_longs * BITS_PER_LONG) {
153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
			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);
175

176 177 178 179 180 181 182 183 184 185 186 187
	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;
188
	int err = 0, i;
189 190 191 192 193 194 195 196 197 198 199 200 201
	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;
	}
202

203
	/* special-case our own group and hacks */
204 205 206 207 208 209
	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);
210
	} else if (family->id == GENL_ID_VFS_DQUOT) {
211 212
		first_id = GENL_ID_VFS_DQUOT;
		BUG_ON(n_groups != 1);
213 214 215
	} else if (family->id == GENL_ID_PMCRAID) {
		first_id = GENL_ID_PMCRAID;
		BUG_ON(n_groups != 1);
216 217 218 219 220
	} else {
		groups_allocated = true;
		err = genl_allocate_reserve_groups(n_groups, &first_id);
		if (err)
			return err;
221 222
	}

223 224 225 226 227 228
	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;

J
Johannes Berg 已提交
229 230 231
	if (family->netnsok) {
		struct net *net;

232
		netlink_table_grab();
J
Johannes Berg 已提交
233 234
		rcu_read_lock();
		for_each_net_rcu(net) {
235
			err = __netlink_change_ngroups(net->genl_sock,
J
Johannes Berg 已提交
236 237 238 239 240 241 242 243
					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.
				 */
244
				break;
J
Johannes Berg 已提交
245 246 247
			}
		}
		rcu_read_unlock();
248
		netlink_table_ungrab();
J
Johannes Berg 已提交
249 250 251 252
	} else {
		err = netlink_change_ngroups(init_net.genl_sock,
					     mc_groups_longs * BITS_PER_LONG);
	}
253

254 255 256 257
	if (groups_allocated && err) {
		for (i = 0; i < family->n_mcgrps; i++)
			clear_bit(family->mcgrp_offset + i, mc_groups);
	}
258

259
	return err;
260 261
}

262
static void genl_unregister_mc_groups(const struct genl_family *family)
263
{
J
Johannes Berg 已提交
264
	struct net *net;
265
	int i;
J
Johannes Berg 已提交
266

267
	netlink_table_grab();
J
Johannes Berg 已提交
268
	rcu_read_lock();
269 270 271 272 273
	for_each_net_rcu(net) {
		for (i = 0; i < family->n_mcgrps; i++)
			__netlink_clear_multicast_users(
				net->genl_sock, family->mcgrp_offset + i);
	}
J
Johannes Berg 已提交
274
	rcu_read_unlock();
275
	netlink_table_ungrab();
J
Johannes Berg 已提交
276

277 278
	for (i = 0; i < family->n_mcgrps; i++) {
		int grp_id = family->mcgrp_offset + i;
279

280 281 282 283 284
		if (grp_id != 1)
			clear_bit(grp_id, mc_groups);
		genl_ctrl_event(CTRL_CMD_DELMCAST_GRP, family,
				&family->mcgrps[i], grp_id);
	}
285 286
}

287
static int genl_validate_ops(const struct genl_family *family)
T
Thomas Graf 已提交
288
{
289 290
	const struct genl_ops *ops = family->ops;
	unsigned int n_ops = family->n_ops;
291 292
	int i, j;

293 294 295 296 297 298
	if (WARN_ON(n_ops && !ops))
		return -EINVAL;

	if (!n_ops)
		return 0;

299 300 301 302 303 304
	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;
T
Thomas Graf 已提交
305 306
	}

307
	return 0;
T
Thomas Graf 已提交
308 309 310
}

/**
311
 * genl_register_family - register a generic netlink family
T
Thomas Graf 已提交
312 313 314 315 316
 * @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.
 *
317 318
 * The family's ops, multicast groups and module pointer must already
 * be assigned.
319
 *
T
Thomas Graf 已提交
320 321
 * Return 0 on success or a negative error code.
 */
322
int genl_register_family(struct genl_family *family)
T
Thomas Graf 已提交
323
{
324
	int err, i;
325
	int start = GENL_START_ALLOC, end = GENL_MAX_ID;
T
Thomas Graf 已提交
326

327 328 329 330
	err = genl_validate_ops(family);
	if (err)
		return err;

331
	genl_lock_all();
T
Thomas Graf 已提交
332 333 334 335 336 337

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

338 339 340 341 342 343 344
	/*
	 * Sadly, a few cases need to be special-cased
	 * due to them having previously abused the API
	 * and having used their family ID also as their
	 * multicast group ID, so we use reserved IDs
	 * for both to be sure we can do that mapping.
	 */
345
	if (family == &genl_ctrl) {
346 347 348 349 350 351
		/* and this needs to be special for initial family lookups */
		start = end = GENL_ID_CTRL;
	} else if (strcmp(family->name, "pmcraid") == 0) {
		start = end = GENL_ID_PMCRAID;
	} else if (strcmp(family->name, "VFS_DQUOT") == 0) {
		start = end = GENL_ID_VFS_DQUOT;
T
Thomas Graf 已提交
352 353
	}

354
	if (family->maxattr && !family->parallel_ops) {
355 356 357
		family->attrbuf = kmalloc_array(family->maxattr + 1,
						sizeof(struct nlattr *),
						GFP_KERNEL);
T
Thomas Graf 已提交
358 359
		if (family->attrbuf == NULL) {
			err = -ENOMEM;
360
			goto errout_locked;
T
Thomas Graf 已提交
361 362 363 364
		}
	} else
		family->attrbuf = NULL;

365 366
	family->id = idr_alloc(&genl_fam_idr, family,
			       start, end + 1, GFP_KERNEL);
367 368
	if (family->id < 0) {
		err = family->id;
369
		goto errout_free;
370
	}
371

372 373
	err = genl_validate_assign_mc_groups(family);
	if (err)
374
		goto errout_remove;
375

376
	genl_unlock_all();
T
Thomas Graf 已提交
377

378 379 380 381 382
	/* 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);
T
Thomas Graf 已提交
383 384 385

	return 0;

386 387
errout_remove:
	idr_remove(&genl_fam_idr, family->id);
388
errout_free:
389
	kfree(family->attrbuf);
T
Thomas Graf 已提交
390
errout_locked:
391
	genl_unlock_all();
T
Thomas Graf 已提交
392 393
	return err;
}
394
EXPORT_SYMBOL(genl_register_family);
T
Thomas Graf 已提交
395 396 397 398 399 400 401 402 403

/**
 * genl_unregister_family - unregister generic netlink family
 * @family: generic netlink family
 *
 * Unregisters the specified family.
 *
 * Returns 0 on success or a negative error code.
 */
404
int genl_unregister_family(const struct genl_family *family)
T
Thomas Graf 已提交
405
{
406
	genl_lock_all();
T
Thomas Graf 已提交
407

408
	if (!genl_family_find_byid(family->id)) {
409 410 411
		genl_unlock_all();
		return -ENOENT;
	}
T
Thomas Graf 已提交
412

413
	genl_unregister_mc_groups(family);
414

415
	idr_remove(&genl_fam_idr, family->id);
T
Thomas Graf 已提交
416

417 418 419 420
	up_write(&cb_lock);
	wait_event(genl_sk_destructing_waitq,
		   atomic_read(&genl_sk_destructing_cnt) == 0);
	genl_unlock();
T
Thomas Graf 已提交
421

422
	kfree(family->attrbuf);
T
Thomas Graf 已提交
423

424 425 426
	genl_ctrl_event(CTRL_CMD_DELFAMILY, family, NULL, 0);

	return 0;
T
Thomas Graf 已提交
427
}
428
EXPORT_SYMBOL(genl_unregister_family);
T
Thomas Graf 已提交
429

430 431 432
/**
 * genlmsg_put - Add generic netlink header to netlink message
 * @skb: socket buffer holding the message
433
 * @portid: netlink portid the message is addressed to
434 435
 * @seq: sequence number (usually the one of the sender)
 * @family: generic netlink family
436
 * @flags: netlink message flags
437 438 439 440
 * @cmd: generic netlink command
 *
 * Returns pointer to user specific header
 */
441
void *genlmsg_put(struct sk_buff *skb, u32 portid, u32 seq,
442
		  const struct genl_family *family, int flags, u8 cmd)
443 444 445 446
{
	struct nlmsghdr *nlh;
	struct genlmsghdr *hdr;

447
	nlh = nlmsg_put(skb, portid, seq, family->id, GENL_HDRLEN +
448 449 450 451 452 453 454 455 456 457 458 459 460
			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);

461 462 463 464 465 466 467 468 469 470 471 472 473 474
static int genl_lock_start(struct netlink_callback *cb)
{
	/* our ops are always const - netlink API doesn't propagate that */
	const struct genl_ops *ops = cb->data;
	int rc = 0;

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

475 476
static int genl_lock_dumpit(struct sk_buff *skb, struct netlink_callback *cb)
{
J
Johannes Berg 已提交
477 478
	/* our ops are always const - netlink API doesn't propagate that */
	const struct genl_ops *ops = cb->data;
479 480 481 482 483 484 485 486 487 488
	int rc;

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

static int genl_lock_done(struct netlink_callback *cb)
{
J
Johannes Berg 已提交
489 490
	/* our ops are always const - netlink API doesn't propagate that */
	const struct genl_ops *ops = cb->data;
491 492 493 494 495 496 497 498 499 500
	int rc = 0;

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

501
static int genl_family_rcv_msg(const struct genl_family *family,
502
			       struct sk_buff *skb,
503 504
			       struct nlmsghdr *nlh,
			       struct netlink_ext_ack *extack)
T
Thomas Graf 已提交
505
{
J
Johannes Berg 已提交
506
	const struct genl_ops *ops;
J
Johannes Berg 已提交
507
	struct net *net = sock_net(skb->sk);
T
Thomas Graf 已提交
508 509
	struct genl_info info;
	struct genlmsghdr *hdr = nlmsg_data(nlh);
510
	struct nlattr **attrbuf;
511
	int hdrlen, err;
T
Thomas Graf 已提交
512

J
Johannes Berg 已提交
513 514 515 516
	/* this family doesn't exist in this netns */
	if (!family->netnsok && !net_eq(net, &init_net))
		return -ENOENT;

T
Thomas Graf 已提交
517 518
	hdrlen = GENL_HDRLEN + family->hdrsize;
	if (nlh->nlmsg_len < nlmsg_msg_size(hdrlen))
519
		return -EINVAL;
T
Thomas Graf 已提交
520 521

	ops = genl_get_cmd(hdr->cmd, family);
522 523
	if (ops == NULL)
		return -EOPNOTSUPP;
T
Thomas Graf 已提交
524

525
	if ((ops->flags & GENL_ADMIN_PERM) &&
526
	    !netlink_capable(skb, CAP_NET_ADMIN))
527
		return -EPERM;
T
Thomas Graf 已提交
528

529 530 531 532
	if ((ops->flags & GENL_UNS_ADMIN_PERM) &&
	    !netlink_ns_capable(skb, net->user_ns, CAP_NET_ADMIN))
		return -EPERM;

533
	if ((nlh->nlmsg_flags & NLM_F_DUMP) == NLM_F_DUMP) {
534
		int rc;
535

536 537
		if (ops->dumpit == NULL)
			return -EOPNOTSUPP;
T
Thomas Graf 已提交
538

539 540
		if (!family->parallel_ops) {
			struct netlink_dump_control c = {
541
				.module = family->module,
J
Johannes Berg 已提交
542 543
				/* we have const, but the netlink API doesn't */
				.data = (void *)ops,
544
				.start = genl_lock_start,
545 546 547 548 549
				.dump = genl_lock_dumpit,
				.done = genl_lock_done,
			};

			genl_unlock();
550
			rc = __netlink_dump_start(net->genl_sock, skb, nlh, &c);
551 552 553 554
			genl_lock();

		} else {
			struct netlink_dump_control c = {
555
				.module = family->module,
556
				.start = ops->start,
557 558 559 560
				.dump = ops->dumpit,
				.done = ops->done,
			};

561
			rc = __netlink_dump_start(net->genl_sock, skb, nlh, &c);
562 563 564
		}

		return rc;
T
Thomas Graf 已提交
565 566
	}

567 568
	if (ops->doit == NULL)
		return -EOPNOTSUPP;
T
Thomas Graf 已提交
569

570
	if (family->maxattr && family->parallel_ops) {
571 572 573
		attrbuf = kmalloc_array(family->maxattr + 1,
					sizeof(struct nlattr *),
					GFP_KERNEL);
574 575 576 577 578 579 580
		if (attrbuf == NULL)
			return -ENOMEM;
	} else
		attrbuf = family->attrbuf;

	if (attrbuf) {
		err = nlmsg_parse(nlh, hdrlen, attrbuf, family->maxattr,
581
				  ops->policy, extack);
T
Thomas Graf 已提交
582
		if (err < 0)
583
			goto out;
T
Thomas Graf 已提交
584 585 586
	}

	info.snd_seq = nlh->nlmsg_seq;
587
	info.snd_portid = NETLINK_CB(skb).portid;
T
Thomas Graf 已提交
588 589 590
	info.nlhdr = nlh;
	info.genlhdr = nlmsg_data(nlh);
	info.userhdr = nlmsg_data(nlh) + GENL_HDRLEN;
591
	info.attrs = attrbuf;
592
	info.extack = extack;
J
Johannes Berg 已提交
593
	genl_info_net_set(&info, net);
594
	memset(&info.user_ptr, 0, sizeof(info.user_ptr));
T
Thomas Graf 已提交
595

596 597 598
	if (family->pre_doit) {
		err = family->pre_doit(ops, skb, &info);
		if (err)
599
			goto out;
600 601 602 603 604 605 606
	}

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

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

607
out:
608 609 610 611 612 613
	if (family->parallel_ops)
		kfree(attrbuf);

	return err;
}

J
Johannes Berg 已提交
614 615
static int genl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh,
			struct netlink_ext_ack *extack)
616
{
617
	const struct genl_family *family;
618 619 620 621 622 623 624 625 626
	int err;

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

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

627
	err = genl_family_rcv_msg(family, skb, nlh, extack);
628 629 630 631

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

632
	return err;
T
Thomas Graf 已提交
633 634
}

635
static void genl_rcv(struct sk_buff *skb)
T
Thomas Graf 已提交
636
{
637
	down_read(&cb_lock);
638
	netlink_rcv_skb(skb, &genl_rcv_msg);
639
	up_read(&cb_lock);
T
Thomas Graf 已提交
640 641 642 643 644 645
}

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

646
static struct genl_family genl_ctrl;
647

648
static int ctrl_fill_info(const struct genl_family *family, u32 portid, u32 seq,
T
Thomas Graf 已提交
649 650 651 652
			  u32 flags, struct sk_buff *skb, u8 cmd)
{
	void *hdr;

653
	hdr = genlmsg_put(skb, portid, seq, &genl_ctrl, flags, cmd);
T
Thomas Graf 已提交
654 655 656
	if (hdr == NULL)
		return -1;

657 658 659 660 661 662
	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;
663

664
	if (family->n_ops) {
665
		struct nlattr *nla_ops;
666
		int i;
667

668 669
		nla_ops = nla_nest_start(skb, CTRL_ATTR_OPS);
		if (nla_ops == NULL)
670 671
			goto nla_put_failure;

672
		for (i = 0; i < family->n_ops; i++) {
673
			struct nlattr *nest;
J
Johannes Berg 已提交
674
			const struct genl_ops *ops = &family->ops[i];
675
			u32 op_flags = ops->flags;
J
Johannes Berg 已提交
676 677

			if (ops->dumpit)
678
				op_flags |= GENL_CMD_CAP_DUMP;
J
Johannes Berg 已提交
679
			if (ops->doit)
680
				op_flags |= GENL_CMD_CAP_DO;
J
Johannes Berg 已提交
681
			if (ops->policy)
682
				op_flags |= GENL_CMD_CAP_HASPOL;
683

684
			nest = nla_nest_start(skb, i + 1);
685 686
			if (nest == NULL)
				goto nla_put_failure;
687

688
			if (nla_put_u32(skb, CTRL_ATTR_OP_ID, ops->cmd) ||
689
			    nla_put_u32(skb, CTRL_ATTR_OP_FLAGS, op_flags))
690
				goto nla_put_failure;
691

692 693 694 695 696
			nla_nest_end(skb, nest);
		}

		nla_nest_end(skb, nla_ops);
	}
T
Thomas Graf 已提交
697

698
	if (family->n_mcgrps) {
699
		struct nlattr *nla_grps;
700
		int i;
701 702 703 704 705

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

706
		for (i = 0; i < family->n_mcgrps; i++) {
707
			struct nlattr *nest;
708
			const struct genl_multicast_group *grp;
709

710 711 712
			grp = &family->mcgrps[i];

			nest = nla_nest_start(skb, i + 1);
713 714 715
			if (nest == NULL)
				goto nla_put_failure;

716 717
			if (nla_put_u32(skb, CTRL_ATTR_MCAST_GRP_ID,
					family->mcgrp_offset + i) ||
718 719 720
			    nla_put_string(skb, CTRL_ATTR_MCAST_GRP_NAME,
					   grp->name))
				goto nla_put_failure;
721 722 723 724 725 726

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

727 728
	genlmsg_end(skb, hdr);
	return 0;
729 730

nla_put_failure:
731 732
	genlmsg_cancel(skb, hdr);
	return -EMSGSIZE;
733 734
}

735
static int ctrl_fill_mcgrp_info(const struct genl_family *family,
736 737 738
				const struct genl_multicast_group *grp,
				int grp_id, u32 portid, u32 seq, u32 flags,
				struct sk_buff *skb, u8 cmd)
739 740 741 742 743
{
	void *hdr;
	struct nlattr *nla_grps;
	struct nlattr *nest;

744
	hdr = genlmsg_put(skb, portid, seq, &genl_ctrl, flags, cmd);
745 746 747
	if (hdr == NULL)
		return -1;

748 749
	if (nla_put_string(skb, CTRL_ATTR_FAMILY_NAME, family->name) ||
	    nla_put_u16(skb, CTRL_ATTR_FAMILY_ID, family->id))
750
		goto nla_put_failure;
751 752 753 754 755 756 757 758 759

	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;

760
	if (nla_put_u32(skb, CTRL_ATTR_MCAST_GRP_ID, grp_id) ||
761 762 763
	    nla_put_string(skb, CTRL_ATTR_MCAST_GRP_NAME,
			   grp->name))
		goto nla_put_failure;
764 765 766 767

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

768 769
	genlmsg_end(skb, hdr);
	return 0;
T
Thomas Graf 已提交
770 771

nla_put_failure:
772 773
	genlmsg_cancel(skb, hdr);
	return -EMSGSIZE;
T
Thomas Graf 已提交
774 775 776 777
}

static int ctrl_dumpfamily(struct sk_buff *skb, struct netlink_callback *cb)
{
778
	int n = 0;
T
Thomas Graf 已提交
779
	struct genl_family *rt;
J
Johannes Berg 已提交
780
	struct net *net = sock_net(skb->sk);
781 782
	int fams_to_skip = cb->args[0];
	unsigned int id;
T
Thomas Graf 已提交
783

784 785 786 787 788 789
	idr_for_each_entry(&genl_fam_idr, rt, id) {
		if (!rt->netnsok && !net_eq(net, &init_net))
			continue;

		if (n++ < fams_to_skip)
			continue;
T
Thomas Graf 已提交
790

791 792
		if (ctrl_fill_info(rt, NETLINK_CB(cb->skb).portid,
				   cb->nlh->nlmsg_seq, NLM_F_MULTI,
793 794
				   skb, CTRL_CMD_NEWFAMILY) < 0) {
			n--;
795
			break;
796
		}
797
	}
T
Thomas Graf 已提交
798

799
	cb->args[0] = n;
T
Thomas Graf 已提交
800 801 802
	return skb->len;
}

803
static struct sk_buff *ctrl_build_family_msg(const struct genl_family *family,
804
					     u32 portid, int seq, u8 cmd)
T
Thomas Graf 已提交
805 806 807 808
{
	struct sk_buff *skb;
	int err;

809
	skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
T
Thomas Graf 已提交
810 811 812
	if (skb == NULL)
		return ERR_PTR(-ENOBUFS);

813
	err = ctrl_fill_info(family, portid, seq, 0, skb, cmd);
T
Thomas Graf 已提交
814 815 816 817 818 819 820 821
	if (err < 0) {
		nlmsg_free(skb);
		return ERR_PTR(err);
	}

	return skb;
}

822
static struct sk_buff *
823
ctrl_build_mcgrp_msg(const struct genl_family *family,
824 825
		     const struct genl_multicast_group *grp,
		     int grp_id, u32 portid, int seq, u8 cmd)
826 827 828 829 830 831 832 833
{
	struct sk_buff *skb;
	int err;

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

834 835
	err = ctrl_fill_mcgrp_info(family, grp, grp_id, portid,
				   seq, 0, skb, cmd);
836 837 838 839 840 841 842 843
	if (err < 0) {
		nlmsg_free(skb);
		return ERR_PTR(err);
	}

	return skb;
}

844
static const struct nla_policy ctrl_policy[CTRL_ATTR_MAX+1] = {
T
Thomas Graf 已提交
845
	[CTRL_ATTR_FAMILY_ID]	= { .type = NLA_U16 },
846 847
	[CTRL_ATTR_FAMILY_NAME]	= { .type = NLA_NUL_STRING,
				    .len = GENL_NAMSIZ - 1 },
T
Thomas Graf 已提交
848 849 850 851 852
};

static int ctrl_getfamily(struct sk_buff *skb, struct genl_info *info)
{
	struct sk_buff *msg;
853
	const struct genl_family *res = NULL;
T
Thomas Graf 已提交
854 855 856 857 858
	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);
J
Johannes Berg 已提交
859
		err = -ENOENT;
T
Thomas Graf 已提交
860 861 862
	}

	if (info->attrs[CTRL_ATTR_FAMILY_NAME]) {
863
		char *name;
T
Thomas Graf 已提交
864

865
		name = nla_data(info->attrs[CTRL_ATTR_FAMILY_NAME]);
T
Thomas Graf 已提交
866
		res = genl_family_find_byname(name);
867 868 869
#ifdef CONFIG_MODULES
		if (res == NULL) {
			genl_unlock();
870
			up_read(&cb_lock);
871
			request_module("net-pf-%d-proto-%d-family-%s",
872
				       PF_NETLINK, NETLINK_GENERIC, name);
873
			down_read(&cb_lock);
874 875 876 877
			genl_lock();
			res = genl_family_find_byname(name);
		}
#endif
J
Johannes Berg 已提交
878
		err = -ENOENT;
T
Thomas Graf 已提交
879 880
	}

J
Johannes Berg 已提交
881 882 883 884 885 886
	if (res == NULL)
		return err;

	if (!res->netnsok && !net_eq(genl_info_net(info), &init_net)) {
		/* family doesn't exist here */
		return -ENOENT;
T
Thomas Graf 已提交
887 888
	}

889
	msg = ctrl_build_family_msg(res, info->snd_portid, info->snd_seq,
890
				    CTRL_CMD_NEWFAMILY);
J
Johannes Berg 已提交
891 892
	if (IS_ERR(msg))
		return PTR_ERR(msg);
T
Thomas Graf 已提交
893

J
Johannes Berg 已提交
894
	return genlmsg_reply(msg, info);
T
Thomas Graf 已提交
895 896
}

897
static int genl_ctrl_event(int event, const struct genl_family *family,
898 899
			   const struct genl_multicast_group *grp,
			   int grp_id)
T
Thomas Graf 已提交
900 901 902
{
	struct sk_buff *msg;

J
Johannes Berg 已提交
903 904
	/* genl is still initialising */
	if (!init_net.genl_sock)
T
Thomas Graf 已提交
905 906 907 908 909
		return 0;

	switch (event) {
	case CTRL_CMD_NEWFAMILY:
	case CTRL_CMD_DELFAMILY:
910
		WARN_ON(grp);
J
Johannes Berg 已提交
911
		msg = ctrl_build_family_msg(family, 0, 0, event);
912 913 914
		break;
	case CTRL_CMD_NEWMCAST_GRP:
	case CTRL_CMD_DELMCAST_GRP:
915
		BUG_ON(!grp);
916
		msg = ctrl_build_mcgrp_msg(family, grp, grp_id, 0, 0, event);
T
Thomas Graf 已提交
917
		break;
J
Johannes Berg 已提交
918 919 920 921 922 923 924 925
	default:
		return -EINVAL;
	}

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

	if (!family->netnsok) {
926
		genlmsg_multicast_netns(&genl_ctrl, &init_net, msg, 0,
927
					0, GFP_KERNEL);
J
Johannes Berg 已提交
928 929
	} else {
		rcu_read_lock();
930
		genlmsg_multicast_allns(&genl_ctrl, msg, 0,
931
					0, GFP_ATOMIC);
J
Johannes Berg 已提交
932
		rcu_read_unlock();
T
Thomas Graf 已提交
933 934 935 936 937
	}

	return 0;
}

938
static const struct genl_ops genl_ctrl_ops[] = {
939 940 941 942 943 944
	{
		.cmd		= CTRL_CMD_GETFAMILY,
		.doit		= ctrl_getfamily,
		.dumpit		= ctrl_dumpfamily,
		.policy		= ctrl_policy,
	},
T
Thomas Graf 已提交
945 946
};

947
static const struct genl_multicast_group genl_ctrl_groups[] = {
948
	{ .name = "notify", },
949 950
};

951
static struct genl_family genl_ctrl __ro_after_init = {
952 953 954 955 956 957 958 959 960 961 962 963
	.module = THIS_MODULE,
	.ops = genl_ctrl_ops,
	.n_ops = ARRAY_SIZE(genl_ctrl_ops),
	.mcgrps = genl_ctrl_groups,
	.n_mcgrps = ARRAY_SIZE(genl_ctrl_groups),
	.id = GENL_ID_CTRL,
	.name = "nlctrl",
	.version = 0x2,
	.maxattr = CTRL_ATTR_MAX,
	.netnsok = true,
};

964
static int genl_bind(struct net *net, int group)
965
{
966 967 968
	struct genl_family *f;
	int err = -ENOENT;
	unsigned int id;
969 970

	down_read(&cb_lock);
971 972 973 974 975 976 977 978 979 980 981 982 983

	idr_for_each_entry(&genl_fam_idr, f, id) {
		if (group >= f->mcgrp_offset &&
		    group < f->mcgrp_offset + f->n_mcgrps) {
			int fam_grp = group - f->mcgrp_offset;

			if (!f->netnsok && net != &init_net)
				err = -ENOENT;
			else if (f->mcast_bind)
				err = f->mcast_bind(net, fam_grp);
			else
				err = 0;
			break;
984 985 986 987 988 989 990
		}
	}
	up_read(&cb_lock);

	return err;
}

991
static void genl_unbind(struct net *net, int group)
992
{
993 994
	struct genl_family *f;
	unsigned int id;
995 996 997

	down_read(&cb_lock);

998 999 1000 1001
	idr_for_each_entry(&genl_fam_idr, f, id) {
		if (group >= f->mcgrp_offset &&
		    group < f->mcgrp_offset + f->n_mcgrps) {
			int fam_grp = group - f->mcgrp_offset;
1002

1003 1004 1005
			if (f->mcast_unbind)
				f->mcast_unbind(net, fam_grp);
			break;
1006 1007 1008 1009 1010
		}
	}
	up_read(&cb_lock);
}

J
Johannes Berg 已提交
1011 1012
static int __net_init genl_pernet_init(struct net *net)
{
1013 1014
	struct netlink_kernel_cfg cfg = {
		.input		= genl_rcv,
1015
		.flags		= NL_CFG_F_NONROOT_RECV,
1016 1017
		.bind		= genl_bind,
		.unbind		= genl_unbind,
1018 1019
	};

J
Johannes Berg 已提交
1020
	/* we'll bump the group number right afterwards */
1021
	net->genl_sock = netlink_kernel_create(net, NETLINK_GENERIC, &cfg);
J
Johannes Berg 已提交
1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042

	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,
};

T
Thomas Graf 已提交
1043 1044
static int __init genl_init(void)
{
1045
	int err;
T
Thomas Graf 已提交
1046

1047
	err = genl_register_family(&genl_ctrl);
T
Thomas Graf 已提交
1048
	if (err < 0)
J
Johannes Berg 已提交
1049
		goto problem;
T
Thomas Graf 已提交
1050

J
Johannes Berg 已提交
1051 1052 1053
	err = register_pernet_subsys(&genl_pernet_ops);
	if (err)
		goto problem;
T
Thomas Graf 已提交
1054 1055 1056

	return 0;

J
Johannes Berg 已提交
1057
problem:
T
Thomas Graf 已提交
1058 1059 1060 1061 1062
	panic("GENL: Cannot register controller: %d\n", err);
}

subsys_initcall(genl_init);

1063 1064 1065 1066 1067 1068 1069 1070 1071 1072
/**
 * genl_family_attrbuf - return family's attrbuf
 * @family: the family
 *
 * Return the family's attrbuf, while validating that it's
 * actually valid to access it.
 *
 * You cannot use this function with a family that has parallel_ops
 * and you can only use it within (pre/post) doit/dumpit callbacks.
 */
1073
struct nlattr **genl_family_attrbuf(const struct genl_family *family)
1074 1075 1076 1077 1078 1079 1080 1081
{
	if (!WARN_ON(family->parallel_ops))
		lockdep_assert_held(&genl_mutex);

	return family->attrbuf;
}
EXPORT_SYMBOL(genl_family_attrbuf);

1082
static int genlmsg_mcast(struct sk_buff *skb, u32 portid, unsigned long group,
J
Johannes Berg 已提交
1083 1084 1085 1086
			 gfp_t flags)
{
	struct sk_buff *tmp;
	struct net *net, *prev = NULL;
1087
	bool delivered = false;
J
Johannes Berg 已提交
1088 1089 1090 1091 1092 1093 1094 1095 1096 1097
	int err;

	for_each_net_rcu(net) {
		if (prev) {
			tmp = skb_clone(skb, flags);
			if (!tmp) {
				err = -ENOMEM;
				goto error;
			}
			err = nlmsg_multicast(prev->genl_sock, tmp,
1098
					      portid, group, flags);
1099 1100 1101
			if (!err)
				delivered = true;
			else if (err != -ESRCH)
J
Johannes Berg 已提交
1102 1103 1104 1105 1106 1107
				goto error;
		}

		prev = net;
	}

1108 1109 1110 1111
	err = nlmsg_multicast(prev->genl_sock, skb, portid, group, flags);
	if (!err)
		delivered = true;
	else if (err != -ESRCH)
1112
		return err;
1113
	return delivered ? 0 : -ESRCH;
J
Johannes Berg 已提交
1114 1115 1116 1117 1118
 error:
	kfree_skb(skb);
	return err;
}

1119 1120 1121
int genlmsg_multicast_allns(const struct genl_family *family,
			    struct sk_buff *skb, u32 portid,
			    unsigned int group, gfp_t flags)
J
Johannes Berg 已提交
1122
{
1123
	if (WARN_ON_ONCE(group >= family->n_mcgrps))
1124 1125
		return -EINVAL;
	group = family->mcgrp_offset + group;
1126
	return genlmsg_mcast(skb, portid, group, flags);
J
Johannes Berg 已提交
1127 1128
}
EXPORT_SYMBOL(genlmsg_multicast_allns);
P
Pravin B Shelar 已提交
1129

1130
void genl_notify(const struct genl_family *family, struct sk_buff *skb,
J
Jiri Benc 已提交
1131
		 struct genl_info *info, u32 group, gfp_t flags)
P
Pravin B Shelar 已提交
1132
{
J
Jiri Benc 已提交
1133
	struct net *net = genl_info_net(info);
P
Pravin B Shelar 已提交
1134 1135 1136
	struct sock *sk = net->genl_sock;
	int report = 0;

J
Jiri Benc 已提交
1137 1138
	if (info->nlhdr)
		report = nlmsg_report(info->nlhdr);
P
Pravin B Shelar 已提交
1139

1140
	if (WARN_ON_ONCE(group >= family->n_mcgrps))
1141 1142
		return;
	group = family->mcgrp_offset + group;
J
Jiri Benc 已提交
1143
	nlmsg_notify(sk, skb, info->snd_portid, group, report, flags);
P
Pravin B Shelar 已提交
1144 1145
}
EXPORT_SYMBOL(genl_notify);