diff options
-rw-r--r-- | net/mac80211/ieee80211.c | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/net/mac80211/ieee80211.c b/net/mac80211/ieee80211.c index 190917a74c3e..7106d651f4f9 100644 --- a/net/mac80211/ieee80211.c +++ b/net/mac80211/ieee80211.c | |||
@@ -26,6 +26,9 @@ | |||
26 | 26 | ||
27 | #include "ieee80211_i.h" | 27 | #include "ieee80211_i.h" |
28 | #include "ieee80211_rate.h" | 28 | #include "ieee80211_rate.h" |
29 | #ifdef CONFIG_MAC80211_MESH | ||
30 | #include "mesh.h" | ||
31 | #endif | ||
29 | #include "wep.h" | 32 | #include "wep.h" |
30 | #include "wme.h" | 33 | #include "wme.h" |
31 | #include "aes_ccm.h" | 34 | #include "aes_ccm.h" |
@@ -138,9 +141,15 @@ static void ieee80211_master_set_multicast_list(struct net_device *dev) | |||
138 | 141 | ||
139 | static int ieee80211_change_mtu(struct net_device *dev, int new_mtu) | 142 | static int ieee80211_change_mtu(struct net_device *dev, int new_mtu) |
140 | { | 143 | { |
144 | int meshhdrlen; | ||
145 | struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); | ||
146 | |||
147 | meshhdrlen = (sdata->vif.type == IEEE80211_IF_TYPE_MESH_POINT) ? 5 : 0; | ||
148 | |||
141 | /* FIX: what would be proper limits for MTU? | 149 | /* FIX: what would be proper limits for MTU? |
142 | * This interface uses 802.3 frames. */ | 150 | * This interface uses 802.3 frames. */ |
143 | if (new_mtu < 256 || new_mtu > IEEE80211_MAX_DATA_LEN - 24 - 6) { | 151 | if (new_mtu < 256 || |
152 | new_mtu > IEEE80211_MAX_DATA_LEN - 24 - 6 - meshhdrlen) { | ||
144 | printk(KERN_WARNING "%s: invalid MTU %d\n", | 153 | printk(KERN_WARNING "%s: invalid MTU %d\n", |
145 | dev->name, new_mtu); | 154 | dev->name, new_mtu); |
146 | return -EINVAL; | 155 | return -EINVAL; |
@@ -441,6 +450,9 @@ static int ieee80211_stop(struct net_device *dev) | |||
441 | ieee80211_configure_filter(local); | 450 | ieee80211_configure_filter(local); |
442 | netif_tx_unlock_bh(local->mdev); | 451 | netif_tx_unlock_bh(local->mdev); |
443 | break; | 452 | break; |
453 | case IEEE80211_IF_TYPE_MESH_POINT: | ||
454 | sta_info_flush(local, dev); | ||
455 | /* fall through */ | ||
444 | case IEEE80211_IF_TYPE_STA: | 456 | case IEEE80211_IF_TYPE_STA: |
445 | case IEEE80211_IF_TYPE_IBSS: | 457 | case IEEE80211_IF_TYPE_IBSS: |
446 | sdata->u.sta.state = IEEE80211_DISABLED; | 458 | sdata->u.sta.state = IEEE80211_DISABLED; |
@@ -926,6 +938,11 @@ static int __ieee80211_if_config(struct net_device *dev, | |||
926 | conf.bssid = sdata->u.sta.bssid; | 938 | conf.bssid = sdata->u.sta.bssid; |
927 | conf.ssid = sdata->u.sta.ssid; | 939 | conf.ssid = sdata->u.sta.ssid; |
928 | conf.ssid_len = sdata->u.sta.ssid_len; | 940 | conf.ssid_len = sdata->u.sta.ssid_len; |
941 | #ifdef CONFIG_MAC80211_MESH | ||
942 | } else if (sdata->vif.type == IEEE80211_IF_TYPE_MESH_POINT) { | ||
943 | conf.beacon = beacon; | ||
944 | ieee80211_start_mesh(dev); | ||
945 | #endif | ||
929 | } else if (sdata->vif.type == IEEE80211_IF_TYPE_AP) { | 946 | } else if (sdata->vif.type == IEEE80211_IF_TYPE_AP) { |
930 | conf.ssid = sdata->u.ap.ssid; | 947 | conf.ssid = sdata->u.ap.ssid; |
931 | conf.ssid_len = sdata->u.ap.ssid_len; | 948 | conf.ssid_len = sdata->u.ap.ssid_len; |
@@ -938,6 +955,11 @@ static int __ieee80211_if_config(struct net_device *dev, | |||
938 | 955 | ||
939 | int ieee80211_if_config(struct net_device *dev) | 956 | int ieee80211_if_config(struct net_device *dev) |
940 | { | 957 | { |
958 | struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); | ||
959 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); | ||
960 | if (sdata->vif.type == IEEE80211_IF_TYPE_MESH_POINT && | ||
961 | (local->hw.flags & IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE)) | ||
962 | return ieee80211_if_config_beacon(dev); | ||
941 | return __ieee80211_if_config(dev, NULL, NULL); | 963 | return __ieee80211_if_config(dev, NULL, NULL); |
942 | } | 964 | } |
943 | 965 | ||
@@ -1802,6 +1824,10 @@ static void __exit ieee80211_exit(void) | |||
1802 | rc80211_simple_exit(); | 1824 | rc80211_simple_exit(); |
1803 | rc80211_pid_exit(); | 1825 | rc80211_pid_exit(); |
1804 | 1826 | ||
1827 | #ifdef CONFIG_MAC80211_MESH | ||
1828 | if (mesh_allocated) | ||
1829 | ieee80211s_stop(); | ||
1830 | #endif | ||
1805 | ieee80211_wme_unregister(); | 1831 | ieee80211_wme_unregister(); |
1806 | ieee80211_debugfs_netdev_exit(); | 1832 | ieee80211_debugfs_netdev_exit(); |
1807 | } | 1833 | } |