linux/net/netlink/genetlink.c
<<
>>
Prefs
   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
  23static DEFINE_MUTEX(genl_mutex); /* serialization of message processing */
  24static DECLARE_RWSEM(cb_lock);
  25
  26atomic_t genl_sk_destructing_cnt = ATOMIC_INIT(0);
  27DECLARE_WAIT_QUEUE_HEAD(genl_sk_destructing_waitq);
  28
  29void genl_lock(void)
  30{
  31        mutex_lock(&genl_mutex);
  32}
  33EXPORT_SYMBOL(genl_lock);
  34
  35void genl_unlock(void)
  36{
  37        mutex_unlock(&genl_mutex);
  38}
  39EXPORT_SYMBOL(genl_unlock);
  40
  41#ifdef CONFIG_LOCKDEP
  42bool lockdep_genl_is_held(void)
  43{
  44        return lockdep_is_held(&genl_mutex);
  45}
  46EXPORT_SYMBOL(lockdep_genl_is_held);
  47#endif
  48
  49static void genl_lock_all(void)
  50{
  51        down_write(&cb_lock);
  52        genl_lock();
  53}
  54
  55static void genl_unlock_all(void)
  56{
  57        genl_unlock();
  58        up_write(&cb_lock);
  59}
  60
  61#define GENL_FAM_TAB_SIZE       16
  62#define GENL_FAM_TAB_MASK       (GENL_FAM_TAB_SIZE - 1)
  63
  64static struct list_head family_ht[GENL_FAM_TAB_SIZE];
  65/*
  66 * Bitmap of multicast groups that are currently in use.
  67 *
  68 * To avoid an allocation at boot of just one unsigned long,
  69 * declare it global instead.
  70 * Bit 0 is marked as already used since group 0 is invalid.
  71 * Bit 1 is marked as already used since the drop-monitor code
  72 * abuses the API and thinks it can statically use group 1.
  73 * That group will typically conflict with other groups that
  74 * any proper users use.
  75 * Bit 16 is marked as used since it's used for generic netlink
  76 * and the code no longer marks pre-reserved IDs as used.
  77 * Bit 17 is marked as already used since the VFS quota code
  78 * also abused this API and relied on family == group ID, we
  79 * cater to that by giving it a static family and group ID.
  80 * Bit 18 is marked as already used since the PMCRAID driver
  81 * did the same thing as the VFS quota code (maybe copied?)
  82 */
  83static unsigned long mc_group_start = 0x3 | BIT(GENL_ID_CTRL) |
  84                                      BIT(GENL_ID_VFS_DQUOT) |
  85                                      BIT(GENL_ID_PMCRAID);
  86static unsigned long *mc_groups = &mc_group_start;
  87static unsigned long mc_groups_longs = 1;
  88
  89static int genl_ctrl_event(int event, struct genl_family *family,
  90                           const struct genl_multicast_group *grp,
  91                           int grp_id);
  92
  93static inline unsigned int genl_family_hash(unsigned int id)
  94{
  95        return id & GENL_FAM_TAB_MASK;
  96}
  97
  98static inline struct list_head *genl_family_chain(unsigned int id)
  99{
 100        return &family_ht[genl_family_hash(id)];
 101}
 102
 103static struct genl_family *genl_family_find_byid(unsigned int id)
 104{
 105        struct genl_family *f;
 106
 107        list_for_each_entry(f, genl_family_chain(id), family_list)
 108                if (f->id == id)
 109                        return f;
 110
 111        return NULL;
 112}
 113
 114static struct genl_family *genl_family_find_byname(char *name)
 115{
 116        struct genl_family *f;
 117        int i;
 118
 119        for (i = 0; i < GENL_FAM_TAB_SIZE; i++)
 120                list_for_each_entry(f, genl_family_chain(i), family_list)
 121                        if (strcmp(f->name, name) == 0)
 122                                return f;
 123
 124        return NULL;
 125}
 126
 127static const struct genl_ops *genl_get_cmd(u8 cmd, struct genl_family *family)
 128{
 129        int i;
 130
 131        for (i = 0; i < family->n_ops; i++)
 132                if (family->ops[i].cmd == cmd)
 133                        return &family->ops[i];
 134
 135        return NULL;
 136}
 137
 138/* Of course we are going to have problems once we hit
 139 * 2^16 alive types, but that can only happen by year 2K
 140*/
 141static u16 genl_generate_id(void)
 142{
 143        static u16 id_gen_idx = GENL_MIN_ID;
 144        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                        return id_gen_idx;
 151                if (++id_gen_idx > GENL_MAX_ID)
 152                        id_gen_idx = GENL_MIN_ID;
 153        }
 154
 155        return 0;
 156}
 157
 158static int genl_allocate_reserve_groups(int n_groups, int *first_id)
 159{
 160        unsigned long *new_groups;
 161        int start = 0;
 162        int i;
 163        int id;
 164        bool fits;
 165
 166        do {
 167                if (start == 0)
 168                        id = find_first_zero_bit(mc_groups,
 169                                                 mc_groups_longs *
 170                                                 BITS_PER_LONG);
 171                else
 172                        id = find_next_zero_bit(mc_groups,
 173                                                mc_groups_longs * BITS_PER_LONG,
 174                                                start);
 175
 176                fits = true;
 177                for (i = id;
 178                     i < min_t(int, id + n_groups,
 179                               mc_groups_longs * BITS_PER_LONG);
 180                     i++) {
 181                        if (test_bit(i, mc_groups)) {
 182                                start = i;
 183                                fits = false;
 184                                break;
 185                        }
 186                }
 187
 188                if (id >= mc_groups_longs * BITS_PER_LONG) {
 189                        unsigned long new_longs = mc_groups_longs +
 190                                                  BITS_TO_LONGS(n_groups);
 191                        size_t nlen = new_longs * sizeof(unsigned long);
 192
 193                        if (mc_groups == &mc_group_start) {
 194                                new_groups = kzalloc(nlen, GFP_KERNEL);
 195                                if (!new_groups)
 196                                        return -ENOMEM;
 197                                mc_groups = new_groups;
 198                                *mc_groups = mc_group_start;
 199                        } else {
 200                                new_groups = krealloc(mc_groups, nlen,
 201                                                      GFP_KERNEL);
 202                                if (!new_groups)
 203                                        return -ENOMEM;
 204                                mc_groups = new_groups;
 205                                for (i = 0; i < BITS_TO_LONGS(n_groups); i++)
 206                                        mc_groups[mc_groups_longs + i] = 0;
 207                        }
 208                        mc_groups_longs = new_longs;
 209                }
 210        } while (!fits);
 211
 212        for (i = id; i < id + n_groups; i++)
 213                set_bit(i, mc_groups);
 214        *first_id = id;
 215        return 0;
 216}
 217
 218static struct genl_family genl_ctrl;
 219
 220static int genl_validate_assign_mc_groups(struct genl_family *family)
 221{
 222        int first_id;
 223        int n_groups = family->n_mcgrps;
 224        int err = 0, i;
 225        bool groups_allocated = false;
 226
 227        if (!n_groups)
 228                return 0;
 229
 230        for (i = 0; i < n_groups; i++) {
 231                const struct genl_multicast_group *grp = &family->mcgrps[i];
 232
 233                if (WARN_ON(grp->name[0] == '\0'))
 234                        return -EINVAL;
 235                if (WARN_ON(memchr(grp->name, '\0', GENL_NAMSIZ) == NULL))
 236                        return -EINVAL;
 237        }
 238
 239        /* special-case our own group and hacks */
 240        if (family == &genl_ctrl) {
 241                first_id = GENL_ID_CTRL;
 242                BUG_ON(n_groups != 1);
 243        } else if (strcmp(family->name, "NET_DM") == 0) {
 244                first_id = 1;
 245                BUG_ON(n_groups != 1);
 246        } else if (family->id == GENL_ID_VFS_DQUOT) {
 247                first_id = GENL_ID_VFS_DQUOT;
 248                BUG_ON(n_groups != 1);
 249        } else if (family->id == GENL_ID_PMCRAID) {
 250                first_id = GENL_ID_PMCRAID;
 251                BUG_ON(n_groups != 1);
 252        } else {
 253                groups_allocated = true;
 254                err = genl_allocate_reserve_groups(n_groups, &first_id);
 255                if (err)
 256                        return err;
 257        }
 258
 259        family->mcgrp_offset = first_id;
 260
 261        /* if still initializing, can't and don't need to to realloc bitmaps */
 262        if (!init_net.genl_sock)
 263                return 0;
 264
 265        if (family->netnsok) {
 266                struct net *net;
 267
 268                netlink_table_grab();
 269                rcu_read_lock();
 270                for_each_net_rcu(net) {
 271                        err = __netlink_change_ngroups(net->genl_sock,
 272                                        mc_groups_longs * BITS_PER_LONG);
 273                        if (err) {
 274                                /*
 275                                 * No need to roll back, can only fail if
 276                                 * memory allocation fails and then the
 277                                 * number of _possible_ groups has been
 278                                 * increased on some sockets which is ok.
 279                                 */
 280                                break;
 281                        }
 282                }
 283                rcu_read_unlock();
 284                netlink_table_ungrab();
 285        } else {
 286                err = netlink_change_ngroups(init_net.genl_sock,
 287                                             mc_groups_longs * BITS_PER_LONG);
 288        }
 289
 290        if (groups_allocated && err) {
 291                for (i = 0; i < family->n_mcgrps; i++)
 292                        clear_bit(family->mcgrp_offset + i, mc_groups);
 293        }
 294
 295        return err;
 296}
 297
 298static void genl_unregister_mc_groups(struct genl_family *family)
 299{
 300        struct net *net;
 301        int i;
 302
 303        netlink_table_grab();
 304        rcu_read_lock();
 305        for_each_net_rcu(net) {
 306                for (i = 0; i < family->n_mcgrps; i++)
 307                        __netlink_clear_multicast_users(
 308                                net->genl_sock, family->mcgrp_offset + i);
 309        }
 310        rcu_read_unlock();
 311        netlink_table_ungrab();
 312
 313        for (i = 0; i < family->n_mcgrps; i++) {
 314                int grp_id = family->mcgrp_offset + i;
 315
 316                if (grp_id != 1)
 317                        clear_bit(grp_id, mc_groups);
 318                genl_ctrl_event(CTRL_CMD_DELMCAST_GRP, family,
 319                                &family->mcgrps[i], grp_id);
 320        }
 321}
 322
 323static int genl_validate_ops(const struct genl_family *family)
 324{
 325        const struct genl_ops *ops = family->ops;
 326        unsigned int n_ops = family->n_ops;
 327        int i, j;
 328
 329        if (WARN_ON(n_ops && !ops))
 330                return -EINVAL;
 331
 332        if (!n_ops)
 333                return 0;
 334
 335        for (i = 0; i < n_ops; i++) {
 336                if (ops[i].dumpit == NULL && ops[i].doit == NULL)
 337                        return -EINVAL;
 338                for (j = i + 1; j < n_ops; j++)
 339                        if (ops[i].cmd == ops[j].cmd)
 340                                return -EINVAL;
 341        }
 342
 343        return 0;
 344}
 345
 346/**
 347 * __genl_register_family - register a generic netlink family
 348 * @family: generic netlink family
 349 *
 350 * Registers the specified family after validating it first. Only one
 351 * family may be registered with the same family name or identifier.
 352 * The family id may equal GENL_ID_GENERATE causing an unique id to
 353 * be automatically generated and assigned.
 354 *
 355 * The family's ops array must already be assigned, you can use the
 356 * genl_register_family_with_ops() helper function.
 357 *
 358 * Return 0 on success or a negative error code.
 359 */
 360int __genl_register_family(struct genl_family *family)
 361{
 362        int err = -EINVAL, i;
 363
 364        if (family->id && family->id < GENL_MIN_ID)
 365                goto errout;
 366
 367        if (family->id > GENL_MAX_ID)
 368                goto errout;
 369
 370        err = genl_validate_ops(family);
 371        if (err)
 372                return err;
 373
 374        genl_lock_all();
 375
 376        if (genl_family_find_byname(family->name)) {
 377                err = -EEXIST;
 378                goto errout_locked;
 379        }
 380
 381        if (family->id == GENL_ID_GENERATE) {
 382                u16 newid = genl_generate_id();
 383
 384                if (!newid) {
 385                        err = -ENOMEM;
 386                        goto errout_locked;
 387                }
 388
 389                family->id = newid;
 390        } else if (genl_family_find_byid(family->id)) {
 391                err = -EEXIST;
 392                goto errout_locked;
 393        }
 394
 395        if (family->maxattr && !family->parallel_ops) {
 396                family->attrbuf = kmalloc((family->maxattr+1) *
 397                                        sizeof(struct nlattr *), GFP_KERNEL);
 398                if (family->attrbuf == NULL) {
 399                        err = -ENOMEM;
 400                        goto errout_locked;
 401                }
 402        } else
 403                family->attrbuf = NULL;
 404
 405        err = genl_validate_assign_mc_groups(family);
 406        if (err)
 407                goto errout_locked;
 408
 409        list_add_tail(&family->family_list, genl_family_chain(family->id));
 410        genl_unlock_all();
 411
 412        /* send all events */
 413        genl_ctrl_event(CTRL_CMD_NEWFAMILY, family, NULL, 0);
 414        for (i = 0; i < family->n_mcgrps; i++)
 415                genl_ctrl_event(CTRL_CMD_NEWMCAST_GRP, family,
 416                                &family->mcgrps[i], family->mcgrp_offset + i);
 417
 418        return 0;
 419
 420errout_locked:
 421        genl_unlock_all();
 422errout:
 423        return err;
 424}
 425EXPORT_SYMBOL(__genl_register_family);
 426
 427/**
 428 * genl_unregister_family - unregister generic netlink family
 429 * @family: generic netlink family
 430 *
 431 * Unregisters the specified family.
 432 *
 433 * Returns 0 on success or a negative error code.
 434 */
 435int genl_unregister_family(struct genl_family *family)
 436{
 437        struct genl_family *rc;
 438
 439        genl_lock_all();
 440
 441        list_for_each_entry(rc, genl_family_chain(family->id), family_list) {
 442                if (family->id != rc->id || strcmp(rc->name, family->name))
 443                        continue;
 444
 445                genl_unregister_mc_groups(family);
 446
 447                list_del(&rc->family_list);
 448                family->n_ops = 0;
 449                up_write(&cb_lock);
 450                wait_event(genl_sk_destructing_waitq,
 451                           atomic_read(&genl_sk_destructing_cnt) == 0);
 452                genl_unlock();
 453
 454                kfree(family->attrbuf);
 455                genl_ctrl_event(CTRL_CMD_DELFAMILY, family, NULL, 0);
 456                return 0;
 457        }
 458
 459        genl_unlock_all();
 460
 461        return -ENOENT;
 462}
 463EXPORT_SYMBOL(genl_unregister_family);
 464
 465/**
 466 * genlmsg_new_unicast - Allocate generic netlink message for unicast
 467 * @payload: size of the message payload
 468 * @info: information on destination
 469 * @flags: the type of memory to allocate
 470 *
 471 * Allocates a new sk_buff large enough to cover the specified payload
 472 * plus required Netlink headers. Will check receiving socket for
 473 * memory mapped i/o capability and use it if enabled. Will fall back
 474 * to non-mapped skb if message size exceeds the frame size of the ring.
 475 */
 476struct sk_buff *genlmsg_new_unicast(size_t payload, struct genl_info *info,
 477                                    gfp_t flags)
 478{
 479        size_t len = nlmsg_total_size(genlmsg_total_size(payload));
 480
 481        return netlink_alloc_skb(info->dst_sk, len, info->snd_portid, flags);
 482}
 483EXPORT_SYMBOL_GPL(genlmsg_new_unicast);
 484
 485/**
 486 * genlmsg_put - Add generic netlink header to netlink message
 487 * @skb: socket buffer holding the message
 488 * @portid: netlink portid the message is addressed to
 489 * @seq: sequence number (usually the one of the sender)
 490 * @family: generic netlink family
 491 * @flags: netlink message flags
 492 * @cmd: generic netlink command
 493 *
 494 * Returns pointer to user specific header
 495 */
 496void *genlmsg_put(struct sk_buff *skb, u32 portid, u32 seq,
 497                                struct genl_family *family, int flags, u8 cmd)
 498{
 499        struct nlmsghdr *nlh;
 500        struct genlmsghdr *hdr;
 501
 502        nlh = nlmsg_put(skb, portid, seq, family->id, GENL_HDRLEN +
 503                        family->hdrsize, flags);
 504        if (nlh == NULL)
 505                return NULL;
 506
 507        hdr = nlmsg_data(nlh);
 508        hdr->cmd = cmd;
 509        hdr->version = family->version;
 510        hdr->reserved = 0;
 511
 512        return (char *) hdr + GENL_HDRLEN;
 513}
 514EXPORT_SYMBOL(genlmsg_put);
 515
 516static int genl_lock_dumpit(struct sk_buff *skb, struct netlink_callback *cb)
 517{
 518        /* our ops are always const - netlink API doesn't propagate that */
 519        const struct genl_ops *ops = cb->data;
 520        int rc;
 521
 522        genl_lock();
 523        rc = ops->dumpit(skb, cb);
 524        genl_unlock();
 525        return rc;
 526}
 527
 528static int genl_lock_done(struct netlink_callback *cb)
 529{
 530        /* our ops are always const - netlink API doesn't propagate that */
 531        const struct genl_ops *ops = cb->data;
 532        int rc = 0;
 533
 534        if (ops->done) {
 535                genl_lock();
 536                rc = ops->done(cb);
 537                genl_unlock();
 538        }
 539        return rc;
 540}
 541
 542static int genl_family_rcv_msg(struct genl_family *family,
 543                               struct sk_buff *skb,
 544                               struct nlmsghdr *nlh)
 545{
 546        const struct genl_ops *ops;
 547        struct net *net = sock_net(skb->sk);
 548        struct genl_info info;
 549        struct genlmsghdr *hdr = nlmsg_data(nlh);
 550        struct nlattr **attrbuf;
 551        int hdrlen, err;
 552
 553        /* this family doesn't exist in this netns */
 554        if (!family->netnsok && !net_eq(net, &init_net))
 555                return -ENOENT;
 556
 557        hdrlen = GENL_HDRLEN + family->hdrsize;
 558        if (nlh->nlmsg_len < nlmsg_msg_size(hdrlen))
 559                return -EINVAL;
 560
 561        ops = genl_get_cmd(hdr->cmd, family);
 562        if (ops == NULL)
 563                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                if (ops->dumpit == NULL)
 573                        return -EOPNOTSUPP;
 574
 575                if (!family->parallel_ops) {
 576                        struct netlink_dump_control c = {
 577                                .module = family->module,
 578                                /* we have const, but the netlink API doesn't */
 579                                .data = (void *)ops,
 580                                .dump = genl_lock_dumpit,
 581                                .done = genl_lock_done,
 582                        };
 583
 584                        genl_unlock();
 585                        rc = __netlink_dump_start(net->genl_sock, skb, nlh, &c);
 586                        genl_lock();
 587
 588                } else {
 589                        struct netlink_dump_control c = {
 590                                .module = family->module,
 591                                .dump = ops->dumpit,
 592                                .done = ops->done,
 593                        };
 594
 595                        rc = __netlink_dump_start(net->genl_sock, skb, nlh, &c);
 596                }
 597
 598                return rc;
 599        }
 600
 601        if (ops->doit == NULL)
 602                return -EOPNOTSUPP;
 603
 604        if (family->maxattr && family->parallel_ops) {
 605                attrbuf = kmalloc((family->maxattr+1) *
 606                                        sizeof(struct nlattr *), GFP_KERNEL);
 607                if (attrbuf == NULL)
 608                        return -ENOMEM;
 609        } else
 610                attrbuf = family->attrbuf;
 611
 612        if (attrbuf) {
 613                err = nlmsg_parse(nlh, hdrlen, attrbuf, family->maxattr,
 614                                  ops->policy);
 615                if (err < 0)
 616                        goto out;
 617        }
 618
 619        info.snd_seq = nlh->nlmsg_seq;
 620        info.snd_portid = NETLINK_CB(skb).portid;
 621        info.nlhdr = nlh;
 622        info.genlhdr = nlmsg_data(nlh);
 623        info.userhdr = nlmsg_data(nlh) + GENL_HDRLEN;
 624        info.attrs = attrbuf;
 625        info.dst_sk = skb->sk;
 626        genl_info_net_set(&info, net);
 627        memset(&info.user_ptr, 0, sizeof(info.user_ptr));
 628
 629        if (family->pre_doit) {
 630                err = family->pre_doit(ops, skb, &info);
 631                if (err)
 632                        goto out;
 633        }
 634
 635        err = ops->doit(skb, &info);
 636
 637        if (family->post_doit)
 638                family->post_doit(ops, skb, &info);
 639
 640out:
 641        if (family->parallel_ops)
 642                kfree(attrbuf);
 643
 644        return err;
 645}
 646
 647static int genl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
 648{
 649        struct genl_family *family;
 650        int err;
 651
 652        family = genl_family_find_byid(nlh->nlmsg_type);
 653        if (family == NULL)
 654                return -ENOENT;
 655
 656        if (!family->parallel_ops)
 657                genl_lock();
 658
 659        err = genl_family_rcv_msg(family, skb, nlh);
 660
 661        if (!family->parallel_ops)
 662                genl_unlock();
 663
 664        return err;
 665}
 666
 667static 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 * Controller
 676 **************************************************************************/
 677
 678static struct genl_family genl_ctrl = {
 679        .id = GENL_ID_CTRL,
 680        .name = "nlctrl",
 681        .version = 0x2,
 682        .maxattr = CTRL_ATTR_MAX,
 683        .netnsok = true,
 684};
 685
 686static int ctrl_fill_info(struct genl_family *family, u32 portid, u32 seq,
 687                          u32 flags, struct sk_buff *skb, u8 cmd)
 688{
 689        void *hdr;
 690
 691        hdr = genlmsg_put(skb, portid, seq, &genl_ctrl, flags, cmd);
 692        if (hdr == NULL)
 693                return -1;
 694
 695        if (nla_put_string(skb, CTRL_ATTR_FAMILY_NAME, family->name) ||
 696            nla_put_u16(skb, CTRL_ATTR_FAMILY_ID, family->id) ||
 697            nla_put_u32(skb, CTRL_ATTR_VERSION, family->version) ||
 698            nla_put_u32(skb, CTRL_ATTR_HDRSIZE, family->hdrsize) ||
 699            nla_put_u32(skb, CTRL_ATTR_MAXATTR, family->maxattr))
 700                goto nla_put_failure;
 701
 702        if (family->n_ops) {
 703                struct nlattr *nla_ops;
 704                int i;
 705
 706                nla_ops = nla_nest_start(skb, CTRL_ATTR_OPS);
 707                if (nla_ops == NULL)
 708                        goto nla_put_failure;
 709
 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                        if (nest == NULL)
 724                                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                        nla_nest_end(skb, nest);
 731                }
 732
 733                nla_nest_end(skb, nla_ops);
 734        }
 735
 736        if (family->n_mcgrps) {
 737                struct nlattr *nla_grps;
 738                int i;
 739
 740                nla_grps = nla_nest_start(skb, CTRL_ATTR_MCAST_GROUPS);
 741                if (nla_grps == NULL)
 742                        goto nla_put_failure;
 743
 744                for (i = 0; i < family->n_mcgrps; i++) {
 745                        struct nlattr *nest;
 746                        const struct genl_multicast_group *grp;
 747
 748                        grp = &family->mcgrps[i];
 749
 750                        nest = nla_nest_start(skb, i + 1);
 751                        if (nest == NULL)
 752                                goto nla_put_failure;
 753
 754                        if (nla_put_u32(skb, CTRL_ATTR_MCAST_GRP_ID,
 755                                        family->mcgrp_offset + i) ||
 756                            nla_put_string(skb, CTRL_ATTR_MCAST_GRP_NAME,
 757                                           grp->name))
 758                                goto nla_put_failure;
 759
 760                        nla_nest_end(skb, nest);
 761                }
 762                nla_nest_end(skb, nla_grps);
 763        }
 764
 765        genlmsg_end(skb, hdr);
 766        return 0;
 767
 768nla_put_failure:
 769        genlmsg_cancel(skb, hdr);
 770        return -EMSGSIZE;
 771}
 772
 773static int ctrl_fill_mcgrp_info(struct genl_family *family,
 774                                const struct genl_multicast_group *grp,
 775                                int grp_id, u32 portid, u32 seq, u32 flags,
 776                                struct sk_buff *skb, u8 cmd)
 777{
 778        void *hdr;
 779        struct nlattr *nla_grps;
 780        struct nlattr *nest;
 781
 782        hdr = genlmsg_put(skb, portid, seq, &genl_ctrl, flags, cmd);
 783        if (hdr == NULL)
 784                return -1;
 785
 786        if (nla_put_string(skb, CTRL_ATTR_FAMILY_NAME, family->name) ||
 787            nla_put_u16(skb, CTRL_ATTR_FAMILY_ID, family->id))
 788                goto nla_put_failure;
 789
 790        nla_grps = nla_nest_start(skb, CTRL_ATTR_MCAST_GROUPS);
 791        if (nla_grps == NULL)
 792                goto nla_put_failure;
 793
 794        nest = nla_nest_start(skb, 1);
 795        if (nest == NULL)
 796                goto nla_put_failure;
 797
 798        if (nla_put_u32(skb, CTRL_ATTR_MCAST_GRP_ID, grp_id) ||
 799            nla_put_string(skb, CTRL_ATTR_MCAST_GRP_NAME,
 800                           grp->name))
 801                goto nla_put_failure;
 802
 803        nla_nest_end(skb, nest);
 804        nla_nest_end(skb, nla_grps);
 805
 806        genlmsg_end(skb, hdr);
 807        return 0;
 808
 809nla_put_failure:
 810        genlmsg_cancel(skb, hdr);
 811        return -EMSGSIZE;
 812}
 813
 814static int ctrl_dumpfamily(struct sk_buff *skb, struct netlink_callback *cb)
 815{
 816
 817        int i, n = 0;
 818        struct genl_family *rt;
 819        struct net *net = sock_net(skb->sk);
 820        int chains_to_skip = cb->args[0];
 821        int fams_to_skip = cb->args[1];
 822
 823        for (i = chains_to_skip; i < GENL_FAM_TAB_SIZE; i++) {
 824                n = 0;
 825                list_for_each_entry(rt, genl_family_chain(i), family_list) {
 826                        if (!rt->netnsok && !net_eq(net, &init_net))
 827                                continue;
 828                        if (++n < fams_to_skip)
 829                                continue;
 830                        if (ctrl_fill_info(rt, NETLINK_CB(cb->skb).portid,
 831                                           cb->nlh->nlmsg_seq, NLM_F_MULTI,
 832                                           skb, CTRL_CMD_NEWFAMILY) < 0)
 833                                goto errout;
 834                }
 835
 836                fams_to_skip = 0;
 837        }
 838
 839errout:
 840        cb->args[0] = i;
 841        cb->args[1] = n;
 842
 843        return skb->len;
 844}
 845
 846static struct sk_buff *ctrl_build_family_msg(struct genl_family *family,
 847                                             u32 portid, int seq, u8 cmd)
 848{
 849        struct sk_buff *skb;
 850        int err;
 851
 852        skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
 853        if (skb == NULL)
 854                return ERR_PTR(-ENOBUFS);
 855
 856        err = ctrl_fill_info(family, portid, seq, 0, skb, cmd);
 857        if (err < 0) {
 858                nlmsg_free(skb);
 859                return ERR_PTR(err);
 860        }
 861
 862        return skb;
 863}
 864
 865static struct sk_buff *
 866ctrl_build_mcgrp_msg(struct genl_family *family,
 867                     const struct genl_multicast_group *grp,
 868                     int grp_id, u32 portid, int seq, u8 cmd)
 869{
 870        struct sk_buff *skb;
 871        int err;
 872
 873        skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
 874        if (skb == NULL)
 875                return ERR_PTR(-ENOBUFS);
 876
 877        err = ctrl_fill_mcgrp_info(family, grp, grp_id, portid,
 878                                   seq, 0, skb, cmd);
 879        if (err < 0) {
 880                nlmsg_free(skb);
 881                return ERR_PTR(err);
 882        }
 883
 884        return skb;
 885}
 886
 887static const struct nla_policy ctrl_policy[CTRL_ATTR_MAX+1] = {
 888        [CTRL_ATTR_FAMILY_ID]   = { .type = NLA_U16 },
 889        [CTRL_ATTR_FAMILY_NAME] = { .type = NLA_NUL_STRING,
 890                                    .len = GENL_NAMSIZ - 1 },
 891};
 892
 893static int ctrl_getfamily(struct sk_buff *skb, struct genl_info *info)
 894{
 895        struct sk_buff *msg;
 896        struct genl_family *res = NULL;
 897        int err = -EINVAL;
 898
 899        if (info->attrs[CTRL_ATTR_FAMILY_ID]) {
 900                u16 id = nla_get_u16(info->attrs[CTRL_ATTR_FAMILY_ID]);
 901                res = genl_family_find_byid(id);
 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#ifdef CONFIG_MODULES
 911                if (res == NULL) {
 912                        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                        genl_lock();
 918                        res = genl_family_find_byname(name);
 919                }
 920#endif
 921                err = -ENOENT;
 922        }
 923
 924        if (res == NULL)
 925                return err;
 926
 927        if (!res->netnsok && !net_eq(genl_info_net(info), &init_net)) {
 928                /* family doesn't exist here */
 929                return -ENOENT;
 930        }
 931
 932        msg = ctrl_build_family_msg(res, info->snd_portid, info->snd_seq,
 933                                    CTRL_CMD_NEWFAMILY);
 934        if (IS_ERR(msg))
 935                return PTR_ERR(msg);
 936
 937        return genlmsg_reply(msg, info);
 938}
 939
 940static int genl_ctrl_event(int event, struct genl_family *family,
 941                           const struct genl_multicast_group *grp,
 942                           int grp_id)
 943{
 944        struct sk_buff *msg;
 945
 946        /* genl is still initialising */
 947        if (!init_net.genl_sock)
 948                return 0;
 949
 950        switch (event) {
 951        case CTRL_CMD_NEWFAMILY:
 952        case CTRL_CMD_DELFAMILY:
 953                WARN_ON(grp);
 954                msg = ctrl_build_family_msg(family, 0, 0, event);
 955                break;
 956        case CTRL_CMD_NEWMCAST_GRP:
 957        case CTRL_CMD_DELMCAST_GRP:
 958                BUG_ON(!grp);
 959                msg = ctrl_build_mcgrp_msg(family, grp, grp_id, 0, 0, event);
 960                break;
 961        default:
 962                return -EINVAL;
 963        }
 964
 965        if (IS_ERR(msg))
 966                return PTR_ERR(msg);
 967
 968        if (!family->netnsok) {
 969                genlmsg_multicast_netns(&genl_ctrl, &init_net, msg, 0,
 970                                        0, GFP_KERNEL);
 971        } else {
 972                rcu_read_lock();
 973                genlmsg_multicast_allns(&genl_ctrl, msg, 0,
 974                                        0, GFP_ATOMIC);
 975                rcu_read_unlock();
 976        }
 977
 978        return 0;
 979}
 980
 981static struct genl_ops genl_ctrl_ops[] = {
 982        {
 983                .cmd            = CTRL_CMD_GETFAMILY,
 984                .doit           = ctrl_getfamily,
 985                .dumpit         = ctrl_dumpfamily,
 986                .policy         = ctrl_policy,
 987        },
 988};
 989
 990static struct genl_multicast_group genl_ctrl_groups[] = {
 991        { .name = "notify", },
 992};
 993
 994static int genl_bind(struct net *net, int group)
 995{
 996        int i, err = -ENOENT;
 997
 998        down_read(&cb_lock);
 999        for (i = 0; i < GENL_FAM_TAB_SIZE; i++) {
1000                struct genl_family *f;
1001
1002                list_for_each_entry(f, genl_family_chain(i), family_list) {
1003                        if (group >= f->mcgrp_offset &&
1004                            group < f->mcgrp_offset + f->n_mcgrps) {
1005                                int fam_grp = group - f->mcgrp_offset;
1006
1007                                if (!f->netnsok && net != &init_net)
1008                                        err = -ENOENT;
1009                                else if (f->mcast_bind)
1010                                        err = f->mcast_bind(net, fam_grp);
1011                                else
1012                                        err = 0;
1013                                break;
1014                        }
1015                }
1016        }
1017        up_read(&cb_lock);
1018
1019        return err;
1020}
1021
1022static void genl_unbind(struct net *net, int group)
1023{
1024        int i;
1025
1026        down_read(&cb_lock);
1027        for (i = 0; i < GENL_FAM_TAB_SIZE; i++) {
1028                struct genl_family *f;
1029
1030                list_for_each_entry(f, genl_family_chain(i), family_list) {
1031                        if (group >= f->mcgrp_offset &&
1032                            group < f->mcgrp_offset + f->n_mcgrps) {
1033                                int fam_grp = group - f->mcgrp_offset;
1034
1035                                if (f->mcast_unbind)
1036                                        f->mcast_unbind(net, fam_grp);
1037                                break;
1038                        }
1039                }
1040        }
1041        up_read(&cb_lock);
1042}
1043
1044static int __net_init genl_pernet_init(struct net *net)
1045{
1046        struct netlink_kernel_cfg cfg = {
1047                .input          = genl_rcv,
1048                .flags          = NL_CFG_F_NONROOT_RECV,
1049                .bind           = genl_bind,
1050                .unbind         = genl_unbind,
1051        };
1052
1053        /* we'll bump the group number right afterwards */
1054        net->genl_sock = netlink_kernel_create(net, NETLINK_GENERIC, &cfg);
1055
1056        if (!net->genl_sock && net_eq(net, &init_net))
1057                panic("GENL: Cannot initialize generic netlink\n");
1058
1059        if (!net->genl_sock)
1060                return -ENOMEM;
1061
1062        return 0;
1063}
1064
1065static void __net_exit genl_pernet_exit(struct net *net)
1066{
1067        netlink_kernel_release(net->genl_sock);
1068        net->genl_sock = NULL;
1069}
1070
1071static struct pernet_operations genl_pernet_ops = {
1072        .init = genl_pernet_init,
1073        .exit = genl_pernet_exit,
1074};
1075
1076static int __init genl_init(void)
1077{
1078        int i, err;
1079
1080        for (i = 0; i < GENL_FAM_TAB_SIZE; i++)
1081                INIT_LIST_HEAD(&family_ht[i]);
1082
1083        err = genl_register_family_with_ops_groups(&genl_ctrl, genl_ctrl_ops,
1084                                                   genl_ctrl_groups);
1085        if (err < 0)
1086                goto problem;
1087
1088        err = register_pernet_subsys(&genl_pernet_ops);
1089        if (err)
1090                goto problem;
1091
1092        return 0;
1093
1094problem:
1095        panic("GENL: Cannot register controller: %d\n", err);
1096}
1097
1098subsys_initcall(genl_init);
1099
1100static int genlmsg_mcast(struct sk_buff *skb, u32 portid, unsigned long group,
1101                         gfp_t flags)
1102{
1103        struct sk_buff *tmp;
1104        struct net *net, *prev = NULL;
1105        int err;
1106
1107        for_each_net_rcu(net) {
1108                if (prev) {
1109                        tmp = skb_clone(skb, flags);
1110                        if (!tmp) {
1111                                err = -ENOMEM;
1112                                goto error;
1113                        }
1114                        err = nlmsg_multicast(prev->genl_sock, tmp,
1115                                              portid, group, flags);
1116                        if (err)
1117                                goto error;
1118                }
1119
1120                prev = net;
1121        }
1122
1123        return nlmsg_multicast(prev->genl_sock, skb, portid, group, flags);
1124 error:
1125        kfree_skb(skb);
1126        return err;
1127}
1128
1129int genlmsg_multicast_allns(struct genl_family *family, struct sk_buff *skb,
1130                            u32 portid, unsigned int group, gfp_t flags)
1131{
1132        if (WARN_ON_ONCE(group >= family->n_mcgrps))
1133                return -EINVAL;
1134        group = family->mcgrp_offset + group;
1135        return genlmsg_mcast(skb, portid, group, flags);
1136}
1137EXPORT_SYMBOL(genlmsg_multicast_allns);
1138
1139void genl_notify(struct genl_family *family, struct sk_buff *skb,
1140                 struct genl_info *info, u32 group, gfp_t flags)
1141{
1142        struct net *net = genl_info_net(info);
1143        struct sock *sk = net->genl_sock;
1144        int report = 0;
1145
1146        if (info->nlhdr)
1147                report = nlmsg_report(info->nlhdr);
1148
1149        if (WARN_ON_ONCE(group >= family->n_mcgrps))
1150                return;
1151        group = family->mcgrp_offset + group;
1152        nlmsg_notify(sk, skb, info->snd_portid, group, report, flags);
1153}
1154EXPORT_SYMBOL(genl_notify);
1155