1 // SPDX-License-Identifier: GPL-2.0 2 #include <linux/kmod.h> 3 #include <linux/netdevice.h> 4 #include <linux/inetdevice.h> 5 #include <linux/etherdevice.h> 6 #include <linux/rtnetlink.h> 7 #include <linux/net_tstamp.h> 8 #include <linux/wireless.h> 9 #include <linux/if_bridge.h> 10 #include <net/dsa_stubs.h> 11 #include <net/wext.h> 12 13 #include "dev.h" 14 15 /* 16 * Map an interface index to its name (SIOCGIFNAME) 17 */ 18 19 /* 20 * We need this ioctl for efficient implementation of the 21 * if_indextoname() function required by the IPv6 API. Without 22 * it, we would have to search all the interfaces to find a 23 * match. --pb 24 */ 25 26 static int dev_ifname(struct net *net, struct ifreq *ifr) 27 { 28 ifr->ifr_name[IFNAMSIZ-1] = 0; 29 return netdev_get_name(net, ifr->ifr_name, ifr->ifr_ifindex); 30 } 31 32 /* 33 * Perform a SIOCGIFCONF call. This structure will change 34 * size eventually, and there is nothing I can do about it. 35 * Thus we will need a 'compatibility mode'. 36 */ 37 int dev_ifconf(struct net *net, struct ifconf __user *uifc) 38 { 39 struct net_device *dev; 40 void __user *pos; 41 size_t size; 42 int len, total = 0, done; 43 44 /* both the ifconf and the ifreq structures are slightly different */ 45 if (in_compat_syscall()) { 46 struct compat_ifconf ifc32; 47 48 if (copy_from_user(&ifc32, uifc, sizeof(struct compat_ifconf))) 49 return -EFAULT; 50 51 pos = compat_ptr(ifc32.ifcbuf); 52 len = ifc32.ifc_len; 53 size = sizeof(struct compat_ifreq); 54 } else { 55 struct ifconf ifc; 56 57 if (copy_from_user(&ifc, uifc, sizeof(struct ifconf))) 58 return -EFAULT; 59 60 pos = ifc.ifc_buf; 61 len = ifc.ifc_len; 62 size = sizeof(struct ifreq); 63 } 64 65 /* Loop over the interfaces, and write an info block for each. */ 66 rtnl_lock(); 67 for_each_netdev(net, dev) { 68 if (!pos) 69 done = inet_gifconf(dev, NULL, 0, size); 70 else 71 done = inet_gifconf(dev, pos + total, 72 len - total, size); 73 if (done < 0) { 74 rtnl_unlock(); 75 return -EFAULT; 76 } 77 total += done; 78 } 79 rtnl_unlock(); 80 81 return put_user(total, &uifc->ifc_len); 82 } 83 84 static int dev_getifmap(struct net_device *dev, struct ifreq *ifr) 85 { 86 struct ifmap *ifmap = &ifr->ifr_map; 87 88 if (in_compat_syscall()) { 89 struct compat_ifmap *cifmap = (struct compat_ifmap *)ifmap; 90 91 cifmap->mem_start = dev->mem_start; 92 cifmap->mem_end = dev->mem_end; 93 cifmap->base_addr = dev->base_addr; 94 cifmap->irq = dev->irq; 95 cifmap->dma = dev->dma; 96 cifmap->port = dev->if_port; 97 98 return 0; 99 } 100 101 ifmap->mem_start = dev->mem_start; 102 ifmap->mem_end = dev->mem_end; 103 ifmap->base_addr = dev->base_addr; 104 ifmap->irq = dev->irq; 105 ifmap->dma = dev->dma; 106 ifmap->port = dev->if_port; 107 108 return 0; 109 } 110 111 static int dev_setifmap(struct net_device *dev, struct ifreq *ifr) 112 { 113 struct compat_ifmap *cifmap = (struct compat_ifmap *)&ifr->ifr_map; 114 115 if (!dev->netdev_ops->ndo_set_config) 116 return -EOPNOTSUPP; 117 118 if (in_compat_syscall()) { 119 struct ifmap ifmap = { 120 .mem_start = cifmap->mem_start, 121 .mem_end = cifmap->mem_end, 122 .base_addr = cifmap->base_addr, 123 .irq = cifmap->irq, 124 .dma = cifmap->dma, 125 .port = cifmap->port, 126 }; 127 128 return dev->netdev_ops->ndo_set_config(dev, &ifmap); 129 } 130 131 return dev->netdev_ops->ndo_set_config(dev, &ifr->ifr_map); 132 } 133 134 /* 135 * Perform the SIOCxIFxxx calls, inside rcu_read_lock() 136 */ 137 static int dev_ifsioc_locked(struct net *net, struct ifreq *ifr, unsigned int cmd) 138 { 139 int err; 140 struct net_device *dev = dev_get_by_name_rcu(net, ifr->ifr_name); 141 142 if (!dev) 143 return -ENODEV; 144 145 switch (cmd) { 146 case SIOCGIFFLAGS: /* Get interface flags */ 147 ifr->ifr_flags = (short) dev_get_flags(dev); 148 return 0; 149 150 case SIOCGIFMETRIC: /* Get the metric on the interface 151 (currently unused) */ 152 ifr->ifr_metric = 0; 153 return 0; 154 155 case SIOCGIFMTU: /* Get the MTU of a device */ 156 ifr->ifr_mtu = dev->mtu; 157 return 0; 158 159 case SIOCGIFSLAVE: 160 err = -EINVAL; 161 break; 162 163 case SIOCGIFMAP: 164 return dev_getifmap(dev, ifr); 165 166 case SIOCGIFINDEX: 167 ifr->ifr_ifindex = dev->ifindex; 168 return 0; 169 170 case SIOCGIFTXQLEN: 171 ifr->ifr_qlen = dev->tx_queue_len; 172 return 0; 173 174 default: 175 /* dev_ioctl() should ensure this case 176 * is never reached 177 */ 178 WARN_ON(1); 179 err = -ENOTTY; 180 break; 181 182 } 183 return err; 184 } 185 186 static int net_hwtstamp_validate(const struct kernel_hwtstamp_config *cfg) 187 { 188 enum hwtstamp_tx_types tx_type; 189 enum hwtstamp_rx_filters rx_filter; 190 int tx_type_valid = 0; 191 int rx_filter_valid = 0; 192 193 if (cfg->flags & ~HWTSTAMP_FLAG_MASK) 194 return -EINVAL; 195 196 tx_type = cfg->tx_type; 197 rx_filter = cfg->rx_filter; 198 199 switch (tx_type) { 200 case HWTSTAMP_TX_OFF: 201 case HWTSTAMP_TX_ON: 202 case HWTSTAMP_TX_ONESTEP_SYNC: 203 case HWTSTAMP_TX_ONESTEP_P2P: 204 tx_type_valid = 1; 205 break; 206 case __HWTSTAMP_TX_CNT: 207 /* not a real value */ 208 break; 209 } 210 211 switch (rx_filter) { 212 case HWTSTAMP_FILTER_NONE: 213 case HWTSTAMP_FILTER_ALL: 214 case HWTSTAMP_FILTER_SOME: 215 case HWTSTAMP_FILTER_PTP_V1_L4_EVENT: 216 case HWTSTAMP_FILTER_PTP_V1_L4_SYNC: 217 case HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ: 218 case HWTSTAMP_FILTER_PTP_V2_L4_EVENT: 219 case HWTSTAMP_FILTER_PTP_V2_L4_SYNC: 220 case HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ: 221 case HWTSTAMP_FILTER_PTP_V2_L2_EVENT: 222 case HWTSTAMP_FILTER_PTP_V2_L2_SYNC: 223 case HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ: 224 case HWTSTAMP_FILTER_PTP_V2_EVENT: 225 case HWTSTAMP_FILTER_PTP_V2_SYNC: 226 case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ: 227 case HWTSTAMP_FILTER_NTP_ALL: 228 rx_filter_valid = 1; 229 break; 230 case __HWTSTAMP_FILTER_CNT: 231 /* not a real value */ 232 break; 233 } 234 235 if (!tx_type_valid || !rx_filter_valid) 236 return -ERANGE; 237 238 return 0; 239 } 240 241 static int dev_eth_ioctl(struct net_device *dev, 242 struct ifreq *ifr, unsigned int cmd) 243 { 244 const struct net_device_ops *ops = dev->netdev_ops; 245 246 if (!ops->ndo_eth_ioctl) 247 return -EOPNOTSUPP; 248 249 if (!netif_device_present(dev)) 250 return -ENODEV; 251 252 return ops->ndo_eth_ioctl(dev, ifr, cmd); 253 } 254 255 static int dev_get_hwtstamp(struct net_device *dev, struct ifreq *ifr) 256 { 257 const struct net_device_ops *ops = dev->netdev_ops; 258 struct kernel_hwtstamp_config kernel_cfg = {}; 259 struct hwtstamp_config cfg; 260 int err; 261 262 if (!ops->ndo_hwtstamp_get) 263 return dev_eth_ioctl(dev, ifr, SIOCGHWTSTAMP); /* legacy */ 264 265 if (!netif_device_present(dev)) 266 return -ENODEV; 267 268 kernel_cfg.ifr = ifr; 269 err = ops->ndo_hwtstamp_get(dev, &kernel_cfg); 270 if (err) 271 return err; 272 273 /* If the request was resolved through an unconverted driver, omit 274 * the copy_to_user(), since the implementation has already done that 275 */ 276 if (!kernel_cfg.copied_to_user) { 277 hwtstamp_config_from_kernel(&cfg, &kernel_cfg); 278 279 if (copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg))) 280 return -EFAULT; 281 } 282 283 return 0; 284 } 285 286 static int dev_set_hwtstamp(struct net_device *dev, struct ifreq *ifr) 287 { 288 const struct net_device_ops *ops = dev->netdev_ops; 289 struct kernel_hwtstamp_config kernel_cfg = {}; 290 struct netlink_ext_ack extack = {}; 291 struct hwtstamp_config cfg; 292 int err; 293 294 if (copy_from_user(&cfg, ifr->ifr_data, sizeof(cfg))) 295 return -EFAULT; 296 297 hwtstamp_config_to_kernel(&kernel_cfg, &cfg); 298 kernel_cfg.ifr = ifr; 299 300 err = net_hwtstamp_validate(&kernel_cfg); 301 if (err) 302 return err; 303 304 err = dsa_master_hwtstamp_validate(dev, &kernel_cfg, &extack); 305 if (err) { 306 if (extack._msg) 307 netdev_err(dev, "%s\n", extack._msg); 308 return err; 309 } 310 311 if (!ops->ndo_hwtstamp_set) 312 return dev_eth_ioctl(dev, ifr, SIOCSHWTSTAMP); /* legacy */ 313 314 if (!netif_device_present(dev)) 315 return -ENODEV; 316 317 err = ops->ndo_hwtstamp_set(dev, &kernel_cfg, &extack); 318 if (err) { 319 if (extack._msg) 320 netdev_err(dev, "%s\n", extack._msg); 321 return err; 322 } 323 324 /* The driver may have modified the configuration, so copy the 325 * updated version of it back to user space 326 */ 327 if (!kernel_cfg.copied_to_user) { 328 hwtstamp_config_from_kernel(&cfg, &kernel_cfg); 329 330 if (copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg))) 331 return -EFAULT; 332 } 333 334 return 0; 335 } 336 337 static int generic_hwtstamp_ioctl_lower(struct net_device *dev, int cmd, 338 struct kernel_hwtstamp_config *kernel_cfg) 339 { 340 struct ifreq ifrr; 341 int err; 342 343 strscpy_pad(ifrr.ifr_name, dev->name, IFNAMSIZ); 344 ifrr.ifr_ifru = kernel_cfg->ifr->ifr_ifru; 345 346 err = dev_eth_ioctl(dev, &ifrr, cmd); 347 if (err) 348 return err; 349 350 kernel_cfg->ifr->ifr_ifru = ifrr.ifr_ifru; 351 kernel_cfg->copied_to_user = true; 352 353 return 0; 354 } 355 356 int generic_hwtstamp_get_lower(struct net_device *dev, 357 struct kernel_hwtstamp_config *kernel_cfg) 358 { 359 const struct net_device_ops *ops = dev->netdev_ops; 360 361 if (!netif_device_present(dev)) 362 return -ENODEV; 363 364 if (ops->ndo_hwtstamp_get) 365 return ops->ndo_hwtstamp_get(dev, kernel_cfg); 366 367 /* Legacy path: unconverted lower driver */ 368 return generic_hwtstamp_ioctl_lower(dev, SIOCGHWTSTAMP, kernel_cfg); 369 } 370 EXPORT_SYMBOL(generic_hwtstamp_get_lower); 371 372 int generic_hwtstamp_set_lower(struct net_device *dev, 373 struct kernel_hwtstamp_config *kernel_cfg, 374 struct netlink_ext_ack *extack) 375 { 376 const struct net_device_ops *ops = dev->netdev_ops; 377 378 if (!netif_device_present(dev)) 379 return -ENODEV; 380 381 if (ops->ndo_hwtstamp_set) 382 return ops->ndo_hwtstamp_set(dev, kernel_cfg, extack); 383 384 /* Legacy path: unconverted lower driver */ 385 return generic_hwtstamp_ioctl_lower(dev, SIOCSHWTSTAMP, kernel_cfg); 386 } 387 EXPORT_SYMBOL(generic_hwtstamp_set_lower); 388 389 static int dev_siocbond(struct net_device *dev, 390 struct ifreq *ifr, unsigned int cmd) 391 { 392 const struct net_device_ops *ops = dev->netdev_ops; 393 394 if (ops->ndo_siocbond) { 395 if (netif_device_present(dev)) 396 return ops->ndo_siocbond(dev, ifr, cmd); 397 else 398 return -ENODEV; 399 } 400 401 return -EOPNOTSUPP; 402 } 403 404 static int dev_siocdevprivate(struct net_device *dev, struct ifreq *ifr, 405 void __user *data, unsigned int cmd) 406 { 407 const struct net_device_ops *ops = dev->netdev_ops; 408 409 if (ops->ndo_siocdevprivate) { 410 if (netif_device_present(dev)) 411 return ops->ndo_siocdevprivate(dev, ifr, data, cmd); 412 else 413 return -ENODEV; 414 } 415 416 return -EOPNOTSUPP; 417 } 418 419 static int dev_siocwandev(struct net_device *dev, struct if_settings *ifs) 420 { 421 const struct net_device_ops *ops = dev->netdev_ops; 422 423 if (ops->ndo_siocwandev) { 424 if (netif_device_present(dev)) 425 return ops->ndo_siocwandev(dev, ifs); 426 else 427 return -ENODEV; 428 } 429 430 return -EOPNOTSUPP; 431 } 432 433 /* 434 * Perform the SIOCxIFxxx calls, inside rtnl_lock() 435 */ 436 static int dev_ifsioc(struct net *net, struct ifreq *ifr, void __user *data, 437 unsigned int cmd) 438 { 439 int err; 440 struct net_device *dev = __dev_get_by_name(net, ifr->ifr_name); 441 const struct net_device_ops *ops; 442 netdevice_tracker dev_tracker; 443 444 if (!dev) 445 return -ENODEV; 446 447 ops = dev->netdev_ops; 448 449 switch (cmd) { 450 case SIOCSIFFLAGS: /* Set interface flags */ 451 return dev_change_flags(dev, ifr->ifr_flags, NULL); 452 453 case SIOCSIFMETRIC: /* Set the metric on the interface 454 (currently unused) */ 455 return -EOPNOTSUPP; 456 457 case SIOCSIFMTU: /* Set the MTU of a device */ 458 return dev_set_mtu(dev, ifr->ifr_mtu); 459 460 case SIOCSIFHWADDR: 461 if (dev->addr_len > sizeof(struct sockaddr)) 462 return -EINVAL; 463 return dev_set_mac_address_user(dev, &ifr->ifr_hwaddr, NULL); 464 465 case SIOCSIFHWBROADCAST: 466 if (ifr->ifr_hwaddr.sa_family != dev->type) 467 return -EINVAL; 468 memcpy(dev->broadcast, ifr->ifr_hwaddr.sa_data, 469 min(sizeof(ifr->ifr_hwaddr.sa_data_min), 470 (size_t)dev->addr_len)); 471 call_netdevice_notifiers(NETDEV_CHANGEADDR, dev); 472 return 0; 473 474 case SIOCSIFMAP: 475 return dev_setifmap(dev, ifr); 476 477 case SIOCADDMULTI: 478 if (!ops->ndo_set_rx_mode || 479 ifr->ifr_hwaddr.sa_family != AF_UNSPEC) 480 return -EINVAL; 481 if (!netif_device_present(dev)) 482 return -ENODEV; 483 return dev_mc_add_global(dev, ifr->ifr_hwaddr.sa_data); 484 485 case SIOCDELMULTI: 486 if (!ops->ndo_set_rx_mode || 487 ifr->ifr_hwaddr.sa_family != AF_UNSPEC) 488 return -EINVAL; 489 if (!netif_device_present(dev)) 490 return -ENODEV; 491 return dev_mc_del_global(dev, ifr->ifr_hwaddr.sa_data); 492 493 case SIOCSIFTXQLEN: 494 if (ifr->ifr_qlen < 0) 495 return -EINVAL; 496 return dev_change_tx_queue_len(dev, ifr->ifr_qlen); 497 498 case SIOCSIFNAME: 499 ifr->ifr_newname[IFNAMSIZ-1] = '\0'; 500 return dev_change_name(dev, ifr->ifr_newname); 501 502 case SIOCWANDEV: 503 return dev_siocwandev(dev, &ifr->ifr_settings); 504 505 case SIOCBRADDIF: 506 case SIOCBRDELIF: 507 if (!netif_device_present(dev)) 508 return -ENODEV; 509 if (!netif_is_bridge_master(dev)) 510 return -EOPNOTSUPP; 511 netdev_hold(dev, &dev_tracker, GFP_KERNEL); 512 rtnl_unlock(); 513 err = br_ioctl_call(net, netdev_priv(dev), cmd, ifr, NULL); 514 netdev_put(dev, &dev_tracker); 515 rtnl_lock(); 516 return err; 517 518 case SIOCDEVPRIVATE ... SIOCDEVPRIVATE + 15: 519 return dev_siocdevprivate(dev, ifr, data, cmd); 520 521 case SIOCSHWTSTAMP: 522 return dev_set_hwtstamp(dev, ifr); 523 524 case SIOCGHWTSTAMP: 525 return dev_get_hwtstamp(dev, ifr); 526 527 case SIOCGMIIPHY: 528 case SIOCGMIIREG: 529 case SIOCSMIIREG: 530 return dev_eth_ioctl(dev, ifr, cmd); 531 532 case SIOCBONDENSLAVE: 533 case SIOCBONDRELEASE: 534 case SIOCBONDSETHWADDR: 535 case SIOCBONDSLAVEINFOQUERY: 536 case SIOCBONDINFOQUERY: 537 case SIOCBONDCHANGEACTIVE: 538 return dev_siocbond(dev, ifr, cmd); 539 540 /* Unknown ioctl */ 541 default: 542 err = -EINVAL; 543 } 544 return err; 545 } 546 547 /** 548 * dev_load - load a network module 549 * @net: the applicable net namespace 550 * @name: name of interface 551 * 552 * If a network interface is not present and the process has suitable 553 * privileges this function loads the module. If module loading is not 554 * available in this kernel then it becomes a nop. 555 */ 556 557 void dev_load(struct net *net, const char *name) 558 { 559 struct net_device *dev; 560 int no_module; 561 562 rcu_read_lock(); 563 dev = dev_get_by_name_rcu(net, name); 564 rcu_read_unlock(); 565 566 no_module = !dev; 567 if (no_module && capable(CAP_NET_ADMIN)) 568 no_module = request_module("netdev-%s", name); 569 if (no_module && capable(CAP_SYS_MODULE)) 570 request_module("%s", name); 571 } 572 EXPORT_SYMBOL(dev_load); 573 574 /* 575 * This function handles all "interface"-type I/O control requests. The actual 576 * 'doing' part of this is dev_ifsioc above. 577 */ 578 579 /** 580 * dev_ioctl - network device ioctl 581 * @net: the applicable net namespace 582 * @cmd: command to issue 583 * @ifr: pointer to a struct ifreq in user space 584 * @data: data exchanged with userspace 585 * @need_copyout: whether or not copy_to_user() should be called 586 * 587 * Issue ioctl functions to devices. This is normally called by the 588 * user space syscall interfaces but can sometimes be useful for 589 * other purposes. The return value is the return from the syscall if 590 * positive or a negative errno code on error. 591 */ 592 593 int dev_ioctl(struct net *net, unsigned int cmd, struct ifreq *ifr, 594 void __user *data, bool *need_copyout) 595 { 596 int ret; 597 char *colon; 598 599 if (need_copyout) 600 *need_copyout = true; 601 if (cmd == SIOCGIFNAME) 602 return dev_ifname(net, ifr); 603 604 ifr->ifr_name[IFNAMSIZ-1] = 0; 605 606 colon = strchr(ifr->ifr_name, ':'); 607 if (colon) 608 *colon = 0; 609 610 /* 611 * See which interface the caller is talking about. 612 */ 613 614 switch (cmd) { 615 case SIOCGIFHWADDR: 616 dev_load(net, ifr->ifr_name); 617 ret = dev_get_mac_address(&ifr->ifr_hwaddr, net, ifr->ifr_name); 618 if (colon) 619 *colon = ':'; 620 return ret; 621 /* 622 * These ioctl calls: 623 * - can be done by all. 624 * - atomic and do not require locking. 625 * - return a value 626 */ 627 case SIOCGIFFLAGS: 628 case SIOCGIFMETRIC: 629 case SIOCGIFMTU: 630 case SIOCGIFSLAVE: 631 case SIOCGIFMAP: 632 case SIOCGIFINDEX: 633 case SIOCGIFTXQLEN: 634 dev_load(net, ifr->ifr_name); 635 rcu_read_lock(); 636 ret = dev_ifsioc_locked(net, ifr, cmd); 637 rcu_read_unlock(); 638 if (colon) 639 *colon = ':'; 640 return ret; 641 642 case SIOCETHTOOL: 643 dev_load(net, ifr->ifr_name); 644 ret = dev_ethtool(net, ifr, data); 645 if (colon) 646 *colon = ':'; 647 return ret; 648 649 /* 650 * These ioctl calls: 651 * - require superuser power. 652 * - require strict serialization. 653 * - return a value 654 */ 655 case SIOCGMIIPHY: 656 case SIOCGMIIREG: 657 case SIOCSIFNAME: 658 dev_load(net, ifr->ifr_name); 659 if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) 660 return -EPERM; 661 rtnl_lock(); 662 ret = dev_ifsioc(net, ifr, data, cmd); 663 rtnl_unlock(); 664 if (colon) 665 *colon = ':'; 666 return ret; 667 668 /* 669 * These ioctl calls: 670 * - require superuser power. 671 * - require strict serialization. 672 * - do not return a value 673 */ 674 case SIOCSIFMAP: 675 case SIOCSIFTXQLEN: 676 if (!capable(CAP_NET_ADMIN)) 677 return -EPERM; 678 fallthrough; 679 /* 680 * These ioctl calls: 681 * - require local superuser power. 682 * - require strict serialization. 683 * - do not return a value 684 */ 685 case SIOCSIFFLAGS: 686 case SIOCSIFMETRIC: 687 case SIOCSIFMTU: 688 case SIOCSIFHWADDR: 689 case SIOCSIFSLAVE: 690 case SIOCADDMULTI: 691 case SIOCDELMULTI: 692 case SIOCSIFHWBROADCAST: 693 case SIOCSMIIREG: 694 case SIOCBONDENSLAVE: 695 case SIOCBONDRELEASE: 696 case SIOCBONDSETHWADDR: 697 case SIOCBONDCHANGEACTIVE: 698 case SIOCBRADDIF: 699 case SIOCBRDELIF: 700 case SIOCSHWTSTAMP: 701 if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) 702 return -EPERM; 703 fallthrough; 704 case SIOCBONDSLAVEINFOQUERY: 705 case SIOCBONDINFOQUERY: 706 dev_load(net, ifr->ifr_name); 707 rtnl_lock(); 708 ret = dev_ifsioc(net, ifr, data, cmd); 709 rtnl_unlock(); 710 if (need_copyout) 711 *need_copyout = false; 712 return ret; 713 714 case SIOCGIFMEM: 715 /* Get the per device memory space. We can add this but 716 * currently do not support it */ 717 case SIOCSIFMEM: 718 /* Set the per device memory buffer space. 719 * Not applicable in our case */ 720 case SIOCSIFLINK: 721 return -ENOTTY; 722 723 /* 724 * Unknown or private ioctl. 725 */ 726 default: 727 if (cmd == SIOCWANDEV || 728 cmd == SIOCGHWTSTAMP || 729 (cmd >= SIOCDEVPRIVATE && 730 cmd <= SIOCDEVPRIVATE + 15)) { 731 dev_load(net, ifr->ifr_name); 732 rtnl_lock(); 733 ret = dev_ifsioc(net, ifr, data, cmd); 734 rtnl_unlock(); 735 return ret; 736 } 737 return -ENOTTY; 738 } 739 } 740