diff options
Diffstat (limited to 'net/wireless/mlme.c')
-rw-r--r-- | net/wireless/mlme.c | 39 |
1 files changed, 28 insertions, 11 deletions
diff --git a/net/wireless/mlme.c b/net/wireless/mlme.c index 0855f0d32349..387dd2a27d2f 100644 --- a/net/wireless/mlme.c +++ b/net/wireless/mlme.c | |||
@@ -377,7 +377,8 @@ int __cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, | |||
377 | const u8 *bssid, | 377 | const u8 *bssid, |
378 | const u8 *ssid, int ssid_len, | 378 | const u8 *ssid, int ssid_len, |
379 | const u8 *ie, int ie_len, | 379 | const u8 *ie, int ie_len, |
380 | const u8 *key, int key_len, int key_idx) | 380 | const u8 *key, int key_len, int key_idx, |
381 | bool local_state_change) | ||
381 | { | 382 | { |
382 | struct wireless_dev *wdev = dev->ieee80211_ptr; | 383 | struct wireless_dev *wdev = dev->ieee80211_ptr; |
383 | struct cfg80211_auth_request req; | 384 | struct cfg80211_auth_request req; |
@@ -407,6 +408,7 @@ int __cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, | |||
407 | 408 | ||
408 | memset(&req, 0, sizeof(req)); | 409 | memset(&req, 0, sizeof(req)); |
409 | 410 | ||
411 | req.local_state_change = local_state_change; | ||
410 | req.ie = ie; | 412 | req.ie = ie; |
411 | req.ie_len = ie_len; | 413 | req.ie_len = ie_len; |
412 | req.auth_type = auth_type; | 414 | req.auth_type = auth_type; |
@@ -433,12 +435,18 @@ int __cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, | |||
433 | goto out; | 435 | goto out; |
434 | } | 436 | } |
435 | 437 | ||
436 | wdev->authtry_bsses[slot] = bss; | 438 | if (local_state_change) |
439 | wdev->auth_bsses[slot] = bss; | ||
440 | else | ||
441 | wdev->authtry_bsses[slot] = bss; | ||
437 | cfg80211_hold_bss(bss); | 442 | cfg80211_hold_bss(bss); |
438 | 443 | ||
439 | err = rdev->ops->auth(&rdev->wiphy, dev, &req); | 444 | err = rdev->ops->auth(&rdev->wiphy, dev, &req); |
440 | if (err) { | 445 | if (err) { |
441 | wdev->authtry_bsses[slot] = NULL; | 446 | if (local_state_change) |
447 | wdev->auth_bsses[slot] = NULL; | ||
448 | else | ||
449 | wdev->authtry_bsses[slot] = NULL; | ||
442 | cfg80211_unhold_bss(bss); | 450 | cfg80211_unhold_bss(bss); |
443 | } | 451 | } |
444 | 452 | ||
@@ -453,14 +461,15 @@ int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, | |||
453 | enum nl80211_auth_type auth_type, const u8 *bssid, | 461 | enum nl80211_auth_type auth_type, const u8 *bssid, |
454 | const u8 *ssid, int ssid_len, | 462 | const u8 *ssid, int ssid_len, |
455 | const u8 *ie, int ie_len, | 463 | const u8 *ie, int ie_len, |
456 | const u8 *key, int key_len, int key_idx) | 464 | const u8 *key, int key_len, int key_idx, |
465 | bool local_state_change) | ||
457 | { | 466 | { |
458 | int err; | 467 | int err; |
459 | 468 | ||
460 | wdev_lock(dev->ieee80211_ptr); | 469 | wdev_lock(dev->ieee80211_ptr); |
461 | err = __cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid, | 470 | err = __cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid, |
462 | ssid, ssid_len, ie, ie_len, | 471 | ssid, ssid_len, ie, ie_len, |
463 | key, key_len, key_idx); | 472 | key, key_len, key_idx, local_state_change); |
464 | wdev_unlock(dev->ieee80211_ptr); | 473 | wdev_unlock(dev->ieee80211_ptr); |
465 | 474 | ||
466 | return err; | 475 | return err; |
@@ -554,7 +563,8 @@ int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev, | |||
554 | 563 | ||
555 | int __cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, | 564 | int __cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, |
556 | struct net_device *dev, const u8 *bssid, | 565 | struct net_device *dev, const u8 *bssid, |
557 | const u8 *ie, int ie_len, u16 reason) | 566 | const u8 *ie, int ie_len, u16 reason, |
567 | bool local_state_change) | ||
558 | { | 568 | { |
559 | struct wireless_dev *wdev = dev->ieee80211_ptr; | 569 | struct wireless_dev *wdev = dev->ieee80211_ptr; |
560 | struct cfg80211_deauth_request req; | 570 | struct cfg80211_deauth_request req; |
@@ -564,6 +574,7 @@ int __cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, | |||
564 | 574 | ||
565 | memset(&req, 0, sizeof(req)); | 575 | memset(&req, 0, sizeof(req)); |
566 | req.reason_code = reason; | 576 | req.reason_code = reason; |
577 | req.local_state_change = local_state_change; | ||
567 | req.ie = ie; | 578 | req.ie = ie; |
568 | req.ie_len = ie_len; | 579 | req.ie_len = ie_len; |
569 | if (wdev->current_bss && | 580 | if (wdev->current_bss && |
@@ -590,13 +601,15 @@ int __cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, | |||
590 | 601 | ||
591 | int cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, | 602 | int cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, |
592 | struct net_device *dev, const u8 *bssid, | 603 | struct net_device *dev, const u8 *bssid, |
593 | const u8 *ie, int ie_len, u16 reason) | 604 | const u8 *ie, int ie_len, u16 reason, |
605 | bool local_state_change) | ||
594 | { | 606 | { |
595 | struct wireless_dev *wdev = dev->ieee80211_ptr; | 607 | struct wireless_dev *wdev = dev->ieee80211_ptr; |
596 | int err; | 608 | int err; |
597 | 609 | ||
598 | wdev_lock(wdev); | 610 | wdev_lock(wdev); |
599 | err = __cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason); | 611 | err = __cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason, |
612 | local_state_change); | ||
600 | wdev_unlock(wdev); | 613 | wdev_unlock(wdev); |
601 | 614 | ||
602 | return err; | 615 | return err; |
@@ -604,7 +617,8 @@ int cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, | |||
604 | 617 | ||
605 | static int __cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev, | 618 | static int __cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev, |
606 | struct net_device *dev, const u8 *bssid, | 619 | struct net_device *dev, const u8 *bssid, |
607 | const u8 *ie, int ie_len, u16 reason) | 620 | const u8 *ie, int ie_len, u16 reason, |
621 | bool local_state_change) | ||
608 | { | 622 | { |
609 | struct wireless_dev *wdev = dev->ieee80211_ptr; | 623 | struct wireless_dev *wdev = dev->ieee80211_ptr; |
610 | struct cfg80211_disassoc_request req; | 624 | struct cfg80211_disassoc_request req; |
@@ -619,6 +633,7 @@ static int __cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev, | |||
619 | 633 | ||
620 | memset(&req, 0, sizeof(req)); | 634 | memset(&req, 0, sizeof(req)); |
621 | req.reason_code = reason; | 635 | req.reason_code = reason; |
636 | req.local_state_change = local_state_change; | ||
622 | req.ie = ie; | 637 | req.ie = ie; |
623 | req.ie_len = ie_len; | 638 | req.ie_len = ie_len; |
624 | if (memcmp(wdev->current_bss->pub.bssid, bssid, ETH_ALEN) == 0) | 639 | if (memcmp(wdev->current_bss->pub.bssid, bssid, ETH_ALEN) == 0) |
@@ -631,13 +646,15 @@ static int __cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev, | |||
631 | 646 | ||
632 | int cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev, | 647 | int cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev, |
633 | struct net_device *dev, const u8 *bssid, | 648 | struct net_device *dev, const u8 *bssid, |
634 | const u8 *ie, int ie_len, u16 reason) | 649 | const u8 *ie, int ie_len, u16 reason, |
650 | bool local_state_change) | ||
635 | { | 651 | { |
636 | struct wireless_dev *wdev = dev->ieee80211_ptr; | 652 | struct wireless_dev *wdev = dev->ieee80211_ptr; |
637 | int err; | 653 | int err; |
638 | 654 | ||
639 | wdev_lock(wdev); | 655 | wdev_lock(wdev); |
640 | err = __cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason); | 656 | err = __cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason, |
657 | local_state_change); | ||
641 | wdev_unlock(wdev); | 658 | wdev_unlock(wdev); |
642 | 659 | ||
643 | return err; | 660 | return err; |