linux/net/core/rtnetlink.c
<<
>>
Prefs
   1/*
   2 * INET         An implementation of the TCP/IP protocol suite for the LINUX
   3 *              operating system.  INET is implemented using the  BSD Socket
   4 *              interface as the means of communication with the user level.
   5 *
   6 *              Routing netlink socket interface: protocol independent part.
   7 *
   8 * Authors:     Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
   9 *
  10 *              This program is free software; you can redistribute it and/or
  11 *              modify it under the terms of the GNU General Public License
  12 *              as published by the Free Software Foundation; either version
  13 *              2 of the License, or (at your option) any later version.
  14 *
  15 *      Fixes:
  16 *      Vitaly E. Lavrov                RTA_OK arithmetics was wrong.
  17 */
  18
  19#include <linux/errno.h>
  20#include <linux/module.h>
  21#include <linux/types.h>
  22#include <linux/socket.h>
  23#include <linux/kernel.h>
  24#include <linux/timer.h>
  25#include <linux/string.h>
  26#include <linux/sockios.h>
  27#include <linux/net.h>
  28#include <linux/fcntl.h>
  29#include <linux/mm.h>
  30#include <linux/slab.h>
  31#include <linux/interrupt.h>
  32#include <linux/capability.h>
  33#include <linux/skbuff.h>
  34#include <linux/init.h>
  35#include <linux/security.h>
  36#include <linux/mutex.h>
  37#include <linux/if_addr.h>
  38#include <linux/if_bridge.h>
  39#include <linux/pci.h>
  40#include <linux/etherdevice.h>
  41
  42#include <asm/uaccess.h>
  43
  44#include <linux/inet.h>
  45#include <linux/netdevice.h>
  46#include <net/ip.h>
  47#include <net/protocol.h>
  48#include <net/arp.h>
  49#include <net/route.h>
  50#include <net/udp.h>
  51#include <net/sock.h>
  52#include <net/pkt_sched.h>
  53#include <net/fib_rules.h>
  54#include <net/rtnetlink.h>
  55#include <net/net_namespace.h>
  56
  57struct rtnl_link {
  58        rtnl_doit_func          doit;
  59        rtnl_dumpit_func        dumpit;
  60        rtnl_calcit_func        calcit;
  61};
  62
  63static DEFINE_MUTEX(rtnl_mutex);
  64
  65void rtnl_lock(void)
  66{
  67        mutex_lock(&rtnl_mutex);
  68}
  69EXPORT_SYMBOL(rtnl_lock);
  70
  71void __rtnl_unlock(void)
  72{
  73        mutex_unlock(&rtnl_mutex);
  74}
  75
  76void rtnl_unlock(void)
  77{
  78        /* This fellow will unlock it for us. */
  79        netdev_run_todo();
  80}
  81EXPORT_SYMBOL(rtnl_unlock);
  82
  83int rtnl_trylock(void)
  84{
  85        return mutex_trylock(&rtnl_mutex);
  86}
  87EXPORT_SYMBOL(rtnl_trylock);
  88
  89int rtnl_is_locked(void)
  90{
  91        return mutex_is_locked(&rtnl_mutex);
  92}
  93EXPORT_SYMBOL(rtnl_is_locked);
  94
  95#ifdef CONFIG_PROVE_LOCKING
  96int lockdep_rtnl_is_held(void)
  97{
  98        return lockdep_is_held(&rtnl_mutex);
  99}
 100EXPORT_SYMBOL(lockdep_rtnl_is_held);
 101#endif /* #ifdef CONFIG_PROVE_LOCKING */
 102
 103static struct rtnl_link *rtnl_msg_handlers[RTNL_FAMILY_MAX + 1];
 104
 105static inline int rtm_msgindex(int msgtype)
 106{
 107        int msgindex = msgtype - RTM_BASE;
 108
 109        /*
 110         * msgindex < 0 implies someone tried to register a netlink
 111         * control code. msgindex >= RTM_NR_MSGTYPES may indicate that
 112         * the message type has not been added to linux/rtnetlink.h
 113         */
 114        BUG_ON(msgindex < 0 || msgindex >= RTM_NR_MSGTYPES);
 115
 116        return msgindex;
 117}
 118
 119static rtnl_doit_func rtnl_get_doit(int protocol, int msgindex)
 120{
 121        struct rtnl_link *tab;
 122
 123        if (protocol <= RTNL_FAMILY_MAX)
 124                tab = rtnl_msg_handlers[protocol];
 125        else
 126                tab = NULL;
 127
 128        if (tab == NULL || tab[msgindex].doit == NULL)
 129                tab = rtnl_msg_handlers[PF_UNSPEC];
 130
 131        return tab[msgindex].doit;
 132}
 133
 134static rtnl_dumpit_func rtnl_get_dumpit(int protocol, int msgindex)
 135{
 136        struct rtnl_link *tab;
 137
 138        if (protocol <= RTNL_FAMILY_MAX)
 139                tab = rtnl_msg_handlers[protocol];
 140        else
 141                tab = NULL;
 142
 143        if (tab == NULL || tab[msgindex].dumpit == NULL)
 144                tab = rtnl_msg_handlers[PF_UNSPEC];
 145
 146        return tab[msgindex].dumpit;
 147}
 148
 149static rtnl_calcit_func rtnl_get_calcit(int protocol, int msgindex)
 150{
 151        struct rtnl_link *tab;
 152
 153        if (protocol <= RTNL_FAMILY_MAX)
 154                tab = rtnl_msg_handlers[protocol];
 155        else
 156                tab = NULL;
 157
 158        if (tab == NULL || tab[msgindex].calcit == NULL)
 159                tab = rtnl_msg_handlers[PF_UNSPEC];
 160
 161        return tab[msgindex].calcit;
 162}
 163
 164/**
 165 * __rtnl_register - Register a rtnetlink message type
 166 * @protocol: Protocol family or PF_UNSPEC
 167 * @msgtype: rtnetlink message type
 168 * @doit: Function pointer called for each request message
 169 * @dumpit: Function pointer called for each dump request (NLM_F_DUMP) message
 170 * @calcit: Function pointer to calc size of dump message
 171 *
 172 * Registers the specified function pointers (at least one of them has
 173 * to be non-NULL) to be called whenever a request message for the
 174 * specified protocol family and message type is received.
 175 *
 176 * The special protocol family PF_UNSPEC may be used to define fallback
 177 * function pointers for the case when no entry for the specific protocol
 178 * family exists.
 179 *
 180 * Returns 0 on success or a negative error code.
 181 */
 182int __rtnl_register(int protocol, int msgtype,
 183                    rtnl_doit_func doit, rtnl_dumpit_func dumpit,
 184                    rtnl_calcit_func calcit)
 185{
 186        struct rtnl_link *tab;
 187        int msgindex;
 188
 189        BUG_ON(protocol < 0 || protocol > RTNL_FAMILY_MAX);
 190        msgindex = rtm_msgindex(msgtype);
 191
 192        tab = rtnl_msg_handlers[protocol];
 193        if (tab == NULL) {
 194                tab = kcalloc(RTM_NR_MSGTYPES, sizeof(*tab), GFP_KERNEL);
 195                if (tab == NULL)
 196                        return -ENOBUFS;
 197
 198                rtnl_msg_handlers[protocol] = tab;
 199        }
 200
 201        if (doit)
 202                tab[msgindex].doit = doit;
 203
 204        if (dumpit)
 205                tab[msgindex].dumpit = dumpit;
 206
 207        if (calcit)
 208                tab[msgindex].calcit = calcit;
 209
 210        return 0;
 211}
 212EXPORT_SYMBOL_GPL(__rtnl_register);
 213
 214/**
 215 * rtnl_register - Register a rtnetlink message type
 216 *
 217 * Identical to __rtnl_register() but panics on failure. This is useful
 218 * as failure of this function is very unlikely, it can only happen due
 219 * to lack of memory when allocating the chain to store all message
 220 * handlers for a protocol. Meant for use in init functions where lack
 221 * of memory implies no sense in continuing.
 222 */
 223void rtnl_register(int protocol, int msgtype,
 224                   rtnl_doit_func doit, rtnl_dumpit_func dumpit,
 225                   rtnl_calcit_func calcit)
 226{
 227        if (__rtnl_register(protocol, msgtype, doit, dumpit, calcit) < 0)
 228                panic("Unable to register rtnetlink message handler, "
 229                      "protocol = %d, message type = %d\n",
 230                      protocol, msgtype);
 231}
 232EXPORT_SYMBOL_GPL(rtnl_register);
 233
 234/**
 235 * rtnl_unregister - Unregister a rtnetlink message type
 236 * @protocol: Protocol family or PF_UNSPEC
 237 * @msgtype: rtnetlink message type
 238 *
 239 * Returns 0 on success or a negative error code.
 240 */
 241int rtnl_unregister(int protocol, int msgtype)
 242{
 243        int msgindex;
 244
 245        BUG_ON(protocol < 0 || protocol > RTNL_FAMILY_MAX);
 246        msgindex = rtm_msgindex(msgtype);
 247
 248        if (rtnl_msg_handlers[protocol] == NULL)
 249                return -ENOENT;
 250
 251        rtnl_msg_handlers[protocol][msgindex].doit = NULL;
 252        rtnl_msg_handlers[protocol][msgindex].dumpit = NULL;
 253
 254        return 0;
 255}
 256EXPORT_SYMBOL_GPL(rtnl_unregister);
 257
 258/**
 259 * rtnl_unregister_all - Unregister all rtnetlink message type of a protocol
 260 * @protocol : Protocol family or PF_UNSPEC
 261 *
 262 * Identical to calling rtnl_unregster() for all registered message types
 263 * of a certain protocol family.
 264 */
 265void rtnl_unregister_all(int protocol)
 266{
 267        BUG_ON(protocol < 0 || protocol > RTNL_FAMILY_MAX);
 268
 269        kfree(rtnl_msg_handlers[protocol]);
 270        rtnl_msg_handlers[protocol] = NULL;
 271}
 272EXPORT_SYMBOL_GPL(rtnl_unregister_all);
 273
 274static LIST_HEAD(link_ops);
 275
 276static const struct rtnl_link_ops *rtnl_link_ops_get(const char *kind)
 277{
 278        const struct rtnl_link_ops *ops;
 279
 280        list_for_each_entry(ops, &link_ops, list) {
 281                if (!strcmp(ops->kind, kind))
 282                        return ops;
 283        }
 284        return NULL;
 285}
 286
 287/**
 288 * __rtnl_link_register - Register rtnl_link_ops with rtnetlink.
 289 * @ops: struct rtnl_link_ops * to register
 290 *
 291 * The caller must hold the rtnl_mutex. This function should be used
 292 * by drivers that create devices during module initialization. It
 293 * must be called before registering the devices.
 294 *
 295 * Returns 0 on success or a negative error code.
 296 */
 297int __rtnl_link_register(struct rtnl_link_ops *ops)
 298{
 299        if (rtnl_link_ops_get(ops->kind))
 300                return -EEXIST;
 301
 302        if (!ops->dellink)
 303                ops->dellink = unregister_netdevice_queue;
 304
 305        list_add_tail(&ops->list, &link_ops);
 306        return 0;
 307}
 308EXPORT_SYMBOL_GPL(__rtnl_link_register);
 309
 310/**
 311 * rtnl_link_register - Register rtnl_link_ops with rtnetlink.
 312 * @ops: struct rtnl_link_ops * to register
 313 *
 314 * Returns 0 on success or a negative error code.
 315 */
 316int rtnl_link_register(struct rtnl_link_ops *ops)
 317{
 318        int err;
 319
 320        rtnl_lock();
 321        err = __rtnl_link_register(ops);
 322        rtnl_unlock();
 323        return err;
 324}
 325EXPORT_SYMBOL_GPL(rtnl_link_register);
 326
 327static void __rtnl_kill_links(struct net *net, struct rtnl_link_ops *ops)
 328{
 329        struct net_device *dev;
 330        LIST_HEAD(list_kill);
 331
 332        for_each_netdev(net, dev) {
 333                if (dev->rtnl_link_ops == ops)
 334                        ops->dellink(dev, &list_kill);
 335        }
 336        unregister_netdevice_many(&list_kill);
 337}
 338
 339/**
 340 * __rtnl_link_unregister - Unregister rtnl_link_ops from rtnetlink.
 341 * @ops: struct rtnl_link_ops * to unregister
 342 *
 343 * The caller must hold the rtnl_mutex.
 344 */
 345void __rtnl_link_unregister(struct rtnl_link_ops *ops)
 346{
 347        struct net *net;
 348
 349        for_each_net(net) {
 350                __rtnl_kill_links(net, ops);
 351        }
 352        list_del(&ops->list);
 353}
 354EXPORT_SYMBOL_GPL(__rtnl_link_unregister);
 355
 356/**
 357 * rtnl_link_unregister - Unregister rtnl_link_ops from rtnetlink.
 358 * @ops: struct rtnl_link_ops * to unregister
 359 */
 360void rtnl_link_unregister(struct rtnl_link_ops *ops)
 361{
 362        rtnl_lock();
 363        __rtnl_link_unregister(ops);
 364        rtnl_unlock();
 365}
 366EXPORT_SYMBOL_GPL(rtnl_link_unregister);
 367
 368static size_t rtnl_link_get_size(const struct net_device *dev)
 369{
 370        const struct rtnl_link_ops *ops = dev->rtnl_link_ops;
 371        size_t size;
 372
 373        if (!ops)
 374                return 0;
 375
 376        size = nla_total_size(sizeof(struct nlattr)) + /* IFLA_LINKINFO */
 377               nla_total_size(strlen(ops->kind) + 1);  /* IFLA_INFO_KIND */
 378
 379        if (ops->get_size)
 380                /* IFLA_INFO_DATA + nested data */
 381                size += nla_total_size(sizeof(struct nlattr)) +
 382                        ops->get_size(dev);
 383
 384        if (ops->get_xstats_size)
 385                /* IFLA_INFO_XSTATS */
 386                size += nla_total_size(ops->get_xstats_size(dev));
 387
 388        return size;
 389}
 390
 391static LIST_HEAD(rtnl_af_ops);
 392
 393static const struct rtnl_af_ops *rtnl_af_lookup(const int family)
 394{
 395        const struct rtnl_af_ops *ops;
 396
 397        list_for_each_entry(ops, &rtnl_af_ops, list) {
 398                if (ops->family == family)
 399                        return ops;
 400        }
 401
 402        return NULL;
 403}
 404
 405/**
 406 * __rtnl_af_register - Register rtnl_af_ops with rtnetlink.
 407 * @ops: struct rtnl_af_ops * to register
 408 *
 409 * The caller must hold the rtnl_mutex.
 410 *
 411 * Returns 0 on success or a negative error code.
 412 */
 413int __rtnl_af_register(struct rtnl_af_ops *ops)
 414{
 415        list_add_tail(&ops->list, &rtnl_af_ops);
 416        return 0;
 417}
 418EXPORT_SYMBOL_GPL(__rtnl_af_register);
 419
 420/**
 421 * rtnl_af_register - Register rtnl_af_ops with rtnetlink.
 422 * @ops: struct rtnl_af_ops * to register
 423 *
 424 * Returns 0 on success or a negative error code.
 425 */
 426int rtnl_af_register(struct rtnl_af_ops *ops)
 427{
 428        int err;
 429
 430        rtnl_lock();
 431        err = __rtnl_af_register(ops);
 432        rtnl_unlock();
 433        return err;
 434}
 435EXPORT_SYMBOL_GPL(rtnl_af_register);
 436
 437/**
 438 * __rtnl_af_unregister - Unregister rtnl_af_ops from rtnetlink.
 439 * @ops: struct rtnl_af_ops * to unregister
 440 *
 441 * The caller must hold the rtnl_mutex.
 442 */
 443void __rtnl_af_unregister(struct rtnl_af_ops *ops)
 444{
 445        list_del(&ops->list);
 446}
 447EXPORT_SYMBOL_GPL(__rtnl_af_unregister);
 448
 449/**
 450 * rtnl_af_unregister - Unregister rtnl_af_ops from rtnetlink.
 451 * @ops: struct rtnl_af_ops * to unregister
 452 */
 453void rtnl_af_unregister(struct rtnl_af_ops *ops)
 454{
 455        rtnl_lock();
 456        __rtnl_af_unregister(ops);
 457        rtnl_unlock();
 458}
 459EXPORT_SYMBOL_GPL(rtnl_af_unregister);
 460
 461static size_t rtnl_link_get_af_size(const struct net_device *dev)
 462{
 463        struct rtnl_af_ops *af_ops;
 464        size_t size;
 465
 466        /* IFLA_AF_SPEC */
 467        size = nla_total_size(sizeof(struct nlattr));
 468
 469        list_for_each_entry(af_ops, &rtnl_af_ops, list) {
 470                if (af_ops->get_link_af_size) {
 471                        /* AF_* + nested data */
 472                        size += nla_total_size(sizeof(struct nlattr)) +
 473                                af_ops->get_link_af_size(dev);
 474                }
 475        }
 476
 477        return size;
 478}
 479
 480static int rtnl_link_fill(struct sk_buff *skb, const struct net_device *dev)
 481{
 482        const struct rtnl_link_ops *ops = dev->rtnl_link_ops;
 483        struct nlattr *linkinfo, *data;
 484        int err = -EMSGSIZE;
 485
 486        linkinfo = nla_nest_start(skb, IFLA_LINKINFO);
 487        if (linkinfo == NULL)
 488                goto out;
 489
 490        if (nla_put_string(skb, IFLA_INFO_KIND, ops->kind) < 0)
 491                goto err_cancel_link;
 492        if (ops->fill_xstats) {
 493                err = ops->fill_xstats(skb, dev);
 494                if (err < 0)
 495                        goto err_cancel_link;
 496        }
 497        if (ops->fill_info) {
 498                data = nla_nest_start(skb, IFLA_INFO_DATA);
 499                if (data == NULL)
 500                        goto err_cancel_link;
 501                err = ops->fill_info(skb, dev);
 502                if (err < 0)
 503                        goto err_cancel_data;
 504                nla_nest_end(skb, data);
 505        }
 506
 507        nla_nest_end(skb, linkinfo);
 508        return 0;
 509
 510err_cancel_data:
 511        nla_nest_cancel(skb, data);
 512err_cancel_link:
 513        nla_nest_cancel(skb, linkinfo);
 514out:
 515        return err;
 516}
 517
 518static const int rtm_min[RTM_NR_FAMILIES] =
 519{
 520        [RTM_FAM(RTM_NEWLINK)]      = NLMSG_LENGTH(sizeof(struct ifinfomsg)),
 521        [RTM_FAM(RTM_NEWADDR)]      = NLMSG_LENGTH(sizeof(struct ifaddrmsg)),
 522        [RTM_FAM(RTM_NEWROUTE)]     = NLMSG_LENGTH(sizeof(struct rtmsg)),
 523        [RTM_FAM(RTM_NEWRULE)]      = NLMSG_LENGTH(sizeof(struct fib_rule_hdr)),
 524        [RTM_FAM(RTM_NEWQDISC)]     = NLMSG_LENGTH(sizeof(struct tcmsg)),
 525        [RTM_FAM(RTM_NEWTCLASS)]    = NLMSG_LENGTH(sizeof(struct tcmsg)),
 526        [RTM_FAM(RTM_NEWTFILTER)]   = NLMSG_LENGTH(sizeof(struct tcmsg)),
 527        [RTM_FAM(RTM_NEWACTION)]    = NLMSG_LENGTH(sizeof(struct tcamsg)),
 528        [RTM_FAM(RTM_GETMULTICAST)] = NLMSG_LENGTH(sizeof(struct rtgenmsg)),
 529        [RTM_FAM(RTM_GETANYCAST)]   = NLMSG_LENGTH(sizeof(struct rtgenmsg)),
 530};
 531
 532static const int rta_max[RTM_NR_FAMILIES] =
 533{
 534        [RTM_FAM(RTM_NEWLINK)]      = IFLA_MAX,
 535        [RTM_FAM(RTM_NEWADDR)]      = IFA_MAX,
 536        [RTM_FAM(RTM_NEWROUTE)]     = RTA_MAX,
 537        [RTM_FAM(RTM_NEWRULE)]      = FRA_MAX,
 538        [RTM_FAM(RTM_NEWQDISC)]     = TCA_MAX,
 539        [RTM_FAM(RTM_NEWTCLASS)]    = TCA_MAX,
 540        [RTM_FAM(RTM_NEWTFILTER)]   = TCA_MAX,
 541        [RTM_FAM(RTM_NEWACTION)]    = TCAA_MAX,
 542};
 543
 544int rtnetlink_send(struct sk_buff *skb, struct net *net, u32 pid, unsigned int group, int echo)
 545{
 546        struct sock *rtnl = net->rtnl;
 547        int err = 0;
 548
 549        NETLINK_CB(skb).dst_group = group;
 550        if (echo)
 551                atomic_inc(&skb->users);
 552        netlink_broadcast(rtnl, skb, pid, group, GFP_KERNEL);
 553        if (echo)
 554                err = netlink_unicast(rtnl, skb, pid, MSG_DONTWAIT);
 555        return err;
 556}
 557
 558int rtnl_unicast(struct sk_buff *skb, struct net *net, u32 pid)
 559{
 560        struct sock *rtnl = net->rtnl;
 561
 562        return nlmsg_unicast(rtnl, skb, pid);
 563}
 564EXPORT_SYMBOL(rtnl_unicast);
 565
 566void rtnl_notify(struct sk_buff *skb, struct net *net, u32 pid, u32 group,
 567                 struct nlmsghdr *nlh, gfp_t flags)
 568{
 569        struct sock *rtnl = net->rtnl;
 570        int report = 0;
 571
 572        if (nlh)
 573                report = nlmsg_report(nlh);
 574
 575        nlmsg_notify(rtnl, skb, pid, group, report, flags);
 576}
 577EXPORT_SYMBOL(rtnl_notify);
 578
 579void rtnl_set_sk_err(struct net *net, u32 group, int error)
 580{
 581        struct sock *rtnl = net->rtnl;
 582
 583        netlink_set_err(rtnl, 0, group, error);
 584}
 585EXPORT_SYMBOL(rtnl_set_sk_err);
 586
 587int rtnetlink_put_metrics(struct sk_buff *skb, u32 *metrics)
 588{
 589        struct nlattr *mx;
 590        int i, valid = 0;
 591
 592        mx = nla_nest_start(skb, RTA_METRICS);
 593        if (mx == NULL)
 594                return -ENOBUFS;
 595
 596        for (i = 0; i < RTAX_MAX; i++) {
 597                if (metrics[i]) {
 598                        valid++;
 599                        if (nla_put_u32(skb, i+1, metrics[i]))
 600                                goto nla_put_failure;
 601                }
 602        }
 603
 604        if (!valid) {
 605                nla_nest_cancel(skb, mx);
 606                return 0;
 607        }
 608
 609        return nla_nest_end(skb, mx);
 610
 611nla_put_failure:
 612        nla_nest_cancel(skb, mx);
 613        return -EMSGSIZE;
 614}
 615EXPORT_SYMBOL(rtnetlink_put_metrics);
 616
 617int rtnl_put_cacheinfo(struct sk_buff *skb, struct dst_entry *dst, u32 id,
 618                       long expires, u32 error)
 619{
 620        struct rta_cacheinfo ci = {
 621                .rta_lastuse = jiffies_delta_to_clock_t(jiffies - dst->lastuse),
 622                .rta_used = dst->__use,
 623                .rta_clntref = atomic_read(&(dst->__refcnt)),
 624                .rta_error = error,
 625                .rta_id =  id,
 626        };
 627
 628        if (expires) {
 629                unsigned long clock;
 630
 631                clock = jiffies_to_clock_t(abs(expires));
 632                clock = min_t(unsigned long, clock, INT_MAX);
 633                ci.rta_expires = (expires > 0) ? clock : -clock;
 634        }
 635        return nla_put(skb, RTA_CACHEINFO, sizeof(ci), &ci);
 636}
 637EXPORT_SYMBOL_GPL(rtnl_put_cacheinfo);
 638
 639static void set_operstate(struct net_device *dev, unsigned char transition)
 640{
 641        unsigned char operstate = dev->operstate;
 642
 643        switch (transition) {
 644        case IF_OPER_UP:
 645                if ((operstate == IF_OPER_DORMANT ||
 646                     operstate == IF_OPER_UNKNOWN) &&
 647                    !netif_dormant(dev))
 648                        operstate = IF_OPER_UP;
 649                break;
 650
 651        case IF_OPER_DORMANT:
 652                if (operstate == IF_OPER_UP ||
 653                    operstate == IF_OPER_UNKNOWN)
 654                        operstate = IF_OPER_DORMANT;
 655                break;
 656        }
 657
 658        if (dev->operstate != operstate) {
 659                write_lock_bh(&dev_base_lock);
 660                dev->operstate = operstate;
 661                write_unlock_bh(&dev_base_lock);
 662                netdev_state_change(dev);
 663        }
 664}
 665
 666static unsigned int rtnl_dev_get_flags(const struct net_device *dev)
 667{
 668        return (dev->flags & ~(IFF_PROMISC | IFF_ALLMULTI)) |
 669               (dev->gflags & (IFF_PROMISC | IFF_ALLMULTI));
 670}
 671
 672static unsigned int rtnl_dev_combine_flags(const struct net_device *dev,
 673                                           const struct ifinfomsg *ifm)
 674{
 675        unsigned int flags = ifm->ifi_flags;
 676
 677        /* bugwards compatibility: ifi_change == 0 is treated as ~0 */
 678        if (ifm->ifi_change)
 679                flags = (flags & ifm->ifi_change) |
 680                        (rtnl_dev_get_flags(dev) & ~ifm->ifi_change);
 681
 682        return flags;
 683}
 684
 685static void copy_rtnl_link_stats(struct rtnl_link_stats *a,
 686                                 const struct rtnl_link_stats64 *b)
 687{
 688        a->rx_packets = b->rx_packets;
 689        a->tx_packets = b->tx_packets;
 690        a->rx_bytes = b->rx_bytes;
 691        a->tx_bytes = b->tx_bytes;
 692        a->rx_errors = b->rx_errors;
 693        a->tx_errors = b->tx_errors;
 694        a->rx_dropped = b->rx_dropped;
 695        a->tx_dropped = b->tx_dropped;
 696
 697        a->multicast = b->multicast;
 698        a->collisions = b->collisions;
 699
 700        a->rx_length_errors = b->rx_length_errors;
 701        a->rx_over_errors = b->rx_over_errors;
 702        a->rx_crc_errors = b->rx_crc_errors;
 703        a->rx_frame_errors = b->rx_frame_errors;
 704        a->rx_fifo_errors = b->rx_fifo_errors;
 705        a->rx_missed_errors = b->rx_missed_errors;
 706
 707        a->tx_aborted_errors = b->tx_aborted_errors;
 708        a->tx_carrier_errors = b->tx_carrier_errors;
 709        a->tx_fifo_errors = b->tx_fifo_errors;
 710        a->tx_heartbeat_errors = b->tx_heartbeat_errors;
 711        a->tx_window_errors = b->tx_window_errors;
 712
 713        a->rx_compressed = b->rx_compressed;
 714        a->tx_compressed = b->tx_compressed;
 715}
 716
 717static void copy_rtnl_link_stats64(void *v, const struct rtnl_link_stats64 *b)
 718{
 719        memcpy(v, b, sizeof(*b));
 720}
 721
 722/* All VF info */
 723static inline int rtnl_vfinfo_size(const struct net_device *dev,
 724                                   u32 ext_filter_mask)
 725{
 726        if (dev->dev.parent && dev_is_pci(dev->dev.parent) &&
 727            (ext_filter_mask & RTEXT_FILTER_VF)) {
 728                int num_vfs = dev_num_vf(dev->dev.parent);
 729                size_t size = nla_total_size(sizeof(struct nlattr));
 730                size += nla_total_size(num_vfs * sizeof(struct nlattr));
 731                size += num_vfs *
 732                        (nla_total_size(sizeof(struct ifla_vf_mac)) +
 733                         nla_total_size(sizeof(struct ifla_vf_vlan)) +
 734                         nla_total_size(sizeof(struct ifla_vf_tx_rate)) +
 735                         nla_total_size(sizeof(struct ifla_vf_spoofchk)));
 736                return size;
 737        } else
 738                return 0;
 739}
 740
 741static size_t rtnl_port_size(const struct net_device *dev)
 742{
 743        size_t port_size = nla_total_size(4)            /* PORT_VF */
 744                + nla_total_size(PORT_PROFILE_MAX)      /* PORT_PROFILE */
 745                + nla_total_size(sizeof(struct ifla_port_vsi))
 746                                                        /* PORT_VSI_TYPE */
 747                + nla_total_size(PORT_UUID_MAX)         /* PORT_INSTANCE_UUID */
 748                + nla_total_size(PORT_UUID_MAX)         /* PORT_HOST_UUID */
 749                + nla_total_size(1)                     /* PROT_VDP_REQUEST */
 750                + nla_total_size(2);                    /* PORT_VDP_RESPONSE */
 751        size_t vf_ports_size = nla_total_size(sizeof(struct nlattr));
 752        size_t vf_port_size = nla_total_size(sizeof(struct nlattr))
 753                + port_size;
 754        size_t port_self_size = nla_total_size(sizeof(struct nlattr))
 755                + port_size;
 756
 757        if (!dev->netdev_ops->ndo_get_vf_port || !dev->dev.parent)
 758                return 0;
 759        if (dev_num_vf(dev->dev.parent))
 760                return port_self_size + vf_ports_size +
 761                        vf_port_size * dev_num_vf(dev->dev.parent);
 762        else
 763                return port_self_size;
 764}
 765
 766static noinline size_t if_nlmsg_size(const struct net_device *dev,
 767                                     u32 ext_filter_mask)
 768{
 769        return NLMSG_ALIGN(sizeof(struct ifinfomsg))
 770               + nla_total_size(IFNAMSIZ) /* IFLA_IFNAME */
 771               + nla_total_size(IFALIASZ) /* IFLA_IFALIAS */
 772               + nla_total_size(IFNAMSIZ) /* IFLA_QDISC */
 773               + nla_total_size(sizeof(struct rtnl_link_ifmap))
 774               + nla_total_size(sizeof(struct rtnl_link_stats))
 775               + nla_total_size(sizeof(struct rtnl_link_stats64))
 776               + nla_total_size(MAX_ADDR_LEN) /* IFLA_ADDRESS */
 777               + nla_total_size(MAX_ADDR_LEN) /* IFLA_BROADCAST */
 778               + nla_total_size(4) /* IFLA_TXQLEN */
 779               + nla_total_size(4) /* IFLA_WEIGHT */
 780               + nla_total_size(4) /* IFLA_MTU */
 781               + nla_total_size(4) /* IFLA_LINK */
 782               + nla_total_size(4) /* IFLA_MASTER */
 783               + nla_total_size(4) /* IFLA_PROMISCUITY */
 784               + nla_total_size(4) /* IFLA_NUM_TX_QUEUES */
 785               + nla_total_size(4) /* IFLA_NUM_RX_QUEUES */
 786               + nla_total_size(1) /* IFLA_OPERSTATE */
 787               + nla_total_size(1) /* IFLA_LINKMODE */
 788               + nla_total_size(ext_filter_mask
 789                                & RTEXT_FILTER_VF ? 4 : 0) /* IFLA_NUM_VF */
 790               + rtnl_vfinfo_size(dev, ext_filter_mask) /* IFLA_VFINFO_LIST */
 791               + rtnl_port_size(dev) /* IFLA_VF_PORTS + IFLA_PORT_SELF */
 792               + rtnl_link_get_size(dev) /* IFLA_LINKINFO */
 793               + rtnl_link_get_af_size(dev); /* IFLA_AF_SPEC */
 794}
 795
 796static int rtnl_vf_ports_fill(struct sk_buff *skb, struct net_device *dev)
 797{
 798        struct nlattr *vf_ports;
 799        struct nlattr *vf_port;
 800        int vf;
 801        int err;
 802
 803        vf_ports = nla_nest_start(skb, IFLA_VF_PORTS);
 804        if (!vf_ports)
 805                return -EMSGSIZE;
 806
 807        for (vf = 0; vf < dev_num_vf(dev->dev.parent); vf++) {
 808                vf_port = nla_nest_start(skb, IFLA_VF_PORT);
 809                if (!vf_port)
 810                        goto nla_put_failure;
 811                if (nla_put_u32(skb, IFLA_PORT_VF, vf))
 812                        goto nla_put_failure;
 813                err = dev->netdev_ops->ndo_get_vf_port(dev, vf, skb);
 814                if (err == -EMSGSIZE)
 815                        goto nla_put_failure;
 816                if (err) {
 817                        nla_nest_cancel(skb, vf_port);
 818                        continue;
 819                }
 820                nla_nest_end(skb, vf_port);
 821        }
 822
 823        nla_nest_end(skb, vf_ports);
 824
 825        return 0;
 826
 827nla_put_failure:
 828        nla_nest_cancel(skb, vf_ports);
 829        return -EMSGSIZE;
 830}
 831
 832static int rtnl_port_self_fill(struct sk_buff *skb, struct net_device *dev)
 833{
 834        struct nlattr *port_self;
 835        int err;
 836
 837        port_self = nla_nest_start(skb, IFLA_PORT_SELF);
 838        if (!port_self)
 839                return -EMSGSIZE;
 840
 841        err = dev->netdev_ops->ndo_get_vf_port(dev, PORT_SELF_VF, skb);
 842        if (err) {
 843                nla_nest_cancel(skb, port_self);
 844                return (err == -EMSGSIZE) ? err : 0;
 845        }
 846
 847        nla_nest_end(skb, port_self);
 848
 849        return 0;
 850}
 851
 852static int rtnl_port_fill(struct sk_buff *skb, struct net_device *dev)
 853{
 854        int err;
 855
 856        if (!dev->netdev_ops->ndo_get_vf_port || !dev->dev.parent)
 857                return 0;
 858
 859        err = rtnl_port_self_fill(skb, dev);
 860        if (err)
 861                return err;
 862
 863        if (dev_num_vf(dev->dev.parent)) {
 864                err = rtnl_vf_ports_fill(skb, dev);
 865                if (err)
 866                        return err;
 867        }
 868
 869        return 0;
 870}
 871
 872static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
 873                            int type, u32 pid, u32 seq, u32 change,
 874                            unsigned int flags, u32 ext_filter_mask)
 875{
 876        struct ifinfomsg *ifm;
 877        struct nlmsghdr *nlh;
 878        struct rtnl_link_stats64 temp;
 879        const struct rtnl_link_stats64 *stats;
 880        struct nlattr *attr, *af_spec;
 881        struct rtnl_af_ops *af_ops;
 882
 883        ASSERT_RTNL();
 884        nlh = nlmsg_put(skb, pid, seq, type, sizeof(*ifm), flags);
 885        if (nlh == NULL)
 886                return -EMSGSIZE;
 887
 888        ifm = nlmsg_data(nlh);
 889        ifm->ifi_family = AF_UNSPEC;
 890        ifm->__ifi_pad = 0;
 891        ifm->ifi_type = dev->type;
 892        ifm->ifi_index = dev->ifindex;
 893        ifm->ifi_flags = dev_get_flags(dev);
 894        ifm->ifi_change = change;
 895
 896        if (nla_put_string(skb, IFLA_IFNAME, dev->name) ||
 897            nla_put_u32(skb, IFLA_TXQLEN, dev->tx_queue_len) ||
 898            nla_put_u8(skb, IFLA_OPERSTATE,
 899                       netif_running(dev) ? dev->operstate : IF_OPER_DOWN) ||
 900            nla_put_u8(skb, IFLA_LINKMODE, dev->link_mode) ||
 901            nla_put_u32(skb, IFLA_MTU, dev->mtu) ||
 902            nla_put_u32(skb, IFLA_GROUP, dev->group) ||
 903            nla_put_u32(skb, IFLA_PROMISCUITY, dev->promiscuity) ||
 904            nla_put_u32(skb, IFLA_NUM_TX_QUEUES, dev->num_tx_queues) ||
 905#ifdef CONFIG_RPS
 906            nla_put_u32(skb, IFLA_NUM_RX_QUEUES, dev->num_rx_queues) ||
 907#endif
 908            (dev->ifindex != dev->iflink &&
 909             nla_put_u32(skb, IFLA_LINK, dev->iflink)) ||
 910            (dev->master &&
 911             nla_put_u32(skb, IFLA_MASTER, dev->master->ifindex)) ||
 912            (dev->qdisc &&
 913             nla_put_string(skb, IFLA_QDISC, dev->qdisc->ops->id)) ||
 914            (dev->ifalias &&
 915             nla_put_string(skb, IFLA_IFALIAS, dev->ifalias)))
 916                goto nla_put_failure;
 917
 918        if (1) {
 919                struct rtnl_link_ifmap map = {
 920                        .mem_start   = dev->mem_start,
 921                        .mem_end     = dev->mem_end,
 922                        .base_addr   = dev->base_addr,
 923                        .irq         = dev->irq,
 924                        .dma         = dev->dma,
 925                        .port        = dev->if_port,
 926                };
 927                if (nla_put(skb, IFLA_MAP, sizeof(map), &map))
 928                        goto nla_put_failure;
 929        }
 930
 931        if (dev->addr_len) {
 932                if (nla_put(skb, IFLA_ADDRESS, dev->addr_len, dev->dev_addr) ||
 933                    nla_put(skb, IFLA_BROADCAST, dev->addr_len, dev->broadcast))
 934                        goto nla_put_failure;
 935        }
 936
 937        attr = nla_reserve(skb, IFLA_STATS,
 938                        sizeof(struct rtnl_link_stats));
 939        if (attr == NULL)
 940                goto nla_put_failure;
 941
 942        stats = dev_get_stats(dev, &temp);
 943        copy_rtnl_link_stats(nla_data(attr), stats);
 944
 945        attr = nla_reserve(skb, IFLA_STATS64,
 946                        sizeof(struct rtnl_link_stats64));
 947        if (attr == NULL)
 948                goto nla_put_failure;
 949        copy_rtnl_link_stats64(nla_data(attr), stats);
 950
 951        if (dev->dev.parent && (ext_filter_mask & RTEXT_FILTER_VF) &&
 952            nla_put_u32(skb, IFLA_NUM_VF, dev_num_vf(dev->dev.parent)))
 953                goto nla_put_failure;
 954
 955        if (dev->netdev_ops->ndo_get_vf_config && dev->dev.parent
 956            && (ext_filter_mask & RTEXT_FILTER_VF)) {
 957                int i;
 958
 959                struct nlattr *vfinfo, *vf;
 960                int num_vfs = dev_num_vf(dev->dev.parent);
 961
 962                vfinfo = nla_nest_start(skb, IFLA_VFINFO_LIST);
 963                if (!vfinfo)
 964                        goto nla_put_failure;
 965                for (i = 0; i < num_vfs; i++) {
 966                        struct ifla_vf_info ivi;
 967                        struct ifla_vf_mac vf_mac;
 968                        struct ifla_vf_vlan vf_vlan;
 969                        struct ifla_vf_tx_rate vf_tx_rate;
 970                        struct ifla_vf_spoofchk vf_spoofchk;
 971
 972                        /*
 973                         * Not all SR-IOV capable drivers support the
 974                         * spoofcheck query.  Preset to -1 so the user
 975                         * space tool can detect that the driver didn't
 976                         * report anything.
 977                         */
 978                        ivi.spoofchk = -1;
 979                        if (dev->netdev_ops->ndo_get_vf_config(dev, i, &ivi))
 980                                break;
 981                        vf_mac.vf =
 982                                vf_vlan.vf =
 983                                vf_tx_rate.vf =
 984                                vf_spoofchk.vf = ivi.vf;
 985
 986                        memcpy(vf_mac.mac, ivi.mac, sizeof(ivi.mac));
 987                        vf_vlan.vlan = ivi.vlan;
 988                        vf_vlan.qos = ivi.qos;
 989                        vf_tx_rate.rate = ivi.tx_rate;
 990                        vf_spoofchk.setting = ivi.spoofchk;
 991                        vf = nla_nest_start(skb, IFLA_VF_INFO);
 992                        if (!vf) {
 993                                nla_nest_cancel(skb, vfinfo);
 994                                goto nla_put_failure;
 995                        }
 996                        if (nla_put(skb, IFLA_VF_MAC, sizeof(vf_mac), &vf_mac) ||
 997                            nla_put(skb, IFLA_VF_VLAN, sizeof(vf_vlan), &vf_vlan) ||
 998                            nla_put(skb, IFLA_VF_TX_RATE, sizeof(vf_tx_rate),
 999                                    &vf_tx_rate) ||
1000                            nla_put(skb, IFLA_VF_SPOOFCHK, sizeof(vf_spoofchk),
1001                                    &vf_spoofchk))
1002                                goto nla_put_failure;
1003                        nla_nest_end(skb, vf);
1004                }
1005                nla_nest_end(skb, vfinfo);
1006        }
1007
1008        if (rtnl_port_fill(skb, dev))
1009                goto nla_put_failure;
1010
1011        if (dev->rtnl_link_ops) {
1012                if (rtnl_link_fill(skb, dev) < 0)
1013                        goto nla_put_failure;
1014        }
1015
1016        if (!(af_spec = nla_nest_start(skb, IFLA_AF_SPEC)))
1017                goto nla_put_failure;
1018
1019        list_for_each_entry(af_ops, &rtnl_af_ops, list) {
1020                if (af_ops->fill_link_af) {
1021                        struct nlattr *af;
1022                        int err;
1023
1024                        if (!(af = nla_nest_start(skb, af_ops->family)))
1025                                goto nla_put_failure;
1026
1027                        err = af_ops->fill_link_af(skb, dev);
1028
1029                        /*
1030                         * Caller may return ENODATA to indicate that there
1031                         * was no data to be dumped. This is not an error, it
1032                         * means we should trim the attribute header and
1033                         * continue.
1034                         */
1035                        if (err == -ENODATA)
1036                                nla_nest_cancel(skb, af);
1037                        else if (err < 0)
1038                                goto nla_put_failure;
1039
1040                        nla_nest_end(skb, af);
1041                }
1042        }
1043
1044        nla_nest_end(skb, af_spec);
1045
1046        return nlmsg_end(skb, nlh);
1047
1048nla_put_failure:
1049        nlmsg_cancel(skb, nlh);
1050        return -EMSGSIZE;
1051}
1052
1053static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
1054{
1055        struct net *net = sock_net(skb->sk);
1056        int h, s_h;
1057        int idx = 0, s_idx;
1058        struct net_device *dev;
1059        struct hlist_head *head;
1060        struct hlist_node *node;
1061        struct nlattr *tb[IFLA_MAX+1];
1062        u32 ext_filter_mask = 0;
1063
1064        s_h = cb->args[0];
1065        s_idx = cb->args[1];
1066
1067        rcu_read_lock();
1068        cb->seq = net->dev_base_seq;
1069
1070        if (nlmsg_parse(cb->nlh, sizeof(struct rtgenmsg), tb, IFLA_MAX,
1071                        ifla_policy) >= 0) {
1072
1073                if (tb[IFLA_EXT_MASK])
1074                        ext_filter_mask = nla_get_u32(tb[IFLA_EXT_MASK]);
1075        }
1076
1077        for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) {
1078                idx = 0;
1079                head = &net->dev_index_head[h];
1080                hlist_for_each_entry_rcu(dev, node, head, index_hlist) {
1081                        if (idx < s_idx)
1082                                goto cont;
1083                        if (rtnl_fill_ifinfo(skb, dev, RTM_NEWLINK,
1084                                             NETLINK_CB(cb->skb).portid,
1085                                             cb->nlh->nlmsg_seq, 0,
1086                                             NLM_F_MULTI,
1087                                             ext_filter_mask) <= 0)
1088                                goto out;
1089
1090                        nl_dump_check_consistent(cb, nlmsg_hdr(skb));
1091cont:
1092                        idx++;
1093                }
1094        }
1095out:
1096        rcu_read_unlock();
1097        cb->args[1] = idx;
1098        cb->args[0] = h;
1099
1100        return skb->len;
1101}
1102
1103const struct nla_policy ifla_policy[IFLA_MAX+1] = {
1104        [IFLA_IFNAME]           = { .type = NLA_STRING, .len = IFNAMSIZ-1 },
1105        [IFLA_ADDRESS]          = { .type = NLA_BINARY, .len = MAX_ADDR_LEN },
1106        [IFLA_BROADCAST]        = { .type = NLA_BINARY, .len = MAX_ADDR_LEN },
1107        [IFLA_MAP]              = { .len = sizeof(struct rtnl_link_ifmap) },
1108        [IFLA_MTU]              = { .type = NLA_U32 },
1109        [IFLA_LINK]             = { .type = NLA_U32 },
1110        [IFLA_MASTER]           = { .type = NLA_U32 },
1111        [IFLA_TXQLEN]           = { .type = NLA_U32 },
1112        [IFLA_WEIGHT]           = { .type = NLA_U32 },
1113        [IFLA_OPERSTATE]        = { .type = NLA_U8 },
1114        [IFLA_LINKMODE]         = { .type = NLA_U8 },
1115        [IFLA_LINKINFO]         = { .type = NLA_NESTED },
1116        [IFLA_NET_NS_PID]       = { .type = NLA_U32 },
1117        [IFLA_NET_NS_FD]        = { .type = NLA_U32 },
1118        [IFLA_IFALIAS]          = { .type = NLA_STRING, .len = IFALIASZ-1 },
1119        [IFLA_VFINFO_LIST]      = {. type = NLA_NESTED },
1120        [IFLA_VF_PORTS]         = { .type = NLA_NESTED },
1121        [IFLA_PORT_SELF]        = { .type = NLA_NESTED },
1122        [IFLA_AF_SPEC]          = { .type = NLA_NESTED },
1123        [IFLA_EXT_MASK]         = { .type = NLA_U32 },
1124        [IFLA_PROMISCUITY]      = { .type = NLA_U32 },
1125        [IFLA_NUM_TX_QUEUES]    = { .type = NLA_U32 },
1126        [IFLA_NUM_RX_QUEUES]    = { .type = NLA_U32 },
1127};
1128EXPORT_SYMBOL(ifla_policy);
1129
1130static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = {
1131        [IFLA_INFO_KIND]        = { .type = NLA_STRING },
1132        [IFLA_INFO_DATA]        = { .type = NLA_NESTED },
1133};
1134
1135static const struct nla_policy ifla_vfinfo_policy[IFLA_VF_INFO_MAX+1] = {
1136        [IFLA_VF_INFO]          = { .type = NLA_NESTED },
1137};
1138
1139static const struct nla_policy ifla_vf_policy[IFLA_VF_MAX+1] = {
1140        [IFLA_VF_MAC]           = { .type = NLA_BINARY,
1141                                    .len = sizeof(struct ifla_vf_mac) },
1142        [IFLA_VF_VLAN]          = { .type = NLA_BINARY,
1143                                    .len = sizeof(struct ifla_vf_vlan) },
1144        [IFLA_VF_TX_RATE]       = { .type = NLA_BINARY,
1145                                    .len = sizeof(struct ifla_vf_tx_rate) },
1146        [IFLA_VF_SPOOFCHK]      = { .type = NLA_BINARY,
1147                                    .len = sizeof(struct ifla_vf_spoofchk) },
1148};
1149
1150static const struct nla_policy ifla_port_policy[IFLA_PORT_MAX+1] = {
1151        [IFLA_PORT_VF]          = { .type = NLA_U32 },
1152        [IFLA_PORT_PROFILE]     = { .type = NLA_STRING,
1153                                    .len = PORT_PROFILE_MAX },
1154        [IFLA_PORT_VSI_TYPE]    = { .type = NLA_BINARY,
1155                                    .len = sizeof(struct ifla_port_vsi)},
1156        [IFLA_PORT_INSTANCE_UUID] = { .type = NLA_BINARY,
1157                                      .len = PORT_UUID_MAX },
1158        [IFLA_PORT_HOST_UUID]   = { .type = NLA_STRING,
1159                                    .len = PORT_UUID_MAX },
1160        [IFLA_PORT_REQUEST]     = { .type = NLA_U8, },
1161        [IFLA_PORT_RESPONSE]    = { .type = NLA_U16, },
1162};
1163
1164struct net *rtnl_link_get_net(struct net *src_net, struct nlattr *tb[])
1165{
1166        struct net *net;
1167        /* Examine the link attributes and figure out which
1168         * network namespace we are talking about.
1169         */
1170        if (tb[IFLA_NET_NS_PID])
1171                net = get_net_ns_by_pid(nla_get_u32(tb[IFLA_NET_NS_PID]));
1172        else if (tb[IFLA_NET_NS_FD])
1173                net = get_net_ns_by_fd(nla_get_u32(tb[IFLA_NET_NS_FD]));
1174        else
1175                net = get_net(src_net);
1176        return net;
1177}
1178EXPORT_SYMBOL(rtnl_link_get_net);
1179
1180static int validate_linkmsg(struct net_device *dev, struct nlattr *tb[])
1181{
1182        if (dev) {
1183                if (tb[IFLA_ADDRESS] &&
1184                    nla_len(tb[IFLA_ADDRESS]) < dev->addr_len)
1185                        return -EINVAL;
1186
1187                if (tb[IFLA_BROADCAST] &&
1188                    nla_len(tb[IFLA_BROADCAST]) < dev->addr_len)
1189                        return -EINVAL;
1190        }
1191
1192        if (tb[IFLA_AF_SPEC]) {
1193                struct nlattr *af;
1194                int rem, err;
1195
1196                nla_for_each_nested(af, tb[IFLA_AF_SPEC], rem) {
1197                        const struct rtnl_af_ops *af_ops;
1198
1199                        if (!(af_ops = rtnl_af_lookup(nla_type(af))))
1200                                return -EAFNOSUPPORT;
1201
1202                        if (!af_ops->set_link_af)
1203                                return -EOPNOTSUPP;
1204
1205                        if (af_ops->validate_link_af) {
1206                                err = af_ops->validate_link_af(dev, af);
1207                                if (err < 0)
1208                                        return err;
1209                        }
1210                }
1211        }
1212
1213        return 0;
1214}
1215
1216static int do_setvfinfo(struct net_device *dev, struct nlattr *attr)
1217{
1218        int rem, err = -EINVAL;
1219        struct nlattr *vf;
1220        const struct net_device_ops *ops = dev->netdev_ops;
1221
1222        nla_for_each_nested(vf, attr, rem) {
1223                switch (nla_type(vf)) {
1224                case IFLA_VF_MAC: {
1225                        struct ifla_vf_mac *ivm;
1226                        ivm = nla_data(vf);
1227                        err = -EOPNOTSUPP;
1228                        if (ops->ndo_set_vf_mac)
1229                                err = ops->ndo_set_vf_mac(dev, ivm->vf,
1230                                                          ivm->mac);
1231                        break;
1232                }
1233                case IFLA_VF_VLAN: {
1234                        struct ifla_vf_vlan *ivv;
1235                        ivv = nla_data(vf);
1236                        err = -EOPNOTSUPP;
1237                        if (ops->ndo_set_vf_vlan)
1238                                err = ops->ndo_set_vf_vlan(dev, ivv->vf,
1239                                                           ivv->vlan,
1240                                                           ivv->qos);
1241                        break;
1242                }
1243                case IFLA_VF_TX_RATE: {
1244                        struct ifla_vf_tx_rate *ivt;
1245                        ivt = nla_data(vf);
1246                        err = -EOPNOTSUPP;
1247                        if (ops->ndo_set_vf_tx_rate)
1248                                err = ops->ndo_set_vf_tx_rate(dev, ivt->vf,
1249                                                              ivt->rate);
1250                        break;
1251                }
1252                case IFLA_VF_SPOOFCHK: {
1253                        struct ifla_vf_spoofchk *ivs;
1254                        ivs = nla_data(vf);
1255                        err = -EOPNOTSUPP;
1256                        if (ops->ndo_set_vf_spoofchk)
1257                                err = ops->ndo_set_vf_spoofchk(dev, ivs->vf,
1258                                                               ivs->setting);
1259                        break;
1260                }
1261                default:
1262                        err = -EINVAL;
1263                        break;
1264                }
1265                if (err)
1266                        break;
1267        }
1268        return err;
1269}
1270
1271static int do_set_master(struct net_device *dev, int ifindex)
1272{
1273        struct net_device *master_dev;
1274        const struct net_device_ops *ops;
1275        int err;
1276
1277        if (dev->master) {
1278                if (dev->master->ifindex == ifindex)
1279                        return 0;
1280                ops = dev->master->netdev_ops;
1281                if (ops->ndo_del_slave) {
1282                        err = ops->ndo_del_slave(dev->master, dev);
1283                        if (err)
1284                                return err;
1285                } else {
1286                        return -EOPNOTSUPP;
1287                }
1288        }
1289
1290        if (ifindex) {
1291                master_dev = __dev_get_by_index(dev_net(dev), ifindex);
1292                if (!master_dev)
1293                        return -EINVAL;
1294                ops = master_dev->netdev_ops;
1295                if (ops->ndo_add_slave) {
1296                        err = ops->ndo_add_slave(master_dev, dev);
1297                        if (err)
1298                                return err;
1299                } else {
1300                        return -EOPNOTSUPP;
1301                }
1302        }
1303        return 0;
1304}
1305
1306static int do_setlink(struct net_device *dev, struct ifinfomsg *ifm,
1307                      struct nlattr **tb, char *ifname, int modified)
1308{
1309        const struct net_device_ops *ops = dev->netdev_ops;
1310        int send_addr_notify = 0;
1311        int err;
1312
1313        if (tb[IFLA_NET_NS_PID] || tb[IFLA_NET_NS_FD]) {
1314                struct net *net = rtnl_link_get_net(dev_net(dev), tb);
1315                if (IS_ERR(net)) {
1316                        err = PTR_ERR(net);
1317                        goto errout;
1318                }
1319                if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) {
1320                        err = -EPERM;
1321                        goto errout;
1322                }
1323                err = dev_change_net_namespace(dev, net, ifname);
1324                put_net(net);
1325                if (err)
1326                        goto errout;
1327                modified = 1;
1328        }
1329
1330        if (tb[IFLA_MAP]) {
1331                struct rtnl_link_ifmap *u_map;
1332                struct ifmap k_map;
1333
1334                if (!ops->ndo_set_config) {
1335                        err = -EOPNOTSUPP;
1336                        goto errout;
1337                }
1338
1339                if (!netif_device_present(dev)) {
1340                        err = -ENODEV;
1341                        goto errout;
1342                }
1343
1344                u_map = nla_data(tb[IFLA_MAP]);
1345                k_map.mem_start = (unsigned long) u_map->mem_start;
1346                k_map.mem_end = (unsigned long) u_map->mem_end;
1347                k_map.base_addr = (unsigned short) u_map->base_addr;
1348                k_map.irq = (unsigned char) u_map->irq;
1349                k_map.dma = (unsigned char) u_map->dma;
1350                k_map.port = (unsigned char) u_map->port;
1351
1352                err = ops->ndo_set_config(dev, &k_map);
1353                if (err < 0)
1354                        goto errout;
1355
1356                modified = 1;
1357        }
1358
1359        if (tb[IFLA_ADDRESS]) {
1360                struct sockaddr *sa;
1361                int len;
1362
1363                if (!ops->ndo_set_mac_address) {
1364                        err = -EOPNOTSUPP;
1365                        goto errout;
1366                }
1367
1368                if (!netif_device_present(dev)) {
1369                        err = -ENODEV;
1370                        goto errout;
1371                }
1372
1373                len = sizeof(sa_family_t) + dev->addr_len;
1374                sa = kmalloc(len, GFP_KERNEL);
1375                if (!sa) {
1376                        err = -ENOMEM;
1377                        goto errout;
1378                }
1379                sa->sa_family = dev->type;
1380                memcpy(sa->sa_data, nla_data(tb[IFLA_ADDRESS]),
1381                       dev->addr_len);
1382                err = ops->ndo_set_mac_address(dev, sa);
1383                kfree(sa);
1384                if (err)
1385                        goto errout;
1386                send_addr_notify = 1;
1387                modified = 1;
1388                add_device_randomness(dev->dev_addr, dev->addr_len);
1389        }
1390
1391        if (tb[IFLA_MTU]) {
1392                err = dev_set_mtu(dev, nla_get_u32(tb[IFLA_MTU]));
1393                if (err < 0)
1394                        goto errout;
1395                modified = 1;
1396        }
1397
1398        if (tb[IFLA_GROUP]) {
1399                dev_set_group(dev, nla_get_u32(tb[IFLA_GROUP]));
1400                modified = 1;
1401        }
1402
1403        /*
1404         * Interface selected by interface index but interface
1405         * name provided implies that a name change has been
1406         * requested.
1407         */
1408        if (ifm->ifi_index > 0 && ifname[0]) {
1409                err = dev_change_name(dev, ifname);
1410                if (err < 0)
1411                        goto errout;
1412                modified = 1;
1413        }
1414
1415        if (tb[IFLA_IFALIAS]) {
1416                err = dev_set_alias(dev, nla_data(tb[IFLA_IFALIAS]),
1417                                    nla_len(tb[IFLA_IFALIAS]));
1418                if (err < 0)
1419                        goto errout;
1420                modified = 1;
1421        }
1422
1423        if (tb[IFLA_BROADCAST]) {
1424                nla_memcpy(dev->broadcast, tb[IFLA_BROADCAST], dev->addr_len);
1425                send_addr_notify = 1;
1426        }
1427
1428        if (ifm->ifi_flags || ifm->ifi_change) {
1429                err = dev_change_flags(dev, rtnl_dev_combine_flags(dev, ifm));
1430                if (err < 0)
1431                        goto errout;
1432        }
1433
1434        if (tb[IFLA_MASTER]) {
1435                err = do_set_master(dev, nla_get_u32(tb[IFLA_MASTER]));
1436                if (err)
1437                        goto errout;
1438                modified = 1;
1439        }
1440
1441        if (tb[IFLA_TXQLEN])
1442                dev->tx_queue_len = nla_get_u32(tb[IFLA_TXQLEN]);
1443
1444        if (tb[IFLA_OPERSTATE])
1445                set_operstate(dev, nla_get_u8(tb[IFLA_OPERSTATE]));
1446
1447        if (tb[IFLA_LINKMODE]) {
1448                write_lock_bh(&dev_base_lock);
1449                dev->link_mode = nla_get_u8(tb[IFLA_LINKMODE]);
1450                write_unlock_bh(&dev_base_lock);
1451        }
1452
1453        if (tb[IFLA_VFINFO_LIST]) {
1454                struct nlattr *attr;
1455                int rem;
1456                nla_for_each_nested(attr, tb[IFLA_VFINFO_LIST], rem) {
1457                        if (nla_type(attr) != IFLA_VF_INFO) {
1458                                err = -EINVAL;
1459                                goto errout;
1460                        }
1461                        err = do_setvfinfo(dev, attr);
1462                        if (err < 0)
1463                                goto errout;
1464                        modified = 1;
1465                }
1466        }
1467        err = 0;
1468
1469        if (tb[IFLA_VF_PORTS]) {
1470                struct nlattr *port[IFLA_PORT_MAX+1];
1471                struct nlattr *attr;
1472                int vf;
1473                int rem;
1474
1475                err = -EOPNOTSUPP;
1476                if (!ops->ndo_set_vf_port)
1477                        goto errout;
1478
1479                nla_for_each_nested(attr, tb[IFLA_VF_PORTS], rem) {
1480                        if (nla_type(attr) != IFLA_VF_PORT)
1481                                continue;
1482                        err = nla_parse_nested(port, IFLA_PORT_MAX,
1483                                attr, ifla_port_policy);
1484                        if (err < 0)
1485                                goto errout;
1486                        if (!port[IFLA_PORT_VF]) {
1487                                err = -EOPNOTSUPP;
1488                                goto errout;
1489                        }
1490                        vf = nla_get_u32(port[IFLA_PORT_VF]);
1491                        err = ops->ndo_set_vf_port(dev, vf, port);
1492                        if (err < 0)
1493                                goto errout;
1494                        modified = 1;
1495                }
1496        }
1497        err = 0;
1498
1499        if (tb[IFLA_PORT_SELF]) {
1500                struct nlattr *port[IFLA_PORT_MAX+1];
1501
1502                err = nla_parse_nested(port, IFLA_PORT_MAX,
1503                        tb[IFLA_PORT_SELF], ifla_port_policy);
1504                if (err < 0)
1505                        goto errout;
1506
1507                err = -EOPNOTSUPP;
1508                if (ops->ndo_set_vf_port)
1509                        err = ops->ndo_set_vf_port(dev, PORT_SELF_VF, port);
1510                if (err < 0)
1511                        goto errout;
1512                modified = 1;
1513        }
1514
1515        if (tb[IFLA_AF_SPEC]) {
1516                struct nlattr *af;
1517                int rem;
1518
1519                nla_for_each_nested(af, tb[IFLA_AF_SPEC], rem) {
1520                        const struct rtnl_af_ops *af_ops;
1521
1522                        if (!(af_ops = rtnl_af_lookup(nla_type(af))))
1523                                BUG();
1524
1525                        err = af_ops->set_link_af(dev, af);
1526                        if (err < 0)
1527                                goto errout;
1528
1529                        modified = 1;
1530                }
1531        }
1532        err = 0;
1533
1534errout:
1535        if (err < 0 && modified)
1536                net_warn_ratelimited("A link change request failed with some changes committed already. Interface %s may have been left with an inconsistent configuration, please check.\n",
1537                                     dev->name);
1538
1539        if (send_addr_notify)
1540                call_netdevice_notifiers(NETDEV_CHANGEADDR, dev);
1541
1542        return err;
1543}
1544
1545static int rtnl_setlink(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
1546{
1547        struct net *net = sock_net(skb->sk);
1548        struct ifinfomsg *ifm;
1549        struct net_device *dev;
1550        int err;
1551        struct nlattr *tb[IFLA_MAX+1];
1552        char ifname[IFNAMSIZ];
1553
1554        err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFLA_MAX, ifla_policy);
1555        if (err < 0)
1556                goto errout;
1557
1558        if (tb[IFLA_IFNAME])
1559                nla_strlcpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ);
1560        else
1561                ifname[0] = '\0';
1562
1563        err = -EINVAL;
1564        ifm = nlmsg_data(nlh);
1565        if (ifm->ifi_index > 0)
1566                dev = __dev_get_by_index(net, ifm->ifi_index);
1567        else if (tb[IFLA_IFNAME])
1568                dev = __dev_get_by_name(net, ifname);
1569        else
1570                goto errout;
1571
1572        if (dev == NULL) {
1573                err = -ENODEV;
1574                goto errout;
1575        }
1576
1577        err = validate_linkmsg(dev, tb);
1578        if (err < 0)
1579                goto errout;
1580
1581        err = do_setlink(dev, ifm, tb, ifname, 0);
1582errout:
1583        return err;
1584}
1585
1586static int rtnl_dellink(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
1587{
1588        struct net *net = sock_net(skb->sk);
1589        const struct rtnl_link_ops *ops;
1590        struct net_device *dev;
1591        struct ifinfomsg *ifm;
1592        char ifname[IFNAMSIZ];
1593        struct nlattr *tb[IFLA_MAX+1];
1594        int err;
1595        LIST_HEAD(list_kill);
1596
1597        err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFLA_MAX, ifla_policy);
1598        if (err < 0)
1599                return err;
1600
1601        if (tb[IFLA_IFNAME])
1602                nla_strlcpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ);
1603
1604        ifm = nlmsg_data(nlh);
1605        if (ifm->ifi_index > 0)
1606                dev = __dev_get_by_index(net, ifm->ifi_index);
1607        else if (tb[IFLA_IFNAME])
1608                dev = __dev_get_by_name(net, ifname);
1609        else
1610                return -EINVAL;
1611
1612        if (!dev)
1613                return -ENODEV;
1614
1615        ops = dev->rtnl_link_ops;
1616        if (!ops)
1617                return -EOPNOTSUPP;
1618
1619        ops->dellink(dev, &list_kill);
1620        unregister_netdevice_many(&list_kill);
1621        list_del(&list_kill);
1622        return 0;
1623}
1624
1625int rtnl_configure_link(struct net_device *dev, const struct ifinfomsg *ifm)
1626{
1627        unsigned int old_flags;
1628        int err;
1629
1630        old_flags = dev->flags;
1631        if (ifm && (ifm->ifi_flags || ifm->ifi_change)) {
1632                err = __dev_change_flags(dev, rtnl_dev_combine_flags(dev, ifm));
1633                if (err < 0)
1634                        return err;
1635        }
1636
1637        dev->rtnl_link_state = RTNL_LINK_INITIALIZED;
1638        rtmsg_ifinfo(RTM_NEWLINK, dev, ~0U);
1639
1640        __dev_notify_flags(dev, old_flags);
1641        return 0;
1642}
1643EXPORT_SYMBOL(rtnl_configure_link);
1644
1645struct net_device *rtnl_create_link(struct net *net,
1646        char *ifname, const struct rtnl_link_ops *ops, struct nlattr *tb[])
1647{
1648        int err;
1649        struct net_device *dev;
1650        unsigned int num_tx_queues = 1;
1651        unsigned int num_rx_queues = 1;
1652
1653        if (tb[IFLA_NUM_TX_QUEUES])
1654                num_tx_queues = nla_get_u32(tb[IFLA_NUM_TX_QUEUES]);
1655        else if (ops->get_num_tx_queues)
1656                num_tx_queues = ops->get_num_tx_queues();
1657
1658        if (tb[IFLA_NUM_RX_QUEUES])
1659                num_rx_queues = nla_get_u32(tb[IFLA_NUM_RX_QUEUES]);
1660        else if (ops->get_num_rx_queues)
1661                num_rx_queues = ops->get_num_rx_queues();
1662
1663        err = -ENOMEM;
1664        dev = alloc_netdev_mqs(ops->priv_size, ifname, ops->setup,
1665                               num_tx_queues, num_rx_queues);
1666        if (!dev)
1667                goto err;
1668
1669        dev_net_set(dev, net);
1670        dev->rtnl_link_ops = ops;
1671        dev->rtnl_link_state = RTNL_LINK_INITIALIZING;
1672
1673        if (tb[IFLA_MTU])
1674                dev->mtu = nla_get_u32(tb[IFLA_MTU]);
1675        if (tb[IFLA_ADDRESS])
1676                memcpy(dev->dev_addr, nla_data(tb[IFLA_ADDRESS]),
1677                                nla_len(tb[IFLA_ADDRESS]));
1678        if (tb[IFLA_BROADCAST])
1679                memcpy(dev->broadcast, nla_data(tb[IFLA_BROADCAST]),
1680                                nla_len(tb[IFLA_BROADCAST]));
1681        if (tb[IFLA_TXQLEN])
1682                dev->tx_queue_len = nla_get_u32(tb[IFLA_TXQLEN]);
1683        if (tb[IFLA_OPERSTATE])
1684                set_operstate(dev, nla_get_u8(tb[IFLA_OPERSTATE]));
1685        if (tb[IFLA_LINKMODE])
1686                dev->link_mode = nla_get_u8(tb[IFLA_LINKMODE]);
1687        if (tb[IFLA_GROUP])
1688                dev_set_group(dev, nla_get_u32(tb[IFLA_GROUP]));
1689
1690        return dev;
1691
1692err:
1693        return ERR_PTR(err);
1694}
1695EXPORT_SYMBOL(rtnl_create_link);
1696
1697static int rtnl_group_changelink(struct net *net, int group,
1698                struct ifinfomsg *ifm,
1699                struct nlattr **tb)
1700{
1701        struct net_device *dev;
1702        int err;
1703
1704        for_each_netdev(net, dev) {
1705                if (dev->group == group) {
1706                        err = do_setlink(dev, ifm, tb, NULL, 0);
1707                        if (err < 0)
1708                                return err;
1709                }
1710        }
1711
1712        return 0;
1713}
1714
1715static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
1716{
1717        struct net *net = sock_net(skb->sk);
1718        const struct rtnl_link_ops *ops;
1719        struct net_device *dev;
1720        struct ifinfomsg *ifm;
1721        char kind[MODULE_NAME_LEN];
1722        char ifname[IFNAMSIZ];
1723        struct nlattr *tb[IFLA_MAX+1];
1724        struct nlattr *linkinfo[IFLA_INFO_MAX+1];
1725        int err;
1726
1727#ifdef CONFIG_MODULES
1728replay:
1729#endif
1730        err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFLA_MAX, ifla_policy);
1731        if (err < 0)
1732                return err;
1733
1734        if (tb[IFLA_IFNAME])
1735                nla_strlcpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ);
1736        else
1737                ifname[0] = '\0';
1738
1739        ifm = nlmsg_data(nlh);
1740        if (ifm->ifi_index > 0)
1741                dev = __dev_get_by_index(net, ifm->ifi_index);
1742        else {
1743                if (ifname[0])
1744                        dev = __dev_get_by_name(net, ifname);
1745                else
1746                        dev = NULL;
1747        }
1748
1749        err = validate_linkmsg(dev, tb);
1750        if (err < 0)
1751                return err;
1752
1753        if (tb[IFLA_LINKINFO]) {
1754                err = nla_parse_nested(linkinfo, IFLA_INFO_MAX,
1755                                       tb[IFLA_LINKINFO], ifla_info_policy);
1756                if (err < 0)
1757                        return err;
1758        } else
1759                memset(linkinfo, 0, sizeof(linkinfo));
1760
1761        if (linkinfo[IFLA_INFO_KIND]) {
1762                nla_strlcpy(kind, linkinfo[IFLA_INFO_KIND], sizeof(kind));
1763                ops = rtnl_link_ops_get(kind);
1764        } else {
1765                kind[0] = '\0';
1766                ops = NULL;
1767        }
1768
1769        if (1) {
1770                struct nlattr *attr[ops ? ops->maxtype + 1 : 0], **data = NULL;
1771                struct net *dest_net;
1772
1773                if (ops) {
1774                        if (ops->maxtype && linkinfo[IFLA_INFO_DATA]) {
1775                                err = nla_parse_nested(attr, ops->maxtype,
1776                                                       linkinfo[IFLA_INFO_DATA],
1777                                                       ops->policy);
1778                                if (err < 0)
1779                                        return err;
1780                                data = attr;
1781                        }
1782                        if (ops->validate) {
1783                                err = ops->validate(tb, data);
1784                                if (err < 0)
1785                                        return err;
1786                        }
1787                }
1788
1789                if (dev) {
1790                        int modified = 0;
1791
1792                        if (nlh->nlmsg_flags & NLM_F_EXCL)
1793                                return -EEXIST;
1794                        if (nlh->nlmsg_flags & NLM_F_REPLACE)
1795                                return -EOPNOTSUPP;
1796
1797                        if (linkinfo[IFLA_INFO_DATA]) {
1798                                if (!ops || ops != dev->rtnl_link_ops ||
1799                                    !ops->changelink)
1800                                        return -EOPNOTSUPP;
1801
1802                                err = ops->changelink(dev, tb, data);
1803                                if (err < 0)
1804                                        return err;
1805                                modified = 1;
1806                        }
1807
1808                        return do_setlink(dev, ifm, tb, ifname, modified);
1809                }
1810
1811                if (!(nlh->nlmsg_flags & NLM_F_CREATE)) {
1812                        if (ifm->ifi_index == 0 && tb[IFLA_GROUP])
1813                                return rtnl_group_changelink(net,
1814                                                nla_get_u32(tb[IFLA_GROUP]),
1815                                                ifm, tb);
1816                        return -ENODEV;
1817                }
1818
1819                if (tb[IFLA_MAP] || tb[IFLA_MASTER] || tb[IFLA_PROTINFO])
1820                        return -EOPNOTSUPP;
1821
1822                if (!ops) {
1823#ifdef CONFIG_MODULES
1824                        if (kind[0]) {
1825                                __rtnl_unlock();
1826                                request_module("rtnl-link-%s", kind);
1827                                rtnl_lock();
1828                                ops = rtnl_link_ops_get(kind);
1829                                if (ops)
1830                                        goto replay;
1831                        }
1832#endif
1833                        return -EOPNOTSUPP;
1834                }
1835
1836                if (!ifname[0])
1837                        snprintf(ifname, IFNAMSIZ, "%s%%d", ops->kind);
1838
1839                dest_net = rtnl_link_get_net(net, tb);
1840                if (IS_ERR(dest_net))
1841                        return PTR_ERR(dest_net);
1842
1843                dev = rtnl_create_link(dest_net, ifname, ops, tb);
1844                if (IS_ERR(dev)) {
1845                        err = PTR_ERR(dev);
1846                        goto out;
1847                }
1848
1849                dev->ifindex = ifm->ifi_index;
1850
1851                if (ops->newlink)
1852                        err = ops->newlink(net, dev, tb, data);
1853                else
1854                        err = register_netdevice(dev);
1855
1856                if (err < 0 && !IS_ERR(dev))
1857                        free_netdev(dev);
1858                if (err < 0)
1859                        goto out;
1860
1861                err = rtnl_configure_link(dev, ifm);
1862                if (err < 0)
1863                        unregister_netdevice(dev);
1864out:
1865                put_net(dest_net);
1866                return err;
1867        }
1868}
1869
1870static int rtnl_getlink(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)
1871{
1872        struct net *net = sock_net(skb->sk);
1873        struct ifinfomsg *ifm;
1874        char ifname[IFNAMSIZ];
1875        struct nlattr *tb[IFLA_MAX+1];
1876        struct net_device *dev = NULL;
1877        struct sk_buff *nskb;
1878        int err;
1879        u32 ext_filter_mask = 0;
1880
1881        err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFLA_MAX, ifla_policy);
1882        if (err < 0)
1883                return err;
1884
1885        if (tb[IFLA_IFNAME])
1886                nla_strlcpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ);
1887
1888        if (tb[IFLA_EXT_MASK])
1889                ext_filter_mask = nla_get_u32(tb[IFLA_EXT_MASK]);
1890
1891        ifm = nlmsg_data(nlh);
1892        if (ifm->ifi_index > 0)
1893                dev = __dev_get_by_index(net, ifm->ifi_index);
1894        else if (tb[IFLA_IFNAME])
1895                dev = __dev_get_by_name(net, ifname);
1896        else
1897                return -EINVAL;
1898
1899        if (dev == NULL)
1900                return -ENODEV;
1901
1902        nskb = nlmsg_new(if_nlmsg_size(dev, ext_filter_mask), GFP_KERNEL);
1903        if (nskb == NULL)
1904                return -ENOBUFS;
1905
1906        err = rtnl_fill_ifinfo(nskb, dev, RTM_NEWLINK, NETLINK_CB(skb).portid,
1907                               nlh->nlmsg_seq, 0, 0, ext_filter_mask);
1908        if (err < 0) {
1909                /* -EMSGSIZE implies BUG in if_nlmsg_size */
1910                WARN_ON(err == -EMSGSIZE);
1911                kfree_skb(nskb);
1912        } else
1913                err = rtnl_unicast(nskb, net, NETLINK_CB(skb).portid);
1914
1915        return err;
1916}
1917
1918static u16 rtnl_calcit(struct sk_buff *skb, struct nlmsghdr *nlh)
1919{
1920        struct net *net = sock_net(skb->sk);
1921        struct net_device *dev;
1922        struct nlattr *tb[IFLA_MAX+1];
1923        u32 ext_filter_mask = 0;
1924        u16 min_ifinfo_dump_size = 0;
1925
1926        if (nlmsg_parse(nlh, sizeof(struct rtgenmsg), tb, IFLA_MAX,
1927                        ifla_policy) >= 0) {
1928                if (tb[IFLA_EXT_MASK])
1929                        ext_filter_mask = nla_get_u32(tb[IFLA_EXT_MASK]);
1930        }
1931
1932        if (!ext_filter_mask)
1933                return NLMSG_GOODSIZE;
1934        /*
1935         * traverse the list of net devices and compute the minimum
1936         * buffer size based upon the filter mask.
1937         */
1938        list_for_each_entry(dev, &net->dev_base_head, dev_list) {
1939                min_ifinfo_dump_size = max_t(u16, min_ifinfo_dump_size,
1940                                             if_nlmsg_size(dev,
1941                                                           ext_filter_mask));
1942        }
1943
1944        return min_ifinfo_dump_size;
1945}
1946
1947static int rtnl_dump_all(struct sk_buff *skb, struct netlink_callback *cb)
1948{
1949        int idx;
1950        int s_idx = cb->family;
1951
1952        if (s_idx == 0)
1953                s_idx = 1;
1954        for (idx = 1; idx <= RTNL_FAMILY_MAX; idx++) {
1955                int type = cb->nlh->nlmsg_type-RTM_BASE;
1956                if (idx < s_idx || idx == PF_PACKET)
1957                        continue;
1958                if (rtnl_msg_handlers[idx] == NULL ||
1959                    rtnl_msg_handlers[idx][type].dumpit == NULL)
1960                        continue;
1961                if (idx > s_idx)
1962                        memset(&cb->args[0], 0, sizeof(cb->args));
1963                if (rtnl_msg_handlers[idx][type].dumpit(skb, cb))
1964                        break;
1965        }
1966        cb->family = idx;
1967
1968        return skb->len;
1969}
1970
1971void rtmsg_ifinfo(int type, struct net_device *dev, unsigned int change)
1972{
1973        struct net *net = dev_net(dev);
1974        struct sk_buff *skb;
1975        int err = -ENOBUFS;
1976        size_t if_info_size;
1977
1978        skb = nlmsg_new((if_info_size = if_nlmsg_size(dev, 0)), GFP_KERNEL);
1979        if (skb == NULL)
1980                goto errout;
1981
1982        err = rtnl_fill_ifinfo(skb, dev, type, 0, 0, change, 0, 0);
1983        if (err < 0) {
1984                /* -EMSGSIZE implies BUG in if_nlmsg_size() */
1985                WARN_ON(err == -EMSGSIZE);
1986                kfree_skb(skb);
1987                goto errout;
1988        }
1989        rtnl_notify(skb, net, 0, RTNLGRP_LINK, NULL, GFP_KERNEL);
1990        return;
1991errout:
1992        if (err < 0)
1993                rtnl_set_sk_err(net, RTNLGRP_LINK, err);
1994}
1995
1996static int nlmsg_populate_fdb_fill(struct sk_buff *skb,
1997                                   struct net_device *dev,
1998                                   u8 *addr, u32 pid, u32 seq,
1999                                   int type, unsigned int flags)
2000{
2001        struct nlmsghdr *nlh;
2002        struct ndmsg *ndm;
2003
2004        nlh = nlmsg_put(skb, pid, seq, type, sizeof(*ndm), NLM_F_MULTI);
2005        if (!nlh)
2006                return -EMSGSIZE;
2007
2008        ndm = nlmsg_data(nlh);
2009        ndm->ndm_family  = AF_BRIDGE;
2010        ndm->ndm_pad1    = 0;
2011        ndm->ndm_pad2    = 0;
2012        ndm->ndm_flags   = flags;
2013        ndm->ndm_type    = 0;
2014        ndm->ndm_ifindex = dev->ifindex;
2015        ndm->ndm_state   = NUD_PERMANENT;
2016
2017        if (nla_put(skb, NDA_LLADDR, ETH_ALEN, addr))
2018                goto nla_put_failure;
2019
2020        return nlmsg_end(skb, nlh);
2021
2022nla_put_failure:
2023        nlmsg_cancel(skb, nlh);
2024        return -EMSGSIZE;
2025}
2026
2027static inline size_t rtnl_fdb_nlmsg_size(void)
2028{
2029        return NLMSG_ALIGN(sizeof(struct ndmsg)) + nla_total_size(ETH_ALEN);
2030}
2031
2032static void rtnl_fdb_notify(struct net_device *dev, u8 *addr, int type)
2033{
2034        struct net *net = dev_net(dev);
2035        struct sk_buff *skb;
2036        int err = -ENOBUFS;
2037
2038        skb = nlmsg_new(rtnl_fdb_nlmsg_size(), GFP_ATOMIC);
2039        if (!skb)
2040                goto errout;
2041
2042        err = nlmsg_populate_fdb_fill(skb, dev, addr, 0, 0, type, NTF_SELF);
2043        if (err < 0) {
2044                kfree_skb(skb);
2045                goto errout;
2046        }
2047
2048        rtnl_notify(skb, net, 0, RTNLGRP_NEIGH, NULL, GFP_ATOMIC);
2049        return;
2050errout:
2051        rtnl_set_sk_err(net, RTNLGRP_NEIGH, err);
2052}
2053
2054static int rtnl_fdb_add(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
2055{
2056        struct net *net = sock_net(skb->sk);
2057        struct net_device *master = NULL;
2058        struct ndmsg *ndm;
2059        struct nlattr *tb[NDA_MAX+1];
2060        struct net_device *dev;
2061        u8 *addr;
2062        int err;
2063
2064        if (!capable(CAP_NET_ADMIN))
2065                return -EPERM;
2066
2067        err = nlmsg_parse(nlh, sizeof(*ndm), tb, NDA_MAX, NULL);
2068        if (err < 0)
2069                return err;
2070
2071        ndm = nlmsg_data(nlh);
2072        if (ndm->ndm_ifindex == 0) {
2073                pr_info("PF_BRIDGE: RTM_NEWNEIGH with invalid ifindex\n");
2074                return -EINVAL;
2075        }
2076
2077        dev = __dev_get_by_index(net, ndm->ndm_ifindex);
2078        if (dev == NULL) {
2079                pr_info("PF_BRIDGE: RTM_NEWNEIGH with unknown ifindex\n");
2080                return -ENODEV;
2081        }
2082
2083        if (!tb[NDA_LLADDR] || nla_len(tb[NDA_LLADDR]) != ETH_ALEN) {
2084                pr_info("PF_BRIDGE: RTM_NEWNEIGH with invalid address\n");
2085                return -EINVAL;
2086        }
2087
2088        addr = nla_data(tb[NDA_LLADDR]);
2089        if (!is_valid_ether_addr(addr)) {
2090                pr_info("PF_BRIDGE: RTM_NEWNEIGH with invalid ether address\n");
2091                return -EINVAL;
2092        }
2093
2094        err = -EOPNOTSUPP;
2095
2096        /* Support fdb on master device the net/bridge default case */
2097        if ((!ndm->ndm_flags || ndm->ndm_flags & NTF_MASTER) &&
2098            (dev->priv_flags & IFF_BRIDGE_PORT)) {
2099                master = dev->master;
2100                err = master->netdev_ops->ndo_fdb_add(ndm, tb,
2101                                                      dev, addr,
2102                                                      nlh->nlmsg_flags);
2103                if (err)
2104                        goto out;
2105                else
2106                        ndm->ndm_flags &= ~NTF_MASTER;
2107        }
2108
2109        /* Embedded bridge, macvlan, and any other device support */
2110        if ((ndm->ndm_flags & NTF_SELF) && dev->netdev_ops->ndo_fdb_add) {
2111                err = dev->netdev_ops->ndo_fdb_add(ndm, tb,
2112                                                   dev, addr,
2113                                                   nlh->nlmsg_flags);
2114
2115                if (!err) {
2116                        rtnl_fdb_notify(dev, addr, RTM_NEWNEIGH);
2117                        ndm->ndm_flags &= ~NTF_SELF;
2118                }
2119        }
2120out:
2121        return err;
2122}
2123
2124static int rtnl_fdb_del(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
2125{
2126        struct net *net = sock_net(skb->sk);
2127        struct ndmsg *ndm;
2128        struct nlattr *llattr;
2129        struct net_device *dev;
2130        int err = -EINVAL;
2131        __u8 *addr;
2132
2133        if (!capable(CAP_NET_ADMIN))
2134                return -EPERM;
2135
2136        if (nlmsg_len(nlh) < sizeof(*ndm))
2137                return -EINVAL;
2138
2139        ndm = nlmsg_data(nlh);
2140        if (ndm->ndm_ifindex == 0) {
2141                pr_info("PF_BRIDGE: RTM_DELNEIGH with invalid ifindex\n");
2142                return -EINVAL;
2143        }
2144
2145        dev = __dev_get_by_index(net, ndm->ndm_ifindex);
2146        if (dev == NULL) {
2147                pr_info("PF_BRIDGE: RTM_DELNEIGH with unknown ifindex\n");
2148                return -ENODEV;
2149        }
2150
2151        llattr = nlmsg_find_attr(nlh, sizeof(*ndm), NDA_LLADDR);
2152        if (llattr == NULL || nla_len(llattr) != ETH_ALEN) {
2153                pr_info("PF_BRIGDE: RTM_DELNEIGH with invalid address\n");
2154                return -EINVAL;
2155        }
2156
2157        addr = nla_data(llattr);
2158        err = -EOPNOTSUPP;
2159
2160        /* Support fdb on master device the net/bridge default case */
2161        if ((!ndm->ndm_flags || ndm->ndm_flags & NTF_MASTER) &&
2162            (dev->priv_flags & IFF_BRIDGE_PORT)) {
2163                struct net_device *master = dev->master;
2164
2165                if (master->netdev_ops->ndo_fdb_del)
2166                        err = master->netdev_ops->ndo_fdb_del(ndm, dev, addr);
2167
2168                if (err)
2169                        goto out;
2170                else
2171                        ndm->ndm_flags &= ~NTF_MASTER;
2172        }
2173
2174        /* Embedded bridge, macvlan, and any other device support */
2175        if ((ndm->ndm_flags & NTF_SELF) && dev->netdev_ops->ndo_fdb_del) {
2176                err = dev->netdev_ops->ndo_fdb_del(ndm, dev, addr);
2177
2178                if (!err) {
2179                        rtnl_fdb_notify(dev, addr, RTM_DELNEIGH);
2180                        ndm->ndm_flags &= ~NTF_SELF;
2181                }
2182        }
2183out:
2184        return err;
2185}
2186
2187static int nlmsg_populate_fdb(struct sk_buff *skb,
2188                              struct netlink_callback *cb,
2189                              struct net_device *dev,
2190                              int *idx,
2191                              struct netdev_hw_addr_list *list)
2192{
2193        struct netdev_hw_addr *ha;
2194        int err;
2195        u32 portid, seq;
2196
2197        portid = NETLINK_CB(cb->skb).portid;
2198        seq = cb->nlh->nlmsg_seq;
2199
2200        list_for_each_entry(ha, &list->list, list) {
2201                if (*idx < cb->args[0])
2202                        goto skip;
2203
2204                err = nlmsg_populate_fdb_fill(skb, dev, ha->addr,
2205                                              portid, seq,
2206                                              RTM_NEWNEIGH, NTF_SELF);
2207                if (err < 0)
2208                        return err;
2209skip:
2210                *idx += 1;
2211        }
2212        return 0;
2213}
2214
2215/**
2216 * ndo_dflt_fdb_dump - default netdevice operation to dump an FDB table.
2217 * @nlh: netlink message header
2218 * @dev: netdevice
2219 *
2220 * Default netdevice operation to dump the existing unicast address list.
2221 * Returns zero on success.
2222 */
2223int ndo_dflt_fdb_dump(struct sk_buff *skb,
2224                      struct netlink_callback *cb,
2225                      struct net_device *dev,
2226                      int idx)
2227{
2228        int err;
2229
2230        netif_addr_lock_bh(dev);
2231        err = nlmsg_populate_fdb(skb, cb, dev, &idx, &dev->uc);
2232        if (err)
2233                goto out;
2234        nlmsg_populate_fdb(skb, cb, dev, &idx, &dev->mc);
2235out:
2236        netif_addr_unlock_bh(dev);
2237        return idx;
2238}
2239EXPORT_SYMBOL(ndo_dflt_fdb_dump);
2240
2241static int rtnl_fdb_dump(struct sk_buff *skb, struct netlink_callback *cb)
2242{
2243        int idx = 0;
2244        struct net *net = sock_net(skb->sk);
2245        struct net_device *dev;
2246
2247        rcu_read_lock();
2248        for_each_netdev_rcu(net, dev) {
2249                if (dev->priv_flags & IFF_BRIDGE_PORT) {
2250                        struct net_device *master = dev->master;
2251                        const struct net_device_ops *ops = master->netdev_ops;
2252
2253                        if (ops->ndo_fdb_dump)
2254                                idx = ops->ndo_fdb_dump(skb, cb, dev, idx);
2255                }
2256
2257                if (dev->netdev_ops->ndo_fdb_dump)
2258                        idx = dev->netdev_ops->ndo_fdb_dump(skb, cb, dev, idx);
2259        }
2260        rcu_read_unlock();
2261
2262        cb->args[0] = idx;
2263        return skb->len;
2264}
2265
2266int ndo_dflt_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq,
2267                            struct net_device *dev, u16 mode)
2268{
2269        struct nlmsghdr *nlh;
2270        struct ifinfomsg *ifm;
2271        struct nlattr *br_afspec;
2272        u8 operstate = netif_running(dev) ? dev->operstate : IF_OPER_DOWN;
2273
2274        nlh = nlmsg_put(skb, pid, seq, RTM_NEWLINK, sizeof(*ifm), NLM_F_MULTI);
2275        if (nlh == NULL)
2276                return -EMSGSIZE;
2277
2278        ifm = nlmsg_data(nlh);
2279        ifm->ifi_family = AF_BRIDGE;
2280        ifm->__ifi_pad = 0;
2281        ifm->ifi_type = dev->type;
2282        ifm->ifi_index = dev->ifindex;
2283        ifm->ifi_flags = dev_get_flags(dev);
2284        ifm->ifi_change = 0;
2285
2286
2287        if (nla_put_string(skb, IFLA_IFNAME, dev->name) ||
2288            nla_put_u32(skb, IFLA_MTU, dev->mtu) ||
2289            nla_put_u8(skb, IFLA_OPERSTATE, operstate) ||
2290            (dev->master &&
2291             nla_put_u32(skb, IFLA_MASTER, dev->master->ifindex)) ||
2292            (dev->addr_len &&
2293             nla_put(skb, IFLA_ADDRESS, dev->addr_len, dev->dev_addr)) ||
2294            (dev->ifindex != dev->iflink &&
2295             nla_put_u32(skb, IFLA_LINK, dev->iflink)))
2296                goto nla_put_failure;
2297
2298        br_afspec = nla_nest_start(skb, IFLA_AF_SPEC);
2299        if (!br_afspec)
2300                goto nla_put_failure;
2301
2302        if (nla_put_u16(skb, IFLA_BRIDGE_FLAGS, BRIDGE_FLAGS_SELF) ||
2303            nla_put_u16(skb, IFLA_BRIDGE_MODE, mode)) {
2304                nla_nest_cancel(skb, br_afspec);
2305                goto nla_put_failure;
2306        }
2307        nla_nest_end(skb, br_afspec);
2308
2309        return nlmsg_end(skb, nlh);
2310nla_put_failure:
2311        nlmsg_cancel(skb, nlh);
2312        return -EMSGSIZE;
2313}
2314EXPORT_SYMBOL(ndo_dflt_bridge_getlink);
2315
2316static int rtnl_bridge_getlink(struct sk_buff *skb, struct netlink_callback *cb)
2317{
2318        struct net *net = sock_net(skb->sk);
2319        struct net_device *dev;
2320        int idx = 0;
2321        u32 portid = NETLINK_CB(cb->skb).portid;
2322        u32 seq = cb->nlh->nlmsg_seq;
2323
2324        rcu_read_lock();
2325        for_each_netdev_rcu(net, dev) {
2326                const struct net_device_ops *ops = dev->netdev_ops;
2327                struct net_device *master = dev->master;
2328
2329                if (master && master->netdev_ops->ndo_bridge_getlink) {
2330                        if (idx >= cb->args[0] &&
2331                            master->netdev_ops->ndo_bridge_getlink(
2332                                    skb, portid, seq, dev) < 0)
2333                                break;
2334                        idx++;
2335                }
2336
2337                if (ops->ndo_bridge_getlink) {
2338                        if (idx >= cb->args[0] &&
2339                            ops->ndo_bridge_getlink(skb, portid, seq, dev) < 0)
2340                                break;
2341                        idx++;
2342                }
2343        }
2344        rcu_read_unlock();
2345        cb->args[0] = idx;
2346
2347        return skb->len;
2348}
2349
2350static inline size_t bridge_nlmsg_size(void)
2351{
2352        return NLMSG_ALIGN(sizeof(struct ifinfomsg))
2353                + nla_total_size(IFNAMSIZ)      /* IFLA_IFNAME */
2354                + nla_total_size(MAX_ADDR_LEN)  /* IFLA_ADDRESS */
2355                + nla_total_size(sizeof(u32))   /* IFLA_MASTER */
2356                + nla_total_size(sizeof(u32))   /* IFLA_MTU */
2357                + nla_total_size(sizeof(u32))   /* IFLA_LINK */
2358                + nla_total_size(sizeof(u32))   /* IFLA_OPERSTATE */
2359                + nla_total_size(sizeof(u8))    /* IFLA_PROTINFO */
2360                + nla_total_size(sizeof(struct nlattr)) /* IFLA_AF_SPEC */
2361                + nla_total_size(sizeof(u16))   /* IFLA_BRIDGE_FLAGS */
2362                + nla_total_size(sizeof(u16));  /* IFLA_BRIDGE_MODE */
2363}
2364
2365static int rtnl_bridge_notify(struct net_device *dev, u16 flags)
2366{
2367        struct net *net = dev_net(dev);
2368        struct net_device *master = dev->master;
2369        struct sk_buff *skb;
2370        int err = -EOPNOTSUPP;
2371
2372        skb = nlmsg_new(bridge_nlmsg_size(), GFP_ATOMIC);
2373        if (!skb) {
2374                err = -ENOMEM;
2375                goto errout;
2376        }
2377
2378        if ((!flags || (flags & BRIDGE_FLAGS_MASTER)) &&
2379            master && master->netdev_ops->ndo_bridge_getlink) {
2380                err = master->netdev_ops->ndo_bridge_getlink(skb, 0, 0, dev);
2381                if (err < 0)
2382                        goto errout;
2383        }
2384
2385        if ((flags & BRIDGE_FLAGS_SELF) &&
2386            dev->netdev_ops->ndo_bridge_getlink) {
2387                err = dev->netdev_ops->ndo_bridge_getlink(skb, 0, 0, dev);
2388                if (err < 0)
2389                        goto errout;
2390        }
2391
2392        rtnl_notify(skb, net, 0, RTNLGRP_LINK, NULL, GFP_ATOMIC);
2393        return 0;
2394errout:
2395        WARN_ON(err == -EMSGSIZE);
2396        kfree_skb(skb);
2397        rtnl_set_sk_err(net, RTNLGRP_LINK, err);
2398        return err;
2399}
2400
2401static int rtnl_bridge_setlink(struct sk_buff *skb, struct nlmsghdr *nlh,
2402                               void *arg)
2403{
2404        struct net *net = sock_net(skb->sk);
2405        struct ifinfomsg *ifm;
2406        struct net_device *dev;
2407        struct nlattr *br_spec, *attr = NULL;
2408        int rem, err = -EOPNOTSUPP;
2409        u16 oflags, flags = 0;
2410        bool have_flags = false;
2411
2412        if (nlmsg_len(nlh) < sizeof(*ifm))
2413                return -EINVAL;
2414
2415        ifm = nlmsg_data(nlh);
2416        if (ifm->ifi_family != AF_BRIDGE)
2417                return -EPFNOSUPPORT;
2418
2419        dev = __dev_get_by_index(net, ifm->ifi_index);
2420        if (!dev) {
2421                pr_info("PF_BRIDGE: RTM_SETLINK with unknown ifindex\n");
2422                return -ENODEV;
2423        }
2424
2425        br_spec = nlmsg_find_attr(nlh, sizeof(struct ifinfomsg), IFLA_AF_SPEC);
2426        if (br_spec) {
2427                nla_for_each_nested(attr, br_spec, rem) {
2428                        if (nla_type(attr) == IFLA_BRIDGE_FLAGS) {
2429                                have_flags = true;
2430                                flags = nla_get_u16(attr);
2431                                break;
2432                        }
2433                }
2434        }
2435
2436        oflags = flags;
2437
2438        if (!flags || (flags & BRIDGE_FLAGS_MASTER)) {
2439                if (!dev->master ||
2440                    !dev->master->netdev_ops->ndo_bridge_setlink) {
2441                        err = -EOPNOTSUPP;
2442                        goto out;
2443                }
2444
2445                err = dev->master->netdev_ops->ndo_bridge_setlink(dev, nlh);
2446                if (err)
2447                        goto out;
2448
2449                flags &= ~BRIDGE_FLAGS_MASTER;
2450        }
2451
2452        if ((flags & BRIDGE_FLAGS_SELF)) {
2453                if (!dev->netdev_ops->ndo_bridge_setlink)
2454                        err = -EOPNOTSUPP;
2455                else
2456                        err = dev->netdev_ops->ndo_bridge_setlink(dev, nlh);
2457
2458                if (!err)
2459                        flags &= ~BRIDGE_FLAGS_SELF;
2460        }
2461
2462        if (have_flags)
2463                memcpy(nla_data(attr), &flags, sizeof(flags));
2464        /* Generate event to notify upper layer of bridge change */
2465        if (!err)
2466                err = rtnl_bridge_notify(dev, oflags);
2467out:
2468        return err;
2469}
2470
2471/* Protected by RTNL sempahore.  */
2472static struct rtattr **rta_buf;
2473static int rtattr_max;
2474
2475/* Process one rtnetlink message. */
2476
2477static int rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
2478{
2479        struct net *net = sock_net(skb->sk);
2480        rtnl_doit_func doit;
2481        int sz_idx, kind;
2482        int min_len;
2483        int family;
2484        int type;
2485        int err;
2486
2487        type = nlh->nlmsg_type;
2488        if (type > RTM_MAX)
2489                return -EOPNOTSUPP;
2490
2491        type -= RTM_BASE;
2492
2493        /* All the messages must have at least 1 byte length */
2494        if (nlh->nlmsg_len < NLMSG_LENGTH(sizeof(struct rtgenmsg)))
2495                return 0;
2496
2497        family = ((struct rtgenmsg *)NLMSG_DATA(nlh))->rtgen_family;
2498        sz_idx = type>>2;
2499        kind = type&3;
2500
2501        if (kind != 2 && !ns_capable(net->user_ns, CAP_NET_ADMIN))
2502                return -EPERM;
2503
2504        if (kind == 2 && nlh->nlmsg_flags&NLM_F_DUMP) {
2505                struct sock *rtnl;
2506                rtnl_dumpit_func dumpit;
2507                rtnl_calcit_func calcit;
2508                u16 min_dump_alloc = 0;
2509
2510                dumpit = rtnl_get_dumpit(family, type);
2511                if (dumpit == NULL)
2512                        return -EOPNOTSUPP;
2513                calcit = rtnl_get_calcit(family, type);
2514                if (calcit)
2515                        min_dump_alloc = calcit(skb, nlh);
2516
2517                __rtnl_unlock();
2518                rtnl = net->rtnl;
2519                {
2520                        struct netlink_dump_control c = {
2521                                .dump           = dumpit,
2522                                .min_dump_alloc = min_dump_alloc,
2523                        };
2524                        err = netlink_dump_start(rtnl, skb, nlh, &c);
2525                }
2526                rtnl_lock();
2527                return err;
2528        }
2529
2530        memset(rta_buf, 0, (rtattr_max * sizeof(struct rtattr *)));
2531
2532        min_len = rtm_min[sz_idx];
2533        if (nlh->nlmsg_len < min_len)
2534                return -EINVAL;
2535
2536        if (nlh->nlmsg_len > min_len) {
2537                int attrlen = nlh->nlmsg_len - NLMSG_ALIGN(min_len);
2538                struct rtattr *attr = (void *)nlh + NLMSG_ALIGN(min_len);
2539
2540                while (RTA_OK(attr, attrlen)) {
2541                        unsigned int flavor = attr->rta_type;
2542                        if (flavor) {
2543                                if (flavor > rta_max[sz_idx])
2544                                        return -EINVAL;
2545                                rta_buf[flavor-1] = attr;
2546                        }
2547                        attr = RTA_NEXT(attr, attrlen);
2548                }
2549        }
2550
2551        doit = rtnl_get_doit(family, type);
2552        if (doit == NULL)
2553                return -EOPNOTSUPP;
2554
2555        return doit(skb, nlh, (void *)&rta_buf[0]);
2556}
2557
2558static void rtnetlink_rcv(struct sk_buff *skb)
2559{
2560        rtnl_lock();
2561        netlink_rcv_skb(skb, &rtnetlink_rcv_msg);
2562        rtnl_unlock();
2563}
2564
2565static int rtnetlink_event(struct notifier_block *this, unsigned long event, void *ptr)
2566{
2567        struct net_device *dev = ptr;
2568
2569        switch (event) {
2570        case NETDEV_UP:
2571        case NETDEV_DOWN:
2572        case NETDEV_PRE_UP:
2573        case NETDEV_POST_INIT:
2574        case NETDEV_REGISTER:
2575        case NETDEV_CHANGE:
2576        case NETDEV_PRE_TYPE_CHANGE:
2577        case NETDEV_GOING_DOWN:
2578        case NETDEV_UNREGISTER:
2579        case NETDEV_UNREGISTER_FINAL:
2580        case NETDEV_RELEASE:
2581        case NETDEV_JOIN:
2582                break;
2583        default:
2584                rtmsg_ifinfo(RTM_NEWLINK, dev, 0);
2585                break;
2586        }
2587        return NOTIFY_DONE;
2588}
2589
2590static struct notifier_block rtnetlink_dev_notifier = {
2591        .notifier_call  = rtnetlink_event,
2592};
2593
2594
2595static int __net_init rtnetlink_net_init(struct net *net)
2596{
2597        struct sock *sk;
2598        struct netlink_kernel_cfg cfg = {
2599                .groups         = RTNLGRP_MAX,
2600                .input          = rtnetlink_rcv,
2601                .cb_mutex       = &rtnl_mutex,
2602                .flags          = NL_CFG_F_NONROOT_RECV,
2603        };
2604
2605        sk = netlink_kernel_create(net, NETLINK_ROUTE, &cfg);
2606        if (!sk)
2607                return -ENOMEM;
2608        net->rtnl = sk;
2609        return 0;
2610}
2611
2612static void __net_exit rtnetlink_net_exit(struct net *net)
2613{
2614        netlink_kernel_release(net->rtnl);
2615        net->rtnl = NULL;
2616}
2617
2618static struct pernet_operations rtnetlink_net_ops = {
2619        .init = rtnetlink_net_init,
2620        .exit = rtnetlink_net_exit,
2621};
2622
2623void __init rtnetlink_init(void)
2624{
2625        int i;
2626
2627        rtattr_max = 0;
2628        for (i = 0; i < ARRAY_SIZE(rta_max); i++)
2629                if (rta_max[i] > rtattr_max)
2630                        rtattr_max = rta_max[i];
2631        rta_buf = kmalloc(rtattr_max * sizeof(struct rtattr *), GFP_KERNEL);
2632        if (!rta_buf)
2633                panic("rtnetlink_init: cannot allocate rta_buf\n");
2634
2635        if (register_pernet_subsys(&rtnetlink_net_ops))
2636                panic("rtnetlink_init: cannot initialize rtnetlink\n");
2637
2638        register_netdevice_notifier(&rtnetlink_dev_notifier);
2639
2640        rtnl_register(PF_UNSPEC, RTM_GETLINK, rtnl_getlink,
2641                      rtnl_dump_ifinfo, rtnl_calcit);
2642        rtnl_register(PF_UNSPEC, RTM_SETLINK, rtnl_setlink, NULL, NULL);
2643        rtnl_register(PF_UNSPEC, RTM_NEWLINK, rtnl_newlink, NULL, NULL);
2644        rtnl_register(PF_UNSPEC, RTM_DELLINK, rtnl_dellink, NULL, NULL);
2645
2646        rtnl_register(PF_UNSPEC, RTM_GETADDR, NULL, rtnl_dump_all, NULL);
2647        rtnl_register(PF_UNSPEC, RTM_GETROUTE, NULL, rtnl_dump_all, NULL);
2648
2649        rtnl_register(PF_BRIDGE, RTM_NEWNEIGH, rtnl_fdb_add, NULL, NULL);
2650        rtnl_register(PF_BRIDGE, RTM_DELNEIGH, rtnl_fdb_del, NULL, NULL);
2651        rtnl_register(PF_BRIDGE, RTM_GETNEIGH, NULL, rtnl_fdb_dump, NULL);
2652
2653        rtnl_register(PF_BRIDGE, RTM_GETLINK, NULL, rtnl_bridge_getlink, NULL);
2654        rtnl_register(PF_BRIDGE, RTM_SETLINK, rtnl_bridge_setlink, NULL, NULL);
2655}
2656
2657