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