aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2013-05-15 11:44:01 -0400
committerJohannes Berg <johannes.berg@intel.com>2013-05-24 18:02:20 -0400
commit91bf9b26fc95c505846bc2f744a73b51f2aaee1d (patch)
tree0a8cad8fa49ccb5f4899446ce78d183d50d377af
parent38fd2143fa653f80729800c1d61d4207b91dca42 (diff)
cfg80211: remove some locked wrappers from mlme API
By making all the API functions require wdev locking we can clean up the API a bit, getting rid of the locking version of each function. This also decreases the size of cfg80211 by a small amount. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-rw-r--r--net/wireless/core.h25
-rw-r--r--net/wireless/mlme.c120
-rw-r--r--net/wireless/nl80211.c34
-rw-r--r--net/wireless/sme.c40
4 files changed, 70 insertions, 149 deletions
diff --git a/net/wireless/core.h b/net/wireless/core.h
index d21a0fc01401..c8f87dfd50d3 100644
--- a/net/wireless/core.h
+++ b/net/wireless/core.h
@@ -282,38 +282,21 @@ int cfg80211_stop_ap(struct cfg80211_registered_device *rdev,
282 struct net_device *dev); 282 struct net_device *dev);
283 283
284/* MLME */ 284/* MLME */
285int __cfg80211_mlme_auth(struct cfg80211_registered_device *rdev,
286 struct net_device *dev,
287 struct ieee80211_channel *chan,
288 enum nl80211_auth_type auth_type,
289 const u8 *bssid,
290 const u8 *ssid, int ssid_len,
291 const u8 *ie, int ie_len,
292 const u8 *key, int key_len, int key_idx,
293 const u8 *sae_data, int sae_data_len);
294int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, 285int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev,
295 struct net_device *dev, struct ieee80211_channel *chan, 286 struct net_device *dev,
296 enum nl80211_auth_type auth_type, const u8 *bssid, 287 struct ieee80211_channel *chan,
288 enum nl80211_auth_type auth_type,
289 const u8 *bssid,
297 const u8 *ssid, int ssid_len, 290 const u8 *ssid, int ssid_len,
298 const u8 *ie, int ie_len, 291 const u8 *ie, int ie_len,
299 const u8 *key, int key_len, int key_idx, 292 const u8 *key, int key_len, int key_idx,
300 const u8 *sae_data, int sae_data_len); 293 const u8 *sae_data, int sae_data_len);
301int __cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev,
302 struct net_device *dev,
303 struct ieee80211_channel *chan,
304 const u8 *bssid,
305 const u8 *ssid, int ssid_len,
306 struct cfg80211_assoc_request *req);
307int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev, 294int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev,
308 struct net_device *dev, 295 struct net_device *dev,
309 struct ieee80211_channel *chan, 296 struct ieee80211_channel *chan,
310 const u8 *bssid, 297 const u8 *bssid,
311 const u8 *ssid, int ssid_len, 298 const u8 *ssid, int ssid_len,
312 struct cfg80211_assoc_request *req); 299 struct cfg80211_assoc_request *req);
313int __cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev,
314 struct net_device *dev, const u8 *bssid,
315 const u8 *ie, int ie_len, u16 reason,
316 bool local_state_change);
317int cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, 300int cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev,
318 struct net_device *dev, const u8 *bssid, 301 struct net_device *dev, const u8 *bssid,
319 const u8 *ie, int ie_len, u16 reason, 302 const u8 *ie, int ie_len, u16 reason,
diff --git a/net/wireless/mlme.c b/net/wireless/mlme.c
index 80ffb0138919..7bde5d9c0003 100644
--- a/net/wireless/mlme.c
+++ b/net/wireless/mlme.c
@@ -221,15 +221,15 @@ void cfg80211_michael_mic_failure(struct net_device *dev, const u8 *addr,
221EXPORT_SYMBOL(cfg80211_michael_mic_failure); 221EXPORT_SYMBOL(cfg80211_michael_mic_failure);
222 222
223/* some MLME handling for userspace SME */ 223/* some MLME handling for userspace SME */
224int __cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, 224int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev,
225 struct net_device *dev, 225 struct net_device *dev,
226 struct ieee80211_channel *chan, 226 struct ieee80211_channel *chan,
227 enum nl80211_auth_type auth_type, 227 enum nl80211_auth_type auth_type,
228 const u8 *bssid, 228 const u8 *bssid,
229 const u8 *ssid, int ssid_len, 229 const u8 *ssid, int ssid_len,
230 const u8 *ie, int ie_len, 230 const u8 *ie, int ie_len,
231 const u8 *key, int key_len, int key_idx, 231 const u8 *key, int key_len, int key_idx,
232 const u8 *sae_data, int sae_data_len) 232 const u8 *sae_data, int sae_data_len)
233{ 233{
234 struct wireless_dev *wdev = dev->ieee80211_ptr; 234 struct wireless_dev *wdev = dev->ieee80211_ptr;
235 struct cfg80211_auth_request req = { 235 struct cfg80211_auth_request req = {
@@ -271,28 +271,6 @@ out:
271 return err; 271 return err;
272} 272}
273 273
274int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev,
275 struct net_device *dev, struct ieee80211_channel *chan,
276 enum nl80211_auth_type auth_type, const u8 *bssid,
277 const u8 *ssid, int ssid_len,
278 const u8 *ie, int ie_len,
279 const u8 *key, int key_len, int key_idx,
280 const u8 *sae_data, int sae_data_len)
281{
282 int err;
283
284 ASSERT_RTNL();
285
286 wdev_lock(dev->ieee80211_ptr);
287 err = __cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid,
288 ssid, ssid_len, ie, ie_len,
289 key, key_len, key_idx,
290 sae_data, sae_data_len);
291 wdev_unlock(dev->ieee80211_ptr);
292
293 return err;
294}
295
296/* Do a logical ht_capa &= ht_capa_mask. */ 274/* Do a logical ht_capa &= ht_capa_mask. */
297void cfg80211_oper_and_ht_capa(struct ieee80211_ht_cap *ht_capa, 275void cfg80211_oper_and_ht_capa(struct ieee80211_ht_cap *ht_capa,
298 const struct ieee80211_ht_cap *ht_capa_mask) 276 const struct ieee80211_ht_cap *ht_capa_mask)
@@ -327,12 +305,12 @@ void cfg80211_oper_and_vht_capa(struct ieee80211_vht_cap *vht_capa,
327 p1[i] &= p2[i]; 305 p1[i] &= p2[i];
328} 306}
329 307
330int __cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev, 308int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev,
331 struct net_device *dev, 309 struct net_device *dev,
332 struct ieee80211_channel *chan, 310 struct ieee80211_channel *chan,
333 const u8 *bssid, 311 const u8 *bssid,
334 const u8 *ssid, int ssid_len, 312 const u8 *ssid, int ssid_len,
335 struct cfg80211_assoc_request *req) 313 struct cfg80211_assoc_request *req)
336{ 314{
337 struct wireless_dev *wdev = dev->ieee80211_ptr; 315 struct wireless_dev *wdev = dev->ieee80211_ptr;
338 int err; 316 int err;
@@ -382,30 +360,10 @@ out:
382 return err; 360 return err;
383} 361}
384 362
385int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev, 363int cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev,
386 struct net_device *dev, 364 struct net_device *dev, const u8 *bssid,
387 struct ieee80211_channel *chan, 365 const u8 *ie, int ie_len, u16 reason,
388 const u8 *bssid, 366 bool local_state_change)
389 const u8 *ssid, int ssid_len,
390 struct cfg80211_assoc_request *req)
391{
392 struct wireless_dev *wdev = dev->ieee80211_ptr;
393 int err;
394
395 ASSERT_RTNL();
396
397 wdev_lock(wdev);
398 err = __cfg80211_mlme_assoc(rdev, dev, chan, bssid,
399 ssid, ssid_len, req);
400 wdev_unlock(wdev);
401
402 return err;
403}
404
405int __cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev,
406 struct net_device *dev, const u8 *bssid,
407 const u8 *ie, int ie_len, u16 reason,
408 bool local_state_change)
409{ 367{
410 struct wireless_dev *wdev = dev->ieee80211_ptr; 368 struct wireless_dev *wdev = dev->ieee80211_ptr;
411 struct cfg80211_deauth_request req = { 369 struct cfg80211_deauth_request req = {
@@ -425,26 +383,10 @@ int __cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev,
425 return rdev_deauth(rdev, dev, &req); 383 return rdev_deauth(rdev, dev, &req);
426} 384}
427 385
428int cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, 386int cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev,
429 struct net_device *dev, const u8 *bssid, 387 struct net_device *dev, const u8 *bssid,
430 const u8 *ie, int ie_len, u16 reason, 388 const u8 *ie, int ie_len, u16 reason,
431 bool local_state_change) 389 bool local_state_change)
432{
433 struct wireless_dev *wdev = dev->ieee80211_ptr;
434 int err;
435
436 wdev_lock(wdev);
437 err = __cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason,
438 local_state_change);
439 wdev_unlock(wdev);
440
441 return err;
442}
443
444static int __cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev,
445 struct net_device *dev, const u8 *bssid,
446 const u8 *ie, int ie_len, u16 reason,
447 bool local_state_change)
448{ 390{
449 struct wireless_dev *wdev = dev->ieee80211_ptr; 391 struct wireless_dev *wdev = dev->ieee80211_ptr;
450 struct cfg80211_disassoc_request req = { 392 struct cfg80211_disassoc_request req = {
@@ -470,22 +412,6 @@ static int __cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev,
470 return rdev_disassoc(rdev, dev, &req); 412 return rdev_disassoc(rdev, dev, &req);
471} 413}
472 414
473int cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev,
474 struct net_device *dev, const u8 *bssid,
475 const u8 *ie, int ie_len, u16 reason,
476 bool local_state_change)
477{
478 struct wireless_dev *wdev = dev->ieee80211_ptr;
479 int err;
480
481 wdev_lock(wdev);
482 err = __cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason,
483 local_state_change);
484 wdev_unlock(wdev);
485
486 return err;
487}
488
489void cfg80211_mlme_down(struct cfg80211_registered_device *rdev, 415void cfg80211_mlme_down(struct cfg80211_registered_device *rdev,
490 struct net_device *dev) 416 struct net_device *dev)
491{ 417{
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 74cdb1a0cf31..49c2f2f511dc 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -5904,10 +5904,13 @@ static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info)
5904 if (local_state_change) 5904 if (local_state_change)
5905 return 0; 5905 return 0;
5906 5906
5907 return cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid, 5907 wdev_lock(dev->ieee80211_ptr);
5908 ssid, ssid_len, ie, ie_len, 5908 err = cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid,
5909 key.p.key, key.p.key_len, key.idx, 5909 ssid, ssid_len, ie, ie_len,
5910 sae_data, sae_data_len); 5910 key.p.key, key.p.key_len, key.idx,
5911 sae_data, sae_data_len);
5912 wdev_unlock(dev->ieee80211_ptr);
5913 return err;
5911} 5914}
5912 5915
5913static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev, 5916static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev,
@@ -6074,9 +6077,12 @@ static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
6074 } 6077 }
6075 6078
6076 err = nl80211_crypto_settings(rdev, info, &req.crypto, 1); 6079 err = nl80211_crypto_settings(rdev, info, &req.crypto, 1);
6077 if (!err) 6080 if (!err) {
6081 wdev_lock(dev->ieee80211_ptr);
6078 err = cfg80211_mlme_assoc(rdev, dev, chan, bssid, 6082 err = cfg80211_mlme_assoc(rdev, dev, chan, bssid,
6079 ssid, ssid_len, &req); 6083 ssid, ssid_len, &req);
6084 wdev_unlock(dev->ieee80211_ptr);
6085 }
6080 6086
6081 return err; 6087 return err;
6082} 6088}
@@ -6086,7 +6092,7 @@ static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info)
6086 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6092 struct cfg80211_registered_device *rdev = info->user_ptr[0];
6087 struct net_device *dev = info->user_ptr[1]; 6093 struct net_device *dev = info->user_ptr[1];
6088 const u8 *ie = NULL, *bssid; 6094 const u8 *ie = NULL, *bssid;
6089 int ie_len = 0; 6095 int ie_len = 0, err;
6090 u16 reason_code; 6096 u16 reason_code;
6091 bool local_state_change; 6097 bool local_state_change;
6092 6098
@@ -6121,8 +6127,11 @@ static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info)
6121 6127
6122 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 6128 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
6123 6129
6124 return cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason_code, 6130 wdev_lock(dev->ieee80211_ptr);
6125 local_state_change); 6131 err = cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason_code,
6132 local_state_change);
6133 wdev_unlock(dev->ieee80211_ptr);
6134 return err;
6126} 6135}
6127 6136
6128static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info) 6137static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info)
@@ -6130,7 +6139,7 @@ static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info)
6130 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6139 struct cfg80211_registered_device *rdev = info->user_ptr[0];
6131 struct net_device *dev = info->user_ptr[1]; 6140 struct net_device *dev = info->user_ptr[1];
6132 const u8 *ie = NULL, *bssid; 6141 const u8 *ie = NULL, *bssid;
6133 int ie_len = 0; 6142 int ie_len = 0, err;
6134 u16 reason_code; 6143 u16 reason_code;
6135 bool local_state_change; 6144 bool local_state_change;
6136 6145
@@ -6165,8 +6174,11 @@ static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info)
6165 6174
6166 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 6175 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
6167 6176
6168 return cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason_code, 6177 wdev_lock(dev->ieee80211_ptr);
6169 local_state_change); 6178 err = cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason_code,
6179 local_state_change);
6180 wdev_unlock(dev->ieee80211_ptr);
6181 return err;
6170} 6182}
6171 6183
6172static bool 6184static bool
diff --git a/net/wireless/sme.c b/net/wireless/sme.c
index 4dbf31407a56..31d67add7424 100644
--- a/net/wireless/sme.c
+++ b/net/wireless/sme.c
@@ -169,13 +169,13 @@ static int cfg80211_conn_do_work(struct wireless_dev *wdev)
169 case CFG80211_CONN_AUTHENTICATE_NEXT: 169 case CFG80211_CONN_AUTHENTICATE_NEXT:
170 BUG_ON(!rdev->ops->auth); 170 BUG_ON(!rdev->ops->auth);
171 wdev->conn->state = CFG80211_CONN_AUTHENTICATING; 171 wdev->conn->state = CFG80211_CONN_AUTHENTICATING;
172 return __cfg80211_mlme_auth(rdev, wdev->netdev, 172 return cfg80211_mlme_auth(rdev, wdev->netdev,
173 params->channel, params->auth_type, 173 params->channel, params->auth_type,
174 params->bssid, 174 params->bssid,
175 params->ssid, params->ssid_len, 175 params->ssid, params->ssid_len,
176 NULL, 0, 176 NULL, 0,
177 params->key, params->key_len, 177 params->key, params->key_len,
178 params->key_idx, NULL, 0); 178 params->key_idx, NULL, 0);
179 case CFG80211_CONN_ASSOCIATE_NEXT: 179 case CFG80211_CONN_ASSOCIATE_NEXT:
180 BUG_ON(!rdev->ops->assoc); 180 BUG_ON(!rdev->ops->assoc);
181 wdev->conn->state = CFG80211_CONN_ASSOCIATING; 181 wdev->conn->state = CFG80211_CONN_ASSOCIATING;
@@ -191,19 +191,19 @@ static int cfg80211_conn_do_work(struct wireless_dev *wdev)
191 req.vht_capa = params->vht_capa; 191 req.vht_capa = params->vht_capa;
192 req.vht_capa_mask = params->vht_capa_mask; 192 req.vht_capa_mask = params->vht_capa_mask;
193 193
194 err = __cfg80211_mlme_assoc(rdev, wdev->netdev, params->channel, 194 err = cfg80211_mlme_assoc(rdev, wdev->netdev, params->channel,
195 params->bssid, params->ssid, 195 params->bssid, params->ssid,
196 params->ssid_len, &req); 196 params->ssid_len, &req);
197 if (err) 197 if (err)
198 __cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid, 198 cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid,
199 NULL, 0, 199 NULL, 0,
200 WLAN_REASON_DEAUTH_LEAVING, 200 WLAN_REASON_DEAUTH_LEAVING,
201 false); 201 false);
202 return err; 202 return err;
203 case CFG80211_CONN_DEAUTH_ASSOC_FAIL: 203 case CFG80211_CONN_DEAUTH_ASSOC_FAIL:
204 __cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid, 204 cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid,
205 NULL, 0, 205 NULL, 0,
206 WLAN_REASON_DEAUTH_LEAVING, false); 206 WLAN_REASON_DEAUTH_LEAVING, false);
207 /* return an error so that we call __cfg80211_connect_result() */ 207 /* return an error so that we call __cfg80211_connect_result() */
208 return -EINVAL; 208 return -EINVAL;
209 default: 209 default:
@@ -961,7 +961,7 @@ int __cfg80211_disconnect(struct cfg80211_registered_device *rdev,
961 } 961 }
962 962
963 /* wdev->conn->params.bssid must be set if > SCANNING */ 963 /* wdev->conn->params.bssid must be set if > SCANNING */
964 err = __cfg80211_mlme_deauth(rdev, dev, 964 err = cfg80211_mlme_deauth(rdev, dev,
965 wdev->conn->params.bssid, 965 wdev->conn->params.bssid,
966 NULL, 0, reason, false); 966 NULL, 0, reason, false);
967 if (err) 967 if (err)
@@ -1018,6 +1018,6 @@ void cfg80211_sme_disassoc(struct net_device *dev,
1018 1018
1019 memcpy(bssid, bss->pub.bssid, ETH_ALEN); 1019 memcpy(bssid, bss->pub.bssid, ETH_ALEN);
1020 1020
1021 __cfg80211_mlme_deauth(rdev, dev, bssid, NULL, 0, 1021 cfg80211_mlme_deauth(rdev, dev, bssid, NULL, 0,
1022 WLAN_REASON_DEAUTH_LEAVING, false); 1022 WLAN_REASON_DEAUTH_LEAVING, false);
1023} 1023}