linux/net/core/ethtool.c
<<
>>
Prefs
   1/*
   2 * net/core/ethtool.c - Ethtool ioctl handler
   3 * Copyright (c) 2003 Matthew Wilcox <matthew@wil.cx>
   4 *
   5 * This file is where we call all the ethtool_ops commands to get
   6 * the information ethtool needs.
   7 *
   8 * This program is free software; you can redistribute it and/or modify
   9 * it under the terms of the GNU General Public License as published by
  10 * the Free Software Foundation; either version 2 of the License, or
  11 * (at your option) any later version.
  12 */
  13
  14#include <linux/module.h>
  15#include <linux/types.h>
  16#include <linux/capability.h>
  17#include <linux/errno.h>
  18#include <linux/ethtool.h>
  19#include <linux/netdevice.h>
  20#include <linux/bitops.h>
  21#include <linux/uaccess.h>
  22#include <linux/vmalloc.h>
  23#include <linux/slab.h>
  24#include <linux/rtnetlink.h>
  25#include <linux/sched.h>
  26
  27/*
  28 * Some useful ethtool_ops methods that're device independent.
  29 * If we find that all drivers want to do the same thing here,
  30 * we can turn these into dev_() function calls.
  31 */
  32
  33u32 ethtool_op_get_link(struct net_device *dev)
  34{
  35        return netif_carrier_ok(dev) ? 1 : 0;
  36}
  37EXPORT_SYMBOL(ethtool_op_get_link);
  38
  39u32 ethtool_op_get_tx_csum(struct net_device *dev)
  40{
  41        return (dev->features & NETIF_F_ALL_CSUM) != 0;
  42}
  43EXPORT_SYMBOL(ethtool_op_get_tx_csum);
  44
  45int ethtool_op_set_tx_csum(struct net_device *dev, u32 data)
  46{
  47        if (data)
  48                dev->features |= NETIF_F_IP_CSUM;
  49        else
  50                dev->features &= ~NETIF_F_IP_CSUM;
  51
  52        return 0;
  53}
  54EXPORT_SYMBOL(ethtool_op_set_tx_csum);
  55
  56int ethtool_op_set_tx_hw_csum(struct net_device *dev, u32 data)
  57{
  58        if (data)
  59                dev->features |= NETIF_F_HW_CSUM;
  60        else
  61                dev->features &= ~NETIF_F_HW_CSUM;
  62
  63        return 0;
  64}
  65EXPORT_SYMBOL(ethtool_op_set_tx_hw_csum);
  66
  67int ethtool_op_set_tx_ipv6_csum(struct net_device *dev, u32 data)
  68{
  69        if (data)
  70                dev->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
  71        else
  72                dev->features &= ~(NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM);
  73
  74        return 0;
  75}
  76EXPORT_SYMBOL(ethtool_op_set_tx_ipv6_csum);
  77
  78u32 ethtool_op_get_sg(struct net_device *dev)
  79{
  80        return (dev->features & NETIF_F_SG) != 0;
  81}
  82EXPORT_SYMBOL(ethtool_op_get_sg);
  83
  84int ethtool_op_set_sg(struct net_device *dev, u32 data)
  85{
  86        if (data)
  87                dev->features |= NETIF_F_SG;
  88        else
  89                dev->features &= ~NETIF_F_SG;
  90
  91        return 0;
  92}
  93EXPORT_SYMBOL(ethtool_op_set_sg);
  94
  95u32 ethtool_op_get_tso(struct net_device *dev)
  96{
  97        return (dev->features & NETIF_F_TSO) != 0;
  98}
  99EXPORT_SYMBOL(ethtool_op_get_tso);
 100
 101int ethtool_op_set_tso(struct net_device *dev, u32 data)
 102{
 103        if (data)
 104                dev->features |= NETIF_F_TSO;
 105        else
 106                dev->features &= ~NETIF_F_TSO;
 107
 108        return 0;
 109}
 110EXPORT_SYMBOL(ethtool_op_set_tso);
 111
 112u32 ethtool_op_get_ufo(struct net_device *dev)
 113{
 114        return (dev->features & NETIF_F_UFO) != 0;
 115}
 116EXPORT_SYMBOL(ethtool_op_get_ufo);
 117
 118int ethtool_op_set_ufo(struct net_device *dev, u32 data)
 119{
 120        if (data)
 121                dev->features |= NETIF_F_UFO;
 122        else
 123                dev->features &= ~NETIF_F_UFO;
 124        return 0;
 125}
 126EXPORT_SYMBOL(ethtool_op_set_ufo);
 127
 128/* the following list of flags are the same as their associated
 129 * NETIF_F_xxx values in include/linux/netdevice.h
 130 */
 131static const u32 flags_dup_features =
 132        (ETH_FLAG_LRO | ETH_FLAG_RXVLAN | ETH_FLAG_TXVLAN | ETH_FLAG_NTUPLE |
 133         ETH_FLAG_RXHASH);
 134
 135u32 ethtool_op_get_flags(struct net_device *dev)
 136{
 137        /* in the future, this function will probably contain additional
 138         * handling for flags which are not so easily handled
 139         * by a simple masking operation
 140         */
 141
 142        return dev->features & flags_dup_features;
 143}
 144EXPORT_SYMBOL(ethtool_op_get_flags);
 145
 146/* Check if device can enable (or disable) particular feature coded in "data"
 147 * argument. Flags "supported" describe features that can be toggled by device.
 148 * If feature can not be toggled, it state (enabled or disabled) must match
 149 * hardcoded device features state, otherwise flags are marked as invalid.
 150 */
 151bool ethtool_invalid_flags(struct net_device *dev, u32 data, u32 supported)
 152{
 153        u32 features = dev->features & flags_dup_features;
 154        /* "data" can contain only flags_dup_features bits,
 155         * see __ethtool_set_flags */
 156
 157        return (features & ~supported) != (data & ~supported);
 158}
 159EXPORT_SYMBOL(ethtool_invalid_flags);
 160
 161int ethtool_op_set_flags(struct net_device *dev, u32 data, u32 supported)
 162{
 163        if (ethtool_invalid_flags(dev, data, supported))
 164                return -EINVAL;
 165
 166        dev->features = ((dev->features & ~flags_dup_features) |
 167                         (data & flags_dup_features));
 168        return 0;
 169}
 170EXPORT_SYMBOL(ethtool_op_set_flags);
 171
 172/* Handlers for each ethtool command */
 173
 174#define ETHTOOL_DEV_FEATURE_WORDS       1
 175
 176static void ethtool_get_features_compat(struct net_device *dev,
 177        struct ethtool_get_features_block *features)
 178{
 179        if (!dev->ethtool_ops)
 180                return;
 181
 182        /* getting RX checksum */
 183        if (dev->ethtool_ops->get_rx_csum)
 184                if (dev->ethtool_ops->get_rx_csum(dev))
 185                        features[0].active |= NETIF_F_RXCSUM;
 186
 187        /* mark legacy-changeable features */
 188        if (dev->ethtool_ops->set_sg)
 189                features[0].available |= NETIF_F_SG;
 190        if (dev->ethtool_ops->set_tx_csum)
 191                features[0].available |= NETIF_F_ALL_CSUM;
 192        if (dev->ethtool_ops->set_tso)
 193                features[0].available |= NETIF_F_ALL_TSO;
 194        if (dev->ethtool_ops->set_rx_csum)
 195                features[0].available |= NETIF_F_RXCSUM;
 196        if (dev->ethtool_ops->set_flags)
 197                features[0].available |= flags_dup_features;
 198}
 199
 200static int ethtool_set_feature_compat(struct net_device *dev,
 201        int (*legacy_set)(struct net_device *, u32),
 202        struct ethtool_set_features_block *features, u32 mask)
 203{
 204        u32 do_set;
 205
 206        if (!legacy_set)
 207                return 0;
 208
 209        if (!(features[0].valid & mask))
 210                return 0;
 211
 212        features[0].valid &= ~mask;
 213
 214        do_set = !!(features[0].requested & mask);
 215
 216        if (legacy_set(dev, do_set) < 0)
 217                netdev_info(dev,
 218                        "Legacy feature change (%s) failed for 0x%08x\n",
 219                        do_set ? "set" : "clear", mask);
 220
 221        return 1;
 222}
 223
 224static int ethtool_set_flags_compat(struct net_device *dev,
 225        int (*legacy_set)(struct net_device *, u32),
 226        struct ethtool_set_features_block *features, u32 mask)
 227{
 228        u32 value;
 229
 230        if (!legacy_set)
 231                return 0;
 232
 233        if (!(features[0].valid & mask))
 234                return 0;
 235
 236        value = dev->features & ~features[0].valid;
 237        value |= features[0].requested;
 238
 239        features[0].valid &= ~mask;
 240
 241        if (legacy_set(dev, value & mask) < 0)
 242                netdev_info(dev, "Legacy flags change failed\n");
 243
 244        return 1;
 245}
 246
 247static int ethtool_set_features_compat(struct net_device *dev,
 248        struct ethtool_set_features_block *features)
 249{
 250        int compat;
 251
 252        if (!dev->ethtool_ops)
 253                return 0;
 254
 255        compat  = ethtool_set_feature_compat(dev, dev->ethtool_ops->set_sg,
 256                features, NETIF_F_SG);
 257        compat |= ethtool_set_feature_compat(dev, dev->ethtool_ops->set_tx_csum,
 258                features, NETIF_F_ALL_CSUM);
 259        compat |= ethtool_set_feature_compat(dev, dev->ethtool_ops->set_tso,
 260                features, NETIF_F_ALL_TSO);
 261        compat |= ethtool_set_feature_compat(dev, dev->ethtool_ops->set_rx_csum,
 262                features, NETIF_F_RXCSUM);
 263        compat |= ethtool_set_flags_compat(dev, dev->ethtool_ops->set_flags,
 264                features, flags_dup_features);
 265
 266        return compat;
 267}
 268
 269static int ethtool_get_features(struct net_device *dev, void __user *useraddr)
 270{
 271        struct ethtool_gfeatures cmd = {
 272                .cmd = ETHTOOL_GFEATURES,
 273                .size = ETHTOOL_DEV_FEATURE_WORDS,
 274        };
 275        struct ethtool_get_features_block features[ETHTOOL_DEV_FEATURE_WORDS] = {
 276                {
 277                        .available = dev->hw_features,
 278                        .requested = dev->wanted_features,
 279                        .active = dev->features,
 280                        .never_changed = NETIF_F_NEVER_CHANGE,
 281                },
 282        };
 283        u32 __user *sizeaddr;
 284        u32 copy_size;
 285
 286        ethtool_get_features_compat(dev, features);
 287
 288        sizeaddr = useraddr + offsetof(struct ethtool_gfeatures, size);
 289        if (get_user(copy_size, sizeaddr))
 290                return -EFAULT;
 291
 292        if (copy_size > ETHTOOL_DEV_FEATURE_WORDS)
 293                copy_size = ETHTOOL_DEV_FEATURE_WORDS;
 294
 295        if (copy_to_user(useraddr, &cmd, sizeof(cmd)))
 296                return -EFAULT;
 297        useraddr += sizeof(cmd);
 298        if (copy_to_user(useraddr, features, copy_size * sizeof(*features)))
 299                return -EFAULT;
 300
 301        return 0;
 302}
 303
 304static int ethtool_set_features(struct net_device *dev, void __user *useraddr)
 305{
 306        struct ethtool_sfeatures cmd;
 307        struct ethtool_set_features_block features[ETHTOOL_DEV_FEATURE_WORDS];
 308        int ret = 0;
 309
 310        if (copy_from_user(&cmd, useraddr, sizeof(cmd)))
 311                return -EFAULT;
 312        useraddr += sizeof(cmd);
 313
 314        if (cmd.size != ETHTOOL_DEV_FEATURE_WORDS)
 315                return -EINVAL;
 316
 317        if (copy_from_user(features, useraddr, sizeof(features)))
 318                return -EFAULT;
 319
 320        if (features[0].valid & ~NETIF_F_ETHTOOL_BITS)
 321                return -EINVAL;
 322
 323        if (ethtool_set_features_compat(dev, features))
 324                ret |= ETHTOOL_F_COMPAT;
 325
 326        if (features[0].valid & ~dev->hw_features) {
 327                features[0].valid &= dev->hw_features;
 328                ret |= ETHTOOL_F_UNSUPPORTED;
 329        }
 330
 331        dev->wanted_features &= ~features[0].valid;
 332        dev->wanted_features |= features[0].valid & features[0].requested;
 333        __netdev_update_features(dev);
 334
 335        if ((dev->wanted_features ^ dev->features) & features[0].valid)
 336                ret |= ETHTOOL_F_WISH;
 337
 338        return ret;
 339}
 340
 341static const char netdev_features_strings[ETHTOOL_DEV_FEATURE_WORDS * 32][ETH_GSTRING_LEN] = {
 342        /* NETIF_F_SG */              "tx-scatter-gather",
 343        /* NETIF_F_IP_CSUM */         "tx-checksum-ipv4",
 344        /* NETIF_F_NO_CSUM */         "tx-checksum-unneeded",
 345        /* NETIF_F_HW_CSUM */         "tx-checksum-ip-generic",
 346        /* NETIF_F_IPV6_CSUM */       "tx-checksum-ipv6",
 347        /* NETIF_F_HIGHDMA */         "highdma",
 348        /* NETIF_F_FRAGLIST */        "tx-scatter-gather-fraglist",
 349        /* NETIF_F_HW_VLAN_TX */      "tx-vlan-hw-insert",
 350
 351        /* NETIF_F_HW_VLAN_RX */      "rx-vlan-hw-parse",
 352        /* NETIF_F_HW_VLAN_FILTER */  "rx-vlan-filter",
 353        /* NETIF_F_VLAN_CHALLENGED */ "vlan-challenged",
 354        /* NETIF_F_GSO */             "tx-generic-segmentation",
 355        /* NETIF_F_LLTX */            "tx-lockless",
 356        /* NETIF_F_NETNS_LOCAL */     "netns-local",
 357        /* NETIF_F_GRO */             "rx-gro",
 358        /* NETIF_F_LRO */             "rx-lro",
 359
 360        /* NETIF_F_TSO */             "tx-tcp-segmentation",
 361        /* NETIF_F_UFO */             "tx-udp-fragmentation",
 362        /* NETIF_F_GSO_ROBUST */      "tx-gso-robust",
 363        /* NETIF_F_TSO_ECN */         "tx-tcp-ecn-segmentation",
 364        /* NETIF_F_TSO6 */            "tx-tcp6-segmentation",
 365        /* NETIF_F_FSO */             "tx-fcoe-segmentation",
 366        "",
 367        "",
 368
 369        /* NETIF_F_FCOE_CRC */        "tx-checksum-fcoe-crc",
 370        /* NETIF_F_SCTP_CSUM */       "tx-checksum-sctp",
 371        /* NETIF_F_FCOE_MTU */        "fcoe-mtu",
 372        /* NETIF_F_NTUPLE */          "rx-ntuple-filter",
 373        /* NETIF_F_RXHASH */          "rx-hashing",
 374        /* NETIF_F_RXCSUM */          "rx-checksum",
 375        /* NETIF_F_NOCACHE_COPY */    "tx-nocache-copy",
 376        /* NETIF_F_LOOPBACK */        "loopback",
 377};
 378
 379static int __ethtool_get_sset_count(struct net_device *dev, int sset)
 380{
 381        const struct ethtool_ops *ops = dev->ethtool_ops;
 382
 383        if (sset == ETH_SS_FEATURES)
 384                return ARRAY_SIZE(netdev_features_strings);
 385
 386        if (ops && ops->get_sset_count && ops->get_strings)
 387                return ops->get_sset_count(dev, sset);
 388        else
 389                return -EOPNOTSUPP;
 390}
 391
 392static void __ethtool_get_strings(struct net_device *dev,
 393        u32 stringset, u8 *data)
 394{
 395        const struct ethtool_ops *ops = dev->ethtool_ops;
 396
 397        if (stringset == ETH_SS_FEATURES)
 398                memcpy(data, netdev_features_strings,
 399                        sizeof(netdev_features_strings));
 400        else
 401                /* ops->get_strings is valid because checked earlier */
 402                ops->get_strings(dev, stringset, data);
 403}
 404
 405static u32 ethtool_get_feature_mask(u32 eth_cmd)
 406{
 407        /* feature masks of legacy discrete ethtool ops */
 408
 409        switch (eth_cmd) {
 410        case ETHTOOL_GTXCSUM:
 411        case ETHTOOL_STXCSUM:
 412                return NETIF_F_ALL_CSUM | NETIF_F_SCTP_CSUM;
 413        case ETHTOOL_GRXCSUM:
 414        case ETHTOOL_SRXCSUM:
 415                return NETIF_F_RXCSUM;
 416        case ETHTOOL_GSG:
 417        case ETHTOOL_SSG:
 418                return NETIF_F_SG;
 419        case ETHTOOL_GTSO:
 420        case ETHTOOL_STSO:
 421                return NETIF_F_ALL_TSO;
 422        case ETHTOOL_GUFO:
 423        case ETHTOOL_SUFO:
 424                return NETIF_F_UFO;
 425        case ETHTOOL_GGSO:
 426        case ETHTOOL_SGSO:
 427                return NETIF_F_GSO;
 428        case ETHTOOL_GGRO:
 429        case ETHTOOL_SGRO:
 430                return NETIF_F_GRO;
 431        default:
 432                BUG();
 433        }
 434}
 435
 436static void *__ethtool_get_one_feature_actor(struct net_device *dev, u32 ethcmd)
 437{
 438        const struct ethtool_ops *ops = dev->ethtool_ops;
 439
 440        if (!ops)
 441                return NULL;
 442
 443        switch (ethcmd) {
 444        case ETHTOOL_GTXCSUM:
 445                return ops->get_tx_csum;
 446        case ETHTOOL_GRXCSUM:
 447                return ops->get_rx_csum;
 448        case ETHTOOL_SSG:
 449                return ops->get_sg;
 450        case ETHTOOL_STSO:
 451                return ops->get_tso;
 452        case ETHTOOL_SUFO:
 453                return ops->get_ufo;
 454        default:
 455                return NULL;
 456        }
 457}
 458
 459static u32 __ethtool_get_rx_csum_oldbug(struct net_device *dev)
 460{
 461        return !!(dev->features & NETIF_F_ALL_CSUM);
 462}
 463
 464static int ethtool_get_one_feature(struct net_device *dev,
 465        char __user *useraddr, u32 ethcmd)
 466{
 467        u32 mask = ethtool_get_feature_mask(ethcmd);
 468        struct ethtool_value edata = {
 469                .cmd = ethcmd,
 470                .data = !!(dev->features & mask),
 471        };
 472
 473        /* compatibility with discrete get_ ops */
 474        if (!(dev->hw_features & mask)) {
 475                u32 (*actor)(struct net_device *);
 476
 477                actor = __ethtool_get_one_feature_actor(dev, ethcmd);
 478
 479                /* bug compatibility with old get_rx_csum */
 480                if (ethcmd == ETHTOOL_GRXCSUM && !actor)
 481                        actor = __ethtool_get_rx_csum_oldbug;
 482
 483                if (actor)
 484                        edata.data = actor(dev);
 485        }
 486
 487        if (copy_to_user(useraddr, &edata, sizeof(edata)))
 488                return -EFAULT;
 489        return 0;
 490}
 491
 492static int __ethtool_set_tx_csum(struct net_device *dev, u32 data);
 493static int __ethtool_set_rx_csum(struct net_device *dev, u32 data);
 494static int __ethtool_set_sg(struct net_device *dev, u32 data);
 495static int __ethtool_set_tso(struct net_device *dev, u32 data);
 496static int __ethtool_set_ufo(struct net_device *dev, u32 data);
 497
 498static int ethtool_set_one_feature(struct net_device *dev,
 499        void __user *useraddr, u32 ethcmd)
 500{
 501        struct ethtool_value edata;
 502        u32 mask;
 503
 504        if (copy_from_user(&edata, useraddr, sizeof(edata)))
 505                return -EFAULT;
 506
 507        mask = ethtool_get_feature_mask(ethcmd);
 508        mask &= dev->hw_features;
 509        if (mask) {
 510                if (edata.data)
 511                        dev->wanted_features |= mask;
 512                else
 513                        dev->wanted_features &= ~mask;
 514
 515                __netdev_update_features(dev);
 516                return 0;
 517        }
 518
 519        /* Driver is not converted to ndo_fix_features or does not
 520         * support changing this offload. In the latter case it won't
 521         * have corresponding ethtool_ops field set.
 522         *
 523         * Following part is to be removed after all drivers advertise
 524         * their changeable features in netdev->hw_features and stop
 525         * using discrete offload setting ops.
 526         */
 527
 528        switch (ethcmd) {
 529        case ETHTOOL_STXCSUM:
 530                return __ethtool_set_tx_csum(dev, edata.data);
 531        case ETHTOOL_SRXCSUM:
 532                return __ethtool_set_rx_csum(dev, edata.data);
 533        case ETHTOOL_SSG:
 534                return __ethtool_set_sg(dev, edata.data);
 535        case ETHTOOL_STSO:
 536                return __ethtool_set_tso(dev, edata.data);
 537        case ETHTOOL_SUFO:
 538                return __ethtool_set_ufo(dev, edata.data);
 539        default:
 540                return -EOPNOTSUPP;
 541        }
 542}
 543
 544int __ethtool_set_flags(struct net_device *dev, u32 data)
 545{
 546        u32 changed;
 547
 548        if (data & ~flags_dup_features)
 549                return -EINVAL;
 550
 551        /* legacy set_flags() op */
 552        if (dev->ethtool_ops->set_flags) {
 553                if (unlikely(dev->hw_features & flags_dup_features))
 554                        netdev_warn(dev,
 555                                "driver BUG: mixed hw_features and set_flags()\n");
 556                return dev->ethtool_ops->set_flags(dev, data);
 557        }
 558
 559        /* allow changing only bits set in hw_features */
 560        changed = (data ^ dev->features) & flags_dup_features;
 561        if (changed & ~dev->hw_features)
 562                return (changed & dev->hw_features) ? -EINVAL : -EOPNOTSUPP;
 563
 564        dev->wanted_features =
 565                (dev->wanted_features & ~changed) | (data & dev->hw_features);
 566
 567        __netdev_update_features(dev);
 568
 569        return 0;
 570}
 571
 572static int ethtool_get_settings(struct net_device *dev, void __user *useraddr)
 573{
 574        struct ethtool_cmd cmd = { .cmd = ETHTOOL_GSET };
 575        int err;
 576
 577        if (!dev->ethtool_ops->get_settings)
 578                return -EOPNOTSUPP;
 579
 580        err = dev->ethtool_ops->get_settings(dev, &cmd);
 581        if (err < 0)
 582                return err;
 583
 584        if (copy_to_user(useraddr, &cmd, sizeof(cmd)))
 585                return -EFAULT;
 586        return 0;
 587}
 588
 589static int ethtool_set_settings(struct net_device *dev, void __user *useraddr)
 590{
 591        struct ethtool_cmd cmd;
 592
 593        if (!dev->ethtool_ops->set_settings)
 594                return -EOPNOTSUPP;
 595
 596        if (copy_from_user(&cmd, useraddr, sizeof(cmd)))
 597                return -EFAULT;
 598
 599        return dev->ethtool_ops->set_settings(dev, &cmd);
 600}
 601
 602static noinline_for_stack int ethtool_get_drvinfo(struct net_device *dev,
 603                                                  void __user *useraddr)
 604{
 605        struct ethtool_drvinfo info;
 606        const struct ethtool_ops *ops = dev->ethtool_ops;
 607
 608        memset(&info, 0, sizeof(info));
 609        info.cmd = ETHTOOL_GDRVINFO;
 610        if (ops && ops->get_drvinfo) {
 611                ops->get_drvinfo(dev, &info);
 612        } else if (dev->dev.parent && dev->dev.parent->driver) {
 613                strlcpy(info.bus_info, dev_name(dev->dev.parent),
 614                        sizeof(info.bus_info));
 615                strlcpy(info.driver, dev->dev.parent->driver->name,
 616                        sizeof(info.driver));
 617        } else {
 618                return -EOPNOTSUPP;
 619        }
 620
 621        /*
 622         * this method of obtaining string set info is deprecated;
 623         * Use ETHTOOL_GSSET_INFO instead.
 624         */
 625        if (ops && ops->get_sset_count) {
 626                int rc;
 627
 628                rc = ops->get_sset_count(dev, ETH_SS_TEST);
 629                if (rc >= 0)
 630                        info.testinfo_len = rc;
 631                rc = ops->get_sset_count(dev, ETH_SS_STATS);
 632                if (rc >= 0)
 633                        info.n_stats = rc;
 634                rc = ops->get_sset_count(dev, ETH_SS_PRIV_FLAGS);
 635                if (rc >= 0)
 636                        info.n_priv_flags = rc;
 637        }
 638        if (ops && ops->get_regs_len)
 639                info.regdump_len = ops->get_regs_len(dev);
 640        if (ops && ops->get_eeprom_len)
 641                info.eedump_len = ops->get_eeprom_len(dev);
 642
 643        if (copy_to_user(useraddr, &info, sizeof(info)))
 644                return -EFAULT;
 645        return 0;
 646}
 647
 648static noinline_for_stack int ethtool_get_sset_info(struct net_device *dev,
 649                                                    void __user *useraddr)
 650{
 651        struct ethtool_sset_info info;
 652        u64 sset_mask;
 653        int i, idx = 0, n_bits = 0, ret, rc;
 654        u32 *info_buf = NULL;
 655
 656        if (copy_from_user(&info, useraddr, sizeof(info)))
 657                return -EFAULT;
 658
 659        /* store copy of mask, because we zero struct later on */
 660        sset_mask = info.sset_mask;
 661        if (!sset_mask)
 662                return 0;
 663
 664        /* calculate size of return buffer */
 665        n_bits = hweight64(sset_mask);
 666
 667        memset(&info, 0, sizeof(info));
 668        info.cmd = ETHTOOL_GSSET_INFO;
 669
 670        info_buf = kzalloc(n_bits * sizeof(u32), GFP_USER);
 671        if (!info_buf)
 672                return -ENOMEM;
 673
 674        /*
 675         * fill return buffer based on input bitmask and successful
 676         * get_sset_count return
 677         */
 678        for (i = 0; i < 64; i++) {
 679                if (!(sset_mask & (1ULL << i)))
 680                        continue;
 681
 682                rc = __ethtool_get_sset_count(dev, i);
 683                if (rc >= 0) {
 684                        info.sset_mask |= (1ULL << i);
 685                        info_buf[idx++] = rc;
 686                }
 687        }
 688
 689        ret = -EFAULT;
 690        if (copy_to_user(useraddr, &info, sizeof(info)))
 691                goto out;
 692
 693        useraddr += offsetof(struct ethtool_sset_info, data);
 694        if (copy_to_user(useraddr, info_buf, idx * sizeof(u32)))
 695                goto out;
 696
 697        ret = 0;
 698
 699out:
 700        kfree(info_buf);
 701        return ret;
 702}
 703
 704static noinline_for_stack int ethtool_set_rxnfc(struct net_device *dev,
 705                                                u32 cmd, void __user *useraddr)
 706{
 707        struct ethtool_rxnfc info;
 708        size_t info_size = sizeof(info);
 709
 710        if (!dev->ethtool_ops->set_rxnfc)
 711                return -EOPNOTSUPP;
 712
 713        /* struct ethtool_rxnfc was originally defined for
 714         * ETHTOOL_{G,S}RXFH with only the cmd, flow_type and data
 715         * members.  User-space might still be using that
 716         * definition. */
 717        if (cmd == ETHTOOL_SRXFH)
 718                info_size = (offsetof(struct ethtool_rxnfc, data) +
 719                             sizeof(info.data));
 720
 721        if (copy_from_user(&info, useraddr, info_size))
 722                return -EFAULT;
 723
 724        return dev->ethtool_ops->set_rxnfc(dev, &info);
 725}
 726
 727static noinline_for_stack int ethtool_get_rxnfc(struct net_device *dev,
 728                                                u32 cmd, void __user *useraddr)
 729{
 730        struct ethtool_rxnfc info;
 731        size_t info_size = sizeof(info);
 732        const struct ethtool_ops *ops = dev->ethtool_ops;
 733        int ret;
 734        void *rule_buf = NULL;
 735
 736        if (!ops->get_rxnfc)
 737                return -EOPNOTSUPP;
 738
 739        /* struct ethtool_rxnfc was originally defined for
 740         * ETHTOOL_{G,S}RXFH with only the cmd, flow_type and data
 741         * members.  User-space might still be using that
 742         * definition. */
 743        if (cmd == ETHTOOL_GRXFH)
 744                info_size = (offsetof(struct ethtool_rxnfc, data) +
 745                             sizeof(info.data));
 746
 747        if (copy_from_user(&info, useraddr, info_size))
 748                return -EFAULT;
 749
 750        if (info.cmd == ETHTOOL_GRXCLSRLALL) {
 751                if (info.rule_cnt > 0) {
 752                        if (info.rule_cnt <= KMALLOC_MAX_SIZE / sizeof(u32))
 753                                rule_buf = kzalloc(info.rule_cnt * sizeof(u32),
 754                                                   GFP_USER);
 755                        if (!rule_buf)
 756                                return -ENOMEM;
 757                }
 758        }
 759
 760        ret = ops->get_rxnfc(dev, &info, rule_buf);
 761        if (ret < 0)
 762                goto err_out;
 763
 764        ret = -EFAULT;
 765        if (copy_to_user(useraddr, &info, info_size))
 766                goto err_out;
 767
 768        if (rule_buf) {
 769                useraddr += offsetof(struct ethtool_rxnfc, rule_locs);
 770                if (copy_to_user(useraddr, rule_buf,
 771                                 info.rule_cnt * sizeof(u32)))
 772                        goto err_out;
 773        }
 774        ret = 0;
 775
 776err_out:
 777        kfree(rule_buf);
 778
 779        return ret;
 780}
 781
 782static noinline_for_stack int ethtool_get_rxfh_indir(struct net_device *dev,
 783                                                     void __user *useraddr)
 784{
 785        struct ethtool_rxfh_indir *indir;
 786        u32 table_size;
 787        size_t full_size;
 788        int ret;
 789
 790        if (!dev->ethtool_ops->get_rxfh_indir)
 791                return -EOPNOTSUPP;
 792
 793        if (copy_from_user(&table_size,
 794                           useraddr + offsetof(struct ethtool_rxfh_indir, size),
 795                           sizeof(table_size)))
 796                return -EFAULT;
 797
 798        if (table_size >
 799            (KMALLOC_MAX_SIZE - sizeof(*indir)) / sizeof(*indir->ring_index))
 800                return -ENOMEM;
 801        full_size = sizeof(*indir) + sizeof(*indir->ring_index) * table_size;
 802        indir = kzalloc(full_size, GFP_USER);
 803        if (!indir)
 804                return -ENOMEM;
 805
 806        indir->cmd = ETHTOOL_GRXFHINDIR;
 807        indir->size = table_size;
 808        ret = dev->ethtool_ops->get_rxfh_indir(dev, indir);
 809        if (ret)
 810                goto out;
 811
 812        if (copy_to_user(useraddr, indir, full_size))
 813                ret = -EFAULT;
 814
 815out:
 816        kfree(indir);
 817        return ret;
 818}
 819
 820static noinline_for_stack int ethtool_set_rxfh_indir(struct net_device *dev,
 821                                                     void __user *useraddr)
 822{
 823        struct ethtool_rxfh_indir *indir;
 824        u32 table_size;
 825        size_t full_size;
 826        int ret;
 827
 828        if (!dev->ethtool_ops->set_rxfh_indir)
 829                return -EOPNOTSUPP;
 830
 831        if (copy_from_user(&table_size,
 832                           useraddr + offsetof(struct ethtool_rxfh_indir, size),
 833                           sizeof(table_size)))
 834                return -EFAULT;
 835
 836        if (table_size >
 837            (KMALLOC_MAX_SIZE - sizeof(*indir)) / sizeof(*indir->ring_index))
 838                return -ENOMEM;
 839        full_size = sizeof(*indir) + sizeof(*indir->ring_index) * table_size;
 840        indir = kmalloc(full_size, GFP_USER);
 841        if (!indir)
 842                return -ENOMEM;
 843
 844        if (copy_from_user(indir, useraddr, full_size)) {
 845                ret = -EFAULT;
 846                goto out;
 847        }
 848
 849        ret = dev->ethtool_ops->set_rxfh_indir(dev, indir);
 850
 851out:
 852        kfree(indir);
 853        return ret;
 854}
 855
 856/*
 857 * ethtool does not (or did not) set masks for flow parameters that are
 858 * not specified, so if both value and mask are 0 then this must be
 859 * treated as equivalent to a mask with all bits set.  Implement that
 860 * here rather than in drivers.
 861 */
 862static void rx_ntuple_fix_masks(struct ethtool_rx_ntuple_flow_spec *fs)
 863{
 864        struct ethtool_tcpip4_spec *entry = &fs->h_u.tcp_ip4_spec;
 865        struct ethtool_tcpip4_spec *mask = &fs->m_u.tcp_ip4_spec;
 866
 867        if (fs->flow_type != TCP_V4_FLOW &&
 868            fs->flow_type != UDP_V4_FLOW &&
 869            fs->flow_type != SCTP_V4_FLOW)
 870                return;
 871
 872        if (!(entry->ip4src | mask->ip4src))
 873                mask->ip4src = htonl(0xffffffff);
 874        if (!(entry->ip4dst | mask->ip4dst))
 875                mask->ip4dst = htonl(0xffffffff);
 876        if (!(entry->psrc | mask->psrc))
 877                mask->psrc = htons(0xffff);
 878        if (!(entry->pdst | mask->pdst))
 879                mask->pdst = htons(0xffff);
 880        if (!(entry->tos | mask->tos))
 881                mask->tos = 0xff;
 882        if (!(fs->vlan_tag | fs->vlan_tag_mask))
 883                fs->vlan_tag_mask = 0xffff;
 884        if (!(fs->data | fs->data_mask))
 885                fs->data_mask = 0xffffffffffffffffULL;
 886}
 887
 888static noinline_for_stack int ethtool_set_rx_ntuple(struct net_device *dev,
 889                                                    void __user *useraddr)
 890{
 891        struct ethtool_rx_ntuple cmd;
 892        const struct ethtool_ops *ops = dev->ethtool_ops;
 893
 894        if (!ops->set_rx_ntuple)
 895                return -EOPNOTSUPP;
 896
 897        if (!(dev->features & NETIF_F_NTUPLE))
 898                return -EINVAL;
 899
 900        if (copy_from_user(&cmd, useraddr, sizeof(cmd)))
 901                return -EFAULT;
 902
 903        rx_ntuple_fix_masks(&cmd.fs);
 904
 905        return ops->set_rx_ntuple(dev, &cmd);
 906}
 907
 908static int ethtool_get_regs(struct net_device *dev, char __user *useraddr)
 909{
 910        struct ethtool_regs regs;
 911        const struct ethtool_ops *ops = dev->ethtool_ops;
 912        void *regbuf;
 913        int reglen, ret;
 914
 915        if (!ops->get_regs || !ops->get_regs_len)
 916                return -EOPNOTSUPP;
 917
 918        if (copy_from_user(&regs, useraddr, sizeof(regs)))
 919                return -EFAULT;
 920
 921        reglen = ops->get_regs_len(dev);
 922        if (regs.len > reglen)
 923                regs.len = reglen;
 924
 925        regbuf = vzalloc(reglen);
 926        if (reglen && !regbuf)
 927                return -ENOMEM;
 928
 929        ops->get_regs(dev, &regs, regbuf);
 930
 931        ret = -EFAULT;
 932        if (copy_to_user(useraddr, &regs, sizeof(regs)))
 933                goto out;
 934        useraddr += offsetof(struct ethtool_regs, data);
 935        if (regbuf && copy_to_user(useraddr, regbuf, regs.len))
 936                goto out;
 937        ret = 0;
 938
 939 out:
 940        vfree(regbuf);
 941        return ret;
 942}
 943
 944static int ethtool_reset(struct net_device *dev, char __user *useraddr)
 945{
 946        struct ethtool_value reset;
 947        int ret;
 948
 949        if (!dev->ethtool_ops->reset)
 950                return -EOPNOTSUPP;
 951
 952        if (copy_from_user(&reset, useraddr, sizeof(reset)))
 953                return -EFAULT;
 954
 955        ret = dev->ethtool_ops->reset(dev, &reset.data);
 956        if (ret)
 957                return ret;
 958
 959        if (copy_to_user(useraddr, &reset, sizeof(reset)))
 960                return -EFAULT;
 961        return 0;
 962}
 963
 964static int ethtool_get_wol(struct net_device *dev, char __user *useraddr)
 965{
 966        struct ethtool_wolinfo wol = { .cmd = ETHTOOL_GWOL };
 967
 968        if (!dev->ethtool_ops->get_wol)
 969                return -EOPNOTSUPP;
 970
 971        dev->ethtool_ops->get_wol(dev, &wol);
 972
 973        if (copy_to_user(useraddr, &wol, sizeof(wol)))
 974                return -EFAULT;
 975        return 0;
 976}
 977
 978static int ethtool_set_wol(struct net_device *dev, char __user *useraddr)
 979{
 980        struct ethtool_wolinfo wol;
 981
 982        if (!dev->ethtool_ops->set_wol)
 983                return -EOPNOTSUPP;
 984
 985        if (copy_from_user(&wol, useraddr, sizeof(wol)))
 986                return -EFAULT;
 987
 988        return dev->ethtool_ops->set_wol(dev, &wol);
 989}
 990
 991static int ethtool_nway_reset(struct net_device *dev)
 992{
 993        if (!dev->ethtool_ops->nway_reset)
 994                return -EOPNOTSUPP;
 995
 996        return dev->ethtool_ops->nway_reset(dev);
 997}
 998
 999static int ethtool_get_link(struct net_device *dev, char __user *useraddr)
