aboutsummaryrefslogtreecommitdiffstats
path: root/net/wireless/mlme.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/wireless/mlme.c')
-rw-r--r--net/wireless/mlme.c59
1 files changed, 44 insertions, 15 deletions
diff --git a/net/wireless/mlme.c b/net/wireless/mlme.c
index f5a7ac3a0939..6801d96bc224 100644
--- a/net/wireless/mlme.c
+++ b/net/wireless/mlme.c
@@ -6,6 +6,7 @@
6 6
7#include <linux/kernel.h> 7#include <linux/kernel.h>
8#include <linux/module.h> 8#include <linux/module.h>
9#include <linux/etherdevice.h>
9#include <linux/netdevice.h> 10#include <linux/netdevice.h>
10#include <linux/nl80211.h> 11#include <linux/nl80211.h>
11#include <linux/slab.h> 12#include <linux/slab.h>
@@ -100,7 +101,7 @@ void __cfg80211_send_deauth(struct net_device *dev,
100 ASSERT_WDEV_LOCK(wdev); 101 ASSERT_WDEV_LOCK(wdev);
101 102
102 if (wdev->current_bss && 103 if (wdev->current_bss &&
103 memcmp(wdev->current_bss->pub.bssid, bssid, ETH_ALEN) == 0) { 104 compare_ether_addr(wdev->current_bss->pub.bssid, bssid) == 0) {
104 cfg80211_unhold_bss(wdev->current_bss); 105 cfg80211_unhold_bss(wdev->current_bss);
105 cfg80211_put_bss(&wdev->current_bss->pub); 106 cfg80211_put_bss(&wdev->current_bss->pub);
106 wdev->current_bss = NULL; 107 wdev->current_bss = NULL;
@@ -115,7 +116,7 @@ void __cfg80211_send_deauth(struct net_device *dev,
115 116
116 reason_code = le16_to_cpu(mgmt->u.deauth.reason_code); 117 reason_code = le16_to_cpu(mgmt->u.deauth.reason_code);
117 118
118 from_ap = memcmp(mgmt->sa, dev->dev_addr, ETH_ALEN) != 0; 119 from_ap = compare_ether_addr(mgmt->sa, dev->dev_addr) != 0;
119 __cfg80211_disconnected(dev, NULL, 0, reason_code, from_ap); 120 __cfg80211_disconnected(dev, NULL, 0, reason_code, from_ap);
120 } else if (wdev->sme_state == CFG80211_SME_CONNECTING) { 121 } else if (wdev->sme_state == CFG80211_SME_CONNECTING) {
121 __cfg80211_connect_result(dev, mgmt->bssid, NULL, 0, NULL, 0, 122 __cfg80211_connect_result(dev, mgmt->bssid, NULL, 0, NULL, 0,
@@ -154,7 +155,7 @@ void __cfg80211_send_disassoc(struct net_device *dev,
154 return; 155 return;
155 156
156 if (wdev->current_bss && 157 if (wdev->current_bss &&
157 memcmp(wdev->current_bss->pub.bssid, bssid, ETH_ALEN) == 0) { 158 compare_ether_addr(wdev->current_bss->pub.bssid, bssid) == 0) {
158 cfg80211_sme_disassoc(dev, wdev->current_bss); 159 cfg80211_sme_disassoc(dev, wdev->current_bss);
159 cfg80211_unhold_bss(wdev->current_bss); 160 cfg80211_unhold_bss(wdev->current_bss);
160 cfg80211_put_bss(&wdev->current_bss->pub); 161 cfg80211_put_bss(&wdev->current_bss->pub);
@@ -165,7 +166,7 @@ void __cfg80211_send_disassoc(struct net_device *dev,
165 166
166 reason_code = le16_to_cpu(mgmt->u.disassoc.reason_code); 167 reason_code = le16_to_cpu(mgmt->u.disassoc.reason_code);
167 168
168 from_ap = memcmp(mgmt->sa, dev->dev_addr, ETH_ALEN) != 0; 169 from_ap = compare_ether_addr(mgmt->sa, dev->dev_addr) != 0;
169 __cfg80211_disconnected(dev, NULL, 0, reason_code, from_ap); 170 __cfg80211_disconnected(dev, NULL, 0, reason_code, from_ap);
170} 171}
171EXPORT_SYMBOL(__cfg80211_send_disassoc); 172EXPORT_SYMBOL(__cfg80211_send_disassoc);
@@ -285,7 +286,7 @@ int __cfg80211_mlme_auth(struct cfg80211_registered_device *rdev,
285 return -EINVAL; 286 return -EINVAL;
286 287
287 if (wdev->current_bss && 288 if (wdev->current_bss &&
288 memcmp(bssid, wdev->current_bss->pub.bssid, ETH_ALEN) == 0) 289 compare_ether_addr(bssid, wdev->current_bss->pub.bssid) == 0)
289 return -EALREADY; 290 return -EALREADY;
290 291
291 memset(&req, 0, sizeof(req)); 292 memset(&req, 0, sizeof(req));
@@ -362,7 +363,7 @@ int __cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev,
362 memset(&req, 0, sizeof(req)); 363 memset(&req, 0, sizeof(req));
363 364
364 if (wdev->current_bss && prev_bssid && 365 if (wdev->current_bss && prev_bssid &&
365 memcmp(wdev->current_bss->pub.bssid, prev_bssid, ETH_ALEN) == 0) { 366 compare_ether_addr(wdev->current_bss->pub.bssid, prev_bssid) == 0) {
366 /* 367 /*
367 * Trying to reassociate: Allow this to proceed and let the old 368 * Trying to reassociate: Allow this to proceed and let the old
368 * association to be dropped when the new one is completed. 369 * association to be dropped when the new one is completed.
@@ -446,7 +447,8 @@ int __cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev,
446 447
447 if (local_state_change) { 448 if (local_state_change) {
448 if (wdev->current_bss && 449 if (wdev->current_bss &&
449 memcmp(wdev->current_bss->pub.bssid, bssid, ETH_ALEN) == 0) { 450 compare_ether_addr(wdev->current_bss->pub.bssid, bssid)
451 == 0) {
450 cfg80211_unhold_bss(wdev->current_bss); 452 cfg80211_unhold_bss(wdev->current_bss);
451 cfg80211_put_bss(&wdev->current_bss->pub); 453 cfg80211_put_bss(&wdev->current_bss->pub);
452 wdev->current_bss = NULL; 454 wdev->current_bss = NULL;
@@ -495,7 +497,7 @@ static int __cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev,
495 req.local_state_change = local_state_change; 497 req.local_state_change = local_state_change;
496 req.ie = ie; 498 req.ie = ie;
497 req.ie_len = ie_len; 499 req.ie_len = ie_len;
498 if (memcmp(wdev->current_bss->pub.bssid, bssid, ETH_ALEN) == 0) 500 if (compare_ether_addr(wdev->current_bss->pub.bssid, bssid) == 0)
499 req.bss = &wdev->current_bss->pub; 501 req.bss = &wdev->current_bss->pub;
500 else 502 else
501 return -ENOTCONN; 503 return -ENOTCONN;
@@ -758,8 +760,8 @@ int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
758 break; 760 break;
759 } 761 }
760 762
761 if (memcmp(wdev->current_bss->pub.bssid, 763 if (compare_ether_addr(wdev->current_bss->pub.bssid,
762 mgmt->bssid, ETH_ALEN)) { 764 mgmt->bssid)) {
763 err = -ENOTCONN; 765 err = -ENOTCONN;
764 break; 766 break;
765 } 767 }
@@ -772,8 +774,8 @@ int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
772 break; 774 break;
773 775
774 /* for station, check that DA is the AP */ 776 /* for station, check that DA is the AP */
775 if (memcmp(wdev->current_bss->pub.bssid, 777 if (compare_ether_addr(wdev->current_bss->pub.bssid,
776 mgmt->da, ETH_ALEN)) { 778 mgmt->da)) {
777 err = -ENOTCONN; 779 err = -ENOTCONN;
778 break; 780 break;
779 } 781 }
@@ -781,11 +783,11 @@ int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
781 case NL80211_IFTYPE_AP: 783 case NL80211_IFTYPE_AP:
782 case NL80211_IFTYPE_P2P_GO: 784 case NL80211_IFTYPE_P2P_GO:
783 case NL80211_IFTYPE_AP_VLAN: 785 case NL80211_IFTYPE_AP_VLAN:
784 if (memcmp(mgmt->bssid, dev->dev_addr, ETH_ALEN)) 786 if (compare_ether_addr(mgmt->bssid, dev->dev_addr))
785 err = -EINVAL; 787 err = -EINVAL;
786 break; 788 break;
787 case NL80211_IFTYPE_MESH_POINT: 789 case NL80211_IFTYPE_MESH_POINT:
788 if (memcmp(mgmt->sa, mgmt->bssid, ETH_ALEN)) { 790 if (compare_ether_addr(mgmt->sa, mgmt->bssid)) {
789 err = -EINVAL; 791 err = -EINVAL;
790 break; 792 break;
791 } 793 }
@@ -804,7 +806,7 @@ int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
804 return err; 806 return err;
805 } 807 }
806 808
807 if (memcmp(mgmt->sa, dev->dev_addr, ETH_ALEN) != 0) 809 if (compare_ether_addr(mgmt->sa, dev->dev_addr) != 0)
808 return -EINVAL; 810 return -EINVAL;
809 811
810 /* Transmit the Action frame as requested by user space */ 812 /* Transmit the Action frame as requested by user space */
@@ -928,6 +930,33 @@ void cfg80211_pmksa_candidate_notify(struct net_device *dev, int index,
928} 930}
929EXPORT_SYMBOL(cfg80211_pmksa_candidate_notify); 931EXPORT_SYMBOL(cfg80211_pmksa_candidate_notify);
930 932
933void cfg80211_ch_switch_notify(struct net_device *dev, int freq,
934 enum nl80211_channel_type type)
935{
936 struct wireless_dev *wdev = dev->ieee80211_ptr;
937 struct wiphy *wiphy = wdev->wiphy;
938 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
939 struct ieee80211_channel *chan;
940
941 wdev_lock(wdev);
942
943 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
944 wdev->iftype != NL80211_IFTYPE_P2P_GO))
945 goto out;
946
947 chan = rdev_freq_to_chan(rdev, freq, type);
948 if (WARN_ON(!chan))
949 goto out;
950
951 wdev->channel = chan;
952
953 nl80211_ch_switch_notify(rdev, dev, freq, type, GFP_KERNEL);
954out:
955 wdev_unlock(wdev);
956 return;
957}
958EXPORT_SYMBOL(cfg80211_ch_switch_notify);
959
931bool cfg80211_rx_spurious_frame(struct net_device *dev, 960bool cfg80211_rx_spurious_frame(struct net_device *dev,
932 const u8 *addr, gfp_t gfp) 961 const u8 *addr, gfp_t gfp)
933{ 962{