at v3.1-rc4 1859 lines 45 kB view raw
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}