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
  25/*
  26 * Some useful ethtool_ops methods that're device independent.
  27 * If we find that all drivers want to do the same thing here,
  28 * we can turn these into dev_() function calls.
  29 */
  30
  31u32 ethtool_op_get_link(struct net_device *dev)
  32{
  33        return netif_carrier_ok(dev) ? 1 : 0;
  34}
  35EXPORT_SYMBOL(ethtool_op_get_link);
  36
  37u32 ethtool_op_get_rx_csum(struct net_device *dev)
  38{
  39        return (dev->features & NETIF_F_ALL_CSUM) != 0;
  40}
  41EXPORT_SYMBOL(ethtool_op_get_rx_csum);
  42
  43u32 ethtool_op_get_tx_csum(struct net_device *dev)
  44{
  45        return (dev->features & NETIF_F_ALL_CSUM) != 0;
  46}
  47EXPORT_SYMBOL(ethtool_op_get_tx_csum);
  48
  49int ethtool_op_set_tx_csum(struct net_device *dev, u32 data)
  50{
  51        if (data)
  52                dev->features |= NETIF_F_IP_CSUM;
  53        else
  54                dev->features &= ~NETIF_F_IP_CSUM;
  55
  56        return 0;
  57}
  58
  59int ethtool_op_set_tx_hw_csum(struct net_device *dev, u32 data)
  60{
  61        if (data)
  62                dev->features |= NETIF_F_HW_CSUM;
  63        else
  64                dev->features &= ~NETIF_F_HW_CSUM;
  65
  66        return 0;
  67}
  68EXPORT_SYMBOL(ethtool_op_set_tx_hw_csum);
  69
  70int ethtool_op_set_tx_ipv6_csum(struct net_device *dev, u32 data)
  71{
  72        if (data)
  73                dev->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
  74        else
  75                dev->features &= ~(NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM);
  76
  77        return 0;
  78}
  79EXPORT_SYMBOL(ethtool_op_set_tx_ipv6_csum);
  80
  81u32 ethtool_op_get_sg(struct net_device *dev)
  82{
  83        return (dev->features & NETIF_F_SG) != 0;
  84}
  85EXPORT_SYMBOL(ethtool_op_get_sg);
  86
  87int ethtool_op_set_sg(struct net_device *dev, u32 data)
  88{
  89        if (data)
  90                dev->features |= NETIF_F_SG;
  91        else
  92                dev->features &= ~NETIF_F_SG;
  93
  94        return 0;
  95}
  96EXPORT_SYMBOL(ethtool_op_set_sg);
  97
  98u32 ethtool_op_get_tso(struct net_device *dev)
  99{
 100        return (dev->features & NETIF_F_TSO) != 0;
 101}
 102EXPORT_SYMBOL(ethtool_op_get_tso);
 103
 104int ethtool_op_set_tso(struct net_device *dev, u32 data)
 105{
 106        if (data)
 107                dev->features |= NETIF_F_TSO;
 108        else
 109                dev->features &= ~NETIF_F_TSO;
 110
 111        return 0;
 112}
 113EXPORT_SYMBOL(ethtool_op_set_tso);
 114
 115u32 ethtool_op_get_ufo(struct net_device *dev)
 116{
 117        return (dev->features & NETIF_F_UFO) != 0;
 118}
 119EXPORT_SYMBOL(ethtool_op_get_ufo);
 120
 121int ethtool_op_set_ufo(struct net_device *dev, u32 data)
 122{
 123        if (data)
 124                dev->features |= NETIF_F_UFO;
 125        else
 126                dev->features &= ~NETIF_F_UFO;
 127        return 0;
 128}
 129EXPORT_SYMBOL(ethtool_op_set_ufo);
 130
 131/* the following list of flags are the same as their associated
 132 * NETIF_F_xxx values in include/linux/netdevice.h
 133 */
 134static const u32 flags_dup_features =
 135        (ETH_FLAG_LRO | ETH_FLAG_RXVLAN | ETH_FLAG_TXVLAN | ETH_FLAG_NTUPLE |
 136         ETH_FLAG_RXHASH);
 137
 138u32 ethtool_op_get_flags(struct net_device *dev)
 139{
 140        /* in the future, this function will probably contain additional
 141         * handling for flags which are not so easily handled
 142         * by a simple masking operation
 143         */
 144
 145        return dev->features & flags_dup_features;
 146}
 147EXPORT_SYMBOL(ethtool_op_get_flags);
 148
 149int ethtool_op_set_flags(struct net_device *dev, u32 data, u32 supported)
 150{
 151        if (data & ~supported)
 152                return -EINVAL;
 153
 154        dev->features = ((dev->features & ~flags_dup_features) |
 155                         (data & flags_dup_features));
 156        return 0;
 157}
 158EXPORT_SYMBOL(ethtool_op_set_flags);
 159
 160void ethtool_ntuple_flush(struct net_device *dev)
 161{
 162        struct ethtool_rx_ntuple_flow_spec_container *fsc, *f;
 163
 164        list_for_each_entry_safe(fsc, f, &dev->ethtool_ntuple_list.list, list) {
 165                list_del(&fsc->list);
 166                kfree(fsc);
 167        }
 168        dev->ethtool_ntuple_list.count = 0;
 169}
 170EXPORT_SYMBOL(ethtool_ntuple_flush);
 171
 172/* Handlers for each ethtool command */
 173
 174static int ethtool_get_settings(struct net_device *dev, void __user *useraddr)
 175{
 176        struct ethtool_cmd cmd = { .cmd = ETHTOOL_GSET };
 177        int err;
 178
 179        if (!dev->ethtool_ops->get_settings)
 180                return -EOPNOTSUPP;
 181
 182        err = dev->ethtool_ops->get_settings(dev, &cmd);
 183        if (err < 0)
 184                return err;
 185
 186        if (copy_to_user(useraddr, &cmd, sizeof(cmd)))
 187                return -EFAULT;
 188        return 0;
 189}
 190
 191static int ethtool_set_settings(struct net_device *dev, void __user *useraddr)
 192{
 193        struct ethtool_cmd cmd;
 194
 195        if (!dev->ethtool_ops->set_settings)
 196                return -EOPNOTSUPP;
 197
 198        if (copy_from_user(&cmd, useraddr, sizeof(cmd)))
 199                return -EFAULT;
 200
 201        return dev->ethtool_ops->set_settings(dev, &cmd);
 202}
 203
 204static noinline_for_stack int ethtool_get_drvinfo(struct net_device *dev,
 205                                                  void __user *useraddr)
 206{
 207        struct ethtool_drvinfo info;
 208        const struct ethtool_ops *ops = dev->ethtool_ops;
 209
 210        memset(&info, 0, sizeof(info));
 211        info.cmd = ETHTOOL_GDRVINFO;
 212        if (ops && ops->get_drvinfo) {
 213                ops->get_drvinfo(dev, &info);
 214        } else if (dev->dev.parent && dev->dev.parent->driver) {
 215                strlcpy(info.bus_info, dev_name(dev->dev.parent),
 216                        sizeof(info.bus_info));
 217                strlcpy(info.driver, dev->dev.parent->driver->name,
 218                        sizeof(info.driver));
 219        } else {
 220                return -EOPNOTSUPP;
 221        }
 222
 223        /*
 224         * this method of obtaining string set info is deprecated;
 225         * Use ETHTOOL_GSSET_INFO instead.
 226         */
 227        if (ops && ops->get_sset_count) {
 228                int rc;
 229
 230                rc = ops->get_sset_count(dev, ETH_SS_TEST);
 231                if (rc >= 0)
 232                        info.testinfo_len = rc;
 233                rc = ops->get_sset_count(dev, ETH_SS_STATS);
 234                if (rc >= 0)
 235                        info.n_stats = rc;
 236                rc = ops->get_sset_count(dev, ETH_SS_PRIV_FLAGS);
 237                if (rc >= 0)
 238                        info.n_priv_flags = rc;
 239        }
 240        if (ops && ops->get_regs_len)
 241                info.regdump_len = ops->get_regs_len(dev);
 242        if (ops && ops->get_eeprom_len)
 243                info.eedump_len = ops->get_eeprom_len(dev);
 244
 245        if (copy_to_user(useraddr, &info, sizeof(info)))
 246                return -EFAULT;
 247        return 0;
 248}
 249
 250static noinline_for_stack int ethtool_get_sset_info(struct net_device *dev,
 251                                                    void __user *useraddr)
 252{
 253        struct ethtool_sset_info info;
 254        const struct ethtool_ops *ops = dev->ethtool_ops;
 255        u64 sset_mask;
 256        int i, idx = 0, n_bits = 0, ret, rc;
 257        u32 *info_buf = NULL;
 258
 259        if (!ops->get_sset_count)
 260                return -EOPNOTSUPP;
 261
 262        if (copy_from_user(&info, useraddr, sizeof(info)))
 263                return -EFAULT;
 264
 265        /* store copy of mask, because we zero struct later on */
 266        sset_mask = info.sset_mask;
 267        if (!sset_mask)
 268                return 0;
 269
 270        /* calculate size of return buffer */
 271        n_bits = hweight64(sset_mask);
 272
 273        memset(&info, 0, sizeof(info));
 274        info.cmd = ETHTOOL_GSSET_INFO;
 275
 276        info_buf = kzalloc(n_bits * sizeof(u32), GFP_USER);
 277        if (!info_buf)
 278                return -ENOMEM;
 279
 280        /*
 281         * fill return buffer based on input bitmask and successful
 282         * get_sset_count return
 283         */
 284        for (i = 0; i < 64; i++) {
 285                if (!(sset_mask & (1ULL << i)))
 286                        continue;
 287
 288                rc = ops->get_sset_count(dev, i);
 289                if (rc >= 0) {
 290                        info.sset_mask |= (1ULL << i);
 291                        info_buf[idx++] = rc;
 292                }
 293        }
 294
 295        ret = -EFAULT;
 296        if (copy_to_user(useraddr, &info, sizeof(info)))
 297                goto out;
 298
 299        useraddr += offsetof(struct ethtool_sset_info, data);
 300        if (copy_to_user(useraddr, info_buf, idx * sizeof(u32)))
 301                goto out;
 302
 303        ret = 0;
 304
 305out:
 306        kfree(info_buf);
 307        return ret;
 308}
 309
 310static noinline_for_stack int ethtool_set_rxnfc(struct net_device *dev,
 311                                                u32 cmd, void __user *useraddr)
 312{
 313        struct ethtool_rxnfc info;
 314        size_t info_size = sizeof(info);
 315
 316        if (!dev->ethtool_ops->set_rxnfc)
 317                return -EOPNOTSUPP;
 318
 319        /* struct ethtool_rxnfc was originally defined for
 320         * ETHTOOL_{G,S}RXFH with only the cmd, flow_type and data
 321         * members.  User-space might still be using that
 322         * definition. */
 323        if (cmd == ETHTOOL_SRXFH)
 324                info_size = (offsetof(struct ethtool_rxnfc, data) +
 325                             sizeof(info.data));
 326
 327        if (copy_from_user(&info, useraddr, info_size))
 328                return -EFAULT;
 329
 330        return dev->ethtool_ops->set_rxnfc(dev, &info);
 331}
 332
 333static noinline_for_stack int ethtool_get_rxnfc(struct net_device *dev,
 334                                                u32 cmd, void __user *useraddr)
 335{
 336        struct ethtool_rxnfc info;
 337        size_t info_size = sizeof(info);
 338        const struct ethtool_ops *ops = dev->ethtool_ops;
 339        int ret;
 340        void *rule_buf = NULL;
 341
 342        if (!ops->get_rxnfc)
 343                return -EOPNOTSUPP;
 344
 345        /* struct ethtool_rxnfc was originally defined for
 346         * ETHTOOL_{G,S}RXFH with only the cmd, flow_type and data
 347         * members.  User-space might still be using that
 348         * definition. */
 349        if (cmd == ETHTOOL_GRXFH)
 350                info_size = (offsetof(struct ethtool_rxnfc, data) +
 351                             sizeof(info.data));
 352
 353        if (copy_from_user(&info, useraddr, info_size))
 354                return -EFAULT;
 355
 356        if (info.cmd == ETHTOOL_GRXCLSRLALL) {
 357                if (info.rule_cnt > 0) {
 358                        if (info.rule_cnt <= KMALLOC_MAX_SIZE / sizeof(u32))
 359                                rule_buf = kzalloc(info.rule_cnt * sizeof(u32),
 360                                                   GFP_USER);
 361                        if (!rule_buf)
 362                                return -ENOMEM;
 363                }
 364        }
 365
 366        ret = ops->get_rxnfc(dev, &info, rule_buf);
 367        if (ret < 0)
 368                goto err_out;
 369
 370        ret = -EFAULT;
 371        if (copy_to_user(useraddr, &info, info_size))
 372                goto err_out;
 373
 374        if (rule_buf) {
 375                useraddr += offsetof(struct ethtool_rxnfc, rule_locs);
 376                if (copy_to_user(useraddr, rule_buf,
 377                                 info.rule_cnt * sizeof(u32)))
 378                        goto err_out;
 379        }
 380        ret = 0;
 381
 382err_out:
 383        kfree(rule_buf);
 384
 385        return ret;
 386}
 387
 388static noinline_for_stack int ethtool_get_rxfh_indir(struct net_device *dev,
 389                                                     void __user *useraddr)
 390{
 391        struct ethtool_rxfh_indir *indir;
 392        u32 table_size;
 393        size_t full_size;
 394        int ret;
 395
 396        if (!dev->ethtool_ops->get_rxfh_indir)
 397                return -EOPNOTSUPP;
 398
 399        if (copy_from_user(&table_size,
 400                           useraddr + offsetof(struct ethtool_rxfh_indir, size),
 401                           sizeof(table_size)))
 402                return -EFAULT;
 403
 404        if (table_size >
 405            (KMALLOC_MAX_SIZE - sizeof(*indir)) / sizeof(*indir->ring_index))
 406                return -ENOMEM;
 407        full_size = sizeof(*indir) + sizeof(*indir->ring_index) * table_size;
 408        indir = kzalloc(full_size, GFP_USER);
 409        if (!indir)
 410                return -ENOMEM;
 411
 412        indir->cmd = ETHTOOL_GRXFHINDIR;
 413        indir->size = table_size;
 414        ret = dev->ethtool_ops->get_rxfh_indir(dev, indir);
 415        if (ret)
 416                goto out;
 417
 418        if (copy_to_user(useraddr, indir, full_size))
 419                ret = -EFAULT;
 420
 421out:
 422        kfree(indir);
 423        return ret;
 424}
 425
 426static noinline_for_stack int ethtool_set_rxfh_indir(struct net_device *dev,
 427                                                     void __user *useraddr)
 428{
 429        struct ethtool_rxfh_indir *indir;
 430        u32 table_size;
 431        size_t full_size;
 432        int ret;
 433
 434        if (!dev->ethtool_ops->set_rxfh_indir)
 435                return -EOPNOTSUPP;
 436
 437        if (copy_from_user(&table_size,
 438                           useraddr + offsetof(struct ethtool_rxfh_indir, size),
 439                           sizeof(table_size)))
 440                return -EFAULT;
 441
 442        if (table_size >
 443            (KMALLOC_MAX_SIZE - sizeof(*indir)) / sizeof(*indir->ring_index))
 444                return -ENOMEM;
 445        full_size = sizeof(*indir) + sizeof(*indir->ring_index) * table_size;
 446        indir = kmalloc(full_size, GFP_USER);
 447        if (!indir)
 448                return -ENOMEM;
 449
 450        if (copy_from_user(indir, useraddr, full_size)) {
 451                ret = -EFAULT;
 452                goto out;
 453        }
 454
 455        ret = dev->ethtool_ops->set_rxfh_indir(dev, indir);
 456
 457out:
 458        kfree(indir);
 459        return ret;
 460}
 461
 462static void __rx_ntuple_filter_add(struct ethtool_rx_ntuple_list *list,
 463                        struct ethtool_rx_ntuple_flow_spec *spec,
 464                        struct ethtool_rx_ntuple_flow_spec_container *fsc)
 465{
 466
 467        /* don't add filters forever */
 468        if (list->count >= ETHTOOL_MAX_NTUPLE_LIST_ENTRY) {
 469                /* free the container */
 470                kfree(fsc);
 471                return;
 472        }
 473
 474        /* Copy the whole filter over */
 475        fsc->fs.flow_type = spec->flow_type;
 476        memcpy(&fsc->fs.h_u, &spec->h_u, sizeof(spec->h_u));
 477        memcpy(&fsc->fs.m_u, &spec->m_u, sizeof(spec->m_u));
 478
 479        fsc->fs.vlan_tag = spec->vlan_tag;
 480        fsc->fs.vlan_tag_mask = spec->vlan_tag_mask;
 481        fsc->fs.data = spec->data;
 482        fsc->fs.data_mask = spec->data_mask;
 483        fsc->fs.action = spec->action;
 484
 485        /* add to the list */
 486        list_add_tail_rcu(&fsc->list, &list->list);
 487        list->count++;
 488}
 489
 490/*
 491 * ethtool does not (or did not) set masks for flow parameters that are
 492 * not specified, so if both value and mask are 0 then this must be
 493 * treated as equivalent to a mask with all bits set.  Implement that
 494 * here rather than in drivers.
 495 */
 496static void rx_ntuple_fix_masks(struct ethtool_rx_ntuple_flow_spec *fs)
 497{
 498        struct ethtool_tcpip4_spec *entry = &fs->h_u.tcp_ip4_spec;
 499        struct ethtool_tcpip4_spec *mask = &fs->m_u.tcp_ip4_spec;
 500
 501        if (fs->flow_type != TCP_V4_FLOW &&
 502            fs->flow_type != UDP_V4_FLOW &&
 503            fs->flow_type != SCTP_V4_FLOW)
 504                return;
 505
 506        if (!(entry->ip4src | mask->ip4src))
 507                mask->ip4src = htonl(0xffffffff);
 508        if (!(entry->ip4dst | mask->ip4dst))
 509                mask->ip4dst = htonl(0xffffffff);
 510        if (!(entry->psrc | mask->psrc))
 511                mask->psrc = htons(0xffff);
 512        if (!(entry->pdst | mask->pdst))
 513                mask->pdst = htons(0xffff);
 514        if (!(entry->tos | mask->tos))
 515                mask->tos = 0xff;
 516        if (!(fs->vlan_tag | fs->vlan_tag_mask))
 517                fs->vlan_tag_mask = 0xffff;
 518        if (!(fs->data | fs->data_mask))
 519                fs->data_mask = 0xffffffffffffffffULL;
 520}
 521
 522static noinline_for_stack int ethtool_set_rx_ntuple(struct net_device *dev,
 523                                                    void __user *useraddr)
 524{
 525        struct ethtool_rx_ntuple cmd;
 526        const struct ethtool_ops *ops = dev->ethtool_ops;
 527        struct ethtool_rx_ntuple_flow_spec_container *fsc = NULL;
 528        int ret;
 529
 530        if (!(dev->features & NETIF_F_NTUPLE))
 531                return -EINVAL;
 532
 533        if (copy_from_user(&cmd, useraddr, sizeof(cmd)))
 534                return -EFAULT;
 535
 536        rx_ntuple_fix_masks(&cmd.fs);
 537
 538        /*
 539         * Cache filter in dev struct for GET operation only if
 540         * the underlying driver doesn't have its own GET operation, and
 541         * only if the filter was added successfully.  First make sure we
 542         * can allocate the filter, then continue if successful.
 543         */
 544        if (!ops->get_rx_ntuple) {
 545                fsc = kmalloc(sizeof(*fsc), GFP_ATOMIC);
 546                if (!fsc)
 547                        return -ENOMEM;
 548        }
 549
 550        ret = ops->set_rx_ntuple(dev, &cmd);
 551        if (ret) {
 552                kfree(fsc);
 553                return ret;
 554        }
 555
 556        if (!ops->get_rx_ntuple)
 557                __rx_ntuple_filter_add(&dev->ethtool_ntuple_list, &cmd.fs, fsc);
 558
 559        return ret;
 560}
 561
 562static int ethtool_get_rx_ntuple(struct net_device *dev, void __user *useraddr)
 563{
 564        struct ethtool_gstrings gstrings;
 565        const struct ethtool_ops *ops = dev->ethtool_ops;
 566        struct ethtool_rx_ntuple_flow_spec_container *fsc;
 567        u8 *data;
 568        char *p;
 569        int ret, i, num_strings = 0;
 570
 571        if (!ops->get_sset_count)
 572                return -EOPNOTSUPP;
 573
 574        if (copy_from_user(&gstrings, useraddr, sizeof(gstrings)))
 575                return -EFAULT;
 576
 577        ret = ops->get_sset_count(dev, gstrings.string_set);
 578        if (ret < 0)
 579                return ret;
 580
 581        gstrings.len = ret;
 582
 583        data = kzalloc(gstrings.len * ETH_GSTRING_LEN, GFP_USER);
 584        if (!data)
 585                return -ENOMEM;
 586
 587        if (ops->get_rx_ntuple) {
 588                /* driver-specific filter grab */
 589                ret = ops->get_rx_ntuple(dev, gstrings.string_set, data);
 590                goto copy;
 591        }
 592
 593        /* default ethtool filter grab */
 594        i = 0;
 595        p = (char *)data;
 596        list_for_each_entry(fsc, &dev->ethtool_ntuple_list.list, list) {
 597                sprintf(p, "Filter %d:\n", i);
 598                p += ETH_GSTRING_LEN;
 599                num_strings++;
 600
 601                switch (fsc->fs.flow_type) {
 602                case TCP_V4_FLOW:
 603                        sprintf(p, "\tFlow Type: TCP\n");
 604                        p += ETH_GSTRING_LEN;
 605                        num_strings++;
 606                        break;
 607                case UDP_V4_FLOW:
 608                        sprintf(p, "\tFlow Type: UDP\n");
 609                        p += ETH_GSTRING_LEN;
 610                        num_strings++;
 611                        break;
 612                case SCTP_V4_FLOW:
 613                        sprintf(p, "\tFlow Type: SCTP\n");
 614                        p += ETH_GSTRING_LEN;
 615                        num_strings++;
 616                        break;
 617                case AH_ESP_V4_FLOW:
 618                        sprintf(p, "\tFlow Type: AH ESP\n");
 619                        p += ETH_GSTRING_LEN;
 620                        num_strings++;
 621                        break;
 622                case ESP_V4_FLOW:
 623                        sprintf(p, "\tFlow Type: ESP\n");
 624                        p += ETH_GSTRING_LEN;
 625                        num_strings++;
 626                        break;
 627                case IP_USER_FLOW:
 628                        sprintf(p, "\tFlow Type: Raw IP\n");
 629                        p += ETH_GSTRING_LEN;
 630                        num_strings++;
 631                        break;
 632                case IPV4_FLOW:
 633                        sprintf(p, "\tFlow Type: IPv4\n");
 634                        p += ETH_GSTRING_LEN;
 635                        num_strings++;
 636                        break;
 637                default:
 638                        sprintf(p, "\tFlow Type: Unknown\n");
 639                        p += ETH_GSTRING_LEN;
 640                        num_strings++;
 641                        goto unknown_filter;
 642                }
 643
 644                /* now the rest of the filters */
 645                switch (fsc->fs.flow_type) {
 646                case TCP_V4_FLOW:
 647                case UDP_V4_FLOW:
 648                case SCTP_V4_FLOW:
 649                        sprintf(p, "\tSrc IP addr: 0x%x\n",
 650                                fsc->fs.h_u.tcp_ip4_spec.ip4src);
 651                        p += ETH_GSTRING_LEN;
 652                        num_strings++;
 653                        sprintf(p, "\tSrc IP mask: 0x%x\n",
 654                                fsc->fs.m_u.tcp_ip4_spec.ip4src);
 655                        p += ETH_GSTRING_LEN;
 656                        num_strings++;
 657                        sprintf(p, "\tDest IP addr: 0x%x\n",
 658                                fsc->fs.h_u.tcp_ip4_spec.ip4dst);
 659                        p += ETH_GSTRING_LEN;
 660                        num_strings++;
 661                        sprintf(p, "\tDest IP mask: 0x%x\n",
 662                                fsc->fs.m_u.tcp_ip4_spec.ip4dst);
 663                        p += ETH_GSTRING_LEN;
 664                        num_strings++;
 665                        sprintf(p, "\tSrc Port: %d, mask: 0x%x\n",
 666                                fsc->fs.h_u.tcp_ip4_spec.psrc,
 667                                fsc->fs.m_u.tcp_ip4_spec.psrc);
 668                        p += ETH_GSTRING_LEN;
 669                        num_strings++;
 670                        sprintf(p, "\tDest Port: %d, mask: 0x%x\n",
 671                                fsc->fs.h_u.tcp_ip4_spec.pdst,
 672                                fsc->fs.m_u.tcp_ip4_spec.pdst);
 673                        p += ETH_GSTRING_LEN;
 674                        num_strings++;
 675                        sprintf(p, "\tTOS: %d, mask: 0x%x\n",
 676                                fsc->fs.h_u.tcp_ip4_spec.tos,
 677                                fsc->fs.m_u.tcp_ip4_spec.tos);
 678                        p += ETH_GSTRING_LEN;
 679                        num_strings++;
 680                        break;
 681                case AH_ESP_V4_FLOW:
 682                case ESP_V4_FLOW:
 683                        sprintf(p, "\tSrc IP addr: 0x%x\n",
 684                                fsc->fs.h_u.ah_ip4_spec.ip4src);
 685                        p += ETH_GSTRING_LEN;
 686                        num_strings++;
 687                        sprintf(p, "\tSrc IP mask: 0x%x\n",
 688                                fsc->fs.m_u.ah_ip4_spec.ip4src);
 689                        p += ETH_GSTRING_LEN;
 690                        num_strings++;
 691                        sprintf(p, "\tDest IP addr: 0x%x\n",
 692                                fsc->fs.h_u.ah_ip4_spec.ip4dst);
 693                        p += ETH_GSTRING_LEN;
 694                        num_strings++;
 695                        sprintf(p, "\tDest IP mask: 0x%x\n",
 696                                fsc->fs.m_u.ah_ip4_spec.ip4dst);
 697                        p += ETH_GSTRING_LEN;
 698                        num_strings++;
 699                        sprintf(p, "\tSPI: %d, mask: 0x%x\n",
 700                                fsc->fs.h_u.ah_ip4_spec.spi,
 701                                fsc->fs.m_u.ah_ip4_spec.spi);
 702                        p += ETH_GSTRING_LEN;
 703                        num_strings++;
 704                        sprintf(p, "\tTOS: %d, mask: 0x%x\n",
 705                                fsc->fs.h_u.ah_ip4_spec.tos,
 706                                fsc->fs.m_u.ah_ip4_spec.tos);
 707                        p += ETH_GSTRING_LEN;
 708                        num_strings++;
 709                        break;
 710                case IP_USER_FLOW:
 711                        sprintf(p, "\tSrc IP addr: 0x%x\n",
 712                                fsc->fs.h_u.usr_ip4_spec.ip4src);
 713                        p += ETH_GSTRING_LEN;
 714                        num_strings++;
 715                        sprintf(p, "\tSrc IP mask: 0x%x\n",
 716                                fsc->fs.m_u.usr_ip4_spec.ip4src);
 717                        p += ETH_GSTRING_LEN;
 718                        num_strings++;
 719                        sprintf(p, "\tDest IP addr: 0x%x\n",
 720                                fsc->fs.h_u.usr_ip4_spec.ip4dst);
 721                        p += ETH_GSTRING_LEN;
 722                        num_strings++;
 723                        sprintf(p, "\tDest IP mask: 0x%x\n",
 724                                fsc->fs.m_u.usr_ip4_spec.ip4dst);
 725                        p += ETH_GSTRING_LEN;
 726                        num_strings++;
 727                        break;
 728                case IPV4_FLOW:
 729                        sprintf(p, "\tSrc IP addr: 0x%x\n",
 730                                fsc->fs.h_u.usr_ip4_spec.ip4src);
 731                        p += ETH_GSTRING_LEN;
 732                        num_strings++;
 733                        sprintf(p, "\tSrc IP mask: 0x%x\n",
 734                                fsc->fs.m_u.usr_ip4_spec.ip4src);
 735                        p += ETH_GSTRING_LEN;
 736                        num_strings++;
 737                        sprintf(p, "\tDest IP addr: 0x%x\n",
 738                                fsc->fs.h_u.usr_ip4_spec.ip4dst);
 739                        p += ETH_GSTRING_LEN;
 740                        num_strings++;
 741                        sprintf(p, "\tDest IP mask: 0x%x\n",
 742                                fsc->fs.m_u.usr_ip4_spec.ip4dst);
 743                        p += ETH_GSTRING_LEN;
 744                        num_strings++;
 745                        sprintf(p, "\tL4 bytes: 0x%x, mask: 0x%x\n",
 746                                fsc->fs.h_u.usr_ip4_spec.l4_4_bytes,
 747                                fsc->fs.m_u.usr_ip4_spec.l4_4_bytes);
 748                        p += ETH_GSTRING_LEN;
 749                        num_strings++;
 750                        sprintf(p, "\tTOS: %d, mask: 0x%x\n",
 751                                fsc->fs.h_u.usr_ip4_spec.tos,
 752                                fsc->fs.m_u.usr_ip4_spec.tos);
 753                        p += ETH_GSTRING_LEN;
 754                        num_strings++;
 755                        sprintf(p, "\tIP Version: %d, mask: 0x%x\n",
 756                                fsc->fs.h_u.usr_ip4_spec.ip_ver,
 757                                fsc->fs.m_u.usr_ip4_spec.ip_ver);
 758                        p += ETH_GSTRING_LEN;
 759                        num_strings++;
 760                        sprintf(p, "\tProtocol: %d, mask: 0x%x\n",
 761                                fsc->fs.h_u.usr_ip4_spec.proto,
 762                                fsc->fs.m_u.usr_ip4_spec.proto);
 763                        p += ETH_GSTRING_LEN;
 764                        num_strings++;
 765                        break;
 766                }
 767                sprintf(p, "\tVLAN: %d, mask: 0x%x\n",
 768                        fsc->fs.vlan_tag, fsc->fs.vlan_tag_mask);
 769                p += ETH_GSTRING_LEN;
 770                num_strings++;
 771                sprintf(p, "\tUser-defined: 0x%Lx\n", fsc->fs.data);
 772                p += ETH_GSTRING_LEN;
 773                num_strings++;
 774                sprintf(p, "\tUser-defined mask: 0x%Lx\n", fsc->fs.data_mask);
 775                p += ETH_GSTRING_LEN;
 776                num_strings++;
 777                if (fsc->fs.action == ETHTOOL_RXNTUPLE_ACTION_DROP)
 778                        sprintf(p, "\tAction: Drop\n");
 779                else
 780                        sprintf(p, "\tAction: Direct to queue %d\n",
 781                                fsc->fs.action);
 782                p += ETH_GSTRING_LEN;
 783                num_strings++;
 784unknown_filter:
 785                i++;
 786        }
 787copy:
 788        /* indicate to userspace how many strings we actually have */
 789        gstrings.len = num_strings;
 790        ret = -EFAULT;
 791        if (copy_to_user(useraddr, &gstrings, sizeof(gstrings)))
 792                goto out;
 793        useraddr += sizeof(gstrings);
 794        if (copy_to_user(useraddr, data, gstrings.len * ETH_GSTRING_LEN))
 795                goto out;
 796        ret = 0;
 797
 798out:
 799        kfree(data);
 800        return ret;
 801}
 802
 803static int ethtool_get_regs(struct net_device *dev, char __user *useraddr)
 804{
 805        struct ethtool_regs regs;
 806        const struct ethtool_ops *ops = dev->ethtool_ops;
 807        void *regbuf;
 808        int reglen, ret;
 809
 810        if (!ops->get_regs || !ops->get_regs_len)
 811                return -EOPNOTSUPP;
 812
 813        if (copy_from_user(&regs, useraddr, sizeof(regs)))
 814                return -EFAULT;
 815
 816        reglen = ops->get_regs_len(dev);
 817        if (regs.len > reglen)
 818                regs.len = reglen;
 819
 820        regbuf = vzalloc(reglen);
 821        if (!regbuf)
 822                return -ENOMEM;
 823
 824        ops->get_regs(dev, &regs, regbuf);
 825
 826        ret = -EFAULT;
 827        if (copy_to_user(useraddr, &regs, sizeof(regs)))
 828                goto out;
 829        useraddr += offsetof(struct ethtool_regs, data);
 830        if (copy_to_user(useraddr, regbuf, regs.len))
 831                goto out;
 832        ret = 0;
 833
 834 out:
 835        vfree(regbuf);
 836        return ret;
 837}
 838
 839static int ethtool_reset(struct net_device *dev, char __user *useraddr)
 840{
 841        struct ethtool_value reset;
 842        int ret;
 843
 844        if (!dev->ethtool_ops->reset)
 845                return -EOPNOTSUPP;
 846
 847        if (copy_from_user(&reset, useraddr, sizeof(reset)))
 848                return -EFAULT;
 849
 850        ret = dev->ethtool_ops->reset(dev, &reset.data);
 851        if (ret)
 852                return ret;
 853
 854        if (copy_to_user(useraddr, &reset, sizeof(reset)))
 855                return -EFAULT;
 856        return 0;
 857}
 858
 859static int ethtool_get_wol(struct net_device *dev, char __user *useraddr)
 860{
 861        struct ethtool_wolinfo wol = { .cmd = ETHTOOL_GWOL };
 862
 863        if (!dev->ethtool_ops->get_wol)
 864                return -EOPNOTSUPP;
 865
 866        dev->ethtool_ops->get_wol(dev, &wol);
 867
 868        if (copy_to_user(useraddr, &wol, sizeof(wol)))
 869                return -EFAULT;
 870        return 0;
 871}
 872
 873static int ethtool_set_wol(struct net_device *dev, char __user *useraddr)
 874{
 875        struct ethtool_wolinfo wol;
 876
 877        if (!dev->ethtool_ops->set_wol)
 878                return -EOPNOTSUPP;
 879
 880        if (copy_from_user(&wol, useraddr, sizeof(wol)))
 881                return -EFAULT;
 882
 883        return dev->ethtool_ops->set_wol(dev, &wol);
 884}
 885
 886static int ethtool_nway_reset(struct net_device *dev)
 887{
 888        if (!dev->ethtool_ops->nway_reset)
 889                return -EOPNOTSUPP;
 890
 891        return dev->ethtool_ops->nway_reset(dev);
 892}
 893
 894static int ethtool_get_link(struct net_device *dev, char __user *useraddr)
 895{
 896        struct ethtool_value edata = { .cmd = ETHTOOL_GLINK };
 897
 898        if (!dev->ethtool_ops->get_link)
 899                return -EOPNOTSUPP;
 900
 901        edata.data = netif_running(dev) && dev->ethtool_ops->get_link(dev);
 902
 903        if (copy_to_user(useraddr, &edata, sizeof(edata)))
 904                return -EFAULT;
 905        return 0;
 906}
 907
 908static int ethtool_get_eeprom(struct net_device *dev, void __user *useraddr)
 909{
 910        struct ethtool_eeprom eeprom;
 911        const struct ethtool_ops *ops = dev->ethtool_ops;
 912        void __user *userbuf = useraddr + sizeof(eeprom);
 913        u32 bytes_remaining;
 914        u8 *data;
 915        int ret = 0;
 916
 917        if (!ops->get_eeprom || !ops->get_eeprom_len)
 918                return -EOPNOTSUPP;
 919
 920        if (copy_from_user(&eeprom, useraddr, sizeof(eeprom)))
 921                return -EFAULT;
 922
 923        /* Check for wrap and zero */
 924        if (eeprom.offset + eeprom.len <= eeprom.offset)
 925                return -EINVAL;
 926
 927        /* Check for exceeding total eeprom len */
 928        if (eeprom.offset + eeprom.len > ops->get_eeprom_len(dev))
 929                return -EINVAL;
 930
 931        data = kmalloc(PAGE_SIZE, GFP_USER);
 932        if (!data)
 933                return -ENOMEM;
 934
 935        bytes_remaining = eeprom.len;
 936        while (bytes_remaining > 0) {
 937                eeprom.len = min(bytes_remaining, (u32)PAGE_SIZE);
 938
 939                ret = ops->get_eeprom(dev, &eeprom, data);
 940                if (ret)
 941                        break;
 942                if (copy_to_user(userbuf, data, eeprom.len)) {
 943                        ret = -EFAULT;
 944                        break;
 945                }
 946                userbuf += eeprom.len;
 947                eeprom.offset += eeprom.len;
 948                bytes_remaining -= eeprom.len;
 949        }
 950
 951        eeprom.len = userbuf - (useraddr + sizeof(eeprom));
 952        eeprom.offset -= eeprom.len;
 953        if (copy_to_user(useraddr, &eeprom, sizeof(eeprom)))
 954                ret = -EFAULT;
 955
 956        kfree(data);
 957        return ret;
 958}
 959
 960static int ethtool_set_eeprom(struct net_device *dev, void __user *useraddr)
 961{
 962        struct ethtool_eeprom eeprom;
 963        const struct ethtool_ops *ops = dev->ethtool_ops;
 964        void __user *userbuf = useraddr + sizeof(eeprom);
 965        u32 bytes_remaining;
 966        u8 *data;
 967        int ret = 0;
 968
 969        if (!ops->set_eeprom || !ops->get_eeprom_len)
 970                return -EOPNOTSUPP;
 971
 972        if (copy_from_user(&eeprom, useraddr, sizeof(eeprom)))
 973                return -EFAULT;
 974
 975        /* Check for wrap and zero */
 976        if (eeprom.offset + eeprom.len <= eeprom.offset)
 977                return -EINVAL;
 978
 979        /* Check for exceeding total eeprom len */
 980        if (eeprom.offset + eeprom.len > ops->get_eeprom_len(dev))
 981                return -EINVAL;
 982
 983        data = kmalloc(PAGE_SIZE, GFP_USER);
 984        if (!data)
 985                return -ENOMEM;
 986
 987        bytes_remaining = eeprom.len;
 988        while (bytes_remaining > 0) {
 989                eeprom.len = min(bytes_remaining, (u32)PAGE_SIZE);
 990
 991                if (copy_from_user(data, userbuf, eeprom.len)) {
 992                        ret = -EFAULT;
 993                        break;
 994                }
 995                ret = ops->set_eeprom(dev, &eeprom, data);
 996                if (ret)
 997                        break;
 998                userbuf += eeprom.len;
 999                eeprom.offset += eeprom.len;
1000                bytes_remaining -= eeprom.len;
1001        }
1002
1003        kfree(data);
1004        return ret;
1005}
1006
1007static noinline_for_stack int ethtool_get_coalesce(struct net_device *dev,
1008                                                   void __user *useraddr)
1009{
1010        struct ethtool_coalesce coalesce = { .cmd = ETHTOOL_GCOALESCE };
1011
1012        if (!dev->ethtool_ops->get_coalesce)
1013                return -EOPNOTSUPP;
1014
1015        dev->ethtool_ops->get_coalesce(dev, &coalesce);
1016
1017        if (copy_to_user(useraddr, &coalesce, sizeof(coalesce)))
1018                return -EFAULT;
1019        return 0;
1020}
1021
1022static noinline_for_stack int ethtool_set_coalesce(struct net_device *dev,
1023                                                   void __user *useraddr)
1024{
1025        struct ethtool_coalesce coalesce;
1026
1027        if (!dev->ethtool_ops->set_coalesce)
1028                return -EOPNOTSUPP;
1029
1030        if (copy_from_user(&coalesce, useraddr, sizeof(coalesce)))
1031                return -EFAULT;
1032
1033        return dev->ethtool_ops->set_coalesce(dev, &coalesce);
1034}
1035
1036static int ethtool_get_ringparam(struct net_device *dev, void __user *useraddr)
1037{
1038        struct ethtool_ringparam ringparam = { .cmd = ETHTOOL_GRINGPARAM };
1039
1040        if (!dev->ethtool_ops->get_ringparam)
1041                return -EOPNOTSUPP;
1042
1043        dev->ethtool_ops->get_ringparam(dev, &ringparam);
1044
1045        if (copy_to_user(useraddr, &ringparam, sizeof(ringparam)))
1046                return -EFAULT;
1047        return 0;
1048}
1049
1050static int ethtool_set_ringparam(struct net_device *dev, void __user *useraddr)
1051{
1052        struct ethtool_ringparam ringparam;
1053
1054        if (!dev->ethtool_ops->set_ringparam)
1055                return -EOPNOTSUPP;
1056
1057        if (copy_from_user(&ringparam, useraddr, sizeof(ringparam)))
1058                return -EFAULT;
1059
1060        return dev->ethtool_ops->set_ringparam(dev, &ringparam);
1061}
1062
1063static int ethtool_get_pauseparam(struct net_device *dev, void __user *useraddr)
1064{
1065        struct ethtool_pauseparam pauseparam = { ETHTOOL_GPAUSEPARAM };
1066
1067        if (!dev->ethtool_ops->get_pauseparam)
1068                return -EOPNOTSUPP;
1069
1070        dev->ethtool_ops->get_pauseparam(dev, &pauseparam);
1071
1072        if (copy_to_user(useraddr, &pauseparam, sizeof(pauseparam)))
1073                return -EFAULT;
1074        return 0;
1075}
1076
1077static int ethtool_set_pauseparam(struct net_device *dev, void __user *useraddr)
1078{
1079        struct ethtool_pauseparam pauseparam;
1080
1081        if (!dev->ethtool_ops->set_pauseparam)
1082                return -EOPNOTSUPP;
1083
1084        if (copy_from_user(&pauseparam, useraddr, sizeof(pauseparam)))
1085                return -EFAULT;
1086
1087        return dev->ethtool_ops->set_pauseparam(dev, &pauseparam);
1088}
1089
1090static int __ethtool_set_sg(struct net_device *dev, u32 data)
1091{
1092        int err;
1093
1094        if (!data && dev->ethtool_ops->set_tso) {
1095                err = dev->ethtool_ops->set_tso(dev, 0);
1096                if (err)
1097                        return err;
1098        }
1099
1100        if (!data && dev->ethtool_ops->set_ufo) {
1101                err = dev->ethtool_ops->set_ufo(dev, 0);
1102                if (err)
1103                        return err;
1104        }
1105        return dev->ethtool_ops->set_sg(dev, data);
1106}
1107
1108static int ethtool_set_tx_csum(struct net_device *dev, char __user *useraddr)
1109{
1110        struct ethtool_value edata;
1111        int err;
1112
1113        if (!dev->ethtool_ops->set_tx_csum)
1114                return -EOPNOTSUPP;
1115
1116        if (copy_from_user(&edata, useraddr, sizeof(edata)))
1117                return -EFAULT;
1118
1119        if (!edata.data && dev->ethtool_ops->set_sg) {
1120                err = __ethtool_set_sg(dev, 0);
1121                if (err)
1122                        return err;
1123        }
1124
1125        return dev->ethtool_ops->set_tx_csum(dev, edata.data);
1126}
1127EXPORT_SYMBOL(ethtool_op_set_tx_csum);
1128
1129static int ethtool_set_rx_csum(struct net_device *dev, char __user *useraddr)
1130{
1131        struct ethtool_value edata;
1132
1133        if (!dev->ethtool_ops->set_rx_csum)
1134                return -EOPNOTSUPP;
1135
1136        if (copy_from_user(&edata, useraddr, sizeof(edata)))
1137                return -EFAULT;
1138
1139        if (!edata.data && dev->ethtool_ops->set_sg)
1140                dev->features &= ~NETIF_F_GRO;
1141
1142        return dev->ethtool_ops->set_rx_csum(dev, edata.data);
1143}
1144
1145static int ethtool_set_sg(struct net_device *dev, char __user *useraddr)
1146{
1147        struct ethtool_value edata;
1148
1149        if (!dev->ethtool_ops->set_sg)
1150                return -EOPNOTSUPP;
1151
1152        if (copy_from_user(&edata, useraddr, sizeof(edata)))
1153                return -EFAULT;
1154
1155        if (edata.data &&
1156            !(dev->features & NETIF_F_ALL_CSUM))
1157                return -EINVAL;
1158
1159        return __ethtool_set_sg(dev, edata.data);
1160}
1161
1162static int ethtool_set_tso(struct net_device *dev, char __user *useraddr)
1163{
1164        struct ethtool_value edata;
1165
1166        if (!dev->ethtool_ops->set_tso)
1167                return -EOPNOTSUPP;
1168
1169        if (copy_from_user(&edata, useraddr, sizeof(edata)))
1170                return -EFAULT;
1171
1172        if (edata.data && !(dev->features & NETIF_F_SG))
1173                return -EINVAL;
1174
1175        return dev->ethtool_ops->set_tso(dev, edata.data);
1176}
1177
1178static int ethtool_set_ufo(struct net_device *dev, char __user *useraddr)
1179{
1180        struct ethtool_value edata;
1181
1182        if (!dev->ethtool_ops->set_ufo)
1183                return -EOPNOTSUPP;
1184        if (copy_from_user(&edata, useraddr, sizeof(edata)))
1185                return -EFAULT;
1186        if (edata.data && !(dev->features & NETIF_F_SG))
1187                return -EINVAL;
1188        if (edata.data && !((dev->features & NETIF_F_GEN_CSUM) ||
1189                (dev->features & (NETIF_F_IP_CSUM|NETIF_F_IPV6_CSUM))
1190                        == (NETIF_F_IP_CSUM|NETIF_F_IPV6_CSUM)))
1191                return -EINVAL;
1192        return dev->ethtool_ops->set_ufo(dev, edata.data);
1193}
1194
1195static int ethtool_get_gso(struct net_device *dev, char __user *useraddr)
1196{
1197        struct ethtool_value edata = { ETHTOOL_GGSO };
1198
1199        edata.data = dev->features & NETIF_F_GSO;
1200        if (copy_to_user(useraddr, &edata, sizeof(edata)))
1201                return -EFAULT;
1202        return 0;
1203}
1204
1205static int ethtool_set_gso(struct net_device *dev, char __user *useraddr)
1206{
1207        struct ethtool_value edata;
1208
1209        if (copy_from_user(&edata, useraddr, sizeof(edata)))
1210                return -EFAULT;
1211        if (edata.data)
1212                dev->features |= NETIF_F_GSO;
1213        else
1214                dev->features &= ~NETIF_F_GSO;
1215        return 0;
1216}
1217
1218static int ethtool_get_gro(struct net_device *dev, char __user *useraddr)
1219{
1220        struct ethtool_value edata = { ETHTOOL_GGRO };
1221
1222        edata.data = dev->features & NETIF_F_GRO;
1223        if (copy_to_user(useraddr, &edata, sizeof(edata)))
1224                return -EFAULT;
1225        return 0;
1226}
1227
1228static int ethtool_set_gro(struct net_device *dev, char __user *useraddr)
1229{
1230        struct ethtool_value edata;
1231
1232        if (copy_from_user(&edata, useraddr, sizeof(edata)))
1233                return -EFAULT;
1234
1235        if (edata.data) {
1236                u32 rxcsum = dev->ethtool_ops->get_rx_csum ?
1237                                dev->ethtool_ops->get_rx_csum(dev) :
1238                                ethtool_op_get_rx_csum(dev);
1239
1240                if (!rxcsum)
1241                        return -EINVAL;
1242                dev->features |= NETIF_F_GRO;
1243        } else
1244                dev->features &= ~NETIF_F_GRO;
1245
1246        return 0;
1247}
1248
1249static int ethtool_self_test(struct net_device *dev, char __user *useraddr)
1250{
1251        struct ethtool_test test;
1252        const struct ethtool_ops *ops = dev->ethtool_ops;
1253        u64 *data;
1254        int ret, test_len;
1255
1256        if (!ops->self_test || !ops->get_sset_count)
1257                return -EOPNOTSUPP;
1258
1259        test_len = ops->get_sset_count(dev, ETH_SS_TEST);
1260        if (test_len < 0)
1261                return test_len;
1262        WARN_ON(test_len == 0);
1263
1264        if (copy_from_user(&test, useraddr, sizeof(test)))
1265                return -EFAULT;
1266
1267        test.len = test_len;
1268        data = kmalloc(test_len * sizeof(u64), GFP_USER);
1269        if (!data)
1270                return -ENOMEM;
1271
1272        ops->self_test(dev, &test, data);
1273
1274        ret = -EFAULT;
1275        if (copy_to_user(useraddr, &test, sizeof(test)))
1276                goto out;
1277        useraddr += sizeof(test);
1278        if (copy_to_user(useraddr, data, test.len * sizeof(u64)))
1279                goto out;
1280        ret = 0;
1281
1282 out:
1283        kfree(data);
1284        return ret;
1285}
1286
1287static int ethtool_get_strings(struct net_device *dev, void __user *useraddr)
1288{
1289        struct ethtool_gstrings gstrings;
1290        const struct ethtool_ops *ops = dev->ethtool_ops;
1291        u8 *data;
1292        int ret;
1293
1294        if (!ops->get_strings || !ops->get_sset_count)
1295                return -EOPNOTSUPP;
1296
1297        if (copy_from_user(&gstrings, useraddr, sizeof(gstrings)))
1298                return -EFAULT;
1299
1300        ret = ops->get_sset_count(dev, gstrings.string_set);
1301        if (ret < 0)
1302                return ret;
1303
1304        gstrings.len = ret;
1305
1306        data = kmalloc(gstrings.len * ETH_GSTRING_LEN, GFP_USER);
1307        if (!data)
1308                return -ENOMEM;
1309
1310        ops->get_strings(dev, gstrings.string_set, data);
1311
1312        ret = -EFAULT;
1313        if (copy_to_user(useraddr, &gstrings, sizeof(gstrings)))
1314                goto out;
1315        useraddr += sizeof(gstrings);
1316        if (copy_to_user(useraddr, data, gstrings.len * ETH_GSTRING_LEN))
1317                goto out;
1318        ret = 0;
1319
1320 out:
1321        kfree(data);
1322        return ret;
1323}
1324
1325static int ethtool_phys_id(struct net_device *dev, void __user *useraddr)
1326{
1327        struct ethtool_value id;
1328
1329        if (!dev->ethtool_ops->phys_id)
1330                return -EOPNOTSUPP;
1331
1332        if (copy_from_user(&id, useraddr, sizeof(id)))
1333                return -EFAULT;
1334
1335        return dev->ethtool_ops->phys_id(dev, id.data);
1336}
1337
1338static int ethtool_get_stats(struct net_device *dev, void __user *useraddr)
1339{
1340        struct ethtool_stats stats;
1341        const struct ethtool_ops *ops = dev->ethtool_ops;
1342        u64 *data;
1343        int ret, n_stats;
1344
1345        if (!ops->get_ethtool_stats || !ops->get_sset_count)
1346                return -EOPNOTSUPP;
1347
1348        n_stats = ops->get_sset_count(dev, ETH_SS_STATS);
1349        if (n_stats < 0)
1350                return n_stats;
1351        WARN_ON(n_stats == 0);
1352
1353        if (copy_from_user(&stats, useraddr, sizeof(stats)))
1354                return -EFAULT;
1355
1356        stats.n_stats = n_stats;
1357        data = kmalloc(n_stats * sizeof(u64), GFP_USER);
1358        if (!data)
1359                return -ENOMEM;
1360
1361        ops->get_ethtool_stats(dev, &stats, data);
1362
1363        ret = -EFAULT;
1364        if (copy_to_user(useraddr, &stats, sizeof(stats)))
1365                goto out;
1366        useraddr += sizeof(stats);
1367        if (copy_to_user(useraddr, data, stats.n_stats * sizeof(u64)))
1368                goto out;
1369        ret = 0;
1370
1371 out:
1372        kfree(data);
1373        return ret;
1374}
1375
1376static int ethtool_get_perm_addr(struct net_device *dev, void __user *useraddr)
1377{
1378        struct ethtool_perm_addr epaddr;
1379
1380        if (copy_from_user(&epaddr, useraddr, sizeof(epaddr)))
1381                return -EFAULT;
1382
1383        if (epaddr.size < dev->addr_len)
1384                return -ETOOSMALL;
1385        epaddr.size = dev->addr_len;
1386
1387        if (copy_to_user(useraddr, &epaddr, sizeof(epaddr)))
1388                return -EFAULT;
1389        useraddr += sizeof(epaddr);
1390        if (copy_to_user(useraddr, dev->perm_addr, epaddr.size))
1391                return -EFAULT;
1392        return 0;
1393}
1394
1395static int ethtool_get_value(struct net_device *dev, char __user *useraddr,
1396                             u32 cmd, u32 (*actor)(struct net_device *))
1397{
1398        struct ethtool_value edata = { .cmd = cmd };
1399
1400        if (!actor)
1401                return -EOPNOTSUPP;
1402
1403        edata.data = actor(dev);
1404
1405        if (copy_to_user(useraddr, &edata, sizeof(edata)))
1406                return -EFAULT;
1407        return 0;
1408}
1409
1410static int ethtool_set_value_void(struct net_device *dev, char __user *useraddr,
1411                             void (*actor)(struct net_device *, u32))
1412{
1413        struct ethtool_value edata;
1414
1415        if (!actor)
1416                return -EOPNOTSUPP;
1417
1418        if (copy_from_user(&edata, useraddr, sizeof(edata)))
1419                return -EFAULT;
1420
1421        actor(dev, edata.data);
1422        return 0;
1423}
1424
1425static int ethtool_set_value(struct net_device *dev, char __user *useraddr,
1426                             int (*actor)(struct net_device *, u32))
1427{
1428        struct ethtool_value edata;
1429
1430        if (!actor)
1431                return -EOPNOTSUPP;
1432
1433        if (copy_from_user(&edata, useraddr, sizeof(edata)))
1434                return -EFAULT;
1435
1436        return actor(dev, edata.data);
1437}
1438
1439static noinline_for_stack int ethtool_flash_device(struct net_device *dev,
1440                                                   char __user *useraddr)
1441{
1442        struct ethtool_flash efl;
1443
1444        if (copy_from_user(&efl, useraddr, sizeof(efl)))
1445                return -EFAULT;
1446
1447        if (!dev->ethtool_ops->flash_device)
1448                return -EOPNOTSUPP;
1449
1450        return dev->ethtool_ops->flash_device(dev, &efl);
1451}
1452
1453/* The main entry point in this file.  Called from net/core/dev.c */
1454
1455int dev_ethtool(struct net *net, struct ifreq *ifr)
1456{
1457        struct net_device *dev = __dev_get_by_name(net, ifr->ifr_name);
1458        void __user *useraddr = ifr->ifr_data;
1459        u32 ethcmd;
1460        int rc;
1461        unsigned long old_features;
1462
1463        if (!dev || !netif_device_present(dev))
1464                return -ENODEV;
1465
1466        if (copy_from_user(&ethcmd, useraddr, sizeof(ethcmd)))
1467                return -EFAULT;
1468
1469        if (!dev->ethtool_ops) {
1470                /* ETHTOOL_GDRVINFO does not require any driver support.
1471                 * It is also unprivileged and does not change anything,
1472                 * so we can take a shortcut to it. */
1473                if (ethcmd == ETHTOOL_GDRVINFO)
1474                        return ethtool_get_drvinfo(dev, useraddr);
1475                else
1476                        return -EOPNOTSUPP;
1477        }
1478
1479        /* Allow some commands to be done by anyone */
1480        switch (ethcmd) {
1481        case ETHTOOL_GSET:
1482        case ETHTOOL_GDRVINFO:
1483        case ETHTOOL_GMSGLVL:
1484        case ETHTOOL_GCOALESCE:
1485        case ETHTOOL_GRINGPARAM:
1486        case ETHTOOL_GPAUSEPARAM:
1487        case ETHTOOL_GRXCSUM:
1488        case ETHTOOL_GTXCSUM:
1489        case ETHTOOL_GSG:
1490        case ETHTOOL_GSTRINGS:
1491        case ETHTOOL_GTSO:
1492        case ETHTOOL_GPERMADDR:
1493        case ETHTOOL_GUFO:
1494        case ETHTOOL_GGSO:
1495        case ETHTOOL_GGRO:
1496        case ETHTOOL_GFLAGS:
1497        case ETHTOOL_GPFLAGS:
1498        case ETHTOOL_GRXFH:
1499        case ETHTOOL_GRXRINGS:
1500        case ETHTOOL_GRXCLSRLCNT:
1501        case ETHTOOL_GRXCLSRULE:
1502        case ETHTOOL_GRXCLSRLALL:
1503                break;
1504        default:
1505                if (!capable(CAP_NET_ADMIN))
1506                        return -EPERM;
1507        }
1508
1509        if (dev->ethtool_ops->begin) {
1510                rc = dev->ethtool_ops->begin(dev);
1511                if (rc  < 0)
1512                        return rc;
1513        }
1514        old_features = dev->features;
1515
1516        switch (ethcmd) {
1517        case ETHTOOL_GSET:
1518                rc = ethtool_get_settings(dev, useraddr);
1519                break;
1520        case ETHTOOL_SSET:
1521                rc = ethtool_set_settings(dev, useraddr);
1522                break;
1523        case ETHTOOL_GDRVINFO:
1524                rc = ethtool_get_drvinfo(dev, useraddr);
1525                break;
1526        case ETHTOOL_GREGS:
1527                rc = ethtool_get_regs(dev, useraddr);
1528                break;
1529        case ETHTOOL_GWOL:
1530                rc = ethtool_get_wol(dev, useraddr);
1531                break;
1532        case ETHTOOL_SWOL:
1533                rc = ethtool_set_wol(dev, useraddr);
1534                break;
1535        case ETHTOOL_GMSGLVL:
1536                rc = ethtool_get_value(dev, useraddr, ethcmd,
1537                                       dev->ethtool_ops->get_msglevel);
1538                break;
1539        case ETHTOOL_SMSGLVL:
1540                rc = ethtool_set_value_void(dev, useraddr,
1541                                       dev->ethtool_ops->set_msglevel);
1542                break;
1543        case ETHTOOL_NWAY_RST:
1544                rc = ethtool_nway_reset(dev);
1545                break;
1546        case ETHTOOL_GLINK:
1547                rc = ethtool_get_link(dev, useraddr);
1548                break;
1549        case ETHTOOL_GEEPROM:
1550                rc = ethtool_get_eeprom(dev, useraddr);
1551                break;
1552        case ETHTOOL_SEEPROM:
1553                rc = ethtool_set_eeprom(dev, useraddr);
1554                break;
1555        case ETHTOOL_GCOALESCE:
1556                rc = ethtool_get_coalesce(dev, useraddr);
1557                break;
1558        case ETHTOOL_SCOALESCE:
1559                rc = ethtool_set_coalesce(dev, useraddr);
1560                break;
1561        case ETHTOOL_GRINGPARAM:
1562                rc = ethtool_get_ringparam(dev, useraddr);
1563                break;
1564        case ETHTOOL_SRINGPARAM:
1565                rc = ethtool_set_ringparam(dev, useraddr);
1566                break;
1567        case ETHTOOL_GPAUSEPARAM:
1568                rc = ethtool_get_pauseparam(dev, useraddr);
1569                break;
1570        case ETHTOOL_SPAUSEPARAM:
1571                rc = ethtool_set_pauseparam(dev, useraddr);
1572                break;
1573        case ETHTOOL_GRXCSUM:
1574                rc = ethtool_get_value(dev, useraddr, ethcmd,
1575                                       (dev->ethtool_ops->get_rx_csum ?
1576                                        dev->ethtool_ops->get_rx_csum :
1577                                        ethtool_op_get_rx_csum));
1578                break;
1579        case ETHTOOL_SRXCSUM:
1580                rc = ethtool_set_rx_csum(dev, useraddr);
1581                break;
1582        case ETHTOOL_GTXCSUM:
1583                rc = ethtool_get_value(dev, useraddr, ethcmd,
1584                                       (dev->ethtool_ops->get_tx_csum ?
1585                                        dev->ethtool_ops->get_tx_csum :
1586                                        ethtool_op_get_tx_csum));
1587                break;
1588        case ETHTOOL_STXCSUM:
1589                rc = ethtool_set_tx_csum(dev, useraddr);
1590                break;
1591        case ETHTOOL_GSG:
1592                rc = ethtool_get_value(dev, useraddr, ethcmd,
1593                                       (dev->ethtool_ops->get_sg ?
1594                                        dev->ethtool_ops->get_sg :
1595                                        ethtool_op_get_sg));
1596                break;
1597        case ETHTOOL_SSG:
1598                rc = ethtool_set_sg(dev, useraddr);
1599                break;
1600        case ETHTOOL_GTSO:
1601                rc = ethtool_get_value(dev, useraddr, ethcmd,
1602                                       (dev->ethtool_ops->get_tso ?
1603                                        dev->ethtool_ops->get_tso :
1604                                        ethtool_op_get_tso));
1605                break;
1606        case ETHTOOL_STSO:
1607                rc = ethtool_set_tso(dev, useraddr);
1608                break;
1609        case ETHTOOL_TEST:
1610                rc = ethtool_self_test(dev, useraddr);
1611                break;
1612        case ETHTOOL_GSTRINGS:
1613                rc = ethtool_get_strings(dev, useraddr);
1614                break;
1615        case ETHTOOL_PHYS_ID:
1616                rc = ethtool_phys_id(dev, useraddr);
1617                break;
1618        case ETHTOOL_GSTATS:
1619                rc = ethtool_get_stats(dev, useraddr);
1620                break;
1621        case ETHTOOL_GPERMADDR:
1622                rc = ethtool_get_perm_addr(dev, useraddr);
1623                break;
1624        case ETHTOOL_GUFO:
1625                rc = ethtool_get_value(dev, useraddr, ethcmd,
1626                                       (dev->ethtool_ops->get_ufo ?
1627                                        dev->ethtool_ops->get_ufo :
1628                                        ethtool_op_get_ufo));
1629                break;
1630        case ETHTOOL_SUFO:
1631                rc = ethtool_set_ufo(dev, useraddr);
1632                break;
1633        case ETHTOOL_GGSO:
1634                rc = ethtool_get_gso(dev, useraddr);
1635                break;
1636        case ETHTOOL_SGSO:
1637                rc = ethtool_set_gso(dev, useraddr);
1638                break;
1639        case ETHTOOL_GFLAGS:
1640                rc = ethtool_get_value(dev, useraddr, ethcmd,
1641                                       (dev->ethtool_ops->get_flags ?
1642                                        dev->ethtool_ops->get_flags :
1643                                        ethtool_op_get_flags));
1644                break;
1645        case ETHTOOL_SFLAGS:
1646                rc = ethtool_set_value(dev, useraddr,
1647                                       dev->ethtool_ops->set_flags);
1648                break;
1649        case ETHTOOL_GPFLAGS:
1650                rc = ethtool_get_value(dev, useraddr, ethcmd,
1651                                       dev->ethtool_ops->get_priv_flags);
1652                break;
1653        case ETHTOOL_SPFLAGS:
1654                rc = ethtool_set_value(dev, useraddr,
1655                                       dev->ethtool_ops->set_priv_flags);
1656                break;
1657        case ETHTOOL_GRXFH:
1658        case ETHTOOL_GRXRINGS:
1659        case ETHTOOL_GRXCLSRLCNT:
1660        case ETHTOOL_GRXCLSRULE:
1661        case ETHTOOL_GRXCLSRLALL:
1662                rc = ethtool_get_rxnfc(dev, ethcmd, useraddr);
1663                break;
1664        case ETHTOOL_SRXFH:
1665        case ETHTOOL_SRXCLSRLDEL:
1666        case ETHTOOL_SRXCLSRLINS:
1667                rc = ethtool_set_rxnfc(dev, ethcmd, useraddr);
1668                break;
1669        case ETHTOOL_GGRO:
1670                rc = ethtool_get_gro(dev, useraddr);
1671                break;
1672        case ETHTOOL_SGRO:
1673                rc = ethtool_set_gro(dev, useraddr);
1674                break;
1675        case ETHTOOL_FLASHDEV:
1676                rc = ethtool_flash_device(dev, useraddr);
1677                break;
1678        case ETHTOOL_RESET:
1679                rc = ethtool_reset(dev, useraddr);
1680                break;
1681        case ETHTOOL_SRXNTUPLE:
1682                rc = ethtool_set_rx_ntuple(dev, useraddr);
1683                break;
1684        case ETHTOOL_GRXNTUPLE:
1685                rc = ethtool_get_rx_ntuple(dev, useraddr);
1686                break;
1687        case ETHTOOL_GSSET_INFO:
1688                rc = ethtool_get_sset_info(dev, useraddr);
1689                break;
1690        case ETHTOOL_GRXFHINDIR:
1691                rc = ethtool_get_rxfh_indir(dev, useraddr);
1692                break;
1693        case ETHTOOL_SRXFHINDIR:
1694                rc = ethtool_set_rxfh_indir(dev, useraddr);
1695                break;
1696        default:
1697                rc = -EOPNOTSUPP;
1698        }
1699
1700        if (dev->ethtool_ops->complete)
1701                dev->ethtool_ops->complete(dev);
1702
1703        if (old_features != dev->features)
1704                netdev_features_change(dev);
1705
1706        return rc;
1707}
1708