aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
Diffstat (limited to 'net')
-rw-r--r--net/mac80211/mlme.c44
-rw-r--r--net/mac80211/rx.c26
-rw-r--r--net/wireless/mlme.c86
-rw-r--r--net/wireless/nl80211.c30
-rw-r--r--net/wireless/trace.h46
5 files changed, 134 insertions, 98 deletions
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index 9950e13f641b..df8170a80a56 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -2155,7 +2155,8 @@ static void __ieee80211_disconnect(struct ieee80211_sub_if_data *sdata)
2155 IEEE80211_MAX_QUEUE_MAP, 2155 IEEE80211_MAX_QUEUE_MAP,
2156 IEEE80211_QUEUE_STOP_REASON_CSA); 2156 IEEE80211_QUEUE_STOP_REASON_CSA);
2157 2157
2158 cfg80211_send_deauth(sdata->dev, frame_buf, IEEE80211_DEAUTH_FRAME_LEN); 2158 cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf,
2159 IEEE80211_DEAUTH_FRAME_LEN);
2159 sdata_unlock(sdata); 2160 sdata_unlock(sdata);
2160} 2161}
2161 2162
@@ -2302,7 +2303,7 @@ static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata,
2302 sdata_info(sdata, "%pM denied authentication (status %d)\n", 2303 sdata_info(sdata, "%pM denied authentication (status %d)\n",
2303 mgmt->sa, status_code); 2304 mgmt->sa, status_code);
2304 ieee80211_destroy_auth_data(sdata, false); 2305 ieee80211_destroy_auth_data(sdata, false);
2305 cfg80211_send_rx_auth(sdata->dev, (u8 *)mgmt, len); 2306 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len);
2306 return; 2307 return;
2307 } 2308 }
2308 2309
@@ -2337,7 +2338,7 @@ static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata,
2337 * Report auth frame to user space for processing since another 2338 * Report auth frame to user space for processing since another
2338 * round of Authentication frames is still needed. 2339 * round of Authentication frames is still needed.
2339 */ 2340 */
2340 cfg80211_send_rx_auth(sdata->dev, (u8 *)mgmt, len); 2341 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len);
2341 return; 2342 return;
2342 } 2343 }
2343 2344
@@ -2354,7 +2355,7 @@ static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata,
2354 } 2355 }
2355 mutex_unlock(&sdata->local->sta_mtx); 2356 mutex_unlock(&sdata->local->sta_mtx);
2356 2357
2357 cfg80211_send_rx_auth(sdata->dev, (u8 *)mgmt, len); 2358 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len);
2358 return; 2359 return;
2359 out_err: 2360 out_err:
2360 mutex_unlock(&sdata->local->sta_mtx); 2361 mutex_unlock(&sdata->local->sta_mtx);
@@ -2387,7 +2388,7 @@ static void ieee80211_rx_mgmt_deauth(struct ieee80211_sub_if_data *sdata,
2387 2388
2388 ieee80211_set_disassoc(sdata, 0, 0, false, NULL); 2389 ieee80211_set_disassoc(sdata, 0, 0, false, NULL);
2389 2390
2390 cfg80211_send_deauth(sdata->dev, (u8 *)mgmt, len); 2391 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len);
2391} 2392}
2392 2393
2393 2394
@@ -2413,7 +2414,7 @@ static void ieee80211_rx_mgmt_disassoc(struct ieee80211_sub_if_data *sdata,
2413 2414
2414 ieee80211_set_disassoc(sdata, 0, 0, false, NULL); 2415 ieee80211_set_disassoc(sdata, 0, 0, false, NULL);
2415 2416
2416 cfg80211_send_disassoc(sdata->dev, (u8 *)mgmt, len); 2417 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len);
2417} 2418}
2418 2419
2419static void ieee80211_get_rates(struct ieee80211_supported_band *sband, 2420static void ieee80211_get_rates(struct ieee80211_supported_band *sband,
@@ -2711,7 +2712,7 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
2711 /* oops -- internal error -- send timeout for now */ 2712 /* oops -- internal error -- send timeout for now */
2712 ieee80211_destroy_assoc_data(sdata, false); 2713 ieee80211_destroy_assoc_data(sdata, false);
2713 cfg80211_put_bss(sdata->local->hw.wiphy, bss); 2714 cfg80211_put_bss(sdata->local->hw.wiphy, bss);
2714 cfg80211_send_assoc_timeout(sdata->dev, mgmt->bssid); 2715 cfg80211_assoc_timeout(sdata->dev, mgmt->bssid);
2715 return; 2716 return;
2716 } 2717 }
2717 sdata_info(sdata, "associated\n"); 2718 sdata_info(sdata, "associated\n");
@@ -2724,7 +2725,7 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
2724 ieee80211_destroy_assoc_data(sdata, true); 2725 ieee80211_destroy_assoc_data(sdata, true);
2725 } 2726 }
2726 2727
2727 cfg80211_send_rx_assoc(sdata->dev, bss, (u8 *)mgmt, len); 2728 cfg80211_rx_assoc_resp(sdata->dev, bss, (u8 *)mgmt, len);
2728} 2729}
2729 2730
2730static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, 2731static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
@@ -3117,8 +3118,8 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
3117 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, 3118 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH,
3118 WLAN_REASON_DEAUTH_LEAVING, 3119 WLAN_REASON_DEAUTH_LEAVING,
3119 true, deauth_buf); 3120 true, deauth_buf);
3120 cfg80211_send_deauth(sdata->dev, deauth_buf, 3121 cfg80211_tx_mlme_mgmt(sdata->dev, deauth_buf,
3121 sizeof(deauth_buf)); 3122 sizeof(deauth_buf));
3122 return; 3123 return;
3123 } 3124 }
3124 3125
@@ -3236,7 +3237,8 @@ static void ieee80211_sta_connection_lost(struct ieee80211_sub_if_data *sdata,
3236 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, reason, 3237 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, reason,
3237 tx, frame_buf); 3238 tx, frame_buf);
3238 3239
3239 cfg80211_send_deauth(sdata->dev, frame_buf, IEEE80211_DEAUTH_FRAME_LEN); 3240 cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf,
3241 IEEE80211_DEAUTH_FRAME_LEN);
3240} 3242}
3241 3243
3242static int ieee80211_probe_auth(struct ieee80211_sub_if_data *sdata) 3244static int ieee80211_probe_auth(struct ieee80211_sub_if_data *sdata)
@@ -3427,7 +3429,7 @@ void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata)
3427 3429
3428 ieee80211_destroy_auth_data(sdata, false); 3430 ieee80211_destroy_auth_data(sdata, false);
3429 3431
3430 cfg80211_send_auth_timeout(sdata->dev, bssid); 3432 cfg80211_auth_timeout(sdata->dev, bssid);
3431 } 3433 }
3432 } else if (ifmgd->auth_data && ifmgd->auth_data->timeout_started) 3434 } else if (ifmgd->auth_data && ifmgd->auth_data->timeout_started)
3433 run_again(sdata, ifmgd->auth_data->timeout); 3435 run_again(sdata, ifmgd->auth_data->timeout);
@@ -3443,7 +3445,7 @@ void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata)
3443 3445
3444 ieee80211_destroy_assoc_data(sdata, false); 3446 ieee80211_destroy_assoc_data(sdata, false);
3445 3447
3446 cfg80211_send_assoc_timeout(sdata->dev, bssid); 3448 cfg80211_assoc_timeout(sdata->dev, bssid);
3447 } 3449 }
3448 } else if (ifmgd->assoc_data && ifmgd->assoc_data->timeout_started) 3450 } else if (ifmgd->assoc_data && ifmgd->assoc_data->timeout_started)
3449 run_again(sdata, ifmgd->assoc_data->timeout); 3451 run_again(sdata, ifmgd->assoc_data->timeout);
@@ -3992,8 +3994,8 @@ int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata,
3992 WLAN_REASON_UNSPECIFIED, 3994 WLAN_REASON_UNSPECIFIED,
3993 false, frame_buf); 3995 false, frame_buf);
3994 3996
3995 cfg80211_send_deauth(sdata->dev, frame_buf, 3997 cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf,
3996 sizeof(frame_buf)); 3998 sizeof(frame_buf));
3997 } 3999 }
3998 4000
3999 sdata_info(sdata, "authenticate with %pM\n", req->bss->bssid); 4001 sdata_info(sdata, "authenticate with %pM\n", req->bss->bssid);
@@ -4055,8 +4057,8 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
4055 WLAN_REASON_UNSPECIFIED, 4057 WLAN_REASON_UNSPECIFIED,
4056 false, frame_buf); 4058 false, frame_buf);
4057 4059
4058 cfg80211_send_deauth(sdata->dev, frame_buf, 4060 cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf,
4059 sizeof(frame_buf)); 4061 sizeof(frame_buf));
4060 } 4062 }
4061 4063
4062 if (ifmgd->auth_data && !ifmgd->auth_data->done) { 4064 if (ifmgd->auth_data && !ifmgd->auth_data->done) {
@@ -4309,8 +4311,8 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
4309 4311
4310 out: 4312 out:
4311 if (report_frame) 4313 if (report_frame)
4312 cfg80211_send_deauth(sdata->dev, frame_buf, 4314 cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf,
4313 IEEE80211_DEAUTH_FRAME_LEN); 4315 IEEE80211_DEAUTH_FRAME_LEN);
4314 4316
4315 return 0; 4317 return 0;
4316} 4318}
@@ -4340,8 +4342,8 @@ int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata,
4340 req->reason_code, !req->local_state_change, 4342 req->reason_code, !req->local_state_change,
4341 frame_buf); 4343 frame_buf);
4342 4344
4343 cfg80211_send_disassoc(sdata->dev, frame_buf, 4345 cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf,
4344 IEEE80211_DEAUTH_FRAME_LEN); 4346 IEEE80211_DEAUTH_FRAME_LEN);
4345 4347
4346 return 0; 4348 return 0;
4347} 4349}
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index bdd7b4a719e9..23dbcfc69b3b 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -1747,27 +1747,21 @@ static int ieee80211_drop_unencrypted_mgmt(struct ieee80211_rx_data *rx)
1747 if (unlikely(!ieee80211_has_protected(fc) && 1747 if (unlikely(!ieee80211_has_protected(fc) &&
1748 ieee80211_is_unicast_robust_mgmt_frame(rx->skb) && 1748 ieee80211_is_unicast_robust_mgmt_frame(rx->skb) &&
1749 rx->key)) { 1749 rx->key)) {
1750 if (ieee80211_is_deauth(fc)) 1750 if (ieee80211_is_deauth(fc) ||
1751 cfg80211_send_unprot_deauth(rx->sdata->dev, 1751 ieee80211_is_disassoc(fc))
1752 rx->skb->data, 1752 cfg80211_rx_unprot_mlme_mgmt(rx->sdata->dev,
1753 rx->skb->len); 1753 rx->skb->data,
1754 else if (ieee80211_is_disassoc(fc)) 1754 rx->skb->len);
1755 cfg80211_send_unprot_disassoc(rx->sdata->dev,
1756 rx->skb->data,
1757 rx->skb->len);
1758 return -EACCES; 1755 return -EACCES;
1759 } 1756 }
1760 /* BIP does not use Protected field, so need to check MMIE */ 1757 /* BIP does not use Protected field, so need to check MMIE */
1761 if (unlikely(ieee80211_is_multicast_robust_mgmt_frame(rx->skb) && 1758 if (unlikely(ieee80211_is_multicast_robust_mgmt_frame(rx->skb) &&
1762 ieee80211_get_mmie_keyidx(rx->skb) < 0)) { 1759 ieee80211_get_mmie_keyidx(rx->skb) < 0)) {
1763 if (ieee80211_is_deauth(fc)) 1760 if (ieee80211_is_deauth(fc) ||
1764 cfg80211_send_unprot_deauth(rx->sdata->dev, 1761 ieee80211_is_disassoc(fc))
1765 rx->skb->data, 1762 cfg80211_rx_unprot_mlme_mgmt(rx->sdata->dev,
1766 rx->skb->len); 1763 rx->skb->data,
1767 else if (ieee80211_is_disassoc(fc)) 1764 rx->skb->len);
1768 cfg80211_send_unprot_disassoc(rx->sdata->dev,
1769 rx->skb->data,
1770 rx->skb->len);
1771 return -EACCES; 1765 return -EACCES;
1772 } 1766 }
1773 /* 1767 /*
diff --git a/net/wireless/mlme.c b/net/wireless/mlme.c
index 7bde5d9c0003..4b9c2be0d56d 100644
--- a/net/wireless/mlme.c
+++ b/net/wireless/mlme.c
@@ -18,20 +18,7 @@
18#include "rdev-ops.h" 18#include "rdev-ops.h"
19 19
20 20
21void cfg80211_send_rx_auth(struct net_device *dev, const u8 *buf, size_t len) 21void cfg80211_rx_assoc_resp(struct net_device *dev, struct cfg80211_bss *bss,
22{
23 struct wireless_dev *wdev = dev->ieee80211_ptr;
24 struct wiphy *wiphy = wdev->wiphy;
25 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
26
27 trace_cfg80211_send_rx_auth(dev);
28
29 nl80211_send_rx_auth(rdev, dev, buf, len, GFP_KERNEL);
30 cfg80211_sme_rx_auth(dev, buf, len);
31}
32EXPORT_SYMBOL(cfg80211_send_rx_auth);
33
34void cfg80211_send_rx_assoc(struct net_device *dev, struct cfg80211_bss *bss,
35 const u8 *buf, size_t len) 22 const u8 *buf, size_t len)
36{ 23{
37 u16 status_code; 24 u16 status_code;
@@ -84,10 +71,10 @@ void cfg80211_send_rx_assoc(struct net_device *dev, struct cfg80211_bss *bss,
84 status_code, 71 status_code,
85 status_code == WLAN_STATUS_SUCCESS, bss); 72 status_code == WLAN_STATUS_SUCCESS, bss);
86} 73}
87EXPORT_SYMBOL(cfg80211_send_rx_assoc); 74EXPORT_SYMBOL(cfg80211_rx_assoc_resp);
88 75
89void cfg80211_send_deauth(struct net_device *dev, 76static void cfg80211_process_deauth(struct net_device *dev,
90 const u8 *buf, size_t len) 77 const u8 *buf, size_t len)
91{ 78{
92 struct wireless_dev *wdev = dev->ieee80211_ptr; 79 struct wireless_dev *wdev = dev->ieee80211_ptr;
93 struct wiphy *wiphy = wdev->wiphy; 80 struct wiphy *wiphy = wdev->wiphy;
@@ -96,9 +83,6 @@ void cfg80211_send_deauth(struct net_device *dev,
96 const u8 *bssid = mgmt->bssid; 83 const u8 *bssid = mgmt->bssid;
97 bool was_current = false; 84 bool was_current = false;
98 85
99 trace_cfg80211_send_deauth(dev);
100 ASSERT_WDEV_LOCK(wdev);
101
102 if (wdev->current_bss && 86 if (wdev->current_bss &&
103 ether_addr_equal(wdev->current_bss->pub.bssid, bssid)) { 87 ether_addr_equal(wdev->current_bss->pub.bssid, bssid)) {
104 cfg80211_unhold_bss(wdev->current_bss); 88 cfg80211_unhold_bss(wdev->current_bss);
@@ -123,10 +107,9 @@ void cfg80211_send_deauth(struct net_device *dev,
123 false, NULL); 107 false, NULL);
124 } 108 }
125} 109}
126EXPORT_SYMBOL(cfg80211_send_deauth);
127 110
128void cfg80211_send_disassoc(struct net_device *dev, 111static void cfg80211_process_disassoc(struct net_device *dev,
129 const u8 *buf, size_t len) 112 const u8 *buf, size_t len)
130{ 113{
131 struct wireless_dev *wdev = dev->ieee80211_ptr; 114 struct wireless_dev *wdev = dev->ieee80211_ptr;
132 struct wiphy *wiphy = wdev->wiphy; 115 struct wiphy *wiphy = wdev->wiphy;
@@ -136,9 +119,6 @@ void cfg80211_send_disassoc(struct net_device *dev,
136 u16 reason_code; 119 u16 reason_code;
137 bool from_ap; 120 bool from_ap;
138 121
139 trace_cfg80211_send_disassoc(dev);
140 ASSERT_WDEV_LOCK(wdev);
141
142 nl80211_send_disassoc(rdev, dev, buf, len, GFP_KERNEL); 122 nl80211_send_disassoc(rdev, dev, buf, len, GFP_KERNEL);
143 123
144 if (wdev->sme_state != CFG80211_SME_CONNECTED) 124 if (wdev->sme_state != CFG80211_SME_CONNECTED)
@@ -153,15 +133,38 @@ void cfg80211_send_disassoc(struct net_device *dev,
153 } else 133 } else
154 WARN_ON(1); 134 WARN_ON(1);
155 135
156
157 reason_code = le16_to_cpu(mgmt->u.disassoc.reason_code); 136 reason_code = le16_to_cpu(mgmt->u.disassoc.reason_code);
158 137
159 from_ap = !ether_addr_equal(mgmt->sa, dev->dev_addr); 138 from_ap = !ether_addr_equal(mgmt->sa, dev->dev_addr);
160 __cfg80211_disconnected(dev, NULL, 0, reason_code, from_ap); 139 __cfg80211_disconnected(dev, NULL, 0, reason_code, from_ap);
161} 140}
162EXPORT_SYMBOL(cfg80211_send_disassoc);
163 141
164void cfg80211_send_auth_timeout(struct net_device *dev, const u8 *addr) 142void cfg80211_rx_mlme_mgmt(struct net_device *dev, const u8 *buf, size_t len)
143{
144 struct wireless_dev *wdev = dev->ieee80211_ptr;
145 struct wiphy *wiphy = wdev->wiphy;
146 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
147 struct ieee80211_mgmt *mgmt = (void *)buf;
148
149 ASSERT_WDEV_LOCK(wdev);
150
151 trace_cfg80211_rx_mlme_mgmt(dev, buf, len);
152
153 if (WARN_ON(len < 2))
154 return;
155
156 if (ieee80211_is_auth(mgmt->frame_control)) {
157 nl80211_send_rx_auth(rdev, dev, buf, len, GFP_KERNEL);
158 cfg80211_sme_rx_auth(dev, buf, len);
159 } else if (ieee80211_is_deauth(mgmt->frame_control)) {
160 cfg80211_process_deauth(dev, buf, len);
161 } else if (ieee80211_is_disassoc(mgmt->frame_control)) {
162 cfg80211_process_disassoc(dev, buf, len);
163 }
164}
165EXPORT_SYMBOL(cfg80211_rx_mlme_mgmt);
166
167void cfg80211_auth_timeout(struct net_device *dev, const u8 *addr)
165{ 168{
166 struct wireless_dev *wdev = dev->ieee80211_ptr; 169 struct wireless_dev *wdev = dev->ieee80211_ptr;
167 struct wiphy *wiphy = wdev->wiphy; 170 struct wiphy *wiphy = wdev->wiphy;
@@ -175,9 +178,9 @@ void cfg80211_send_auth_timeout(struct net_device *dev, const u8 *addr)
175 WLAN_STATUS_UNSPECIFIED_FAILURE, 178 WLAN_STATUS_UNSPECIFIED_FAILURE,
176 false, NULL); 179 false, NULL);
177} 180}
178EXPORT_SYMBOL(cfg80211_send_auth_timeout); 181EXPORT_SYMBOL(cfg80211_auth_timeout);
179 182
180void cfg80211_send_assoc_timeout(struct net_device *dev, const u8 *addr) 183void cfg80211_assoc_timeout(struct net_device *dev, const u8 *addr)
181{ 184{
182 struct wireless_dev *wdev = dev->ieee80211_ptr; 185 struct wireless_dev *wdev = dev->ieee80211_ptr;
183 struct wiphy *wiphy = wdev->wiphy; 186 struct wiphy *wiphy = wdev->wiphy;
@@ -191,7 +194,26 @@ void cfg80211_send_assoc_timeout(struct net_device *dev, const u8 *addr)
191 WLAN_STATUS_UNSPECIFIED_FAILURE, 194 WLAN_STATUS_UNSPECIFIED_FAILURE,
192 false, NULL); 195 false, NULL);
193} 196}
194EXPORT_SYMBOL(cfg80211_send_assoc_timeout); 197EXPORT_SYMBOL(cfg80211_assoc_timeout);
198
199void cfg80211_tx_mlme_mgmt(struct net_device *dev, const u8 *buf, size_t len)
200{
201 struct wireless_dev *wdev = dev->ieee80211_ptr;
202 struct ieee80211_mgmt *mgmt = (void *)buf;
203
204 ASSERT_WDEV_LOCK(wdev);
205
206 trace_cfg80211_tx_mlme_mgmt(dev, buf, len);
207
208 if (WARN_ON(len < 2))
209 return;
210
211 if (ieee80211_is_deauth(mgmt->frame_control))
212 cfg80211_process_deauth(dev, buf, len);
213 else
214 cfg80211_process_disassoc(dev, buf, len);
215}
216EXPORT_SYMBOL(cfg80211_tx_mlme_mgmt);
195 217
196void cfg80211_michael_mic_failure(struct net_device *dev, const u8 *addr, 218void cfg80211_michael_mic_failure(struct net_device *dev, const u8 *addr,
197 enum nl80211_key_type key_type, int key_id, 219 enum nl80211_key_type key_type, int key_id,
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index ce949e38178c..444f5effb77f 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -9313,31 +9313,27 @@ void nl80211_send_disassoc(struct cfg80211_registered_device *rdev,
9313 NL80211_CMD_DISASSOCIATE, gfp); 9313 NL80211_CMD_DISASSOCIATE, gfp);
9314} 9314}
9315 9315
9316void cfg80211_send_unprot_deauth(struct net_device *dev, const u8 *buf, 9316void cfg80211_rx_unprot_mlme_mgmt(struct net_device *dev, const u8 *buf,
9317 size_t len) 9317 size_t len)
9318{ 9318{
9319 struct wireless_dev *wdev = dev->ieee80211_ptr; 9319 struct wireless_dev *wdev = dev->ieee80211_ptr;
9320 struct wiphy *wiphy = wdev->wiphy; 9320 struct wiphy *wiphy = wdev->wiphy;
9321 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); 9321 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
9322 const struct ieee80211_mgmt *mgmt = (void *)buf;
9323 u32 cmd;
9322 9324
9323 trace_cfg80211_send_unprot_deauth(dev); 9325 if (WARN_ON(len < 2))
9324 nl80211_send_mlme_event(rdev, dev, buf, len, 9326 return;
9325 NL80211_CMD_UNPROT_DEAUTHENTICATE, GFP_ATOMIC);
9326}
9327EXPORT_SYMBOL(cfg80211_send_unprot_deauth);
9328 9327
9329void cfg80211_send_unprot_disassoc(struct net_device *dev, const u8 *buf, 9328 if (ieee80211_is_deauth(mgmt->frame_control))
9330 size_t len) 9329 cmd = NL80211_CMD_UNPROT_DEAUTHENTICATE;
9331{ 9330 else
9332 struct wireless_dev *wdev = dev->ieee80211_ptr; 9331 cmd = NL80211_CMD_UNPROT_DISASSOCIATE;
9333 struct wiphy *wiphy = wdev->wiphy;
9334 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
9335 9332
9336 trace_cfg80211_send_unprot_disassoc(dev); 9333 trace_cfg80211_rx_unprot_mlme_mgmt(dev, buf, len);
9337 nl80211_send_mlme_event(rdev, dev, buf, len, 9334 nl80211_send_mlme_event(rdev, dev, buf, len, cmd, GFP_ATOMIC);
9338 NL80211_CMD_UNPROT_DISASSOCIATE, GFP_ATOMIC);
9339} 9335}
9340EXPORT_SYMBOL(cfg80211_send_unprot_disassoc); 9336EXPORT_SYMBOL(cfg80211_rx_unprot_mlme_mgmt);
9341 9337
9342static void nl80211_send_mlme_timeout(struct cfg80211_registered_device *rdev, 9338static void nl80211_send_mlme_timeout(struct cfg80211_registered_device *rdev,
9343 struct net_device *netdev, int cmd, 9339 struct net_device *netdev, int cmd,
diff --git a/net/wireless/trace.h b/net/wireless/trace.h
index 23fafeae8a10..e1534baf2ebb 100644
--- a/net/wireless/trace.h
+++ b/net/wireless/trace.h
@@ -1911,24 +1911,46 @@ TRACE_EVENT(cfg80211_send_rx_assoc,
1911 NETDEV_PR_ARG, MAC_PR_ARG(bssid), CHAN_PR_ARG) 1911 NETDEV_PR_ARG, MAC_PR_ARG(bssid), CHAN_PR_ARG)
1912); 1912);
1913 1913
1914DEFINE_EVENT(netdev_evt_only, cfg80211_send_deauth, 1914DECLARE_EVENT_CLASS(netdev_frame_event,
1915 TP_PROTO(struct net_device *netdev), 1915 TP_PROTO(struct net_device *netdev, const u8 *buf, int len),
1916 TP_ARGS(netdev) 1916 TP_ARGS(netdev, buf, len),
1917 TP_STRUCT__entry(
1918 NETDEV_ENTRY
1919 __dynamic_array(u8, frame, len)
1920 ),
1921 TP_fast_assign(
1922 NETDEV_ASSIGN;
1923 memcpy(__get_dynamic_array(frame), buf, len);
1924 ),
1925 TP_printk(NETDEV_PR_FMT ", ftype:0x%.2x",
1926 NETDEV_PR_ARG,
1927 le16_to_cpup((__le16 *)__get_dynamic_array(frame)))
1917); 1928);
1918 1929
1919DEFINE_EVENT(netdev_evt_only, cfg80211_send_disassoc, 1930DEFINE_EVENT(netdev_frame_event, cfg80211_rx_unprot_mlme_mgmt,
1920 TP_PROTO(struct net_device *netdev), 1931 TP_PROTO(struct net_device *netdev, const u8 *buf, int len),
1921 TP_ARGS(netdev) 1932 TP_ARGS(netdev, buf, len)
1922); 1933);
1923 1934
1924DEFINE_EVENT(netdev_evt_only, cfg80211_send_unprot_deauth, 1935DEFINE_EVENT(netdev_frame_event, cfg80211_rx_mlme_mgmt,
1925 TP_PROTO(struct net_device *netdev), 1936 TP_PROTO(struct net_device *netdev, const u8 *buf, int len),
1926 TP_ARGS(netdev) 1937 TP_ARGS(netdev, buf, len)
1927); 1938);
1928 1939
1929DEFINE_EVENT(netdev_evt_only, cfg80211_send_unprot_disassoc, 1940TRACE_EVENT(cfg80211_tx_mlme_mgmt,
1930 TP_PROTO(struct net_device *netdev), 1941 TP_PROTO(struct net_device *netdev, const u8 *buf, int len),
1931 TP_ARGS(netdev) 1942 TP_ARGS(netdev, buf, len),
1943 TP_STRUCT__entry(
1944 NETDEV_ENTRY
1945 __dynamic_array(u8, frame, len)
1946 ),
1947 TP_fast_assign(
1948 NETDEV_ASSIGN;
1949 memcpy(__get_dynamic_array(frame), buf, len);
1950 ),
1951 TP_printk(NETDEV_PR_FMT ", ftype:0x%.2x",
1952 NETDEV_PR_ARG,
1953 le16_to_cpup((__le16 *)__get_dynamic_array(frame)))
1932); 1954);
1933 1955
1934DECLARE_EVENT_CLASS(netdev_mac_evt, 1956DECLARE_EVENT_CLASS(netdev_mac_evt,