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