aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/wext.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/mac80211/wext.c')
-rw-r--r--net/mac80211/wext.c35
1 files changed, 27 insertions, 8 deletions
diff --git a/net/mac80211/wext.c b/net/mac80211/wext.c
index 76e1de1dc735..e8404212ad57 100644
--- a/net/mac80211/wext.c
+++ b/net/mac80211/wext.c
@@ -95,6 +95,13 @@ static int ieee80211_set_encryption(struct net_device *dev, u8 *sta_addr,
95 } 95 }
96 } 96 }
97 97
98 if (alg == ALG_WEP &&
99 key_len != LEN_WEP40 && key_len != LEN_WEP104) {
100 ieee80211_key_free(key);
101 err = -EINVAL;
102 goto out_unlock;
103 }
104
98 ieee80211_key_link(key, sdata, sta); 105 ieee80211_key_link(key, sdata, sta);
99 106
100 if (set_tx_key || (!sta && !sdata->default_key && key)) 107 if (set_tx_key || (!sta && !sdata->default_key && key))
@@ -209,7 +216,6 @@ static int ieee80211_ioctl_giwrange(struct net_device *dev,
209 range->num_frequency = c; 216 range->num_frequency = c;
210 217
211 IW_EVENT_CAPA_SET_KERNEL(range->event_capa); 218 IW_EVENT_CAPA_SET_KERNEL(range->event_capa);
212 IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWTHRSPY);
213 IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWAP); 219 IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWAP);
214 IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWSCAN); 220 IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWSCAN);
215 221
@@ -291,14 +297,22 @@ static int ieee80211_ioctl_giwmode(struct net_device *dev,
291 return 0; 297 return 0;
292} 298}
293 299
294int ieee80211_set_freq(struct ieee80211_local *local, int freqMHz) 300int ieee80211_set_freq(struct net_device *dev, int freqMHz)
295{ 301{
296 int ret = -EINVAL; 302 int ret = -EINVAL;
297 struct ieee80211_channel *chan; 303 struct ieee80211_channel *chan;
304 struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
305 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
298 306
299 chan = ieee80211_get_channel(local->hw.wiphy, freqMHz); 307 chan = ieee80211_get_channel(local->hw.wiphy, freqMHz);
300 308
301 if (chan && !(chan->flags & IEEE80211_CHAN_DISABLED)) { 309 if (chan && !(chan->flags & IEEE80211_CHAN_DISABLED)) {
310 if (sdata->vif.type == IEEE80211_IF_TYPE_IBSS &&
311 chan->flags & IEEE80211_CHAN_NO_IBSS) {
312 printk(KERN_DEBUG "%s: IBSS not allowed on frequency "
313 "%d MHz\n", dev->name, chan->center_freq);
314 return ret;
315 }
302 local->oper_channel = chan; 316 local->oper_channel = chan;
303 317
304 if (local->sta_sw_scanning || local->sta_hw_scanning) 318 if (local->sta_sw_scanning || local->sta_hw_scanning)
@@ -316,7 +330,6 @@ static int ieee80211_ioctl_siwfreq(struct net_device *dev,
316 struct iw_request_info *info, 330 struct iw_request_info *info,
317 struct iw_freq *freq, char *extra) 331 struct iw_freq *freq, char *extra)
318{ 332{
319 struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
320 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); 333 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
321 334
322 if (sdata->vif.type == IEEE80211_IF_TYPE_STA) 335 if (sdata->vif.type == IEEE80211_IF_TYPE_STA)
@@ -330,14 +343,14 @@ static int ieee80211_ioctl_siwfreq(struct net_device *dev,
330 IEEE80211_STA_AUTO_CHANNEL_SEL; 343 IEEE80211_STA_AUTO_CHANNEL_SEL;
331 return 0; 344 return 0;
332 } else 345 } else
333 return ieee80211_set_freq(local, 346 return ieee80211_set_freq(dev,
334 ieee80211_channel_to_frequency(freq->m)); 347 ieee80211_channel_to_frequency(freq->m));
335 } else { 348 } else {
336 int i, div = 1000000; 349 int i, div = 1000000;
337 for (i = 0; i < freq->e; i++) 350 for (i = 0; i < freq->e; i++)
338 div /= 10; 351 div /= 10;
339 if (div > 0) 352 if (div > 0)
340 return ieee80211_set_freq(local, freq->m / div); 353 return ieee80211_set_freq(dev, freq->m / div);
341 else 354 else
342 return -EINVAL; 355 return -EINVAL;
343 } 356 }
@@ -490,9 +503,15 @@ static int ieee80211_ioctl_giwap(struct net_device *dev,
490 sdata = IEEE80211_DEV_TO_SUB_IF(dev); 503 sdata = IEEE80211_DEV_TO_SUB_IF(dev);
491 if (sdata->vif.type == IEEE80211_IF_TYPE_STA || 504 if (sdata->vif.type == IEEE80211_IF_TYPE_STA ||
492 sdata->vif.type == IEEE80211_IF_TYPE_IBSS) { 505 sdata->vif.type == IEEE80211_IF_TYPE_IBSS) {
493 ap_addr->sa_family = ARPHRD_ETHER; 506 if (sdata->u.sta.state == IEEE80211_ASSOCIATED ||
494 memcpy(&ap_addr->sa_data, sdata->u.sta.bssid, ETH_ALEN); 507 sdata->u.sta.state == IEEE80211_IBSS_JOINED) {
495 return 0; 508 ap_addr->sa_family = ARPHRD_ETHER;
509 memcpy(&ap_addr->sa_data, sdata->u.sta.bssid, ETH_ALEN);
510 return 0;
511 } else {
512 memset(&ap_addr->sa_data, 0, ETH_ALEN);
513 return 0;
514 }
496 } else if (sdata->vif.type == IEEE80211_IF_TYPE_WDS) { 515 } else if (sdata->vif.type == IEEE80211_IF_TYPE_WDS) {
497 ap_addr->sa_family = ARPHRD_ETHER; 516 ap_addr->sa_family = ARPHRD_ETHER;
498 memcpy(&ap_addr->sa_data, sdata->u.wds.remote_addr, ETH_ALEN); 517 memcpy(&ap_addr->sa_data, sdata->u.wds.remote_addr, ETH_ALEN);