1000{
1001        struct ethtool_value edata = { .cmd = ETHTOOL_GLINK };
1002
1003        if (!dev->ethtool_ops->get_link)
1004                return -EOPNOTSUPP;
1005
1006        edata.data = netif_running(dev) && dev->ethtool_ops->get_link(dev);
1007
1008        if (copy_to_user(useraddr, &edata, sizeof(edata)))
1009                return -EFAULT;
1010        return 0;
1011}
1012
1013static int ethtool_get_eeprom(struct net_device *dev, void __user *useraddr)
1014{
1015        struct ethtool_eeprom eeprom;
1016        const struct ethtool_ops *ops = dev->ethtool_ops;
1017        void __user *userbuf = useraddr + sizeof(eeprom);
1018        u32 bytes_remaining;
1019        u8 *data;
1020        int ret = 0;
1021
1022        if (!ops->get_eeprom || !ops->get_eeprom_len)
1023                return -EOPNOTSUPP;
1024
1025        if (copy_from_user(&eeprom, useraddr, sizeof(eeprom)))
1026                return -EFAULT;
1027
1028        /* Check for wrap and zero */
1029        if (eeprom.offset + eeprom.len <= eeprom.offset)
1030                return -EINVAL;
1031
1032        /* Check for exceeding total eeprom len */
1033        if (eeprom.offset + eeprom.len > ops->get_eeprom_len(dev))
1034                return -EINVAL;
1035
1036        data = kmalloc(PAGE_SIZE, GFP_USER);
1037        if (!data)
1038                return -ENOMEM;
1039
1040        bytes_remaining = eeprom.len;
1041        while (bytes_remaining > 0) {
1042                eeprom.len = min(bytes_remaining, (u32)PAGE_SIZE);
1043
1044                ret = ops->get_eeprom(dev, &eeprom, data);
1045                if (ret)
1046                        break;
1047                if (copy_to_user(userbuf, data, eeprom.len)) {
1048                        ret = -EFAULT;
1049                        break;
1050                }
1051                userbuf += eeprom.len;
1052                eeprom.offset += eeprom.len;
1053                bytes_remaining -= eeprom.len;
1054        }
1055
1056        eeprom.len = userbuf - (useraddr + sizeof(eeprom));
1057        eeprom.offset -= eeprom.len;
1058        if (copy_to_user(useraddr, &eeprom, sizeof(eeprom)))
1059                ret = -EFAULT;
1060
1061        kfree(data);
1062        return ret;
1063}
1064
1065static int ethtool_set_eeprom(struct net_device *dev, void __user *useraddr)
1066{
1067        struct ethtool_eeprom eeprom;
1068        const struct ethtool_ops *ops = dev->ethtool_ops;
1069        void __user *userbuf = useraddr + sizeof(eeprom);
1070        u32 bytes_remaining;
1071        u8 *data;
1072        int ret = 0;
1073
1074        if (!ops->set_eeprom || !ops->get_eeprom_len)
1075                return -EOPNOTSUPP;
1076
1077        if (copy_from_user(&eeprom, useraddr, sizeof(eeprom)))
1078                return -EFAULT;
1079
1080        /* Check for wrap and zero */
1081        if (eeprom.offset + eeprom.len <= eeprom.offset)
1082                return -EINVAL;
1083
1084        /* Check for exceeding total eeprom len */
1085        if (eeprom.offset + eeprom.len > ops->get_eeprom_len(dev))
1086                return -EINVAL;
1087
1088        data = kmalloc(PAGE_SIZE, GFP_USER);
1089        if (!data)
1090                return -ENOMEM;
1091
1092        bytes_remaining = eeprom.len;
1093        while (bytes_remaining > 0) {
1094                eeprom.len = min(bytes_remaining, (u32)PAGE_SIZE);
1095
1096                if (copy_from_user(data, userbuf, eeprom.len)) {
1097                        ret = -EFAULT;
1098                        break;
1099                }
1100                ret = ops->set_eeprom(dev, &eeprom, data);
1101                if (ret)
1102                        break;
1103                userbuf += eeprom.len;
1104                eeprom.offset += eeprom.len;
1105                bytes_remaining -= eeprom.len;
1106        }
1107
1108        kfree(data);
1109        return ret;
1110}
1111
1112static noinline_for_stack int ethtool_get_coalesce(struct net_device *dev,
1113                                                   void __user *useraddr)
1114{
1115        struct ethtool_coalesce coalesce = { .cmd = ETHTOOL_GCOALESCE };
1116
1117        if (!dev->ethtool_ops->get_coalesce)
1118                return -EOPNOTSUPP;
1119
1120        dev->ethtool_ops->get_coalesce(dev, &coalesce);
1121
1122        if (copy_to_user(useraddr, &coalesce, sizeof(coalesce)))
1123                return -EFAULT;
1124        return 0;
1125}
1126
1127static noinline_for_stack int ethtool_set_coalesce(struct net_device *dev,
1128                                                   void __user *useraddr)
1129{
1130        struct ethtool_coalesce coalesce;
1131
1132        if (!dev->ethtool_ops->set_coalesce)
1133                return -EOPNOTSUPP;
1134
1135        if (copy_from_user(&coalesce, useraddr, sizeof(coalesce)))
1136                return -EFAULT;
1137
1138        return dev->ethtool_ops->set_coalesce(dev, &coalesce);
1139}
1140
1141static int ethtool_get_ringparam(struct net_device *dev, void __user *useraddr)
1142{
1143        struct ethtool_ringparam ringparam = { .cmd = ETHTOOL_GRINGPARAM };
1144
1145        if (!dev->ethtool_ops->get_ringparam)
1146                return -EOPNOTSUPP;
1147
1148        dev->ethtool_ops->get_ringparam(dev, &ringparam);
1149
1150        if (copy_to_user(useraddr, &ringparam, sizeof(ringparam)))
1151                return -EFAULT;
1152        return 0;
1153}
1154
1155static int ethtool_set_ringparam(struct net_device *dev, void __user *useraddr)
1156{
1157        struct ethtool_ringparam ringparam;
1158
1159        if (!dev->ethtool_ops->set_ringparam)
1160                return -EOPNOTSUPP;
1161
1162        if (copy_from_user(&ringparam, useraddr, sizeof(ringparam)))
1163                return -EFAULT;
1164
1165        return dev->ethtool_ops->set_ringparam(dev, &ringparam);
1166}
1167
1168static noinline_for_stack int ethtool_get_channels(struct net_device *dev,
1169                                                   void __user *useraddr)
1170{
1171        struct ethtool_channels channels = { .cmd = ETHTOOL_GCHANNELS };
1172
1173        if (!dev->ethtool_ops->get_channels)
1174                return -EOPNOTSUPP;
1175
1176        dev->ethtool_ops->get_channels(dev, &channels);
1177
1178        if (copy_to_user(useraddr, &channels, sizeof(channels)))
1179                return -EFAULT;
1180        return 0;
1181}
1182
1183static noinline_for_stack int ethtool_set_channels(struct net_device *dev,
1184                                                   void __user *useraddr)
1185{
1186        struct ethtool_channels channels;
1187
1188        if (!dev->ethtool_ops->set_channels)
1189                return -EOPNOTSUPP;
1190
1191        if (copy_from_user(&channels, useraddr, sizeof(channels)))
1192                return -EFAULT;
1193
1194        return dev->ethtool_ops->set_channels(dev, &channels);
1195}
1196
1197static int ethtool_get_pauseparam(struct net_device *dev, void __user *useraddr)
1198{
1199        struct ethtool_pauseparam pauseparam = { ETHTOOL_GPAUSEPARAM };
1200
1201        if (!dev->ethtool_ops->get_pauseparam)
1202                return -EOPNOTSUPP;
1203
1204        dev->ethtool_ops->get_pauseparam(dev, &pauseparam);
1205
1206        if (copy_to_user(useraddr, &pauseparam, sizeof(pauseparam)))
1207                return -EFAULT;
1208        return 0;
1209}
1210
1211static int ethtool_set_pauseparam(struct net_device *dev, void __user *useraddr)
1212{
1213        struct ethtool_pauseparam pauseparam;
1214
1215        if (!dev->ethtool_ops->set_pauseparam)
1216                return -EOPNOTSUPP;
1217
1218        if (copy_from_user(&pauseparam, useraddr, sizeof(pauseparam)))
1219                return -EFAULT;
1220
1221        return dev->ethtool_ops->set_pauseparam(dev, &pauseparam);
1222}
1223
1224static int __ethtool_set_sg(struct net_device *dev, u32 data)
1225{
1226        int err;
1227
1228        if (!dev->ethtool_ops->set_sg)
1229                return -EOPNOTSUPP;
1230
1231        if (data && !(dev->features & NETIF_F_ALL_CSUM))
1232                return -EINVAL;
1233
1234        if (!data && dev->ethtool_ops->set_tso) {
1235                err = dev->ethtool_ops->set_tso(dev, 0);
1236                if (err)
1237                        return err;
1238        }
1239
1240        if (!data && dev->ethtool_ops->set_ufo) {
1241                err = dev->ethtool_ops->set_ufo(dev, 0);
1242                if (err)
1243                        return err;
1244        }
1245        return dev->ethtool_ops->set_sg(dev, data);
1246}
1247
1248static int __ethtool_set_tx_csum(struct net_device *dev, u32 data)
1249{
1250        int err;
1251
1252        if (!dev->ethtool_ops->set_tx_csum)
1253                return -EOPNOTSUPP;
1254
1255        if (!data && dev->ethtool_ops->set_sg) {
1256                err = __ethtool_set_sg(dev, 0);
1257                if (err)
1258                        return err;
1259        }
1260
1261        return dev->ethtool_ops->set_tx_csum(dev, data);
1262}
1263
1264static int __ethtool_set_rx_csum(struct net_device *dev, u32 data)
1265{
1266        if (!dev->ethtool_ops->set_rx_csum)
1267                return -EOPNOTSUPP;
1268
1269        if (!data)
1270                dev->features &= ~NETIF_F_GRO;
1271
1272        return dev->ethtool_ops->set_rx_csum(dev, data);
1273}
1274
1275static int __ethtool_set_tso(struct net_device *dev, u32 data)
1276{
1277        if (!dev->ethtool_ops->set_tso)
1278                return -EOPNOTSUPP;
1279
1280        if (data && !(dev->features & NETIF_F_SG))
1281                return -EINVAL;
1282
1283        return dev->ethtool_ops->set_tso(dev, data);
1284}
1285
1286static int __ethtool_set_ufo(struct net_device *dev, u32 data)
1287{
1288        if (!dev->ethtool_ops->set_ufo)
1289                return -EOPNOTSUPP;
1290        if (data && !(dev->features & NETIF_F_SG))
1291                return -EINVAL;
1292        if (data && !((dev->features & NETIF_F_GEN_CSUM) ||
1293                (dev->features & (NETIF_F_IP_CSUM|NETIF_F_IPV6_CSUM))
1294                        == (NETIF_F_IP_CSUM|NETIF_F_IPV6_CSUM)))
1295                return -EINVAL;
1296        return dev->ethtool_ops->set_ufo(dev, data);
1297}
1298
1299static int ethtool_self_test(struct net_device *dev, char __user *useraddr)
1300{
1301        struct ethtool_test test;
1302        const struct ethtool_ops *ops = dev->ethtool_ops;
1303        u64 *data;
1304        int ret, test_len;
1305
1306        if (!ops->self_test || !ops->get_sset_count)
1307                return -EOPNOTSUPP;
1308
1309        test_len = ops->get_sset_count(dev, ETH_SS_TEST);
1310        if (test_len < 0)
1311                return test_len;
1312        WARN_ON(test_len == 0);
1313
1314        if (copy_from_user(&test, useraddr, sizeof(test)))
1315                return -EFAULT;
1316
1317        test.len = test_len;
1318        data = kmalloc(test_len * sizeof(u64), GFP_USER);
1319        if (!data)
1320                return -ENOMEM;
1321
1322        ops->self_test(dev, &test, data);
1323
1324        ret = -EFAULT;
1325        if (copy_to_user(useraddr, &test, sizeof(test)))
1326                goto out;
1327        useraddr += sizeof(test);
1328        if (copy_to_user(useraddr, data, test.len * sizeof(u64)))
1329                goto out;
1330        ret = 0;
1331
1332 out:
1333        kfree(data);
1334        return ret;
1335}
1336
1337static int ethtool_get_strings(struct net_device *dev, void __user *useraddr)
1338{
1339        struct ethtool_gstrings gstrings;
1340        u8 *data;
1341        int ret;
1342
1343        if (copy_from_user(&gstrings, useraddr, sizeof(gstrings)))
1344                return -EFAULT;
1345
1346        ret = __ethtool_get_sset_count(dev, gstrings.string_set);
1347        if (ret < 0)
1348                return ret;
1349
1350        gstrings.len = ret;
1351
1352        data = kmalloc(gstrings.len * ETH_GSTRING_LEN, GFP_USER);
1353        if (!data)
1354                return -ENOMEM;
1355
1356        __ethtool_get_strings(dev, gstrings.string_set, data);
1357
1358        ret = -EFAULT;
1359        if (copy_to_user(useraddr, &gstrings, sizeof(gstrings)))
1360                goto out;
1361        useraddr += sizeof(gstrings);
1362        if (copy_to_user(useraddr, data, gstrings.len * ETH_GSTRING_LEN))
1363                goto out;
1364        ret = 0;
1365
1366out:
1367        kfree(data);
1368        return ret;
1369}
1370
1371static int ethtool_phys_id(struct net_device *dev, void __user *useraddr)
1372{
1373        struct ethtool_value id;
1374        static bool busy;
1375        int rc;
1376
1377        if (!dev->ethtool_ops->set_phys_id)
1378                return -EOPNOTSUPP;
1379
1380        if (busy)
1381                return -EBUSY;
1382
1383        if (copy_from_user(&id, useraddr, sizeof(id)))
1384                return -EFAULT;
1385
1386        rc = dev->ethtool_ops->set_phys_id(dev, ETHTOOL_ID_ACTIVE);
1387        if (rc < 0)
1388                return rc;
1389
1390        /* Drop the RTNL lock while waiting, but prevent reentry or
1391         * removal of the device.
1392         */
1393        busy = true;
1394        dev_hold(dev);
1395        rtnl_unlock();
1396
1397        if (rc == 0) {
1398                /* Driver will handle this itself */
1399                schedule_timeout_interruptible(
1400                        id.data ? (id.data * HZ) : MAX_SCHEDULE_TIMEOUT);
1401        } else {
1402                /* Driver expects to be called at twice the frequency in rc */
1403                int n = rc * 2, i, interval = HZ / n;
1404
1405                /* Count down seconds */
1406                do {
1407                        /* Count down iterations per second */
1408                        i = n;
1409                        do {
1410                                rtnl_lock();
1411                                rc = dev->ethtool_ops->set_phys_id(dev,
1412                                    (i & 1) ? ETHTOOL_ID_OFF : ETHTOOL_ID_ON);
1413                                rtnl_unlock();
1414                                if (rc)
1415                                        break;
1416                                schedule_timeout_interruptible(interval);
1417                        } while (!signal_pending(current) && --i != 0);
1418                } while (!signal_pending(current) &&
1419                         (id.data == 0 || --id.data != 0));
1420        }
1421
1422        rtnl_lock();
1423        dev_put(dev);
1424        busy = false;
1425
1426        (void)dev->ethtool_ops->set_phys_id(dev, ETHTOOL_ID_INACTIVE);
1427        return rc;
1428}
1429
1430static int ethtool_get_stats(struct net_device *dev, void __user *useraddr)
1431{
1432        struct ethtool_stats stats;
1433        const struct ethtool_ops *ops = dev->ethtool_ops;
1434        u64 *data;
1435        int ret, n_stats;
1436
1437        if (!ops->get_ethtool_stats || !ops->get_sset_count)
1438                return -EOPNOTSUPP;
1439
1440        n_stats = ops->get_sset_count(dev, ETH_SS_STATS);
1441        if (n_stats < 0)
1442                return n_stats;
1443        WARN_ON(n_stats == 0);
1444
1445        if (copy_from_user(&stats, useraddr, sizeof(stats)))
1446                return -EFAULT;
1447
1448        stats.n_stats = n_stats;
1449        data = kmalloc(n_stats * sizeof(u64), GFP_USER);
1450        if (!data)
1451                return -ENOMEM;
1452
1453        ops->get_ethtool_stats(dev, &stats, data);
1454
1455        ret = -EFAULT;
1456        if (copy_to_user(useraddr, &stats, sizeof(stats)))
1457                goto out;
1458        useraddr += sizeof(stats);
1459        if (copy_to_user(useraddr, data, stats.n_stats * sizeof(u64)))
1460                goto out;
1461        ret = 0;
1462
1463 out:
1464        kfree(data);
1465        return ret;
1466}
1467
1468static int ethtool_get_perm_addr(struct net_device *dev, void __user *useraddr)
1469{
1470        struct ethtool_perm_addr epaddr;
1471
1472        if (copy_from_user(&epaddr, useraddr, sizeof(epaddr)))
1473                return -EFAULT;
1474
1475        if (epaddr.size < dev->addr_len)
1476                return -ETOOSMALL;
1477        epaddr.size = dev->addr_len;
1478
1479        if (copy_to_user(useraddr, &epaddr, sizeof(epaddr)))
1480                return -EFAULT;
1481        useraddr += sizeof(epaddr);
1482        if (copy_to_user(useraddr, dev->perm_addr, epaddr.size))
1483                return -EFAULT;
1484        return 0;
1485}
1486
1487static int ethtool_get_value(struct net_device *dev, char __user *useraddr,
1488                             u32 cmd, u32 (*actor)(struct net_device *))
1489{
1490        struct ethtool_value edata = { .cmd = cmd };
1491
1492        if (!actor)
1493                return -EOPNOTSUPP;
1494
1495        edata.data = actor(dev);
1496
1497        if (copy_to_user(useraddr, &edata, sizeof(edata)))
1498                return -EFAULT;
1499        return 0;
1500}
1501
1502static int ethtool_set_value_void(struct net_device *dev, char __user *useraddr,
1503                             void (*actor)(struct net_device *, u32))
1504{
1505        struct ethtool_value edata;
1506
1507        if (!actor)
1508                return -EOPNOTSUPP;
1509
1510        if (copy_from_user(&edata, useraddr, sizeof(edata)))
1511                return -EFAULT;
1512
1513        actor(dev, edata.data);
1514        return 0;
1515}
1516
1517static int ethtool_set_value(struct net_device *dev, char __user *useraddr,
1518                             int (*actor)(struct net_device *, u32))
1519{
1520        struct ethtool_value edata;
1521
1522        if (!actor)
1523                return -EOPNOTSUPP;
1524
1525        if (copy_from_user(&edata, useraddr, sizeof(edata)))
1526                return -EFAULT;
1527
1528        return actor(dev, edata.data);
1529}
1530
1531static noinline_for_stack int ethtool_flash_device(struct net_device *dev,
1532                                                   char __user *useraddr)
1533{
1534        struct ethtool_flash efl;
1535
1536        if (copy_from_user(&efl, useraddr, sizeof(efl)))
1537                return -EFAULT;
1538
1539        if (!dev->ethtool_ops->flash_device)
1540                return -EOPNOTSUPP;
1541
1542        return dev->ethtool_ops->flash_device(dev, &efl);
1543}
1544
1545static int ethtool_set_dump(struct net_device *dev,
1546                        void __user *useraddr)
1547{
1548        struct ethtool_dump dump;
1549
1550        if (!dev->ethtool_ops->set_dump)
1551                return -EOPNOTSUPP;
1552
1553        if (copy_from_user(&dump, useraddr, sizeof(dump)))
1554                return -EFAULT;
1555
1556        return dev->ethtool_ops->set_dump(dev, &dump);
1557}
1558
1559static int ethtool_get_dump_flag(struct net_device *dev,
1560                                void __user *useraddr)
1561{
1562        int ret;
1563        struct ethtool_dump dump;
1564        const struct ethtool_ops *ops = dev->ethtool_ops;
1565
1566        if (!dev->ethtool_ops->get_dump_flag)
1567                return -EOPNOTSUPP;
1568
1569        if (copy_from_user(&dump, useraddr, sizeof(dump)))
1570                return -EFAULT;
1571
1572        ret = ops->get_dump_flag(dev, &dump);
1573        if (ret)
1574                return ret;
1575
1576        if (copy_to_user(useraddr, &dump, sizeof(dump)))
1577                return -EFAULT;
1578        return 0;
1579}
1580
1581static int ethtool_get_dump_data(struct net_device *dev,
1582                                void __user *useraddr)
1583{
1584        int ret;
1585        __u32 len;
1586        struct ethtool_dump dump, tmp;
1587        const struct ethtool_ops *ops = dev->ethtool_ops;
1588        void *data = NULL;
1589
1590        if (!dev->ethtool_ops->get_dump_data ||
1591                !dev->ethtool_ops->get_dump_flag)
1592                return -EOPNOTSUPP;
1593
1594        if (copy_from_user(&dump, useraddr, sizeof(dump)))
1595                return -EFAULT;
1596
1597        memset(&tmp, 0, sizeof(tmp));
1598        tmp.cmd = ETHTOOL_GET_DUMP_FLAG;
1599        ret = ops->get_dump_flag(dev, &tmp);
1600        if (ret)
1601                return ret;
1602
1603        len = (tmp.len > dump.len) ? dump.len : tmp.len;
1604        if (!len)
1605                return -EFAULT;
1606
1607        data = vzalloc(tmp.len);
1608        if (!data)
1609                return -ENOMEM;
1610        ret = ops->get_dump_data(dev, &dump, data);
1611        if (ret)
1612                goto out;
1613
1614        if (copy_to_user(useraddr, &dump, sizeof(dump))) {
1615                ret = -EFAULT;
1616                goto out;
1617        }
1618        useraddr += offsetof(struct ethtool_dump, data);
1619        if (copy_to_user(useraddr, data, len))
1620                ret = -EFAULT;
1621out:
1622        vfree(data);
1623        return ret;
1624}
1625
1626/* The main entry point in this file.  Called from net/core/dev.c */
1627
1628int dev_ethtool(struct net *net, struct ifreq *ifr)
1629{
1630        struct net_device *dev = __dev_get_by_name(net, ifr->ifr_name);
1631        void __user *useraddr = ifr->ifr_data;
1632        u32 ethcmd;
1633        int rc;
1634        u32 old_features;
1635
1636        if (!dev || !netif_device_present(dev))
1637                return -ENODEV;
1638
1639        if (copy_from_user(&ethcmd, useraddr, sizeof(ethcmd)))
1640                return -EFAULT;
1641
1642        if (!dev->ethtool_ops) {
1643                /* ETHTOOL_GDRVINFO does not require any driver support.
1644                 * It is also unprivileged and does not change anything,
1645                 * so we can take a shortcut to it. */
1646                if (ethcmd == ETHTOOL_GDRVINFO)
1647                        return ethtool_get_drvinfo(dev, useraddr);
1648                else
1649                        return -EOPNOTSUPP;
1650        }
1651
1652        /* Allow some commands to be done by anyone */
1653        switch (ethcmd) {
1654        case ETHTOOL_GSET:
1655        case ETHTOOL_GDRVINFO:
1656        case ETHTOOL_GMSGLVL:
1657        case ETHTOOL_GCOALESCE:
1658        case ETHTOOL_GRINGPARAM:
1659        case ETHTOOL_GPAUSEPARAM:
1660        case ETHTOOL_GRXCSUM:
1661        case ETHTOOL_GTXCSUM:
1662        case ETHTOOL_GSG:
1663        case ETHTOOL_GSTRINGS:
1664        case ETHTOOL_GTSO:
1665        case ETHTOOL_GPERMADDR:
1666        case ETHTOOL_GUFO:
1667        case ETHTOOL_GGSO:
1668        case ETHTOOL_GGRO:
1669        case ETHTOOL_GFLAGS:
1670        case ETHTOOL_GPFLAGS:
1671        case ETHTOOL_GRXFH:
1672        case ETHTOOL_GRXRINGS:
1673        case ETHTOOL_GRXCLSRLCNT:
1674        case ETHTOOL_GRXCLSRULE:
1675        case ETHTOOL_GRXCLSRLALL:
1676        case ETHTOOL_GFEATURES:
1677                break;
1678        default:
1679                if (!capable(CAP_NET_ADMIN))
1680                        return -EPERM;
1681        }
1682
1683        if (dev->ethtool_ops->begin) {
1684                rc = dev->ethtool_ops->begin(dev);
1685                if (rc  < 0)
1686                        return rc;
1687        }
1688        old_features = dev->features;
1689
1690        switch (ethcmd) {
1691        case ETHTOOL_GSET:
1692                rc = ethtool_get_settings(dev, useraddr);
1693                break;
1694        case ETHTOOL_SSET:
1695                rc = ethtool_set_settings(dev, useraddr);
1696                break;
1697        case ETHTOOL_GDRVINFO:
1698                rc = ethtool_get_drvinfo(dev, useraddr);
1699                break;
1700        case ETHTOOL_GREGS:
1701                rc = ethtool_get_regs(dev, useraddr);
1702                break;
1703        case ETHTOOL_GWOL:
1704                rc = ethtool_get_wol(dev, useraddr);
1705                break;
1706        case ETHTOOL_SWOL:
1707                rc = ethtool_set_wol(dev, useraddr);
1708                break;
1709        case ETHTOOL_GMSGLVL:
1710                rc = ethtool_get_value(dev, useraddr, ethcmd,
1711                                       dev->ethtool_ops->get_msglevel);
1712                break;
1713        case ETHTOOL_SMSGLVL:
1714                rc = ethtool_set_value_void(dev, useraddr,
1715                                       dev->ethtool_ops->set_msglevel);
1716                break;
1717        case ETHTOOL_NWAY_RST:
1718                rc = ethtool_nway_reset(dev);
1719                break;
1720        case ETHTOOL_GLINK:
1721                rc = ethtool_get_link(dev, useraddr);
1722                break;
1723        case ETHTOOL_GEEPROM:
1724                rc = ethtool_get_eeprom(dev, useraddr);
1725                break;
1726        case ETHTOOL_SEEPROM:
1727                rc = ethtool_set_eeprom(dev, useraddr);
1728                break;
1729        case ETHTOOL_GCOALESCE:
1730                rc = ethtool_get_coalesce(dev, useraddr);
1731                break;
1732        case ETHTOOL_SCOALESCE:
1733                rc = ethtool_set_coalesce(dev, useraddr);
1734                break;
1735        case ETHTOOL_GRINGPARAM:
1736                rc = ethtool_get_ringparam(dev, useraddr);
1737                break;
1738        case ETHTOOL_SRINGPARAM:
1739                rc = ethtool_set_ringparam(dev, useraddr);
1740                break;
1741        case ETHTOOL_GPAUSEPARAM:
1742                rc = ethtool_get_pauseparam(dev, useraddr);
1743                break;
1744        case ETHTOOL_SPAUSEPARAM:
1745                rc = ethtool_set_pauseparam(dev, useraddr);
1746                break;
1747        case ETHTOOL_TEST:
1748                rc = ethtool_self_test(dev, useraddr);
1749                break;
1750        case ETHTOOL_GSTRINGS:
1751                rc = ethtool_get_strings(dev, useraddr);
1752                break;
1753        case ETHTOOL_PHYS_ID:
1754                rc = ethtool_phys_id(dev, useraddr);
1755                break;
1756        case ETHTOOL_GSTATS:
1757                rc = ethtool_get_stats(dev, useraddr);
1758                break;
1759        case ETHTOOL_GPERMADDR:
1760                rc = ethtool_get_perm_addr(dev, useraddr);
1761                break;
1762        case ETHTOOL_GFLAGS:
1763                rc = ethtool_get_value(dev, useraddr, ethcmd,
1764                                       (dev->ethtool_ops->get_flags ?
1765                                        dev->ethtool_ops->get_flags :
1766                                        ethtool_op_get_flags));
1767                break;
1768        case ETHTOOL_SFLAGS:
1769                rc = ethtool_set_value(dev, useraddr, __ethtool_set_flags);
1770                break;
1771        case ETHTOOL_GPFLAGS:
1772                rc = ethtool_get_value(dev, useraddr, ethcmd,
1773                                       dev->ethtool_ops->get_priv_flags);
1774                break;
1775        case ETHTOOL_SPFLAGS:
1776                rc = ethtool_set_value(dev, useraddr,
1777                                       dev->ethtool_ops->set_priv_flags);
1778                break;
1779        case ETHTOOL_GRXFH:
1780        case ETHTOOL_GRXRINGS:
1781        case ETHTOOL_GRXCLSRLCNT:
1782        case ETHTOOL_GRXCLSRULE:
1783        case ETHTOOL_GRXCLSRLALL:
1784                rc = ethtool_get_rxnfc(dev, ethcmd, useraddr);
1785                break;
1786        case ETHTOOL_SRXFH:
1787        case ETHTOOL_SRXCLSRLDEL:
1788        case ETHTOOL_SRXCLSRLINS:
1789                rc = ethtool_set_rxnfc(dev, ethcmd, useraddr);
1790                break;
1791        case ETHTOOL_FLASHDEV:
1792                rc = ethtool_flash_device(dev, useraddr);
1793                break;
1794        case ETHTOOL_RESET:
1795                rc = ethtool_reset(dev, useraddr);
1796                break;
1797        case ETHTOOL_SRXNTUPLE:
1798                rc = ethtool_set_rx_ntuple(dev, useraddr);
1799                break;
1800        case ETHTOOL_GSSET_INFO:
1801                rc = ethtool_get_sset_info(dev, useraddr);
1802                break;
1803        case ETHTOOL_GRXFHINDIR:
1804                rc = ethtool_get_rxfh_indir(dev, useraddr);
1805                break;
1806        case ETHTOOL_SRXFHINDIR:
1807                rc = ethtool_set_rxfh_indir(dev, useraddr);
1808                break;
1809        case ETHTOOL_GFEATURES:
1810                rc = ethtool_get_features(dev, useraddr);
1811                break;
1812        case ETHTOOL_SFEATURES:
1813                rc = ethtool_set_features(dev, useraddr);
1814                break;
1815        case ETHTOOL_GTXCSUM:
1816        case ETHTOOL_GRXCSUM:
1817        case ETHTOOL_GSG:
1818        case ETHTOOL_GTSO:
1819        case ETHTOOL_GUFO:
1820        case ETHTOOL_GGSO:
1821        case ETHTOOL_GGRO:
1822                rc = ethtool_get_one_feature(dev, useraddr, ethcmd);
1823                break;
1824        case ETHTOOL_STXCSUM:
1825        case ETHTOOL_SRXCSUM:
1826        case ETHTOOL_SSG:
1827        case ETHTOOL_STSO:
1828        case ETHTOOL_SUFO:
1829        case ETHTOOL_SGSO:
1830        case ETHTOOL_SGRO:
1831                rc = ethtool_set_one_feature(dev, useraddr, ethcmd);
1832                break;
1833        case ETHTOOL_GCHANNELS:
1834                rc = ethtool_get_channels(dev, useraddr);
1835                break;
1836        case ETHTOOL_SCHANNELS:
1837                rc = ethtool_set_channels(dev, useraddr);
1838                break;
1839        case ETHTOOL_SET_DUMP:
1840                rc = ethtool_set_dump(dev, useraddr);
1841                break;
1842        case ETHTOOL_GET_DUMP_FLAG:
1843                rc = ethtool_get_dump_flag(dev, useraddr);
1844                break;
1845        case ETHTOOL_GET_DUMP_DATA:
1846                rc = ethtool_get_dump_data(dev, useraddr);
1847                break;
1848        default:
1849                rc = -EOPNOTSUPP;
1850        }
1851
1852        if (dev->ethtool_ops->complete)
1853                dev->ethtool_ops->complete(dev);
1854
1855        if (old_features != dev->features)
1856                netdev_features_change(dev);
1857
1858        return rc;
1859}
1860