linux/net/core/net-sysfs.c
<<
>>
Prefs
   1/*
   2 * net-sysfs.c - network device class and attributes
   3 *
   4 * Copyright (c) 2003 Stephen Hemminger <shemminger@osdl.org>
   5 *
   6 *      This program is free software; you can redistribute it and/or
   7 *      modify it under the terms of the GNU General Public License
   8 *      as published by the Free Software Foundation; either version
   9 *      2 of the License, or (at your option) any later version.
  10 */
  11
  12#include <linux/capability.h>
  13#include <linux/kernel.h>
  14#include <linux/netdevice.h>
  15#include <linux/if_arp.h>
  16#include <linux/slab.h>
  17#include <linux/nsproxy.h>
  18#include <net/sock.h>
  19#include <net/net_namespace.h>
  20#include <linux/rtnetlink.h>
  21#include <linux/wireless.h>
  22#include <linux/vmalloc.h>
  23#include <net/wext.h>
  24
  25#include "net-sysfs.h"
  26
  27#ifdef CONFIG_SYSFS
  28static const char fmt_hex[] = "%#x\n";
  29static const char fmt_long_hex[] = "%#lx\n";
  30static const char fmt_dec[] = "%d\n";
  31static const char fmt_ulong[] = "%lu\n";
  32static const char fmt_u64[] = "%llu\n";
  33
  34static inline int dev_isalive(const struct net_device *dev)
  35{
  36        return dev->reg_state <= NETREG_REGISTERED;
  37}
  38
  39/* use same locking rules as GIF* ioctl's */
  40static ssize_t netdev_show(const struct device *dev,
  41                           struct device_attribute *attr, char *buf,
  42                           ssize_t (*format)(const struct net_device *, char *))
  43{
  44        struct net_device *net = to_net_dev(dev);
  45        ssize_t ret = -EINVAL;
  46
  47        read_lock(&dev_base_lock);
  48        if (dev_isalive(net))
  49                ret = (*format)(net, buf);
  50        read_unlock(&dev_base_lock);
  51
  52        return ret;
  53}
  54
  55/* generate a show function for simple field */
  56#define NETDEVICE_SHOW(field, format_string)                            \
  57static ssize_t format_##field(const struct net_device *net, char *buf)  \
  58{                                                                       \
  59        return sprintf(buf, format_string, net->field);                 \
  60}                                                                       \
  61static ssize_t show_##field(struct device *dev,                         \
  62                            struct device_attribute *attr, char *buf)   \
  63{                                                                       \
  64        return netdev_show(dev, attr, buf, format_##field);             \
  65}
  66
  67
  68/* use same locking and permission rules as SIF* ioctl's */
  69static ssize_t netdev_store(struct device *dev, struct device_attribute *attr,
  70                            const char *buf, size_t len,
  71                            int (*set)(struct net_device *, unsigned long))
  72{
  73        struct net_device *net = to_net_dev(dev);
  74        char *endp;
  75        unsigned long new;
  76        int ret = -EINVAL;
  77
  78        if (!capable(CAP_NET_ADMIN))
  79                return -EPERM;
  80
  81        new = simple_strtoul(buf, &endp, 0);
  82        if (endp == buf)
  83                goto err;
  84
  85        if (!rtnl_trylock())
  86                return restart_syscall();
  87
  88        if (dev_isalive(net)) {
  89                if ((ret = (*set)(net, new)) == 0)
  90                        ret = len;
  91        }
  92        rtnl_unlock();
  93 err:
  94        return ret;
  95}
  96
  97NETDEVICE_SHOW(dev_id, fmt_hex);
  98NETDEVICE_SHOW(addr_assign_type, fmt_dec);
  99NETDEVICE_SHOW(addr_len, fmt_dec);
 100NETDEVICE_SHOW(iflink, fmt_dec);
 101NETDEVICE_SHOW(ifindex, fmt_dec);
 102NETDEVICE_SHOW(features, fmt_long_hex);
 103NETDEVICE_SHOW(type, fmt_dec);
 104NETDEVICE_SHOW(link_mode, fmt_dec);
 105
 106/* use same locking rules as GIFHWADDR ioctl's */
 107static ssize_t show_address(struct device *dev, struct device_attribute *attr,
 108                            char *buf)
 109{
 110        struct net_device *net = to_net_dev(dev);
 111        ssize_t ret = -EINVAL;
 112
 113        read_lock(&dev_base_lock);
 114        if (dev_isalive(net))
 115                ret = sysfs_format_mac(buf, net->dev_addr, net->addr_len);
 116        read_unlock(&dev_base_lock);
 117        return ret;
 118}
 119
 120static ssize_t show_broadcast(struct device *dev,
 121                            struct device_attribute *attr, char *buf)
 122{
 123        struct net_device *net = to_net_dev(dev);
 124        if (dev_isalive(net))
 125                return sysfs_format_mac(buf, net->broadcast, net->addr_len);
 126        return -EINVAL;
 127}
 128
 129static ssize_t show_carrier(struct device *dev,
 130                            struct device_attribute *attr, char *buf)
 131{
 132        struct net_device *netdev = to_net_dev(dev);
 133        if (netif_running(netdev)) {
 134                return sprintf(buf, fmt_dec, !!netif_carrier_ok(netdev));
 135        }
 136        return -EINVAL;
 137}
 138
 139static ssize_t show_speed(struct device *dev,
 140                          struct device_attribute *attr, char *buf)
 141{
 142        struct net_device *netdev = to_net_dev(dev);
 143        int ret = -EINVAL;
 144
 145        if (!rtnl_trylock())
 146                return restart_syscall();
 147
 148        if (netif_running(netdev) &&
 149            netdev->ethtool_ops &&
 150            netdev->ethtool_ops->get_settings) {
 151                struct ethtool_cmd cmd = { ETHTOOL_GSET };
 152
 153                if (!netdev->ethtool_ops->get_settings(netdev, &cmd))
 154                        ret = sprintf(buf, fmt_dec, ethtool_cmd_speed(&cmd));
 155        }
 156        rtnl_unlock();
 157        return ret;
 158}
 159
 160static ssize_t show_duplex(struct device *dev,
 161                           struct device_attribute *attr, char *buf)
 162{
 163        struct net_device *netdev = to_net_dev(dev);
 164        int ret = -EINVAL;
 165
 166        if (!rtnl_trylock())
 167                return restart_syscall();
 168
 169        if (netif_running(netdev) &&
 170            netdev->ethtool_ops &&
 171            netdev->ethtool_ops->get_settings) {
 172                struct ethtool_cmd cmd = { ETHTOOL_GSET };
 173
 174                if (!netdev->ethtool_ops->get_settings(netdev, &cmd))
 175                        ret = sprintf(buf, "%s\n", cmd.duplex ? "full" : "half");
 176        }
 177        rtnl_unlock();
 178        return ret;
 179}
 180
 181static ssize_t show_dormant(struct device *dev,
 182                            struct device_attribute *attr, char *buf)
 183{
 184        struct net_device *netdev = to_net_dev(dev);
 185
 186        if (netif_running(netdev))
 187                return sprintf(buf, fmt_dec, !!netif_dormant(netdev));
 188
 189        return -EINVAL;
 190}
 191
 192static const char *const operstates[] = {
 193        "unknown",
 194        "notpresent", /* currently unused */
 195        "down",
 196        "lowerlayerdown",
 197        "testing", /* currently unused */
 198        "dormant",
 199        "up"
 200};
 201
 202static ssize_t show_operstate(struct device *dev,
 203                              struct device_attribute *attr, char *buf)
 204{
 205        const struct net_device *netdev = to_net_dev(dev);
 206        unsigned char operstate;
 207
 208        read_lock(&dev_base_lock);
 209        operstate = netdev->operstate;
 210        if (!netif_running(netdev))
 211                operstate = IF_OPER_DOWN;
 212        read_unlock(&dev_base_lock);
 213
 214        if (operstate >= ARRAY_SIZE(operstates))
 215                return -EINVAL; /* should not happen */
 216
 217        return sprintf(buf, "%s\n", operstates[operstate]);
 218}
 219
 220/* read-write attributes */
 221NETDEVICE_SHOW(mtu, fmt_dec);
 222
 223static int change_mtu(struct net_device *net, unsigned long new_mtu)
 224{
 225        return dev_set_mtu(net, (int) new_mtu);
 226}
 227
 228static ssize_t store_mtu(struct device *dev, struct device_attribute *attr,
 229                         const char *buf, size_t len)
 230{
 231        return netdev_store(dev, attr, buf, len, change_mtu);
 232}
 233
 234NETDEVICE_SHOW(flags, fmt_hex);
 235
 236static int change_flags(struct net_device *net, unsigned long new_flags)
 237{
 238        return dev_change_flags(net, (unsigned) new_flags);
 239}
 240
 241static ssize_t store_flags(struct device *dev, struct device_attribute *attr,
 242                           const char *buf, size_t len)
 243{
 244        return netdev_store(dev, attr, buf, len, change_flags);
 245}
 246
 247NETDEVICE_SHOW(tx_queue_len, fmt_ulong);
 248
 249static int change_tx_queue_len(struct net_device *net, unsigned long new_len)
 250{
 251        net->tx_queue_len = new_len;
 252        return 0;
 253}
 254
 255static ssize_t store_tx_queue_len(struct device *dev,
 256                                  struct device_attribute *attr,
 257                                  const char *buf, size_t len)
 258{
 259        return netdev_store(dev, attr, buf, len, change_tx_queue_len);
 260}
 261
 262static ssize_t store_ifalias(struct device *dev, struct device_attribute *attr,
 263                             const char *buf, size_t len)
 264{
 265        struct net_device *netdev = to_net_dev(dev);
 266        size_t count = len;
 267        ssize_t ret;
 268
 269        if (!capable(CAP_NET_ADMIN))
 270                return -EPERM;
 271
 272        /* ignore trailing newline */
 273        if (len >  0 && buf[len - 1] == '\n')
 274                --count;
 275
 276        if (!rtnl_trylock())
 277                return restart_syscall();
 278        ret = dev_set_alias(netdev, buf, count);
 279        rtnl_unlock();
 280
 281        return ret < 0 ? ret : len;
 282}
 283
 284static ssize_t show_ifalias(struct device *dev,
 285                            struct device_attribute *attr, char *buf)
 286{
 287        const struct net_device *netdev = to_net_dev(dev);
 288        ssize_t ret = 0;
 289
 290        if (!rtnl_trylock())
 291                return restart_syscall();
 292        if (netdev->ifalias)
 293                ret = sprintf(buf, "%s\n", netdev->ifalias);
 294        rtnl_unlock();
 295        return ret;
 296}
 297
 298static struct device_attribute net_class_attributes[] = {
 299        __ATTR(addr_assign_type, S_IRUGO, show_addr_assign_type, NULL),
 300        __ATTR(addr_len, S_IRUGO, show_addr_len, NULL),
 301        __ATTR(dev_id, S_IRUGO, show_dev_id, NULL),
 302        __ATTR(ifalias, S_IRUGO | S_IWUSR, show_ifalias, store_ifalias),
 303        __ATTR(iflink, S_IRUGO, show_iflink, NULL),
 304        __ATTR(ifindex, S_IRUGO, show_ifindex, NULL),
 305        __ATTR(features, S_IRUGO, show_features, NULL),
 306        __ATTR(type, S_IRUGO, show_type, NULL),
 307        __ATTR(link_mode, S_IRUGO, show_link_mode, NULL),
 308        __ATTR(address, S_IRUGO, show_address, NULL),
 309        __ATTR(broadcast, S_IRUGO, show_broadcast, NULL),
 310        __ATTR(carrier, S_IRUGO, show_carrier, NULL),
 311        __ATTR(speed, S_IRUGO, show_speed, NULL),
 312        __ATTR(duplex, S_IRUGO, show_duplex, NULL),
 313        __ATTR(dormant, S_IRUGO, show_dormant, NULL),
 314        __ATTR(operstate, S_IRUGO, show_operstate, NULL),
 315        __ATTR(mtu, S_IRUGO | S_IWUSR, show_mtu, store_mtu),
 316        __ATTR(flags, S_IRUGO | S_IWUSR, show_flags, store_flags),
 317        __ATTR(tx_queue_len, S_IRUGO | S_IWUSR, show_tx_queue_len,
 318               store_tx_queue_len),
 319        {}
 320};
 321
 322/* Show a given an attribute in the statistics group */
 323static ssize_t netstat_show(const struct device *d,
 324                            struct device_attribute *attr, char *buf,
 325                            unsigned long offset)
 326{
 327        struct net_device *dev = to_net_dev(d);
 328        ssize_t ret = -EINVAL;
 329
 330        WARN_ON(offset > sizeof(struct rtnl_link_stats64) ||
 331                        offset % sizeof(u64) != 0);
 332
 333        read_lock(&dev_base_lock);
 334        if (dev_isalive(dev)) {
 335                struct rtnl_link_stats64 temp;
 336                const struct rtnl_link_stats64 *stats = dev_get_stats(dev, &temp);
 337
 338                ret = sprintf(buf, fmt_u64, *(u64 *)(((u8 *) stats) + offset));
 339        }
 340        read_unlock(&dev_base_lock);
 341        return ret;
 342}
 343
 344/* generate a read-only statistics attribute */
 345#define NETSTAT_ENTRY(name)                                             \
 346static ssize_t show_##name(struct device *d,                            \
 347                           struct device_attribute *attr, char *buf)    \
 348{                                                                       \
 349        return netstat_show(d, attr, buf,                               \
 350                            offsetof(struct rtnl_link_stats64, name));  \
 351}                                                                       \
 352static DEVICE_ATTR(name, S_IRUGO, show_##name, NULL)
 353
 354NETSTAT_ENTRY(rx_packets);
 355NETSTAT_ENTRY(tx_packets);
 356NETSTAT_ENTRY(rx_bytes);
 357NETSTAT_ENTRY(tx_bytes);
 358NETSTAT_ENTRY(rx_errors);
 359NETSTAT_ENTRY(tx_errors);
 360NETSTAT_ENTRY(rx_dropped);
 361NETSTAT_ENTRY(tx_dropped);
 362NETSTAT_ENTRY(multicast);
 363NETSTAT_ENTRY(collisions);
 364NETSTAT_ENTRY(rx_length_errors);
 365NETSTAT_ENTRY(rx_over_errors);
 366NETSTAT_ENTRY(rx_crc_errors);
 367NETSTAT_ENTRY(rx_frame_errors);
 368NETSTAT_ENTRY(rx_fifo_errors);
 369NETSTAT_ENTRY(rx_missed_errors);
 370NETSTAT_ENTRY(tx_aborted_errors);
 371NETSTAT_ENTRY(tx_carrier_errors);
 372NETSTAT_ENTRY(tx_fifo_errors);
 373NETSTAT_ENTRY(tx_heartbeat_errors);
 374NETSTAT_ENTRY(tx_window_errors);
 375NETSTAT_ENTRY(rx_compressed);
 376NETSTAT_ENTRY(tx_compressed);
 377
 378static struct attribute *netstat_attrs[] = {
 379        &dev_attr_rx_packets.attr,
 380        &dev_attr_tx_packets.attr,
 381        &dev_attr_rx_bytes.attr,
 382        &dev_attr_tx_bytes.attr,
 383        &dev_attr_rx_errors.attr,
 384        &dev_attr_tx_errors.attr,
 385        &dev_attr_rx_dropped.attr,
 386        &dev_attr_tx_dropped.attr,
 387        &dev_attr_multicast.attr,
 388        &dev_attr_collisions.attr,
 389        &dev_attr_rx_length_errors.attr,
 390        &dev_attr_rx_over_errors.attr,
 391        &dev_attr_rx_crc_errors.attr,
 392        &dev_attr_rx_frame_errors.attr,
 393        &dev_attr_rx_fifo_errors.attr,
 394        &dev_attr_rx_missed_errors.attr,
 395        &dev_attr_tx_aborted_errors.attr,
 396        &dev_attr_tx_carrier_errors.attr,
 397        &dev_attr_tx_fifo_errors.attr,
 398        &dev_attr_tx_heartbeat_errors.attr,
 399        &dev_attr_tx_window_errors.attr,
 400        &dev_attr_rx_compressed.attr,
 401        &dev_attr_tx_compressed.attr,
 402        NULL
 403};
 404
 405
 406static struct attribute_group netstat_group = {
 407        .name  = "statistics",
 408        .attrs  = netstat_attrs,
 409};
 410
 411#ifdef CONFIG_WIRELESS_EXT_SYSFS
 412/* helper function that does all the locking etc for wireless stats */
 413static ssize_t wireless_show(struct device *d, char *buf,
 414                             ssize_t (*format)(const struct iw_statistics *,
 415                                               char *))
 416{
 417        struct net_device *dev = to_net_dev(d);
 418        const struct iw_statistics *iw;
 419        ssize_t ret = -EINVAL;
 420
 421        if (!rtnl_trylock())
 422                return restart_syscall();
 423        if (dev_isalive(dev)) {
 424                iw = get_wireless_stats(dev);
 425                if (iw)
 426                        ret = (*format)(iw, buf);
 427        }
 428        rtnl_unlock();
 429
 430        return ret;
 431}
 432
 433/* show function template for wireless fields */
 434#define WIRELESS_SHOW(name, field, format_string)                       \
 435static ssize_t format_iw_##name(const struct iw_statistics *iw, char *buf) \
 436{                                                                       \
 437        return sprintf(buf, format_string, iw->field);                  \
 438}                                                                       \
 439static ssize_t show_iw_##name(struct device *d,                         \
 440                              struct device_attribute *attr, char *buf) \
 441{                                                                       \
 442        return wireless_show(d, buf, format_iw_##name);                 \
 443}                                                                       \
 444static DEVICE_ATTR(name, S_IRUGO, show_iw_##name, NULL)
 445
 446WIRELESS_SHOW(status, status, fmt_hex);
 447WIRELESS_SHOW(link, qual.qual, fmt_dec);
 448WIRELESS_SHOW(level, qual.level, fmt_dec);
 449WIRELESS_SHOW(noise, qual.noise, fmt_dec);
 450WIRELESS_SHOW(nwid, discard.nwid, fmt_dec);
 451WIRELESS_SHOW(crypt, discard.code, fmt_dec);
 452WIRELESS_SHOW(fragment, discard.fragment, fmt_dec);
 453WIRELESS_SHOW(misc, discard.misc, fmt_dec);
 454WIRELESS_SHOW(retries, discard.retries, fmt_dec);
 455WIRELESS_SHOW(beacon, miss.beacon, fmt_dec);
 456
 457static struct attribute *wireless_attrs[] = {
 458        &dev_attr_status.attr,
 459        &dev_attr_link.attr,
 460        &dev_attr_level.attr,
 461        &dev_attr_noise.attr,
 462        &dev_attr_nwid.attr,
 463        &dev_attr_crypt.attr,
 464        &dev_attr_fragment.attr,
 465        &dev_attr_retries.attr,
 466        &dev_attr_misc.attr,
 467        &dev_attr_beacon.attr,
 468        NULL
 469};
 470
 471static struct attribute_group wireless_group = {
 472        .name = "wireless",
 473        .attrs = wireless_attrs,
 474};
 475#endif
 476#endif /* CONFIG_SYSFS */
 477
 478#ifdef CONFIG_RPS
 479/*
 480 * RX queue sysfs structures and functions.
 481 */
 482struct rx_queue_attribute {
 483        struct attribute attr;
 484        ssize_t (*show)(struct netdev_rx_queue *queue,
 485            struct rx_queue_attribute *attr, char *buf);
 486        ssize_t (*store)(struct netdev_rx_queue *queue,
 487            struct rx_queue_attribute *attr, const char *buf, size_t len);
 488};
 489#define to_rx_queue_attr(_attr) container_of(_attr,             \
 490    struct rx_queue_attribute, attr)
 491
 492#define to_rx_queue(obj) container_of(obj, struct netdev_rx_queue, kobj)
 493
 494static ssize_t rx_queue_attr_show(struct kobject *kobj, struct attribute *attr,
 495                                  char *buf)
 496{
 497        struct rx_queue_attribute *attribute = to_rx_queue_attr(attr);
 498        struct netdev_rx_queue *queue = to_rx_queue(kobj);
 499
 500        if (!attribute->show)
 501                return -EIO;
 502
 503        return attribute->show(queue, attribute, buf);
 504}
 505
 506static ssize_t rx_queue_attr_store(struct kobject *kobj, struct attribute *attr,
 507                                   const char *buf, size_t count)
 508{
 509        struct rx_queue_attribute *attribute = to_rx_queue_attr(attr);
 510        struct netdev_rx_queue *queue = to_rx_queue(kobj);
 511
 512        if (!attribute->store)
 513                return -EIO;
 514
 515        return attribute->store(queue, attribute, buf, count);
 516}
 517
 518static const struct sysfs_ops rx_queue_sysfs_ops = {
 519        .show = rx_queue_attr_show,
 520        .store = rx_queue_attr_store,
 521};
 522
 523static ssize_t show_rps_map(struct netdev_rx_queue *queue,
 524                            struct rx_queue_attribute *attribute, char *buf)
 525{
 526        struct rps_map *map;
 527        cpumask_var_t mask;
 528        size_t len = 0;
 529        int i;
 530
 531        if (!zalloc_cpumask_var(&mask, GFP_KERNEL))
 532                return -ENOMEM;
 533
 534        rcu_read_lock();
 535        map = rcu_dereference(queue->rps_map);
 536        if (map)
 537                for (i = 0; i < map->len; i++)
 538                        cpumask_set_cpu(map->cpus[i], mask);
 539
 540        len += cpumask_scnprintf(buf + len, PAGE_SIZE, mask);
 541        if (PAGE_SIZE - len < 3) {
 542                rcu_read_unlock();
 543                free_cpumask_var(mask);
 544                return -EINVAL;
 545        }
 546        rcu_read_unlock();
 547
 548        free_cpumask_var(mask);
 549        len += sprintf(buf + len, "\n");
 550        return len;
 551}
 552
 553static void rps_map_release(struct rcu_head *rcu)
 554{
 555        struct rps_map *map = container_of(rcu, struct rps_map, rcu);
 556
 557        kfree(map);
 558}
 559
 560static ssize_t store_rps_map(struct netdev_rx_queue *queue,
 561                      struct rx_queue_attribute *attribute,
 562                      const char *buf, size_t len)
 563{
 564        struct rps_map *old_map, *map;
 565        cpumask_var_t mask;
 566        int err, cpu, i;
 567        static DEFINE_SPINLOCK(rps_map_lock);
 568
 569        if (!capable(CAP_NET_ADMIN))
 570                return -EPERM;
 571
 572        if (!alloc_cpumask_var(&mask, GFP_KERNEL))
 573                return -ENOMEM;
 574
 575        err = bitmap_parse(buf, len, cpumask_bits(mask), nr_cpumask_bits);
 576        if (err) {
 577                free_cpumask_var(mask);
 578                return err;
 579        }
 580
 581        map = kzalloc(max_t(unsigned,
 582            RPS_MAP_SIZE(cpumask_weight(mask)), L1_CACHE_BYTES),
 583            GFP_KERNEL);
 584        if (!map) {
 585                free_cpumask_var(mask);
 586                return -ENOMEM;
 587        }
 588
 589        i = 0;
 590        for_each_cpu_and(cpu, mask, cpu_online_mask)
 591                map->cpus[i++] = cpu;
 592
 593        if (i)
 594                map->len = i;
 595        else {
 596                kfree(map);
 597                map = NULL;
 598        }
 599
 600        spin_lock(&rps_map_lock);
 601        old_map = rcu_dereference_protected(queue->rps_map,
 602                                            lockdep_is_held(&rps_map_lock));
 603        rcu_assign_pointer(queue->rps_map, map);
 604        spin_unlock(&rps_map_lock);
 605
 606        if (old_map)
 607                call_rcu(&old_map->rcu, rps_map_release);
 608
 609        free_cpumask_var(mask);
 610        return len;
 611}
 612
 613static ssize_t show_rps_dev_flow_table_cnt(struct netdev_rx_queue *queue,
 614                                           struct rx_queue_attribute *attr,
 615                                           char *buf)
 616{
 617        struct rps_dev_flow_table *flow_table;
 618        unsigned int val = 0;
 619
 620        rcu_read_lock();
 621        flow_table = rcu_dereference(queue->rps_flow_table);
 622        if (flow_table)
 623                val = flow_table->mask + 1;
 624        rcu_read_unlock();
 625
 626        return sprintf(buf, "%u\n", val);
 627}
 628
 629static void rps_dev_flow_table_release_work(struct work_struct *work)
 630{
 631        struct rps_dev_flow_table *table = container_of(work,
 632            struct rps_dev_flow_table, free_work);
 633
 634        vfree(table);
 635}
 636
 637static void rps_dev_flow_table_release(struct rcu_head *rcu)
 638{
 639        struct rps_dev_flow_table *table = container_of(rcu,
 640            struct rps_dev_flow_table, rcu);
 641
 642        INIT_WORK(&table->free_work, rps_dev_flow_table_release_work);
 643        schedule_work(&table->free_work);
 644}
 645
 646static ssize_t store_rps_dev_flow_table_cnt(struct netdev_rx_queue *queue,
 647                                     struct rx_queue_attribute *attr,
 648                                     const char *buf, size_t len)
 649{
 650        unsigned int count;
 651        char *endp;
 652        struct rps_dev_flow_table *table, *old_table;
 653        static DEFINE_SPINLOCK(rps_dev_flow_lock);
 654
 655        if (!capable(CAP_NET_ADMIN))
 656                return -EPERM;
 657
 658        count = simple_strtoul(buf, &endp, 0);
 659        if (endp == buf)
 660                return -EINVAL;
 661
 662        if (count) {
 663                int i;
 664
 665                if (count > 1<<30) {
 666                        /* Enforce a limit to prevent overflow */
 667                        return -EINVAL;
 668                }
 669                count = roundup_pow_of_two(count);
 670                table = vmalloc(RPS_DEV_FLOW_TABLE_SIZE(count));
 671                if (!table)
 672                        return -ENOMEM;
 673
 674                table->mask = count - 1;
 675                for (i = 0; i < count; i++)
 676                        table->flows[i].cpu = RPS_NO_CPU;
 677        } else
 678                table = NULL;
 679
 680        spin_lock(&rps_dev_flow_lock);
 681        old_table = rcu_dereference_protected(queue->rps_flow_table,
 682                                              lockdep_is_held(&rps_dev_flow_lock));
 683        rcu_assign_pointer(queue->rps_flow_table, table);
 684        spin_unlock(&rps_dev_flow_lock);
 685
 686        if (old_table)
 687                call_rcu(&old_table->rcu, rps_dev_flow_table_release);
 688
 689        return len;
 690}
 691
 692static struct rx_queue_attribute rps_cpus_attribute =
 693        __ATTR(rps_cpus, S_IRUGO | S_IWUSR, show_rps_map, store_rps_map);
 694
 695
 696static struct rx_queue_attribute rps_dev_flow_table_cnt_attribute =
 697        __ATTR(rps_flow_cnt, S_IRUGO | S_IWUSR,
 698            show_rps_dev_flow_table_cnt, store_rps_dev_flow_table_cnt);
 699
 700static struct attribute *rx_queue_default_attrs[] = {
 701        &rps_cpus_attribute.attr,
 702        &rps_dev_flow_table_cnt_attribute.attr,
 703        NULL
 704};
 705
 706static void rx_queue_release(struct kobject *kobj)
 707{
 708        struct netdev_rx_queue *queue = to_rx_queue(kobj);
 709        struct netdev_rx_queue *first = queue->first;
 710        struct rps_map *map;
 711        struct rps_dev_flow_table *flow_table;
 712
 713
 714        map = rcu_dereference_raw(queue->rps_map);
 715        if (map) {
 716                RCU_INIT_POINTER(queue->rps_map, NULL);
 717                call_rcu(&map->rcu, rps_map_release);
 718        }
 719
 720        flow_table = rcu_dereference_raw(queue->rps_flow_table);
 721        if (flow_table) {
 722                RCU_INIT_POINTER(queue->rps_flow_table, NULL);
 723                call_rcu(&flow_table->rcu, rps_dev_flow_table_release);
 724        }
 725
 726        if (atomic_dec_and_test(&first->count))
 727                kfree(first);
 728        else
 729                memset(kobj, 0, sizeof(*kobj));
 730}
 731
 732static struct kobj_type rx_queue_ktype = {
 733        .sysfs_ops = &rx_queue_sysfs_ops,
 734        .release = rx_queue_release,
 735        .default_attrs = rx_queue_default_attrs,
 736};
 737
 738static int rx_queue_add_kobject(struct net_device *net, int index)
 739{
 740        struct netdev_rx_queue *queue = net->_rx + index;
 741        struct netdev_rx_queue *first = queue->first;
 742        struct kobject *kobj = &queue->kobj;
 743        int error = 0;
 744
 745        kobj->kset = net->queues_kset;
 746        error = kobject_init_and_add(kobj, &rx_queue_ktype, NULL,
 747            "rx-%u", index);
 748        if (error) {
 749                kobject_put(kobj);
 750                return error;
 751        }
 752
 753        kobject_uevent(kobj, KOBJ_ADD);
 754        atomic_inc(&first->count);
 755
 756        return error;
 757}
 758
 759int
 760net_rx_queue_update_kobjects(struct net_device *net, int old_num, int new_num)
 761{
 762        int i;
 763        int error = 0;
 764
 765        for (i = old_num; i < new_num; i++) {
 766                error = rx_queue_add_kobject(net, i);
 767                if (error) {
 768                        new_num = old_num;
 769                        break;
 770                }
 771        }
 772
 773        while (--i >= new_num)
 774                kobject_put(&net->_rx[i].kobj);
 775
 776        return error;
 777}
 778
 779static int rx_queue_register_kobjects(struct net_device *net)
 780{
 781        net->queues_kset = kset_create_and_add("queues",
 782            NULL, &net->dev.kobj);
 783        if (!net->queues_kset)
 784                return -ENOMEM;
 785        return net_rx_queue_update_kobjects(net, 0, net->real_num_rx_queues);
 786}
 787
 788static void rx_queue_remove_kobjects(struct net_device *net)
 789{
 790        net_rx_queue_update_kobjects(net, net->real_num_rx_queues, 0);
 791        kset_unregister(net->queues_kset);
 792}
 793#endif /* CONFIG_RPS */
 794
 795static const void *net_current_ns(void)
 796{
 797        return current->nsproxy->net_ns;
 798}
 799
 800static const void *net_initial_ns(void)
 801{
 802        return &init_net;
 803}
 804
 805static const void *net_netlink_ns(struct sock *sk)
 806{
 807        return sock_net(sk);
 808}
 809
 810struct kobj_ns_type_operations net_ns_type_operations = {
 811        .type = KOBJ_NS_TYPE_NET,
 812        .current_ns = net_current_ns,
 813        .netlink_ns = net_netlink_ns,
 814        .initial_ns = net_initial_ns,
 815};
 816EXPORT_SYMBOL_GPL(net_ns_type_operations);
 817
 818static void net_kobj_ns_exit(struct net *net)
 819{
 820        kobj_ns_exit(KOBJ_NS_TYPE_NET, net);
 821}
 822
 823static struct pernet_operations kobj_net_ops = {
 824        .exit = net_kobj_ns_exit,
 825};
 826
 827
 828#ifdef CONFIG_HOTPLUG
 829static int netdev_uevent(struct device *d, struct kobj_uevent_env *env)
 830{
 831        struct net_device *dev = to_net_dev(d);
 832        int retval;
 833
 834        /* pass interface to uevent. */
 835        retval = add_uevent_var(env, "INTERFACE=%s", dev->name);
 836        if (retval)
 837                goto exit;
 838
 839        /* pass ifindex to uevent.
 840         * ifindex is useful as it won't change (interface name may change)
 841         * and is what RtNetlink uses natively. */
 842        retval = add_uevent_var(env, "IFINDEX=%d", dev->ifindex);
 843
 844exit:
 845        return retval;
 846}
 847#endif
 848
 849/*
 850 *      netdev_release -- destroy and free a dead device.
 851 *      Called when last reference to device kobject is gone.
 852 */
 853static void netdev_release(struct device *d)
 854{
 855        struct net_device *dev = to_net_dev(d);
 856
 857        BUG_ON(dev->reg_state != NETREG_RELEASED);
 858
 859        kfree(dev->ifalias);
 860        kfree((char *)dev - dev->padded);
 861}
 862
 863static const void *net_namespace(struct device *d)
 864{
 865        struct net_device *dev;
 866        dev = container_of(d, struct net_device, dev);
 867        return dev_net(dev);
 868}
 869
 870static struct class net_class = {
 871        .name = "net",
 872        .dev_release = netdev_release,
 873#ifdef CONFIG_SYSFS
 874        .dev_attrs = net_class_attributes,
 875#endif /* CONFIG_SYSFS */
 876#ifdef CONFIG_HOTPLUG
 877        .dev_uevent = netdev_uevent,
 878#endif
 879        .ns_type = &net_ns_type_operations,
 880        .namespace = net_namespace,
 881};
 882
 883/* Delete sysfs entries but hold kobject reference until after all
 884 * netdev references are gone.
 885 */
 886void netdev_unregister_kobject(struct net_device * net)
 887{
 888        struct device *dev = &(net->dev);
 889
 890        kobject_get(&dev->kobj);
 891
 892#ifdef CONFIG_RPS
 893        rx_queue_remove_kobjects(net);
 894#endif
 895
 896        device_del(dev);
 897}
 898
 899/* Create sysfs entries for network device. */
 900int netdev_register_kobject(struct net_device *net)
 901{
 902        struct device *dev = &(net->dev);
 903        const struct attribute_group **groups = net->sysfs_groups;
 904        int error = 0;
 905
 906        device_initialize(dev);
 907        dev->class = &net_class;
 908        dev->platform_data = net;
 909        dev->groups = groups;
 910
 911        dev_set_name(dev, "%s", net->name);
 912
 913#ifdef CONFIG_SYSFS
 914        /* Allow for a device specific group */
 915        if (*groups)
 916                groups++;
 917
 918        *groups++ = &netstat_group;
 919#ifdef CONFIG_WIRELESS_EXT_SYSFS
 920        if (net->ieee80211_ptr)
 921                *groups++ = &wireless_group;
 922#ifdef CONFIG_WIRELESS_EXT
 923        else if (net->wireless_handlers)
 924                *groups++ = &wireless_group;
 925#endif
 926#endif
 927#endif /* CONFIG_SYSFS */
 928
 929        error = device_add(dev);
 930        if (error)
 931                return error;
 932
 933#ifdef CONFIG_RPS
 934        error = rx_queue_register_kobjects(net);
 935        if (error) {
 936                device_del(dev);
 937                return error;
 938        }
 939#endif
 940
 941        return error;
 942}
 943
 944int netdev_class_create_file(struct class_attribute *class_attr)
 945{
 946        return class_create_file(&net_class, class_attr);
 947}
 948EXPORT_SYMBOL(netdev_class_create_file);
 949
 950void netdev_class_remove_file(struct class_attribute *class_attr)
 951{
 952        class_remove_file(&net_class, class_attr);
 953}
 954EXPORT_SYMBOL(netdev_class_remove_file);
 955
 956int netdev_kobject_init(void)
 957{
 958        kobj_ns_type_register(&net_ns_type_operations);
 959        register_pernet_subsys(&kobj_net_ops);
 960        return class_register(&net_class);
 961}
 962
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.