Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: use core MTU range checking in wireless drivers

- set max_mtu in wil6210 driver
- set max_mtu in atmel driver
- set min/max_mtu in cisco airo driver, remove airo_change_mtu
- set min/max_mtu in ipw2100/ipw2200 drivers, remove libipw_change_mtu
- set min/max_mtu in p80211netdev, remove wlan_change_mtu
- set min/max_mtu in net/mac80211/iface.c and remove ieee80211_change_mtu
- set min/max_mtu in wimax/i2400m and remove i2400m_change_mtu
- set min/max_mtu in intersil/hostap and remove prism2_change_mtu
- set min/max_mtu in intersil/orinoco
- set min/max_mtu in tty/n_gsm and remove gsm_change_mtu

CC: netdev@vger.kernel.org
CC: linux-wireless@vger.kernel.org
CC: Maya Erez <qca_merez@qca.qualcomm.com>
CC: Simon Kelley <simon@thekelleys.org.uk>
CC: Stanislav Yakovlev <stas.yakovlev@gmail.com>
CC: Johannes Berg <johannes@sipsolutions.net>
CC: Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>
Signed-off-by: Jarod Wilson <jarod@redhat.com>
Acked-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Jarod Wilson and committed by
David S. Miller
9c22b4a3 f77f0aee

+34 -119
+2 -20
drivers/net/wimax/i2400m/netdev.c
··· 395 395 396 396 397 397 static 398 - int i2400m_change_mtu(struct net_device *net_dev, int new_mtu) 399 - { 400 - int result; 401 - struct i2400m *i2400m = net_dev_to_i2400m(net_dev); 402 - struct device *dev = i2400m_dev(i2400m); 403 - 404 - if (new_mtu >= I2400M_MAX_MTU) { 405 - dev_err(dev, "Cannot change MTU to %d (max is %d)\n", 406 - new_mtu, I2400M_MAX_MTU); 407 - result = -EINVAL; 408 - } else { 409 - net_dev->mtu = new_mtu; 410 - result = 0; 411 - } 412 - return result; 413 - } 414 - 415 - 416 - static 417 398 void i2400m_tx_timeout(struct net_device *net_dev) 418 399 { 419 400 /* ··· 571 590 .ndo_stop = i2400m_stop, 572 591 .ndo_start_xmit = i2400m_hard_start_xmit, 573 592 .ndo_tx_timeout = i2400m_tx_timeout, 574 - .ndo_change_mtu = i2400m_change_mtu, 575 593 }; 576 594 577 595 static void i2400m_get_drvinfo(struct net_device *net_dev, ··· 601 621 d_fnstart(3, NULL, "(net_dev %p)\n", net_dev); 602 622 ether_setup(net_dev); 603 623 net_dev->mtu = I2400M_MAX_MTU; 624 + net_dev->min_mtu = 0; 625 + net_dev->max_mtu = I2400M_MAX_MTU; 604 626 net_dev->tx_queue_len = I2400M_TX_QLEN; 605 627 net_dev->features = 606 628 NETIF_F_VLAN_CHALLENGED
+1 -16
drivers/net/wireless/ath/wil6210/netdev.c
··· 41 41 return wil_down(wil); 42 42 } 43 43 44 - static int wil_change_mtu(struct net_device *ndev, int new_mtu) 45 - { 46 - struct wil6210_priv *wil = ndev_to_wil(ndev); 47 - 48 - if (new_mtu < 68 || new_mtu > mtu_max) { 49 - wil_err(wil, "invalid MTU %d\n", new_mtu); 50 - return -EINVAL; 51 - } 52 - 53 - wil_dbg_misc(wil, "change MTU %d -> %d\n", ndev->mtu, new_mtu); 54 - ndev->mtu = new_mtu; 55 - 56 - return 0; 57 - } 58 - 59 44 static int wil_do_ioctl(struct net_device *ndev, struct ifreq *ifr, int cmd) 60 45 { 61 46 struct wil6210_priv *wil = ndev_to_wil(ndev); ··· 54 69 .ndo_start_xmit = wil_start_xmit, 55 70 .ndo_set_mac_address = eth_mac_addr, 56 71 .ndo_validate_addr = eth_validate_addr, 57 - .ndo_change_mtu = wil_change_mtu, 58 72 .ndo_do_ioctl = wil_do_ioctl, 59 73 }; 60 74 ··· 110 126 static void wil_dev_setup(struct net_device *dev) 111 127 { 112 128 ether_setup(dev); 129 + dev->max_mtu = mtu_max; 113 130 dev->tx_queue_len = WIL_TX_Q_LEN_DEFAULT; 114 131 } 115 132
+4 -9
drivers/net/wireless/atmel/atmel.c
··· 1295 1295 return &priv->wstats; 1296 1296 } 1297 1297 1298 - static int atmel_change_mtu(struct net_device *dev, int new_mtu) 1299 - { 1300 - if ((new_mtu < 68) || (new_mtu > 2312)) 1301 - return -EINVAL; 1302 - dev->mtu = new_mtu; 1303 - return 0; 1304 - } 1305 - 1306 1298 static int atmel_set_mac_address(struct net_device *dev, void *p) 1307 1299 { 1308 1300 struct sockaddr *addr = p; ··· 1498 1506 static const struct net_device_ops atmel_netdev_ops = { 1499 1507 .ndo_open = atmel_open, 1500 1508 .ndo_stop = atmel_close, 1501 - .ndo_change_mtu = atmel_change_mtu, 1502 1509 .ndo_set_mac_address = atmel_set_mac_address, 1503 1510 .ndo_start_xmit = start_tx, 1504 1511 .ndo_do_ioctl = atmel_ioctl, ··· 1590 1599 dev->wireless_handlers = &atmel_handler_def; 1591 1600 dev->irq = irq; 1592 1601 dev->base_addr = port; 1602 + 1603 + /* MTU range: 68 - 2312 */ 1604 + dev->min_mtu = 68; 1605 + dev->max_mtu = MAX_WIRELESS_BODY - ETH_FCS_LEN; 1593 1606 1594 1607 SET_NETDEV_DEV(dev, sys_dev); 1595 1608
+3 -11
drivers/net/wireless/cisco/airo.c
··· 2329 2329 return 0; 2330 2330 } 2331 2331 2332 - static int airo_change_mtu(struct net_device *dev, int new_mtu) 2333 - { 2334 - if ((new_mtu < 68) || (new_mtu > 2400)) 2335 - return -EINVAL; 2336 - dev->mtu = new_mtu; 2337 - return 0; 2338 - } 2339 - 2340 2332 static LIST_HEAD(airo_devices); 2341 2333 2342 2334 static void add_airo_dev(struct airo_info *ai) ··· 2648 2656 .ndo_get_stats = airo_get_stats, 2649 2657 .ndo_set_mac_address = airo_set_mac_address, 2650 2658 .ndo_do_ioctl = airo_ioctl, 2651 - .ndo_change_mtu = airo_change_mtu, 2652 2659 }; 2653 2660 2654 2661 static void wifi_setup(struct net_device *dev) ··· 2659 2668 dev->type = ARPHRD_IEEE80211; 2660 2669 dev->hard_header_len = ETH_HLEN; 2661 2670 dev->mtu = AIRO_DEF_MTU; 2671 + dev->min_mtu = 68; 2672 + dev->max_mtu = MIC_MSGLEN_MAX; 2662 2673 dev->addr_len = ETH_ALEN; 2663 2674 dev->tx_queue_len = 100; 2664 2675 ··· 2747 2754 .ndo_set_rx_mode = airo_set_multicast_list, 2748 2755 .ndo_set_mac_address = airo_set_mac_address, 2749 2756 .ndo_do_ioctl = airo_ioctl, 2750 - .ndo_change_mtu = airo_change_mtu, 2751 2757 .ndo_validate_addr = eth_validate_addr, 2752 2758 }; 2753 2759 ··· 2758 2766 .ndo_set_rx_mode = airo_set_multicast_list, 2759 2767 .ndo_set_mac_address = airo_set_mac_address, 2760 2768 .ndo_do_ioctl = airo_ioctl, 2761 - .ndo_change_mtu = airo_change_mtu, 2762 2769 .ndo_validate_addr = eth_validate_addr, 2763 2770 }; 2764 2771 ··· 2813 2822 dev->irq = irq; 2814 2823 dev->base_addr = port; 2815 2824 dev->priv_flags &= ~IFF_TX_SKB_SHARING; 2825 + dev->max_mtu = MIC_MSGLEN_MAX; 2816 2826 2817 2827 SET_NETDEV_DEV(dev, dmdev); 2818 2828
+2 -1
drivers/net/wireless/intel/ipw2x00/ipw2100.c
··· 6035 6035 .ndo_open = ipw2100_open, 6036 6036 .ndo_stop = ipw2100_close, 6037 6037 .ndo_start_xmit = libipw_xmit, 6038 - .ndo_change_mtu = libipw_change_mtu, 6039 6038 .ndo_tx_timeout = ipw2100_tx_timeout, 6040 6039 .ndo_set_mac_address = ipw2100_set_address, 6041 6040 .ndo_validate_addr = eth_validate_addr, ··· 6070 6071 dev->wireless_data = &priv->wireless_data; 6071 6072 dev->watchdog_timeo = 3 * HZ; 6072 6073 dev->irq = 0; 6074 + dev->min_mtu = 68; 6075 + dev->max_mtu = LIBIPW_DATA_LEN; 6073 6076 6074 6077 /* NOTE: We don't use the wireless_handlers hook 6075 6078 * in dev as the system will start throwing WX requests
+6 -2
drivers/net/wireless/intel/ipw2x00/ipw2200.c
··· 11561 11561 .ndo_open = ipw_prom_open, 11562 11562 .ndo_stop = ipw_prom_stop, 11563 11563 .ndo_start_xmit = ipw_prom_hard_start_xmit, 11564 - .ndo_change_mtu = libipw_change_mtu, 11565 11564 .ndo_set_mac_address = eth_mac_addr, 11566 11565 .ndo_validate_addr = eth_validate_addr, 11567 11566 }; ··· 11585 11586 11586 11587 priv->prom_net_dev->type = ARPHRD_IEEE80211_RADIOTAP; 11587 11588 priv->prom_net_dev->netdev_ops = &ipw_prom_netdev_ops; 11589 + 11590 + priv->prom_net_dev->min_mtu = 68; 11591 + priv->prom_net_dev->max_mtu = LIBIPW_DATA_LEN; 11588 11592 11589 11593 priv->prom_priv->ieee->iw_mode = IW_MODE_MONITOR; 11590 11594 SET_NETDEV_DEV(priv->prom_net_dev, &priv->pci_dev->dev); ··· 11621 11619 .ndo_set_rx_mode = ipw_net_set_multicast_list, 11622 11620 .ndo_set_mac_address = ipw_net_set_mac_address, 11623 11621 .ndo_start_xmit = libipw_xmit, 11624 - .ndo_change_mtu = libipw_change_mtu, 11625 11622 .ndo_validate_addr = eth_validate_addr, 11626 11623 }; 11627 11624 ··· 11729 11728 net_dev->wireless_data = &priv->wireless_data; 11730 11729 net_dev->wireless_handlers = &ipw_wx_handler_def; 11731 11730 net_dev->ethtool_ops = &ipw_ethtool_ops; 11731 + 11732 + net_dev->min_mtu = 68; 11733 + net_dev->max_mtu = LIBIPW_DATA_LEN; 11732 11734 11733 11735 err = sysfs_create_group(&pdev->dev.kobj, &ipw_attribute_group); 11734 11736 if (err) {
-1
drivers/net/wireless/intel/ipw2x00/libipw.h
··· 948 948 /* libipw.c */ 949 949 void free_libipw(struct net_device *dev, int monitor); 950 950 struct net_device *alloc_libipw(int sizeof_priv, int monitor); 951 - int libipw_change_mtu(struct net_device *dev, int new_mtu); 952 951 953 952 void libipw_networks_age(struct libipw_device *ieee, unsigned long age_secs); 954 953
-9
drivers/net/wireless/intel/ipw2x00/libipw_module.c
··· 118 118 &ieee->network_free_list); 119 119 } 120 120 121 - int libipw_change_mtu(struct net_device *dev, int new_mtu) 122 - { 123 - if ((new_mtu < 68) || (new_mtu > LIBIPW_DATA_LEN)) 124 - return -EINVAL; 125 - dev->mtu = new_mtu; 126 - return 0; 127 - } 128 - EXPORT_SYMBOL(libipw_change_mtu); 129 - 130 121 struct net_device *alloc_libipw(int sizeof_priv, int monitor) 131 122 { 132 123 struct libipw_device *ieee;
+2 -13
drivers/net/wireless/intersil/hostap/hostap_main.c
··· 765 765 } 766 766 767 767 768 - static int prism2_change_mtu(struct net_device *dev, int new_mtu) 769 - { 770 - if (new_mtu < PRISM2_MIN_MTU || new_mtu > PRISM2_MAX_MTU) 771 - return -EINVAL; 772 - 773 - dev->mtu = new_mtu; 774 - return 0; 775 - } 776 - 777 - 778 768 static void prism2_tx_timeout(struct net_device *dev) 779 769 { 780 770 struct hostap_interface *iface; ··· 803 813 .ndo_do_ioctl = hostap_ioctl, 804 814 .ndo_set_mac_address = prism2_set_mac_address, 805 815 .ndo_set_rx_mode = hostap_set_multicast_list, 806 - .ndo_change_mtu = prism2_change_mtu, 807 816 .ndo_tx_timeout = prism2_tx_timeout, 808 817 .ndo_validate_addr = eth_validate_addr, 809 818 }; ··· 815 826 .ndo_do_ioctl = hostap_ioctl, 816 827 .ndo_set_mac_address = prism2_set_mac_address, 817 828 .ndo_set_rx_mode = hostap_set_multicast_list, 818 - .ndo_change_mtu = prism2_change_mtu, 819 829 .ndo_tx_timeout = prism2_tx_timeout, 820 830 .ndo_validate_addr = eth_validate_addr, 821 831 }; ··· 827 839 .ndo_do_ioctl = hostap_ioctl, 828 840 .ndo_set_mac_address = prism2_set_mac_address, 829 841 .ndo_set_rx_mode = hostap_set_multicast_list, 830 - .ndo_change_mtu = prism2_change_mtu, 831 842 .ndo_tx_timeout = prism2_tx_timeout, 832 843 .ndo_validate_addr = eth_validate_addr, 833 844 }; ··· 838 851 839 852 iface = netdev_priv(dev); 840 853 ether_setup(dev); 854 + dev->min_mtu = PRISM2_MIN_MTU; 855 + dev->max_mtu = PRISM2_MAX_MTU; 841 856 dev->priv_flags &= ~IFF_TX_SKB_SHARING; 842 857 843 858 /* kernel callbacks */
+3 -3
drivers/net/wireless/intersil/orinoco/main.c
··· 322 322 { 323 323 struct orinoco_private *priv = ndev_priv(dev); 324 324 325 - if ((new_mtu < ORINOCO_MIN_MTU) || (new_mtu > ORINOCO_MAX_MTU)) 326 - return -EINVAL; 327 - 328 325 /* MTU + encapsulation + header length */ 329 326 if ((new_mtu + ENCAPS_OVERHEAD + sizeof(struct ieee80211_hdr)) > 330 327 (priv->nicbuf_size - ETH_HLEN)) ··· 2284 2287 2285 2288 dev->base_addr = base_addr; 2286 2289 dev->irq = irq; 2290 + 2291 + dev->min_mtu = ORINOCO_MIN_MTU; 2292 + dev->max_mtu = ORINOCO_MAX_MTU; 2287 2293 2288 2294 SET_NETDEV_DEV(dev, priv->dev); 2289 2295 ret = register_netdev(dev);
+5 -13
drivers/staging/wlan-ng/p80211netdev.c
··· 669 669 return result; 670 670 } 671 671 672 - static int wlan_change_mtu(struct net_device *dev, int new_mtu) 673 - { 674 - /* 2312 is max 802.11 payload, 20 is overhead, (ether + llc +snap) 675 - and another 8 for wep. */ 676 - if ((new_mtu < 68) || (new_mtu > (2312 - 20 - 8))) 677 - return -EINVAL; 678 - 679 - dev->mtu = new_mtu; 680 - 681 - return 0; 682 - } 683 - 684 672 static const struct net_device_ops p80211_netdev_ops = { 685 673 .ndo_init = p80211knetdev_init, 686 674 .ndo_open = p80211knetdev_open, ··· 678 690 .ndo_do_ioctl = p80211knetdev_do_ioctl, 679 691 .ndo_set_mac_address = p80211knetdev_set_mac_address, 680 692 .ndo_tx_timeout = p80211knetdev_tx_timeout, 681 - .ndo_change_mtu = wlan_change_mtu, 682 693 .ndo_validate_addr = eth_validate_addr, 683 694 }; 684 695 ··· 743 756 wdev->wiphy = wiphy; 744 757 wdev->iftype = NL80211_IFTYPE_STATION; 745 758 netdev->ieee80211_ptr = wdev; 759 + netdev->min_mtu = 68; 760 + /* 2312 is max 802.11 payload, 20 is overhead, 761 + * (ether + llc + snap) and another 8 for wep. 762 + */ 763 + netdev->max_mtu = (2312 - 20 - 8); 746 764 747 765 netif_stop_queue(netdev); 748 766 netif_carrier_off(netdev);
+2 -10
drivers/tty/n_gsm.c
··· 2711 2711 return; 2712 2712 } 2713 2713 2714 - static int gsm_change_mtu(struct net_device *net, int new_mtu) 2715 - { 2716 - struct gsm_mux_net *mux_net = netdev_priv(net); 2717 - if ((new_mtu < 8) || (new_mtu > mux_net->dlci->gsm->mtu)) 2718 - return -EINVAL; 2719 - net->mtu = new_mtu; 2720 - return 0; 2721 - } 2722 - 2723 2714 static void gsm_mux_net_init(struct net_device *net) 2724 2715 { 2725 2716 static const struct net_device_ops gsm_netdev_ops = { ··· 2719 2728 .ndo_start_xmit = gsm_mux_net_start_xmit, 2720 2729 .ndo_tx_timeout = gsm_mux_net_tx_timeout, 2721 2730 .ndo_get_stats = gsm_mux_net_get_stats, 2722 - .ndo_change_mtu = gsm_change_mtu, 2723 2731 }; 2724 2732 2725 2733 net->netdev_ops = &gsm_netdev_ops; ··· 2777 2787 return -ENOMEM; 2778 2788 } 2779 2789 net->mtu = dlci->gsm->mtu; 2790 + net->min_mtu = 8; 2791 + net->max_mtu = dlci->gsm->mtu; 2780 2792 mux_net = netdev_priv(net); 2781 2793 mux_net->dlci = dlci; 2782 2794 kref_init(&mux_net->ref);
+4 -11
net/mac80211/iface.c
··· 150 150 ieee80211_hw_config(local, change); 151 151 } 152 152 153 - static int ieee80211_change_mtu(struct net_device *dev, int new_mtu) 154 - { 155 - if (new_mtu < 256 || new_mtu > IEEE80211_MAX_DATA_LEN) 156 - return -EINVAL; 157 - 158 - dev->mtu = new_mtu; 159 - return 0; 160 - } 161 - 162 153 static int ieee80211_verify_mac(struct ieee80211_sub_if_data *sdata, u8 *addr, 163 154 bool check_dup) 164 155 { ··· 1157 1166 .ndo_uninit = ieee80211_uninit, 1158 1167 .ndo_start_xmit = ieee80211_subif_start_xmit, 1159 1168 .ndo_set_rx_mode = ieee80211_set_multicast_list, 1160 - .ndo_change_mtu = ieee80211_change_mtu, 1161 1169 .ndo_set_mac_address = ieee80211_change_mac, 1162 1170 .ndo_select_queue = ieee80211_netdev_select_queue, 1163 1171 .ndo_get_stats64 = ieee80211_get_stats64, ··· 1190 1200 .ndo_uninit = ieee80211_uninit, 1191 1201 .ndo_start_xmit = ieee80211_monitor_start_xmit, 1192 1202 .ndo_set_rx_mode = ieee80211_set_multicast_list, 1193 - .ndo_change_mtu = ieee80211_change_mtu, 1194 1203 .ndo_set_mac_address = ieee80211_change_mac, 1195 1204 .ndo_select_queue = ieee80211_monitor_select_queue, 1196 1205 .ndo_get_stats64 = ieee80211_get_stats64, ··· 1872 1883 ndev->features |= local->hw.netdev_features; 1873 1884 1874 1885 netdev_set_default_ethtool_ops(ndev, &ieee80211_ethtool_ops); 1886 + 1887 + /* MTU range: 256 - 2304 */ 1888 + ndev->min_mtu = 256; 1889 + ndev->max_mtu = IEEE80211_MAX_DATA_LEN; 1875 1890 1876 1891 ret = register_netdevice(ndev); 1877 1892 if (ret) {