diff options
Diffstat (limited to 'net/wireless')
-rw-r--r-- | net/wireless/core.c | 1 | ||||
-rw-r--r-- | net/wireless/core.h | 15 | ||||
-rw-r--r-- | net/wireless/debugfs.c | 1 | ||||
-rw-r--r-- | net/wireless/ibss.c | 1 | ||||
-rw-r--r-- | net/wireless/mlme.c | 53 | ||||
-rw-r--r-- | net/wireless/nl80211.c | 154 | ||||
-rw-r--r-- | net/wireless/nl80211.h | 6 | ||||
-rw-r--r-- | net/wireless/reg.c | 19 | ||||
-rw-r--r-- | net/wireless/scan.c | 1 | ||||
-rw-r--r-- | net/wireless/sme.c | 16 | ||||
-rw-r--r-- | net/wireless/util.c | 25 | ||||
-rw-r--r-- | net/wireless/wext-compat.c | 1 | ||||
-rw-r--r-- | net/wireless/wext-core.c | 135 | ||||
-rw-r--r-- | net/wireless/wext-priv.c | 1 | ||||
-rw-r--r-- | net/wireless/wext-sme.c | 1 |
15 files changed, 321 insertions, 109 deletions
diff --git a/net/wireless/core.c b/net/wireless/core.c index 7fdb9409ad2a..6ac70c101523 100644 --- a/net/wireless/core.c +++ b/net/wireless/core.c | |||
@@ -8,6 +8,7 @@ | |||
8 | #include <linux/module.h> | 8 | #include <linux/module.h> |
9 | #include <linux/err.h> | 9 | #include <linux/err.h> |
10 | #include <linux/list.h> | 10 | #include <linux/list.h> |
11 | #include <linux/slab.h> | ||
11 | #include <linux/nl80211.h> | 12 | #include <linux/nl80211.h> |
12 | #include <linux/debugfs.h> | 13 | #include <linux/debugfs.h> |
13 | #include <linux/notifier.h> | 14 | #include <linux/notifier.h> |
diff --git a/net/wireless/core.h b/net/wireless/core.h index d52da913145a..b2234b436ead 100644 --- a/net/wireless/core.h +++ b/net/wireless/core.h | |||
@@ -293,13 +293,15 @@ int __cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, | |||
293 | const u8 *bssid, | 293 | const u8 *bssid, |
294 | const u8 *ssid, int ssid_len, | 294 | const u8 *ssid, int ssid_len, |
295 | const u8 *ie, int ie_len, | 295 | const u8 *ie, int ie_len, |
296 | const u8 *key, int key_len, int key_idx); | 296 | const u8 *key, int key_len, int key_idx, |
297 | bool local_state_change); | ||
297 | int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, | 298 | int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, |
298 | struct net_device *dev, struct ieee80211_channel *chan, | 299 | struct net_device *dev, struct ieee80211_channel *chan, |
299 | enum nl80211_auth_type auth_type, const u8 *bssid, | 300 | enum nl80211_auth_type auth_type, const u8 *bssid, |
300 | const u8 *ssid, int ssid_len, | 301 | const u8 *ssid, int ssid_len, |
301 | const u8 *ie, int ie_len, | 302 | const u8 *ie, int ie_len, |
302 | const u8 *key, int key_len, int key_idx); | 303 | const u8 *key, int key_len, int key_idx, |
304 | bool local_state_change); | ||
303 | int __cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev, | 305 | int __cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev, |
304 | struct net_device *dev, | 306 | struct net_device *dev, |
305 | struct ieee80211_channel *chan, | 307 | struct ieee80211_channel *chan, |
@@ -315,13 +317,16 @@ int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev, | |||
315 | struct cfg80211_crypto_settings *crypt); | 317 | struct cfg80211_crypto_settings *crypt); |
316 | int __cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, | 318 | int __cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, |
317 | struct net_device *dev, const u8 *bssid, | 319 | struct net_device *dev, const u8 *bssid, |
318 | const u8 *ie, int ie_len, u16 reason); | 320 | const u8 *ie, int ie_len, u16 reason, |
321 | bool local_state_change); | ||
319 | int cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, | 322 | int cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, |
320 | struct net_device *dev, const u8 *bssid, | 323 | struct net_device *dev, const u8 *bssid, |
321 | const u8 *ie, int ie_len, u16 reason); | 324 | const u8 *ie, int ie_len, u16 reason, |
325 | bool local_state_change); | ||
322 | int cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev, | 326 | int cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev, |
323 | struct net_device *dev, const u8 *bssid, | 327 | struct net_device *dev, const u8 *bssid, |
324 | const u8 *ie, int ie_len, u16 reason); | 328 | const u8 *ie, int ie_len, u16 reason, |
329 | bool local_state_change); | ||
325 | void cfg80211_mlme_down(struct cfg80211_registered_device *rdev, | 330 | void cfg80211_mlme_down(struct cfg80211_registered_device *rdev, |
326 | struct net_device *dev); | 331 | struct net_device *dev); |
327 | void __cfg80211_connect_result(struct net_device *dev, const u8 *bssid, | 332 | void __cfg80211_connect_result(struct net_device *dev, const u8 *bssid, |
diff --git a/net/wireless/debugfs.c b/net/wireless/debugfs.c index 2e4895615037..a4991a3efec0 100644 --- a/net/wireless/debugfs.c +++ b/net/wireless/debugfs.c | |||
@@ -9,6 +9,7 @@ | |||
9 | * published by the Free Software Foundation. | 9 | * published by the Free Software Foundation. |
10 | */ | 10 | */ |
11 | 11 | ||
12 | #include <linux/slab.h> | ||
12 | #include "core.h" | 13 | #include "core.h" |
13 | #include "debugfs.h" | 14 | #include "debugfs.h" |
14 | 15 | ||
diff --git a/net/wireless/ibss.c b/net/wireless/ibss.c index 6ef5a491fb4b..6a5acf750174 100644 --- a/net/wireless/ibss.c +++ b/net/wireless/ibss.c | |||
@@ -6,6 +6,7 @@ | |||
6 | 6 | ||
7 | #include <linux/etherdevice.h> | 7 | #include <linux/etherdevice.h> |
8 | #include <linux/if_arp.h> | 8 | #include <linux/if_arp.h> |
9 | #include <linux/slab.h> | ||
9 | #include <net/cfg80211.h> | 10 | #include <net/cfg80211.h> |
10 | #include "wext-compat.h" | 11 | #include "wext-compat.h" |
11 | #include "nl80211.h" | 12 | #include "nl80211.h" |
diff --git a/net/wireless/mlme.c b/net/wireless/mlme.c index 62bc8855e123..48ead6f0426d 100644 --- a/net/wireless/mlme.c +++ b/net/wireless/mlme.c | |||
@@ -8,6 +8,7 @@ | |||
8 | #include <linux/module.h> | 8 | #include <linux/module.h> |
9 | #include <linux/netdevice.h> | 9 | #include <linux/netdevice.h> |
10 | #include <linux/nl80211.h> | 10 | #include <linux/nl80211.h> |
11 | #include <linux/slab.h> | ||
11 | #include <linux/wireless.h> | 12 | #include <linux/wireless.h> |
12 | #include <net/cfg80211.h> | 13 | #include <net/cfg80211.h> |
13 | #include <net/iw_handler.h> | 14 | #include <net/iw_handler.h> |
@@ -377,7 +378,8 @@ int __cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, | |||
377 | const u8 *bssid, | 378 | const u8 *bssid, |
378 | const u8 *ssid, int ssid_len, | 379 | const u8 *ssid, int ssid_len, |
379 | const u8 *ie, int ie_len, | 380 | const u8 *ie, int ie_len, |
380 | const u8 *key, int key_len, int key_idx) | 381 | const u8 *key, int key_len, int key_idx, |
382 | bool local_state_change) | ||
381 | { | 383 | { |
382 | struct wireless_dev *wdev = dev->ieee80211_ptr; | 384 | struct wireless_dev *wdev = dev->ieee80211_ptr; |
383 | struct cfg80211_auth_request req; | 385 | struct cfg80211_auth_request req; |
@@ -407,6 +409,7 @@ int __cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, | |||
407 | 409 | ||
408 | memset(&req, 0, sizeof(req)); | 410 | memset(&req, 0, sizeof(req)); |
409 | 411 | ||
412 | req.local_state_change = local_state_change; | ||
410 | req.ie = ie; | 413 | req.ie = ie; |
411 | req.ie_len = ie_len; | 414 | req.ie_len = ie_len; |
412 | req.auth_type = auth_type; | 415 | req.auth_type = auth_type; |
@@ -433,12 +436,18 @@ int __cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, | |||
433 | goto out; | 436 | goto out; |
434 | } | 437 | } |
435 | 438 | ||
436 | wdev->authtry_bsses[slot] = bss; | 439 | if (local_state_change) |
440 | wdev->auth_bsses[slot] = bss; | ||
441 | else | ||
442 | wdev->authtry_bsses[slot] = bss; | ||
437 | cfg80211_hold_bss(bss); | 443 | cfg80211_hold_bss(bss); |
438 | 444 | ||
439 | err = rdev->ops->auth(&rdev->wiphy, dev, &req); | 445 | err = rdev->ops->auth(&rdev->wiphy, dev, &req); |
440 | if (err) { | 446 | if (err) { |
441 | wdev->authtry_bsses[slot] = NULL; | 447 | if (local_state_change) |
448 | wdev->auth_bsses[slot] = NULL; | ||
449 | else | ||
450 | wdev->authtry_bsses[slot] = NULL; | ||
442 | cfg80211_unhold_bss(bss); | 451 | cfg80211_unhold_bss(bss); |
443 | } | 452 | } |
444 | 453 | ||
@@ -453,14 +462,15 @@ int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, | |||
453 | enum nl80211_auth_type auth_type, const u8 *bssid, | 462 | enum nl80211_auth_type auth_type, const u8 *bssid, |
454 | const u8 *ssid, int ssid_len, | 463 | const u8 *ssid, int ssid_len, |
455 | const u8 *ie, int ie_len, | 464 | const u8 *ie, int ie_len, |
456 | const u8 *key, int key_len, int key_idx) | 465 | const u8 *key, int key_len, int key_idx, |
466 | bool local_state_change) | ||
457 | { | 467 | { |
458 | int err; | 468 | int err; |
459 | 469 | ||
460 | wdev_lock(dev->ieee80211_ptr); | 470 | wdev_lock(dev->ieee80211_ptr); |
461 | err = __cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid, | 471 | err = __cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid, |
462 | ssid, ssid_len, ie, ie_len, | 472 | ssid, ssid_len, ie, ie_len, |
463 | key, key_len, key_idx); | 473 | key, key_len, key_idx, local_state_change); |
464 | wdev_unlock(dev->ieee80211_ptr); | 474 | wdev_unlock(dev->ieee80211_ptr); |
465 | 475 | ||
466 | return err; | 476 | return err; |
@@ -554,7 +564,8 @@ int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev, | |||
554 | 564 | ||
555 | int __cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, | 565 | int __cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, |
556 | struct net_device *dev, const u8 *bssid, | 566 | struct net_device *dev, const u8 *bssid, |
557 | const u8 *ie, int ie_len, u16 reason) | 567 | const u8 *ie, int ie_len, u16 reason, |
568 | bool local_state_change) | ||
558 | { | 569 | { |
559 | struct wireless_dev *wdev = dev->ieee80211_ptr; | 570 | struct wireless_dev *wdev = dev->ieee80211_ptr; |
560 | struct cfg80211_deauth_request req; | 571 | struct cfg80211_deauth_request req; |
@@ -564,6 +575,7 @@ int __cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, | |||
564 | 575 | ||
565 | memset(&req, 0, sizeof(req)); | 576 | memset(&req, 0, sizeof(req)); |
566 | req.reason_code = reason; | 577 | req.reason_code = reason; |
578 | req.local_state_change = local_state_change; | ||
567 | req.ie = ie; | 579 | req.ie = ie; |
568 | req.ie_len = ie_len; | 580 | req.ie_len = ie_len; |
569 | if (wdev->current_bss && | 581 | if (wdev->current_bss && |
@@ -590,13 +602,15 @@ int __cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, | |||
590 | 602 | ||
591 | int cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, | 603 | int cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, |
592 | struct net_device *dev, const u8 *bssid, | 604 | struct net_device *dev, const u8 *bssid, |
593 | const u8 *ie, int ie_len, u16 reason) | 605 | const u8 *ie, int ie_len, u16 reason, |
606 | bool local_state_change) | ||
594 | { | 607 | { |
595 | struct wireless_dev *wdev = dev->ieee80211_ptr; | 608 | struct wireless_dev *wdev = dev->ieee80211_ptr; |
596 | int err; | 609 | int err; |
597 | 610 | ||
598 | wdev_lock(wdev); | 611 | wdev_lock(wdev); |
599 | err = __cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason); | 612 | err = __cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason, |
613 | local_state_change); | ||
600 | wdev_unlock(wdev); | 614 | wdev_unlock(wdev); |
601 | 615 | ||
602 | return err; | 616 | return err; |
@@ -604,7 +618,8 @@ int cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, | |||
604 | 618 | ||
605 | static int __cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev, | 619 | static int __cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev, |
606 | struct net_device *dev, const u8 *bssid, | 620 | struct net_device *dev, const u8 *bssid, |
607 | const u8 *ie, int ie_len, u16 reason) | 621 | const u8 *ie, int ie_len, u16 reason, |
622 | bool local_state_change) | ||
608 | { | 623 | { |
609 | struct wireless_dev *wdev = dev->ieee80211_ptr; | 624 | struct wireless_dev *wdev = dev->ieee80211_ptr; |
610 | struct cfg80211_disassoc_request req; | 625 | struct cfg80211_disassoc_request req; |
@@ -619,6 +634,7 @@ static int __cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev, | |||
619 | 634 | ||
620 | memset(&req, 0, sizeof(req)); | 635 | memset(&req, 0, sizeof(req)); |
621 | req.reason_code = reason; | 636 | req.reason_code = reason; |
637 | req.local_state_change = local_state_change; | ||
622 | req.ie = ie; | 638 | req.ie = ie; |
623 | req.ie_len = ie_len; | 639 | req.ie_len = ie_len; |
624 | if (memcmp(wdev->current_bss->pub.bssid, bssid, ETH_ALEN) == 0) | 640 | if (memcmp(wdev->current_bss->pub.bssid, bssid, ETH_ALEN) == 0) |
@@ -631,13 +647,15 @@ static int __cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev, | |||
631 | 647 | ||
632 | int cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev, | 648 | int cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev, |
633 | struct net_device *dev, const u8 *bssid, | 649 | struct net_device *dev, const u8 *bssid, |
634 | const u8 *ie, int ie_len, u16 reason) | 650 | const u8 *ie, int ie_len, u16 reason, |
651 | bool local_state_change) | ||
635 | { | 652 | { |
636 | struct wireless_dev *wdev = dev->ieee80211_ptr; | 653 | struct wireless_dev *wdev = dev->ieee80211_ptr; |
637 | int err; | 654 | int err; |
638 | 655 | ||
639 | wdev_lock(wdev); | 656 | wdev_lock(wdev); |
640 | err = __cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason); | 657 | err = __cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason, |
658 | local_state_change); | ||
641 | wdev_unlock(wdev); | 659 | wdev_unlock(wdev); |
642 | 660 | ||
643 | return err; | 661 | return err; |
@@ -894,3 +912,16 @@ void cfg80211_action_tx_status(struct net_device *dev, u64 cookie, | |||
894 | nl80211_send_action_tx_status(rdev, dev, cookie, buf, len, ack, gfp); | 912 | nl80211_send_action_tx_status(rdev, dev, cookie, buf, len, ack, gfp); |
895 | } | 913 | } |
896 | EXPORT_SYMBOL(cfg80211_action_tx_status); | 914 | EXPORT_SYMBOL(cfg80211_action_tx_status); |
915 | |||
916 | void cfg80211_cqm_rssi_notify(struct net_device *dev, | ||
917 | enum nl80211_cqm_rssi_threshold_event rssi_event, | ||
918 | gfp_t gfp) | ||
919 | { | ||
920 | struct wireless_dev *wdev = dev->ieee80211_ptr; | ||
921 | struct wiphy *wiphy = wdev->wiphy; | ||
922 | struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); | ||
923 | |||
924 | /* Indicate roaming trigger event to user space */ | ||
925 | nl80211_send_cqm_rssi_notify(rdev, dev, rssi_event, gfp); | ||
926 | } | ||
927 | EXPORT_SYMBOL(cfg80211_cqm_rssi_notify); | ||
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index e447db04cf76..356a84a5daee 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -7,6 +7,7 @@ | |||
7 | #include <linux/if.h> | 7 | #include <linux/if.h> |
8 | #include <linux/module.h> | 8 | #include <linux/module.h> |
9 | #include <linux/err.h> | 9 | #include <linux/err.h> |
10 | #include <linux/slab.h> | ||
10 | #include <linux/list.h> | 11 | #include <linux/list.h> |
11 | #include <linux/if_ether.h> | 12 | #include <linux/if_ether.h> |
12 | #include <linux/ieee80211.h> | 13 | #include <linux/ieee80211.h> |
@@ -149,6 +150,8 @@ static const struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] = { | |||
149 | .len = IEEE80211_MAX_DATA_LEN }, | 150 | .len = IEEE80211_MAX_DATA_LEN }, |
150 | [NL80211_ATTR_FRAME_MATCH] = { .type = NLA_BINARY, }, | 151 | [NL80211_ATTR_FRAME_MATCH] = { .type = NLA_BINARY, }, |
151 | [NL80211_ATTR_PS_STATE] = { .type = NLA_U32 }, | 152 | [NL80211_ATTR_PS_STATE] = { .type = NLA_U32 }, |
153 | [NL80211_ATTR_CQM] = { .type = NLA_NESTED, }, | ||
154 | [NL80211_ATTR_LOCAL_STATE_CHANGE] = { .type = NLA_FLAG }, | ||
152 | }; | 155 | }; |
153 | 156 | ||
154 | /* policy for the attributes */ | 157 | /* policy for the attributes */ |
@@ -2095,7 +2098,8 @@ static int nl80211_del_station(struct sk_buff *skb, struct genl_info *info) | |||
2095 | goto out_rtnl; | 2098 | goto out_rtnl; |
2096 | 2099 | ||
2097 | if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && | 2100 | if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && |
2098 | dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN) { | 2101 | dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN && |
2102 | dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) { | ||
2099 | err = -EINVAL; | 2103 | err = -EINVAL; |
2100 | goto out; | 2104 | goto out; |
2101 | } | 2105 | } |
@@ -3391,6 +3395,7 @@ static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info) | |||
3391 | int err, ssid_len, ie_len = 0; | 3395 | int err, ssid_len, ie_len = 0; |
3392 | enum nl80211_auth_type auth_type; | 3396 | enum nl80211_auth_type auth_type; |
3393 | struct key_parse key; | 3397 | struct key_parse key; |
3398 | bool local_state_change; | ||
3394 | 3399 | ||
3395 | if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) | 3400 | if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) |
3396 | return -EINVAL; | 3401 | return -EINVAL; |
@@ -3469,9 +3474,12 @@ static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info) | |||
3469 | goto out; | 3474 | goto out; |
3470 | } | 3475 | } |
3471 | 3476 | ||
3477 | local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; | ||
3478 | |||
3472 | err = cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid, | 3479 | err = cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid, |
3473 | ssid, ssid_len, ie, ie_len, | 3480 | ssid, ssid_len, ie, ie_len, |
3474 | key.p.key, key.p.key_len, key.idx); | 3481 | key.p.key, key.p.key_len, key.idx, |
3482 | local_state_change); | ||
3475 | 3483 | ||
3476 | out: | 3484 | out: |
3477 | cfg80211_unlock_rdev(rdev); | 3485 | cfg80211_unlock_rdev(rdev); |
@@ -3648,6 +3656,7 @@ static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info) | |||
3648 | const u8 *ie = NULL, *bssid; | 3656 | const u8 *ie = NULL, *bssid; |
3649 | int err, ie_len = 0; | 3657 | int err, ie_len = 0; |
3650 | u16 reason_code; | 3658 | u16 reason_code; |
3659 | bool local_state_change; | ||
3651 | 3660 | ||
3652 | if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) | 3661 | if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) |
3653 | return -EINVAL; | 3662 | return -EINVAL; |
@@ -3693,7 +3702,10 @@ static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info) | |||
3693 | ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); | 3702 | ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); |
3694 | } | 3703 | } |
3695 | 3704 | ||
3696 | err = cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason_code); | 3705 | local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; |
3706 | |||
3707 | err = cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason_code, | ||
3708 | local_state_change); | ||
3697 | 3709 | ||
3698 | out: | 3710 | out: |
3699 | cfg80211_unlock_rdev(rdev); | 3711 | cfg80211_unlock_rdev(rdev); |
@@ -3710,6 +3722,7 @@ static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info) | |||
3710 | const u8 *ie = NULL, *bssid; | 3722 | const u8 *ie = NULL, *bssid; |
3711 | int err, ie_len = 0; | 3723 | int err, ie_len = 0; |
3712 | u16 reason_code; | 3724 | u16 reason_code; |
3725 | bool local_state_change; | ||
3713 | 3726 | ||
3714 | if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) | 3727 | if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) |
3715 | return -EINVAL; | 3728 | return -EINVAL; |
@@ -3755,7 +3768,10 @@ static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info) | |||
3755 | ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); | 3768 | ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); |
3756 | } | 3769 | } |
3757 | 3770 | ||
3758 | err = cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason_code); | 3771 | local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; |
3772 | |||
3773 | err = cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason_code, | ||
3774 | local_state_change); | ||
3759 | 3775 | ||
3760 | out: | 3776 | out: |
3761 | cfg80211_unlock_rdev(rdev); | 3777 | cfg80211_unlock_rdev(rdev); |
@@ -4778,6 +4794,84 @@ unlock_rtnl: | |||
4778 | return err; | 4794 | return err; |
4779 | } | 4795 | } |
4780 | 4796 | ||
4797 | static struct nla_policy | ||
4798 | nl80211_attr_cqm_policy[NL80211_ATTR_CQM_MAX + 1] __read_mostly = { | ||
4799 | [NL80211_ATTR_CQM_RSSI_THOLD] = { .type = NLA_U32 }, | ||
4800 | [NL80211_ATTR_CQM_RSSI_HYST] = { .type = NLA_U32 }, | ||
4801 | [NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT] = { .type = NLA_U32 }, | ||
4802 | }; | ||
4803 | |||
4804 | static int nl80211_set_cqm_rssi(struct genl_info *info, | ||
4805 | s32 threshold, u32 hysteresis) | ||
4806 | { | ||
4807 | struct cfg80211_registered_device *rdev; | ||
4808 | struct wireless_dev *wdev; | ||
4809 | struct net_device *dev; | ||
4810 | int err; | ||
4811 | |||
4812 | if (threshold > 0) | ||
4813 | return -EINVAL; | ||
4814 | |||
4815 | rtnl_lock(); | ||
4816 | |||
4817 | err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev); | ||
4818 | if (err) | ||
4819 | goto unlock_rdev; | ||
4820 | |||
4821 | wdev = dev->ieee80211_ptr; | ||
4822 | |||
4823 | if (!rdev->ops->set_cqm_rssi_config) { | ||
4824 | err = -EOPNOTSUPP; | ||
4825 | goto unlock_rdev; | ||
4826 | } | ||
4827 | |||
4828 | if (wdev->iftype != NL80211_IFTYPE_STATION) { | ||
4829 | err = -EOPNOTSUPP; | ||
4830 | goto unlock_rdev; | ||
4831 | } | ||
4832 | |||
4833 | err = rdev->ops->set_cqm_rssi_config(wdev->wiphy, dev, | ||
4834 | threshold, hysteresis); | ||
4835 | |||
4836 | unlock_rdev: | ||
4837 | cfg80211_unlock_rdev(rdev); | ||
4838 | dev_put(dev); | ||
4839 | rtnl_unlock(); | ||
4840 | |||
4841 | return err; | ||
4842 | } | ||
4843 | |||
4844 | static int nl80211_set_cqm(struct sk_buff *skb, struct genl_info *info) | ||
4845 | { | ||
4846 | struct nlattr *attrs[NL80211_ATTR_CQM_MAX + 1]; | ||
4847 | struct nlattr *cqm; | ||
4848 | int err; | ||
4849 | |||
4850 | cqm = info->attrs[NL80211_ATTR_CQM]; | ||
4851 | if (!cqm) { | ||
4852 | err = -EINVAL; | ||
4853 | goto out; | ||
4854 | } | ||
4855 | |||
4856 | err = nla_parse_nested(attrs, NL80211_ATTR_CQM_MAX, cqm, | ||
4857 | nl80211_attr_cqm_policy); | ||
4858 | if (err) | ||
4859 | goto out; | ||
4860 | |||
4861 | if (attrs[NL80211_ATTR_CQM_RSSI_THOLD] && | ||
4862 | attrs[NL80211_ATTR_CQM_RSSI_HYST]) { | ||
4863 | s32 threshold; | ||
4864 | u32 hysteresis; | ||
4865 | threshold = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_THOLD]); | ||
4866 | hysteresis = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_HYST]); | ||
4867 | err = nl80211_set_cqm_rssi(info, threshold, hysteresis); | ||
4868 | } else | ||
4869 | err = -EINVAL; | ||
4870 | |||
4871 | out: | ||
4872 | return err; | ||
4873 | } | ||
4874 | |||
4781 | static struct genl_ops nl80211_ops[] = { | 4875 | static struct genl_ops nl80211_ops[] = { |
4782 | { | 4876 | { |
4783 | .cmd = NL80211_CMD_GET_WIPHY, | 4877 | .cmd = NL80211_CMD_GET_WIPHY, |
@@ -5082,6 +5176,12 @@ static struct genl_ops nl80211_ops[] = { | |||
5082 | .policy = nl80211_policy, | 5176 | .policy = nl80211_policy, |
5083 | /* can be retrieved by unprivileged users */ | 5177 | /* can be retrieved by unprivileged users */ |
5084 | }, | 5178 | }, |
5179 | { | ||
5180 | .cmd = NL80211_CMD_SET_CQM, | ||
5181 | .doit = nl80211_set_cqm, | ||
5182 | .policy = nl80211_policy, | ||
5183 | .flags = GENL_ADMIN_PERM, | ||
5184 | }, | ||
5085 | }; | 5185 | }; |
5086 | 5186 | ||
5087 | static struct genl_multicast_group nl80211_mlme_mcgrp = { | 5187 | static struct genl_multicast_group nl80211_mlme_mcgrp = { |
@@ -5832,6 +5932,52 @@ void nl80211_send_action_tx_status(struct cfg80211_registered_device *rdev, | |||
5832 | nlmsg_free(msg); | 5932 | nlmsg_free(msg); |
5833 | } | 5933 | } |
5834 | 5934 | ||
5935 | void | ||
5936 | nl80211_send_cqm_rssi_notify(struct cfg80211_registered_device *rdev, | ||
5937 | struct net_device *netdev, | ||
5938 | enum nl80211_cqm_rssi_threshold_event rssi_event, | ||
5939 | gfp_t gfp) | ||
5940 | { | ||
5941 | struct sk_buff *msg; | ||
5942 | struct nlattr *pinfoattr; | ||
5943 | void *hdr; | ||
5944 | |||
5945 | msg = nlmsg_new(NLMSG_GOODSIZE, gfp); | ||
5946 | if (!msg) | ||
5947 | return; | ||
5948 | |||
5949 | hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NOTIFY_CQM); | ||
5950 | if (!hdr) { | ||
5951 | nlmsg_free(msg); | ||
5952 | return; | ||
5953 | } | ||
5954 | |||
5955 | NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx); | ||
5956 | NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex); | ||
5957 | |||
5958 | pinfoattr = nla_nest_start(msg, NL80211_ATTR_CQM); | ||
5959 | if (!pinfoattr) | ||
5960 | goto nla_put_failure; | ||
5961 | |||
5962 | NLA_PUT_U32(msg, NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT, | ||
5963 | rssi_event); | ||
5964 | |||
5965 | nla_nest_end(msg, pinfoattr); | ||
5966 | |||
5967 | if (genlmsg_end(msg, hdr) < 0) { | ||
5968 | nlmsg_free(msg); | ||
5969 | return; | ||
5970 | } | ||
5971 | |||
5972 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, | ||
5973 | nl80211_mlme_mcgrp.id, gfp); | ||
5974 | return; | ||
5975 | |||
5976 | nla_put_failure: | ||
5977 | genlmsg_cancel(msg, hdr); | ||
5978 | nlmsg_free(msg); | ||
5979 | } | ||
5980 | |||
5835 | static int nl80211_netlink_notify(struct notifier_block * nb, | 5981 | static int nl80211_netlink_notify(struct notifier_block * nb, |
5836 | unsigned long state, | 5982 | unsigned long state, |
5837 | void *_notify) | 5983 | void *_notify) |
diff --git a/net/wireless/nl80211.h b/net/wireless/nl80211.h index 4ca511102c6c..2ad7fbc7d9f1 100644 --- a/net/wireless/nl80211.h +++ b/net/wireless/nl80211.h | |||
@@ -82,4 +82,10 @@ void nl80211_send_action_tx_status(struct cfg80211_registered_device *rdev, | |||
82 | const u8 *buf, size_t len, bool ack, | 82 | const u8 *buf, size_t len, bool ack, |
83 | gfp_t gfp); | 83 | gfp_t gfp); |
84 | 84 | ||
85 | void | ||
86 | nl80211_send_cqm_rssi_notify(struct cfg80211_registered_device *rdev, | ||
87 | struct net_device *netdev, | ||
88 | enum nl80211_cqm_rssi_threshold_event rssi_event, | ||
89 | gfp_t gfp); | ||
90 | |||
85 | #endif /* __NET_WIRELESS_NL80211_H */ | 91 | #endif /* __NET_WIRELESS_NL80211_H */ |
diff --git a/net/wireless/reg.c b/net/wireless/reg.c index ed89c59bb431..8f0d97dd3109 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c | |||
@@ -33,6 +33,7 @@ | |||
33 | * | 33 | * |
34 | */ | 34 | */ |
35 | #include <linux/kernel.h> | 35 | #include <linux/kernel.h> |
36 | #include <linux/slab.h> | ||
36 | #include <linux/list.h> | 37 | #include <linux/list.h> |
37 | #include <linux/random.h> | 38 | #include <linux/random.h> |
38 | #include <linux/nl80211.h> | 39 | #include <linux/nl80211.h> |
@@ -324,7 +325,7 @@ struct reg_regdb_search_request { | |||
324 | }; | 325 | }; |
325 | 326 | ||
326 | static LIST_HEAD(reg_regdb_search_list); | 327 | static LIST_HEAD(reg_regdb_search_list); |
327 | static DEFINE_SPINLOCK(reg_regdb_search_lock); | 328 | static DEFINE_MUTEX(reg_regdb_search_mutex); |
328 | 329 | ||
329 | static void reg_regdb_search(struct work_struct *work) | 330 | static void reg_regdb_search(struct work_struct *work) |
330 | { | 331 | { |
@@ -332,7 +333,7 @@ static void reg_regdb_search(struct work_struct *work) | |||
332 | const struct ieee80211_regdomain *curdom, *regdom; | 333 | const struct ieee80211_regdomain *curdom, *regdom; |
333 | int i, r; | 334 | int i, r; |
334 | 335 | ||
335 | spin_lock(®_regdb_search_lock); | 336 | mutex_lock(®_regdb_search_mutex); |
336 | while (!list_empty(®_regdb_search_list)) { | 337 | while (!list_empty(®_regdb_search_list)) { |
337 | request = list_first_entry(®_regdb_search_list, | 338 | request = list_first_entry(®_regdb_search_list, |
338 | struct reg_regdb_search_request, | 339 | struct reg_regdb_search_request, |
@@ -346,18 +347,16 @@ static void reg_regdb_search(struct work_struct *work) | |||
346 | r = reg_copy_regd(®dom, curdom); | 347 | r = reg_copy_regd(®dom, curdom); |
347 | if (r) | 348 | if (r) |
348 | break; | 349 | break; |
349 | spin_unlock(®_regdb_search_lock); | ||
350 | mutex_lock(&cfg80211_mutex); | 350 | mutex_lock(&cfg80211_mutex); |
351 | set_regdom(regdom); | 351 | set_regdom(regdom); |
352 | mutex_unlock(&cfg80211_mutex); | 352 | mutex_unlock(&cfg80211_mutex); |
353 | spin_lock(®_regdb_search_lock); | ||
354 | break; | 353 | break; |
355 | } | 354 | } |
356 | } | 355 | } |
357 | 356 | ||
358 | kfree(request); | 357 | kfree(request); |
359 | } | 358 | } |
360 | spin_unlock(®_regdb_search_lock); | 359 | mutex_unlock(®_regdb_search_mutex); |
361 | } | 360 | } |
362 | 361 | ||
363 | static DECLARE_WORK(reg_regdb_work, reg_regdb_search); | 362 | static DECLARE_WORK(reg_regdb_work, reg_regdb_search); |
@@ -375,9 +374,9 @@ static void reg_regdb_query(const char *alpha2) | |||
375 | 374 | ||
376 | memcpy(request->alpha2, alpha2, 2); | 375 | memcpy(request->alpha2, alpha2, 2); |
377 | 376 | ||
378 | spin_lock(®_regdb_search_lock); | 377 | mutex_lock(®_regdb_search_mutex); |
379 | list_add_tail(&request->list, ®_regdb_search_list); | 378 | list_add_tail(&request->list, ®_regdb_search_list); |
380 | spin_unlock(®_regdb_search_lock); | 379 | mutex_unlock(®_regdb_search_mutex); |
381 | 380 | ||
382 | schedule_work(®_regdb_work); | 381 | schedule_work(®_regdb_work); |
383 | } | 382 | } |
@@ -2357,10 +2356,10 @@ static void print_regdomain(const struct ieee80211_regdomain *rd) | |||
2357 | rdev->country_ie_alpha2[1]); | 2356 | rdev->country_ie_alpha2[1]); |
2358 | } else | 2357 | } else |
2359 | printk(KERN_INFO "cfg80211: Current regulatory " | 2358 | printk(KERN_INFO "cfg80211: Current regulatory " |
2360 | "domain intersected: \n"); | 2359 | "domain intersected:\n"); |
2361 | } else | 2360 | } else |
2362 | printk(KERN_INFO "cfg80211: Current regulatory " | 2361 | printk(KERN_INFO "cfg80211: Current regulatory " |
2363 | "domain intersected: \n"); | 2362 | "domain intersected:\n"); |
2364 | } else if (is_world_regdom(rd->alpha2)) | 2363 | } else if (is_world_regdom(rd->alpha2)) |
2365 | printk(KERN_INFO "cfg80211: World regulatory " | 2364 | printk(KERN_INFO "cfg80211: World regulatory " |
2366 | "domain updated:\n"); | 2365 | "domain updated:\n"); |
diff --git a/net/wireless/scan.c b/net/wireless/scan.c index 978cac3414b5..a026c6d56bd3 100644 --- a/net/wireless/scan.c +++ b/net/wireless/scan.c | |||
@@ -4,6 +4,7 @@ | |||
4 | * Copyright 2008 Johannes Berg <johannes@sipsolutions.net> | 4 | * Copyright 2008 Johannes Berg <johannes@sipsolutions.net> |
5 | */ | 5 | */ |
6 | #include <linux/kernel.h> | 6 | #include <linux/kernel.h> |
7 | #include <linux/slab.h> | ||
7 | #include <linux/module.h> | 8 | #include <linux/module.h> |
8 | #include <linux/netdevice.h> | 9 | #include <linux/netdevice.h> |
9 | #include <linux/wireless.h> | 10 | #include <linux/wireless.h> |
diff --git a/net/wireless/sme.c b/net/wireless/sme.c index 17fde0da1b08..c2735775ec19 100644 --- a/net/wireless/sme.c +++ b/net/wireless/sme.c | |||
@@ -7,6 +7,7 @@ | |||
7 | 7 | ||
8 | #include <linux/etherdevice.h> | 8 | #include <linux/etherdevice.h> |
9 | #include <linux/if_arp.h> | 9 | #include <linux/if_arp.h> |
10 | #include <linux/slab.h> | ||
10 | #include <linux/workqueue.h> | 11 | #include <linux/workqueue.h> |
11 | #include <linux/wireless.h> | 12 | #include <linux/wireless.h> |
12 | #include <net/iw_handler.h> | 13 | #include <net/iw_handler.h> |
@@ -170,7 +171,7 @@ static int cfg80211_conn_do_work(struct wireless_dev *wdev) | |||
170 | params->ssid, params->ssid_len, | 171 | params->ssid, params->ssid_len, |
171 | NULL, 0, | 172 | NULL, 0, |
172 | params->key, params->key_len, | 173 | params->key, params->key_len, |
173 | params->key_idx); | 174 | params->key_idx, false); |
174 | case CFG80211_CONN_ASSOCIATE_NEXT: | 175 | case CFG80211_CONN_ASSOCIATE_NEXT: |
175 | BUG_ON(!rdev->ops->assoc); | 176 | BUG_ON(!rdev->ops->assoc); |
176 | wdev->conn->state = CFG80211_CONN_ASSOCIATING; | 177 | wdev->conn->state = CFG80211_CONN_ASSOCIATING; |
@@ -185,12 +186,13 @@ static int cfg80211_conn_do_work(struct wireless_dev *wdev) | |||
185 | if (err) | 186 | if (err) |
186 | __cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid, | 187 | __cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid, |
187 | NULL, 0, | 188 | NULL, 0, |
188 | WLAN_REASON_DEAUTH_LEAVING); | 189 | WLAN_REASON_DEAUTH_LEAVING, |
190 | false); | ||
189 | return err; | 191 | return err; |
190 | case CFG80211_CONN_DEAUTH_ASSOC_FAIL: | 192 | case CFG80211_CONN_DEAUTH_ASSOC_FAIL: |
191 | __cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid, | 193 | __cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid, |
192 | NULL, 0, | 194 | NULL, 0, |
193 | WLAN_REASON_DEAUTH_LEAVING); | 195 | WLAN_REASON_DEAUTH_LEAVING, false); |
194 | /* return an error so that we call __cfg80211_connect_result() */ | 196 | /* return an error so that we call __cfg80211_connect_result() */ |
195 | return -EINVAL; | 197 | return -EINVAL; |
196 | default: | 198 | default: |
@@ -675,7 +677,8 @@ void __cfg80211_disconnected(struct net_device *dev, const u8 *ie, | |||
675 | continue; | 677 | continue; |
676 | bssid = wdev->auth_bsses[i]->pub.bssid; | 678 | bssid = wdev->auth_bsses[i]->pub.bssid; |
677 | ret = __cfg80211_mlme_deauth(rdev, dev, bssid, NULL, 0, | 679 | ret = __cfg80211_mlme_deauth(rdev, dev, bssid, NULL, 0, |
678 | WLAN_REASON_DEAUTH_LEAVING); | 680 | WLAN_REASON_DEAUTH_LEAVING, |
681 | false); | ||
679 | WARN(ret, "deauth failed: %d\n", ret); | 682 | WARN(ret, "deauth failed: %d\n", ret); |
680 | } | 683 | } |
681 | } | 684 | } |
@@ -934,7 +937,7 @@ int __cfg80211_disconnect(struct cfg80211_registered_device *rdev, | |||
934 | /* wdev->conn->params.bssid must be set if > SCANNING */ | 937 | /* wdev->conn->params.bssid must be set if > SCANNING */ |
935 | err = __cfg80211_mlme_deauth(rdev, dev, | 938 | err = __cfg80211_mlme_deauth(rdev, dev, |
936 | wdev->conn->params.bssid, | 939 | wdev->conn->params.bssid, |
937 | NULL, 0, reason); | 940 | NULL, 0, reason, false); |
938 | if (err) | 941 | if (err) |
939 | return err; | 942 | return err; |
940 | } else { | 943 | } else { |
@@ -990,7 +993,8 @@ void cfg80211_sme_disassoc(struct net_device *dev, int idx) | |||
990 | 993 | ||
991 | memcpy(bssid, wdev->auth_bsses[idx]->pub.bssid, ETH_ALEN); | 994 | memcpy(bssid, wdev->auth_bsses[idx]->pub.bssid, ETH_ALEN); |
992 | if (__cfg80211_mlme_deauth(rdev, dev, bssid, | 995 | if (__cfg80211_mlme_deauth(rdev, dev, bssid, |
993 | NULL, 0, WLAN_REASON_DEAUTH_LEAVING)) { | 996 | NULL, 0, WLAN_REASON_DEAUTH_LEAVING, |
997 | false)) { | ||
994 | /* whatever -- assume gone anyway */ | 998 | /* whatever -- assume gone anyway */ |
995 | cfg80211_unhold_bss(wdev->auth_bsses[idx]); | 999 | cfg80211_unhold_bss(wdev->auth_bsses[idx]); |
996 | cfg80211_put_bss(&wdev->auth_bsses[idx]->pub); | 1000 | cfg80211_put_bss(&wdev->auth_bsses[idx]->pub); |
diff --git a/net/wireless/util.c b/net/wireless/util.c index be2ab8c59e3a..3416373a9c0c 100644 --- a/net/wireless/util.c +++ b/net/wireless/util.c | |||
@@ -5,6 +5,7 @@ | |||
5 | */ | 5 | */ |
6 | #include <linux/bitops.h> | 6 | #include <linux/bitops.h> |
7 | #include <linux/etherdevice.h> | 7 | #include <linux/etherdevice.h> |
8 | #include <linux/slab.h> | ||
8 | #include <net/cfg80211.h> | 9 | #include <net/cfg80211.h> |
9 | #include <net/ip.h> | 10 | #include <net/ip.h> |
10 | #include "core.h" | 11 | #include "core.h" |
@@ -330,11 +331,18 @@ int ieee80211_data_to_8023(struct sk_buff *skb, const u8 *addr, | |||
330 | if (iftype == NL80211_IFTYPE_MESH_POINT) { | 331 | if (iftype == NL80211_IFTYPE_MESH_POINT) { |
331 | struct ieee80211s_hdr *meshdr = | 332 | struct ieee80211s_hdr *meshdr = |
332 | (struct ieee80211s_hdr *) (skb->data + hdrlen); | 333 | (struct ieee80211s_hdr *) (skb->data + hdrlen); |
333 | hdrlen += ieee80211_get_mesh_hdrlen(meshdr); | 334 | /* make sure meshdr->flags is on the linear part */ |
335 | if (!pskb_may_pull(skb, hdrlen + 1)) | ||
336 | return -1; | ||
334 | if (meshdr->flags & MESH_FLAGS_AE_A5_A6) { | 337 | if (meshdr->flags & MESH_FLAGS_AE_A5_A6) { |
335 | memcpy(dst, meshdr->eaddr1, ETH_ALEN); | 338 | skb_copy_bits(skb, hdrlen + |
336 | memcpy(src, meshdr->eaddr2, ETH_ALEN); | 339 | offsetof(struct ieee80211s_hdr, eaddr1), |
340 | dst, ETH_ALEN); | ||
341 | skb_copy_bits(skb, hdrlen + | ||
342 | offsetof(struct ieee80211s_hdr, eaddr2), | ||
343 | src, ETH_ALEN); | ||
337 | } | 344 | } |
345 | hdrlen += ieee80211_get_mesh_hdrlen(meshdr); | ||
338 | } | 346 | } |
339 | break; | 347 | break; |
340 | case cpu_to_le16(IEEE80211_FCTL_FROMDS): | 348 | case cpu_to_le16(IEEE80211_FCTL_FROMDS): |
@@ -346,9 +354,14 @@ int ieee80211_data_to_8023(struct sk_buff *skb, const u8 *addr, | |||
346 | if (iftype == NL80211_IFTYPE_MESH_POINT) { | 354 | if (iftype == NL80211_IFTYPE_MESH_POINT) { |
347 | struct ieee80211s_hdr *meshdr = | 355 | struct ieee80211s_hdr *meshdr = |
348 | (struct ieee80211s_hdr *) (skb->data + hdrlen); | 356 | (struct ieee80211s_hdr *) (skb->data + hdrlen); |
349 | hdrlen += ieee80211_get_mesh_hdrlen(meshdr); | 357 | /* make sure meshdr->flags is on the linear part */ |
358 | if (!pskb_may_pull(skb, hdrlen + 1)) | ||
359 | return -1; | ||
350 | if (meshdr->flags & MESH_FLAGS_AE_A4) | 360 | if (meshdr->flags & MESH_FLAGS_AE_A4) |
351 | memcpy(src, meshdr->eaddr1, ETH_ALEN); | 361 | skb_copy_bits(skb, hdrlen + |
362 | offsetof(struct ieee80211s_hdr, eaddr1), | ||
363 | src, ETH_ALEN); | ||
364 | hdrlen += ieee80211_get_mesh_hdrlen(meshdr); | ||
352 | } | 365 | } |
353 | break; | 366 | break; |
354 | case cpu_to_le16(0): | 367 | case cpu_to_le16(0): |
@@ -357,7 +370,7 @@ int ieee80211_data_to_8023(struct sk_buff *skb, const u8 *addr, | |||
357 | break; | 370 | break; |
358 | } | 371 | } |
359 | 372 | ||
360 | if (unlikely(skb->len - hdrlen < 8)) | 373 | if (!pskb_may_pull(skb, hdrlen + 8)) |
361 | return -1; | 374 | return -1; |
362 | 375 | ||
363 | payload = skb->data + hdrlen; | 376 | payload = skb->data + hdrlen; |
diff --git a/net/wireless/wext-compat.c b/net/wireless/wext-compat.c index 9ab51838849e..a60a2773b497 100644 --- a/net/wireless/wext-compat.c +++ b/net/wireless/wext-compat.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <linux/nl80211.h> | 12 | #include <linux/nl80211.h> |
13 | #include <linux/if_arp.h> | 13 | #include <linux/if_arp.h> |
14 | #include <linux/etherdevice.h> | 14 | #include <linux/etherdevice.h> |
15 | #include <linux/slab.h> | ||
15 | #include <net/iw_handler.h> | 16 | #include <net/iw_handler.h> |
16 | #include <net/cfg80211.h> | 17 | #include <net/cfg80211.h> |
17 | #include "wext-compat.h" | 18 | #include "wext-compat.h" |
diff --git a/net/wireless/wext-core.c b/net/wireless/wext-core.c index 5e1656bdf23b..0ef17bc42bac 100644 --- a/net/wireless/wext-core.c +++ b/net/wireless/wext-core.c | |||
@@ -10,6 +10,7 @@ | |||
10 | #include <linux/kernel.h> | 10 | #include <linux/kernel.h> |
11 | #include <linux/netdevice.h> | 11 | #include <linux/netdevice.h> |
12 | #include <linux/rtnetlink.h> | 12 | #include <linux/rtnetlink.h> |
13 | #include <linux/slab.h> | ||
13 | #include <linux/wireless.h> | 14 | #include <linux/wireless.h> |
14 | #include <linux/uaccess.h> | 15 | #include <linux/uaccess.h> |
15 | #include <net/cfg80211.h> | 16 | #include <net/cfg80211.h> |
@@ -28,226 +29,226 @@ typedef int (*wext_ioctl_func)(struct net_device *, struct iwreq *, | |||
28 | * know about. | 29 | * know about. |
29 | */ | 30 | */ |
30 | static const struct iw_ioctl_description standard_ioctl[] = { | 31 | static const struct iw_ioctl_description standard_ioctl[] = { |
31 | [SIOCSIWCOMMIT - SIOCIWFIRST] = { | 32 | [IW_IOCTL_IDX(SIOCSIWCOMMIT)] = { |
32 | .header_type = IW_HEADER_TYPE_NULL, | 33 | .header_type = IW_HEADER_TYPE_NULL, |
33 | }, | 34 | }, |
34 | [SIOCGIWNAME - SIOCIWFIRST] = { | 35 | [IW_IOCTL_IDX(SIOCGIWNAME)] = { |
35 | .header_type = IW_HEADER_TYPE_CHAR, | 36 | .header_type = IW_HEADER_TYPE_CHAR, |
36 | .flags = IW_DESCR_FLAG_DUMP, | 37 | .flags = IW_DESCR_FLAG_DUMP, |
37 | }, | 38 | }, |
38 | [SIOCSIWNWID - SIOCIWFIRST] = { | 39 | [IW_IOCTL_IDX(SIOCSIWNWID)] = { |
39 | .header_type = IW_HEADER_TYPE_PARAM, | 40 | .header_type = IW_HEADER_TYPE_PARAM, |
40 | .flags = IW_DESCR_FLAG_EVENT, | 41 | .flags = IW_DESCR_FLAG_EVENT, |
41 | }, | 42 | }, |
42 | [SIOCGIWNWID - SIOCIWFIRST] = { | 43 | [IW_IOCTL_IDX(SIOCGIWNWID)] = { |
43 | .header_type = IW_HEADER_TYPE_PARAM, | 44 | .header_type = IW_HEADER_TYPE_PARAM, |
44 | .flags = IW_DESCR_FLAG_DUMP, | 45 | .flags = IW_DESCR_FLAG_DUMP, |
45 | }, | 46 | }, |
46 | [SIOCSIWFREQ - SIOCIWFIRST] = { | 47 | [IW_IOCTL_IDX(SIOCSIWFREQ)] = { |
47 | .header_type = IW_HEADER_TYPE_FREQ, | 48 | .header_type = IW_HEADER_TYPE_FREQ, |
48 | .flags = IW_DESCR_FLAG_EVENT, | 49 | .flags = IW_DESCR_FLAG_EVENT, |
49 | }, | 50 | }, |
50 | [SIOCGIWFREQ - SIOCIWFIRST] = { | 51 | [IW_IOCTL_IDX(SIOCGIWFREQ)] = { |
51 | .header_type = IW_HEADER_TYPE_FREQ, | 52 | .header_type = IW_HEADER_TYPE_FREQ, |
52 | .flags = IW_DESCR_FLAG_DUMP, | 53 | .flags = IW_DESCR_FLAG_DUMP, |
53 | }, | 54 | }, |
54 | [SIOCSIWMODE - SIOCIWFIRST] = { | 55 | [IW_IOCTL_IDX(SIOCSIWMODE)] = { |
55 | .header_type = IW_HEADER_TYPE_UINT, | 56 | .header_type = IW_HEADER_TYPE_UINT, |
56 | .flags = IW_DESCR_FLAG_EVENT, | 57 | .flags = IW_DESCR_FLAG_EVENT, |
57 | }, | 58 | }, |
58 | [SIOCGIWMODE - SIOCIWFIRST] = { | 59 | [IW_IOCTL_IDX(SIOCGIWMODE)] = { |
59 | .header_type = IW_HEADER_TYPE_UINT, | 60 | .header_type = IW_HEADER_TYPE_UINT, |
60 | .flags = IW_DESCR_FLAG_DUMP, | 61 | .flags = IW_DESCR_FLAG_DUMP, |
61 | }, | 62 | }, |
62 | [SIOCSIWSENS - SIOCIWFIRST] = { | 63 | [IW_IOCTL_IDX(SIOCSIWSENS)] = { |
63 | .header_type = IW_HEADER_TYPE_PARAM, | 64 | .header_type = IW_HEADER_TYPE_PARAM, |
64 | }, | 65 | }, |
65 | [SIOCGIWSENS - SIOCIWFIRST] = { | 66 | [IW_IOCTL_IDX(SIOCGIWSENS)] = { |
66 | .header_type = IW_HEADER_TYPE_PARAM, | 67 | .header_type = IW_HEADER_TYPE_PARAM, |
67 | }, | 68 | }, |
68 | [SIOCSIWRANGE - SIOCIWFIRST] = { | 69 | [IW_IOCTL_IDX(SIOCSIWRANGE)] = { |
69 | .header_type = IW_HEADER_TYPE_NULL, | 70 | .header_type = IW_HEADER_TYPE_NULL, |
70 | }, | 71 | }, |
71 | [SIOCGIWRANGE - SIOCIWFIRST] = { | 72 | [IW_IOCTL_IDX(SIOCGIWRANGE)] = { |
72 | .header_type = IW_HEADER_TYPE_POINT, | 73 | .header_type = IW_HEADER_TYPE_POINT, |
73 | .token_size = 1, | 74 | .token_size = 1, |
74 | .max_tokens = sizeof(struct iw_range), | 75 | .max_tokens = sizeof(struct iw_range), |
75 | .flags = IW_DESCR_FLAG_DUMP, | 76 | .flags = IW_DESCR_FLAG_DUMP, |
76 | }, | 77 | }, |
77 | [SIOCSIWPRIV - SIOCIWFIRST] = { | 78 | [IW_IOCTL_IDX(SIOCSIWPRIV)] = { |
78 | .header_type = IW_HEADER_TYPE_NULL, | 79 | .header_type = IW_HEADER_TYPE_NULL, |
79 | }, | 80 | }, |
80 | [SIOCGIWPRIV - SIOCIWFIRST] = { /* (handled directly by us) */ | 81 | [IW_IOCTL_IDX(SIOCGIWPRIV)] = { /* (handled directly by us) */ |
81 | .header_type = IW_HEADER_TYPE_POINT, | 82 | .header_type = IW_HEADER_TYPE_POINT, |
82 | .token_size = sizeof(struct iw_priv_args), | 83 | .token_size = sizeof(struct iw_priv_args), |
83 | .max_tokens = 16, | 84 | .max_tokens = 16, |
84 | .flags = IW_DESCR_FLAG_NOMAX, | 85 | .flags = IW_DESCR_FLAG_NOMAX, |
85 | }, | 86 | }, |
86 | [SIOCSIWSTATS - SIOCIWFIRST] = { | 87 | [IW_IOCTL_IDX(SIOCSIWSTATS)] = { |
87 | .header_type = IW_HEADER_TYPE_NULL, | 88 | .header_type = IW_HEADER_TYPE_NULL, |
88 | }, | 89 | }, |
89 | [SIOCGIWSTATS - SIOCIWFIRST] = { /* (handled directly by us) */ | 90 | [IW_IOCTL_IDX(SIOCGIWSTATS)] = { /* (handled directly by us) */ |
90 | .header_type = IW_HEADER_TYPE_POINT, | 91 | .header_type = IW_HEADER_TYPE_POINT, |
91 | .token_size = 1, | 92 | .token_size = 1, |
92 | .max_tokens = sizeof(struct iw_statistics), | 93 | .max_tokens = sizeof(struct iw_statistics), |
93 | .flags = IW_DESCR_FLAG_DUMP, | 94 | .flags = IW_DESCR_FLAG_DUMP, |
94 | }, | 95 | }, |
95 | [SIOCSIWSPY - SIOCIWFIRST] = { | 96 | [IW_IOCTL_IDX(SIOCSIWSPY)] = { |
96 | .header_type = IW_HEADER_TYPE_POINT, | 97 | .header_type = IW_HEADER_TYPE_POINT, |
97 | .token_size = sizeof(struct sockaddr), | 98 | .token_size = sizeof(struct sockaddr), |
98 | .max_tokens = IW_MAX_SPY, | 99 | .max_tokens = IW_MAX_SPY, |
99 | }, | 100 | }, |
100 | [SIOCGIWSPY - SIOCIWFIRST] = { | 101 | [IW_IOCTL_IDX(SIOCGIWSPY)] = { |
101 | .header_type = IW_HEADER_TYPE_POINT, | 102 | .header_type = IW_HEADER_TYPE_POINT, |
102 | .token_size = sizeof(struct sockaddr) + | 103 | .token_size = sizeof(struct sockaddr) + |
103 | sizeof(struct iw_quality), | 104 | sizeof(struct iw_quality), |
104 | .max_tokens = IW_MAX_SPY, | 105 | .max_tokens = IW_MAX_SPY, |
105 | }, | 106 | }, |
106 | [SIOCSIWTHRSPY - SIOCIWFIRST] = { | 107 | [IW_IOCTL_IDX(SIOCSIWTHRSPY)] = { |
107 | .header_type = IW_HEADER_TYPE_POINT, | 108 | .header_type = IW_HEADER_TYPE_POINT, |
108 | .token_size = sizeof(struct iw_thrspy), | 109 | .token_size = sizeof(struct iw_thrspy), |
109 | .min_tokens = 1, | 110 | .min_tokens = 1, |
110 | .max_tokens = 1, | 111 | .max_tokens = 1, |
111 | }, | 112 | }, |
112 | [SIOCGIWTHRSPY - SIOCIWFIRST] = { | 113 | [IW_IOCTL_IDX(SIOCGIWTHRSPY)] = { |
113 | .header_type = IW_HEADER_TYPE_POINT, | 114 | .header_type = IW_HEADER_TYPE_POINT, |
114 | .token_size = sizeof(struct iw_thrspy), | 115 | .token_size = sizeof(struct iw_thrspy), |
115 | .min_tokens = 1, | 116 | .min_tokens = 1, |
116 | .max_tokens = 1, | 117 | .max_tokens = 1, |
117 | }, | 118 | }, |
118 | [SIOCSIWAP - SIOCIWFIRST] = { | 119 | [IW_IOCTL_IDX(SIOCSIWAP)] = { |
119 | .header_type = IW_HEADER_TYPE_ADDR, | 120 | .header_type = IW_HEADER_TYPE_ADDR, |
120 | }, | 121 | }, |
121 | [SIOCGIWAP - SIOCIWFIRST] = { | 122 | [IW_IOCTL_IDX(SIOCGIWAP)] = { |
122 | .header_type = IW_HEADER_TYPE_ADDR, | 123 | .header_type = IW_HEADER_TYPE_ADDR, |
123 | .flags = IW_DESCR_FLAG_DUMP, | 124 | .flags = IW_DESCR_FLAG_DUMP, |
124 | }, | 125 | }, |
125 | [SIOCSIWMLME - SIOCIWFIRST] = { | 126 | [IW_IOCTL_IDX(SIOCSIWMLME)] = { |
126 | .header_type = IW_HEADER_TYPE_POINT, | 127 | .header_type = IW_HEADER_TYPE_POINT, |
127 | .token_size = 1, | 128 | .token_size = 1, |
128 | .min_tokens = sizeof(struct iw_mlme), | 129 | .min_tokens = sizeof(struct iw_mlme), |
129 | .max_tokens = sizeof(struct iw_mlme), | 130 | .max_tokens = sizeof(struct iw_mlme), |
130 | }, | 131 | }, |
131 | [SIOCGIWAPLIST - SIOCIWFIRST] = { | 132 | [IW_IOCTL_IDX(SIOCGIWAPLIST)] = { |
132 | .header_type = IW_HEADER_TYPE_POINT, | 133 | .header_type = IW_HEADER_TYPE_POINT, |
133 | .token_size = sizeof(struct sockaddr) + | 134 | .token_size = sizeof(struct sockaddr) + |
134 | sizeof(struct iw_quality), | 135 | sizeof(struct iw_quality), |
135 | .max_tokens = IW_MAX_AP, | 136 | .max_tokens = IW_MAX_AP, |
136 | .flags = IW_DESCR_FLAG_NOMAX, | 137 | .flags = IW_DESCR_FLAG_NOMAX, |
137 | }, | 138 | }, |
138 | [SIOCSIWSCAN - SIOCIWFIRST] = { | 139 | [IW_IOCTL_IDX(SIOCSIWSCAN)] = { |
139 | .header_type = IW_HEADER_TYPE_POINT, | 140 | .header_type = IW_HEADER_TYPE_POINT, |
140 | .token_size = 1, | 141 | .token_size = 1, |
141 | .min_tokens = 0, | 142 | .min_tokens = 0, |
142 | .max_tokens = sizeof(struct iw_scan_req), | 143 | .max_tokens = sizeof(struct iw_scan_req), |
143 | }, | 144 | }, |
144 | [SIOCGIWSCAN - SIOCIWFIRST] = { | 145 | [IW_IOCTL_IDX(SIOCGIWSCAN)] = { |
145 | .header_type = IW_HEADER_TYPE_POINT, | 146 | .header_type = IW_HEADER_TYPE_POINT, |
146 | .token_size = 1, | 147 | .token_size = 1, |
147 | .max_tokens = IW_SCAN_MAX_DATA, | 148 | .max_tokens = IW_SCAN_MAX_DATA, |
148 | .flags = IW_DESCR_FLAG_NOMAX, | 149 | .flags = IW_DESCR_FLAG_NOMAX, |
149 | }, | 150 | }, |
150 | [SIOCSIWESSID - SIOCIWFIRST] = { | 151 | [IW_IOCTL_IDX(SIOCSIWESSID)] = { |
151 | .header_type = IW_HEADER_TYPE_POINT, | 152 | .header_type = IW_HEADER_TYPE_POINT, |
152 | .token_size = 1, | 153 | .token_size = 1, |
153 | .max_tokens = IW_ESSID_MAX_SIZE, | 154 | .max_tokens = IW_ESSID_MAX_SIZE, |
154 | .flags = IW_DESCR_FLAG_EVENT, | 155 | .flags = IW_DESCR_FLAG_EVENT, |
155 | }, | 156 | }, |
156 | [SIOCGIWESSID - SIOCIWFIRST] = { | 157 | [IW_IOCTL_IDX(SIOCGIWESSID)] = { |
157 | .header_type = IW_HEADER_TYPE_POINT, | 158 | .header_type = IW_HEADER_TYPE_POINT, |
158 | .token_size = 1, | 159 | .token_size = 1, |
159 | .max_tokens = IW_ESSID_MAX_SIZE, | 160 | .max_tokens = IW_ESSID_MAX_SIZE, |
160 | .flags = IW_DESCR_FLAG_DUMP, | 161 | .flags = IW_DESCR_FLAG_DUMP, |
161 | }, | 162 | }, |
162 | [SIOCSIWNICKN - SIOCIWFIRST] = { | 163 | [IW_IOCTL_IDX(SIOCSIWNICKN)] = { |
163 | .header_type = IW_HEADER_TYPE_POINT, | 164 | .header_type = IW_HEADER_TYPE_POINT, |
164 | .token_size = 1, | 165 | .token_size = 1, |
165 | .max_tokens = IW_ESSID_MAX_SIZE, | 166 | .max_tokens = IW_ESSID_MAX_SIZE, |
166 | }, | 167 | }, |
167 | [SIOCGIWNICKN - SIOCIWFIRST] = { | 168 | [IW_IOCTL_IDX(SIOCGIWNICKN)] = { |
168 | .header_type = IW_HEADER_TYPE_POINT, | 169 | .header_type = IW_HEADER_TYPE_POINT, |
169 | .token_size = 1, | 170 | .token_size = 1, |
170 | .max_tokens = IW_ESSID_MAX_SIZE, | 171 | .max_tokens = IW_ESSID_MAX_SIZE, |
171 | }, | 172 | }, |
172 | [SIOCSIWRATE - SIOCIWFIRST] = { | 173 | [IW_IOCTL_IDX(SIOCSIWRATE)] = { |
173 | .header_type = IW_HEADER_TYPE_PARAM, | 174 | .header_type = IW_HEADER_TYPE_PARAM, |
174 | }, | 175 | }, |
175 | [SIOCGIWRATE - SIOCIWFIRST] = { | 176 | [IW_IOCTL_IDX(SIOCGIWRATE)] = { |
176 | .header_type = IW_HEADER_TYPE_PARAM, | 177 | .header_type = IW_HEADER_TYPE_PARAM, |
177 | }, | 178 | }, |
178 | [SIOCSIWRTS - SIOCIWFIRST] = { | 179 | [IW_IOCTL_IDX(SIOCSIWRTS)] = { |
179 | .header_type = IW_HEADER_TYPE_PARAM, | 180 | .header_type = IW_HEADER_TYPE_PARAM, |
180 | }, | 181 | }, |
181 | [SIOCGIWRTS - SIOCIWFIRST] = { | 182 | [IW_IOCTL_IDX(SIOCGIWRTS)] = { |
182 | .header_type = IW_HEADER_TYPE_PARAM, | 183 | .header_type = IW_HEADER_TYPE_PARAM, |
183 | }, | 184 | }, |
184 | [SIOCSIWFRAG - SIOCIWFIRST] = { | 185 | [IW_IOCTL_IDX(SIOCSIWFRAG)] = { |
185 | .header_type = IW_HEADER_TYPE_PARAM, | 186 | .header_type = IW_HEADER_TYPE_PARAM, |
186 | }, | 187 | }, |
187 | [SIOCGIWFRAG - SIOCIWFIRST] = { | 188 | [IW_IOCTL_IDX(SIOCGIWFRAG)] = { |
188 | .header_type = IW_HEADER_TYPE_PARAM, | 189 | .header_type = IW_HEADER_TYPE_PARAM, |
189 | }, | 190 | }, |
190 | [SIOCSIWTXPOW - SIOCIWFIRST] = { | 191 | [IW_IOCTL_IDX(SIOCSIWTXPOW)] = { |
191 | .header_type = IW_HEADER_TYPE_PARAM, | 192 | .header_type = IW_HEADER_TYPE_PARAM, |
192 | }, | 193 | }, |
193 | [SIOCGIWTXPOW - SIOCIWFIRST] = { | 194 | [IW_IOCTL_IDX(SIOCGIWTXPOW)] = { |
194 | .header_type = IW_HEADER_TYPE_PARAM, | 195 | .header_type = IW_HEADER_TYPE_PARAM, |
195 | }, | 196 | }, |
196 | [SIOCSIWRETRY - SIOCIWFIRST] = { | 197 | [IW_IOCTL_IDX(SIOCSIWRETRY)] = { |
197 | .header_type = IW_HEADER_TYPE_PARAM, | 198 | .header_type = IW_HEADER_TYPE_PARAM, |
198 | }, | 199 | }, |
199 | [SIOCGIWRETRY - SIOCIWFIRST] = { | 200 | [IW_IOCTL_IDX(SIOCGIWRETRY)] = { |
200 | .header_type = IW_HEADER_TYPE_PARAM, | 201 | .header_type = IW_HEADER_TYPE_PARAM, |
201 | }, | 202 | }, |
202 | [SIOCSIWENCODE - SIOCIWFIRST] = { | 203 | [IW_IOCTL_IDX(SIOCSIWENCODE)] = { |
203 | .header_type = IW_HEADER_TYPE_POINT, | 204 | .header_type = IW_HEADER_TYPE_POINT, |
204 | .token_size = 1, | 205 | .token_size = 1, |
205 | .max_tokens = IW_ENCODING_TOKEN_MAX, | 206 | .max_tokens = IW_ENCODING_TOKEN_MAX, |
206 | .flags = IW_DESCR_FLAG_EVENT | IW_DESCR_FLAG_RESTRICT, | 207 | .flags = IW_DESCR_FLAG_EVENT | IW_DESCR_FLAG_RESTRICT, |
207 | }, | 208 | }, |
208 | [SIOCGIWENCODE - SIOCIWFIRST] = { | 209 | [IW_IOCTL_IDX(SIOCGIWENCODE)] = { |
209 | .header_type = IW_HEADER_TYPE_POINT, | 210 | .header_type = IW_HEADER_TYPE_POINT, |
210 | .token_size = 1, | 211 | .token_size = 1, |
211 | .max_tokens = IW_ENCODING_TOKEN_MAX, | 212 | .max_tokens = IW_ENCODING_TOKEN_MAX, |
212 | .flags = IW_DESCR_FLAG_DUMP | IW_DESCR_FLAG_RESTRICT, | 213 | .flags = IW_DESCR_FLAG_DUMP | IW_DESCR_FLAG_RESTRICT, |
213 | }, | 214 | }, |
214 | [SIOCSIWPOWER - SIOCIWFIRST] = { | 215 | [IW_IOCTL_IDX(SIOCSIWPOWER)] = { |
215 | .header_type = IW_HEADER_TYPE_PARAM, | 216 | .header_type = IW_HEADER_TYPE_PARAM, |
216 | }, | 217 | }, |
217 | [SIOCGIWPOWER - SIOCIWFIRST] = { | 218 | [IW_IOCTL_IDX(SIOCGIWPOWER)] = { |
218 | .header_type = IW_HEADER_TYPE_PARAM, | 219 | .header_type = IW_HEADER_TYPE_PARAM, |
219 | }, | 220 | }, |
220 | [SIOCSIWGENIE - SIOCIWFIRST] = { | 221 | [IW_IOCTL_IDX(SIOCSIWGENIE)] = { |
221 | .header_type = IW_HEADER_TYPE_POINT, | 222 | .header_type = IW_HEADER_TYPE_POINT, |
222 | .token_size = 1, | 223 | .token_size = 1, |
223 | .max_tokens = IW_GENERIC_IE_MAX, | 224 | .max_tokens = IW_GENERIC_IE_MAX, |
224 | }, | 225 | }, |
225 | [SIOCGIWGENIE - SIOCIWFIRST] = { | 226 | [IW_IOCTL_IDX(SIOCGIWGENIE)] = { |
226 | .header_type = IW_HEADER_TYPE_POINT, | 227 | .header_type = IW_HEADER_TYPE_POINT, |
227 | .token_size = 1, | 228 | .token_size = 1, |
228 | .max_tokens = IW_GENERIC_IE_MAX, | 229 | .max_tokens = IW_GENERIC_IE_MAX, |
229 | }, | 230 | }, |
230 | [SIOCSIWAUTH - SIOCIWFIRST] = { | 231 | [IW_IOCTL_IDX(SIOCSIWAUTH)] = { |
231 | .header_type = IW_HEADER_TYPE_PARAM, | 232 | .header_type = IW_HEADER_TYPE_PARAM, |
232 | }, | 233 | }, |
233 | [SIOCGIWAUTH - SIOCIWFIRST] = { | 234 | [IW_IOCTL_IDX(SIOCGIWAUTH)] = { |
234 | .header_type = IW_HEADER_TYPE_PARAM, | 235 | .header_type = IW_HEADER_TYPE_PARAM, |
235 | }, | 236 | }, |
236 | [SIOCSIWENCODEEXT - SIOCIWFIRST] = { | 237 | [IW_IOCTL_IDX(SIOCSIWENCODEEXT)] = { |
237 | .header_type = IW_HEADER_TYPE_POINT, | 238 | .header_type = IW_HEADER_TYPE_POINT, |
238 | .token_size = 1, | 239 | .token_size = 1, |
239 | .min_tokens = sizeof(struct iw_encode_ext), | 240 | .min_tokens = sizeof(struct iw_encode_ext), |
240 | .max_tokens = sizeof(struct iw_encode_ext) + | 241 | .max_tokens = sizeof(struct iw_encode_ext) + |
241 | IW_ENCODING_TOKEN_MAX, | 242 | IW_ENCODING_TOKEN_MAX, |
242 | }, | 243 | }, |
243 | [SIOCGIWENCODEEXT - SIOCIWFIRST] = { | 244 | [IW_IOCTL_IDX(SIOCGIWENCODEEXT)] = { |
244 | .header_type = IW_HEADER_TYPE_POINT, | 245 | .header_type = IW_HEADER_TYPE_POINT, |
245 | .token_size = 1, | 246 | .token_size = 1, |
246 | .min_tokens = sizeof(struct iw_encode_ext), | 247 | .min_tokens = sizeof(struct iw_encode_ext), |
247 | .max_tokens = sizeof(struct iw_encode_ext) + | 248 | .max_tokens = sizeof(struct iw_encode_ext) + |
248 | IW_ENCODING_TOKEN_MAX, | 249 | IW_ENCODING_TOKEN_MAX, |
249 | }, | 250 | }, |
250 | [SIOCSIWPMKSA - SIOCIWFIRST] = { | 251 | [IW_IOCTL_IDX(SIOCSIWPMKSA)] = { |
251 | .header_type = IW_HEADER_TYPE_POINT, | 252 | .header_type = IW_HEADER_TYPE_POINT, |
252 | .token_size = 1, | 253 | .token_size = 1, |
253 | .min_tokens = sizeof(struct iw_pmksa), | 254 | .min_tokens = sizeof(struct iw_pmksa), |
@@ -261,44 +262,44 @@ static const unsigned standard_ioctl_num = ARRAY_SIZE(standard_ioctl); | |||
261 | * we know about. | 262 | * we know about. |
262 | */ | 263 | */ |
263 | static const struct iw_ioctl_description standard_event[] = { | 264 | static const struct iw_ioctl_description standard_event[] = { |
264 | [IWEVTXDROP - IWEVFIRST] = { | 265 | [IW_EVENT_IDX(IWEVTXDROP)] = { |
265 | .header_type = IW_HEADER_TYPE_ADDR, | 266 | .header_type = IW_HEADER_TYPE_ADDR, |
266 | }, | 267 | }, |
267 | [IWEVQUAL - IWEVFIRST] = { | 268 | [IW_EVENT_IDX(IWEVQUAL)] = { |
268 | .header_type = IW_HEADER_TYPE_QUAL, | 269 | .header_type = IW_HEADER_TYPE_QUAL, |
269 | }, | 270 | }, |
270 | [IWEVCUSTOM - IWEVFIRST] = { | 271 | [IW_EVENT_IDX(IWEVCUSTOM)] = { |
271 | .header_type = IW_HEADER_TYPE_POINT, | 272 | .header_type = IW_HEADER_TYPE_POINT, |
272 | .token_size = 1, | 273 | .token_size = 1, |
273 | .max_tokens = IW_CUSTOM_MAX, | 274 | .max_tokens = IW_CUSTOM_MAX, |
274 | }, | 275 | }, |
275 | [IWEVREGISTERED - IWEVFIRST] = { | 276 | [IW_EVENT_IDX(IWEVREGISTERED)] = { |
276 | .header_type = IW_HEADER_TYPE_ADDR, | 277 | .header_type = IW_HEADER_TYPE_ADDR, |
277 | }, | 278 | }, |
278 | [IWEVEXPIRED - IWEVFIRST] = { | 279 | [IW_EVENT_IDX(IWEVEXPIRED)] = { |
279 | .header_type = IW_HEADER_TYPE_ADDR, | 280 | .header_type = IW_HEADER_TYPE_ADDR, |
280 | }, | 281 | }, |
281 | [IWEVGENIE - IWEVFIRST] = { | 282 | [IW_EVENT_IDX(IWEVGENIE)] = { |
282 | .header_type = IW_HEADER_TYPE_POINT, | 283 | .header_type = IW_HEADER_TYPE_POINT, |
283 | .token_size = 1, | 284 | .token_size = 1, |
284 | .max_tokens = IW_GENERIC_IE_MAX, | 285 | .max_tokens = IW_GENERIC_IE_MAX, |
285 | }, | 286 | }, |
286 | [IWEVMICHAELMICFAILURE - IWEVFIRST] = { | 287 | [IW_EVENT_IDX(IWEVMICHAELMICFAILURE)] = { |
287 | .header_type = IW_HEADER_TYPE_POINT, | 288 | .header_type = IW_HEADER_TYPE_POINT, |
288 | .token_size = 1, | 289 | .token_size = 1, |
289 | .max_tokens = sizeof(struct iw_michaelmicfailure), | 290 | .max_tokens = sizeof(struct iw_michaelmicfailure), |
290 | }, | 291 | }, |
291 | [IWEVASSOCREQIE - IWEVFIRST] = { | 292 | [IW_EVENT_IDX(IWEVASSOCREQIE)] = { |
292 | .header_type = IW_HEADER_TYPE_POINT, | 293 | .header_type = IW_HEADER_TYPE_POINT, |
293 | .token_size = 1, | 294 | .token_size = 1, |
294 | .max_tokens = IW_GENERIC_IE_MAX, | 295 | .max_tokens = IW_GENERIC_IE_MAX, |
295 | }, | 296 | }, |
296 | [IWEVASSOCRESPIE - IWEVFIRST] = { | 297 | [IW_EVENT_IDX(IWEVASSOCRESPIE)] = { |
297 | .header_type = IW_HEADER_TYPE_POINT, | 298 | .header_type = IW_HEADER_TYPE_POINT, |
298 | .token_size = 1, | 299 | .token_size = 1, |
299 | .max_tokens = IW_GENERIC_IE_MAX, | 300 | .max_tokens = IW_GENERIC_IE_MAX, |
300 | }, | 301 | }, |
301 | [IWEVPMKIDCAND - IWEVFIRST] = { | 302 | [IW_EVENT_IDX(IWEVPMKIDCAND)] = { |
302 | .header_type = IW_HEADER_TYPE_POINT, | 303 | .header_type = IW_HEADER_TYPE_POINT, |
303 | .token_size = 1, | 304 | .token_size = 1, |
304 | .max_tokens = sizeof(struct iw_pmkid_cand), | 305 | .max_tokens = sizeof(struct iw_pmkid_cand), |
@@ -449,11 +450,11 @@ void wireless_send_event(struct net_device * dev, | |||
449 | 450 | ||
450 | /* Get the description of the Event */ | 451 | /* Get the description of the Event */ |
451 | if (cmd <= SIOCIWLAST) { | 452 | if (cmd <= SIOCIWLAST) { |
452 | cmd_index = cmd - SIOCIWFIRST; | 453 | cmd_index = IW_IOCTL_IDX(cmd); |
453 | if (cmd_index < standard_ioctl_num) | 454 | if (cmd_index < standard_ioctl_num) |
454 | descr = &(standard_ioctl[cmd_index]); | 455 | descr = &(standard_ioctl[cmd_index]); |
455 | } else { | 456 | } else { |
456 | cmd_index = cmd - IWEVFIRST; | 457 | cmd_index = IW_EVENT_IDX(cmd); |
457 | if (cmd_index < standard_event_num) | 458 | if (cmd_index < standard_event_num) |
458 | descr = &(standard_event[cmd_index]); | 459 | descr = &(standard_event[cmd_index]); |
459 | } | 460 | } |
@@ -662,7 +663,7 @@ static iw_handler get_handler(struct net_device *dev, unsigned int cmd) | |||
662 | return NULL; | 663 | return NULL; |
663 | 664 | ||
664 | /* Try as a standard command */ | 665 | /* Try as a standard command */ |
665 | index = cmd - SIOCIWFIRST; | 666 | index = IW_IOCTL_IDX(cmd); |
666 | if (index < handlers->num_standard) | 667 | if (index < handlers->num_standard) |
667 | return handlers->standard[index]; | 668 | return handlers->standard[index]; |
668 | 669 | ||
@@ -954,9 +955,9 @@ static int ioctl_standard_call(struct net_device * dev, | |||
954 | int ret = -EINVAL; | 955 | int ret = -EINVAL; |
955 | 956 | ||
956 | /* Get the description of the IOCTL */ | 957 | /* Get the description of the IOCTL */ |
957 | if ((cmd - SIOCIWFIRST) >= standard_ioctl_num) | 958 | if (IW_IOCTL_IDX(cmd) >= standard_ioctl_num) |
958 | return -EOPNOTSUPP; | 959 | return -EOPNOTSUPP; |
959 | descr = &(standard_ioctl[cmd - SIOCIWFIRST]); | 960 | descr = &(standard_ioctl[IW_IOCTL_IDX(cmd)]); |
960 | 961 | ||
961 | /* Check if we have a pointer to user space data or not */ | 962 | /* Check if we have a pointer to user space data or not */ |
962 | if (descr->header_type != IW_HEADER_TYPE_POINT) { | 963 | if (descr->header_type != IW_HEADER_TYPE_POINT) { |
@@ -1012,7 +1013,7 @@ static int compat_standard_call(struct net_device *dev, | |||
1012 | struct iw_point iwp; | 1013 | struct iw_point iwp; |
1013 | int err; | 1014 | int err; |
1014 | 1015 | ||
1015 | descr = standard_ioctl + (cmd - SIOCIWFIRST); | 1016 | descr = standard_ioctl + IW_IOCTL_IDX(cmd); |
1016 | 1017 | ||
1017 | if (descr->header_type != IW_HEADER_TYPE_POINT) | 1018 | if (descr->header_type != IW_HEADER_TYPE_POINT) |
1018 | return ioctl_standard_call(dev, iwr, cmd, info, handler); | 1019 | return ioctl_standard_call(dev, iwr, cmd, info, handler); |
diff --git a/net/wireless/wext-priv.c b/net/wireless/wext-priv.c index a3c2277de9e5..3feb28e41c53 100644 --- a/net/wireless/wext-priv.c +++ b/net/wireless/wext-priv.c | |||
@@ -7,6 +7,7 @@ | |||
7 | * | 7 | * |
8 | * (As all part of the Linux kernel, this file is GPL) | 8 | * (As all part of the Linux kernel, this file is GPL) |
9 | */ | 9 | */ |
10 | #include <linux/slab.h> | ||
10 | #include <linux/wireless.h> | 11 | #include <linux/wireless.h> |
11 | #include <linux/netdevice.h> | 12 | #include <linux/netdevice.h> |
12 | #include <net/iw_handler.h> | 13 | #include <net/iw_handler.h> |
diff --git a/net/wireless/wext-sme.c b/net/wireless/wext-sme.c index 5615a8802536..d5c6140f4cb8 100644 --- a/net/wireless/wext-sme.c +++ b/net/wireless/wext-sme.c | |||
@@ -7,6 +7,7 @@ | |||
7 | 7 | ||
8 | #include <linux/etherdevice.h> | 8 | #include <linux/etherdevice.h> |
9 | #include <linux/if_arp.h> | 9 | #include <linux/if_arp.h> |
10 | #include <linux/slab.h> | ||
10 | #include <net/cfg80211.h> | 11 | #include <net/cfg80211.h> |
11 | #include "wext-compat.h" | 12 | #include "wext-compat.h" |
12 | #include "nl80211.h" | 13 | #include "nl80211.h" |