diff options
author | Johannes Berg <johannes.berg@intel.com> | 2013-02-21 14:09:09 -0500 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2013-03-06 10:35:49 -0500 |
commit | f62fab735e99af2190eba03f565adaca5c002882 (patch) | |
tree | 450eb619c553539cc7515b16499d77a698b17029 /net/wireless | |
parent | dd5ecfeac8d1a96d0aba6bbcaec431756f8d8854 (diff) |
cfg80211: refactor association parameters
cfg80211_mlme_assoc() has grown far too many arguments,
make the caller build almost all of the driver struct
and pass that to the function instead.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/wireless')
-rw-r--r-- | net/wireless/core.h | 21 | ||||
-rw-r--r-- | net/wireless/mlme.c | 64 | ||||
-rw-r--r-- | net/wireless/nl80211.c | 54 | ||||
-rw-r--r-- | net/wireless/sme.c | 28 |
4 files changed, 63 insertions, 104 deletions
diff --git a/net/wireless/core.h b/net/wireless/core.h index c2f94f22bb22..9a2be8ddac5f 100644 --- a/net/wireless/core.h +++ b/net/wireless/core.h | |||
@@ -330,24 +330,15 @@ int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, | |||
330 | int __cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev, | 330 | int __cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev, |
331 | struct net_device *dev, | 331 | struct net_device *dev, |
332 | struct ieee80211_channel *chan, | 332 | struct ieee80211_channel *chan, |
333 | const u8 *bssid, const u8 *prev_bssid, | 333 | const u8 *bssid, |
334 | const u8 *ssid, int ssid_len, | 334 | const u8 *ssid, int ssid_len, |
335 | const u8 *ie, int ie_len, bool use_mfp, | 335 | struct cfg80211_assoc_request *req); |
336 | struct cfg80211_crypto_settings *crypt, | ||
337 | u32 assoc_flags, struct ieee80211_ht_cap *ht_capa, | ||
338 | struct ieee80211_ht_cap *ht_capa_mask, | ||
339 | struct ieee80211_vht_cap *vht_capa, | ||
340 | struct ieee80211_vht_cap *vht_capa_mask); | ||
341 | int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev, | 336 | int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev, |
342 | struct net_device *dev, struct ieee80211_channel *chan, | 337 | struct net_device *dev, |
343 | const u8 *bssid, const u8 *prev_bssid, | 338 | struct ieee80211_channel *chan, |
339 | const u8 *bssid, | ||
344 | const u8 *ssid, int ssid_len, | 340 | const u8 *ssid, int ssid_len, |
345 | const u8 *ie, int ie_len, bool use_mfp, | 341 | struct cfg80211_assoc_request *req); |
346 | struct cfg80211_crypto_settings *crypt, | ||
347 | u32 assoc_flags, struct ieee80211_ht_cap *ht_capa, | ||
348 | struct ieee80211_ht_cap *ht_capa_mask, | ||
349 | struct ieee80211_vht_cap *vht_capa, | ||
350 | struct ieee80211_vht_cap *vht_capa_mask); | ||
351 | int __cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, | 342 | int __cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, |
352 | struct net_device *dev, const u8 *bssid, | 343 | struct net_device *dev, const u8 *bssid, |
353 | const u8 *ie, int ie_len, u16 reason, | 344 | const u8 *ie, int ie_len, u16 reason, |
diff --git a/net/wireless/mlme.c b/net/wireless/mlme.c index c82adfee7697..390198bf4b36 100644 --- a/net/wireless/mlme.c +++ b/net/wireless/mlme.c | |||
@@ -363,26 +363,18 @@ void cfg80211_oper_and_vht_capa(struct ieee80211_vht_cap *vht_capa, | |||
363 | int __cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev, | 363 | int __cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev, |
364 | struct net_device *dev, | 364 | struct net_device *dev, |
365 | struct ieee80211_channel *chan, | 365 | struct ieee80211_channel *chan, |
366 | const u8 *bssid, const u8 *prev_bssid, | 366 | const u8 *bssid, |
367 | const u8 *ssid, int ssid_len, | 367 | const u8 *ssid, int ssid_len, |
368 | const u8 *ie, int ie_len, bool use_mfp, | 368 | struct cfg80211_assoc_request *req) |
369 | struct cfg80211_crypto_settings *crypt, | ||
370 | u32 assoc_flags, struct ieee80211_ht_cap *ht_capa, | ||
371 | struct ieee80211_ht_cap *ht_capa_mask, | ||
372 | struct ieee80211_vht_cap *vht_capa, | ||
373 | struct ieee80211_vht_cap *vht_capa_mask) | ||
374 | { | 369 | { |
375 | struct wireless_dev *wdev = dev->ieee80211_ptr; | 370 | struct wireless_dev *wdev = dev->ieee80211_ptr; |
376 | struct cfg80211_assoc_request req; | ||
377 | int err; | 371 | int err; |
378 | bool was_connected = false; | 372 | bool was_connected = false; |
379 | 373 | ||
380 | ASSERT_WDEV_LOCK(wdev); | 374 | ASSERT_WDEV_LOCK(wdev); |
381 | 375 | ||
382 | memset(&req, 0, sizeof(req)); | 376 | if (wdev->current_bss && req->prev_bssid && |
383 | 377 | ether_addr_equal(wdev->current_bss->pub.bssid, req->prev_bssid)) { | |
384 | if (wdev->current_bss && prev_bssid && | ||
385 | ether_addr_equal(wdev->current_bss->pub.bssid, prev_bssid)) { | ||
386 | /* | 378 | /* |
387 | * Trying to reassociate: Allow this to proceed and let the old | 379 | * Trying to reassociate: Allow this to proceed and let the old |
388 | * association to be dropped when the new one is completed. | 380 | * association to be dropped when the new one is completed. |
@@ -394,47 +386,30 @@ int __cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev, | |||
394 | } else if (wdev->current_bss) | 386 | } else if (wdev->current_bss) |
395 | return -EALREADY; | 387 | return -EALREADY; |
396 | 388 | ||
397 | req.ie = ie; | 389 | cfg80211_oper_and_ht_capa(&req->ht_capa_mask, |
398 | req.ie_len = ie_len; | ||
399 | memcpy(&req.crypto, crypt, sizeof(req.crypto)); | ||
400 | req.use_mfp = use_mfp; | ||
401 | req.prev_bssid = prev_bssid; | ||
402 | req.flags = assoc_flags; | ||
403 | if (ht_capa) | ||
404 | memcpy(&req.ht_capa, ht_capa, sizeof(req.ht_capa)); | ||
405 | if (ht_capa_mask) | ||
406 | memcpy(&req.ht_capa_mask, ht_capa_mask, | ||
407 | sizeof(req.ht_capa_mask)); | ||
408 | cfg80211_oper_and_ht_capa(&req.ht_capa_mask, | ||
409 | rdev->wiphy.ht_capa_mod_mask); | 390 | rdev->wiphy.ht_capa_mod_mask); |
410 | if (vht_capa) | 391 | cfg80211_oper_and_vht_capa(&req->vht_capa_mask, |
411 | memcpy(&req.vht_capa, vht_capa, sizeof(req.vht_capa)); | ||
412 | if (vht_capa_mask) | ||
413 | memcpy(&req.vht_capa_mask, vht_capa_mask, | ||
414 | sizeof(req.vht_capa_mask)); | ||
415 | cfg80211_oper_and_vht_capa(&req.vht_capa_mask, | ||
416 | rdev->wiphy.vht_capa_mod_mask); | 392 | rdev->wiphy.vht_capa_mod_mask); |
417 | 393 | ||
418 | req.bss = cfg80211_get_bss(&rdev->wiphy, chan, bssid, ssid, ssid_len, | 394 | req->bss = cfg80211_get_bss(&rdev->wiphy, chan, bssid, ssid, ssid_len, |
419 | WLAN_CAPABILITY_ESS, WLAN_CAPABILITY_ESS); | 395 | WLAN_CAPABILITY_ESS, WLAN_CAPABILITY_ESS); |
420 | if (!req.bss) { | 396 | if (!req->bss) { |
421 | if (was_connected) | 397 | if (was_connected) |
422 | wdev->sme_state = CFG80211_SME_CONNECTED; | 398 | wdev->sme_state = CFG80211_SME_CONNECTED; |
423 | return -ENOENT; | 399 | return -ENOENT; |
424 | } | 400 | } |
425 | 401 | ||
426 | err = cfg80211_can_use_chan(rdev, wdev, req.bss->channel, | 402 | err = cfg80211_can_use_chan(rdev, wdev, chan, CHAN_MODE_SHARED); |
427 | CHAN_MODE_SHARED); | ||
428 | if (err) | 403 | if (err) |
429 | goto out; | 404 | goto out; |
430 | 405 | ||
431 | err = rdev_assoc(rdev, dev, &req); | 406 | err = rdev_assoc(rdev, dev, req); |
432 | 407 | ||
433 | out: | 408 | out: |
434 | if (err) { | 409 | if (err) { |
435 | if (was_connected) | 410 | if (was_connected) |
436 | wdev->sme_state = CFG80211_SME_CONNECTED; | 411 | wdev->sme_state = CFG80211_SME_CONNECTED; |
437 | cfg80211_put_bss(&rdev->wiphy, req.bss); | 412 | cfg80211_put_bss(&rdev->wiphy, req->bss); |
438 | } | 413 | } |
439 | 414 | ||
440 | return err; | 415 | return err; |
@@ -443,24 +418,17 @@ out: | |||
443 | int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev, | 418 | int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev, |
444 | struct net_device *dev, | 419 | struct net_device *dev, |
445 | struct ieee80211_channel *chan, | 420 | struct ieee80211_channel *chan, |
446 | const u8 *bssid, const u8 *prev_bssid, | 421 | const u8 *bssid, |
447 | const u8 *ssid, int ssid_len, | 422 | const u8 *ssid, int ssid_len, |
448 | const u8 *ie, int ie_len, bool use_mfp, | 423 | struct cfg80211_assoc_request *req) |
449 | struct cfg80211_crypto_settings *crypt, | ||
450 | u32 assoc_flags, struct ieee80211_ht_cap *ht_capa, | ||
451 | struct ieee80211_ht_cap *ht_capa_mask, | ||
452 | struct ieee80211_vht_cap *vht_capa, | ||
453 | struct ieee80211_vht_cap *vht_capa_mask) | ||
454 | { | 424 | { |
455 | struct wireless_dev *wdev = dev->ieee80211_ptr; | 425 | struct wireless_dev *wdev = dev->ieee80211_ptr; |
456 | int err; | 426 | int err; |
457 | 427 | ||
458 | mutex_lock(&rdev->devlist_mtx); | 428 | mutex_lock(&rdev->devlist_mtx); |
459 | wdev_lock(wdev); | 429 | wdev_lock(wdev); |
460 | err = __cfg80211_mlme_assoc(rdev, dev, chan, bssid, prev_bssid, | 430 | err = __cfg80211_mlme_assoc(rdev, dev, chan, bssid, |
461 | ssid, ssid_len, ie, ie_len, use_mfp, crypt, | 431 | ssid, ssid_len, req); |
462 | assoc_flags, ht_capa, ht_capa_mask, | ||
463 | vht_capa, vht_capa_mask); | ||
464 | wdev_unlock(wdev); | 432 | wdev_unlock(wdev); |
465 | mutex_unlock(&rdev->devlist_mtx); | 433 | mutex_unlock(&rdev->devlist_mtx); |
466 | 434 | ||
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 6a5893f5e481..3acde3f88d3a 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -5984,16 +5984,10 @@ static int nl80211_associate(struct sk_buff *skb, struct genl_info *info) | |||
5984 | { | 5984 | { |
5985 | struct cfg80211_registered_device *rdev = info->user_ptr[0]; | 5985 | struct cfg80211_registered_device *rdev = info->user_ptr[0]; |
5986 | struct net_device *dev = info->user_ptr[1]; | 5986 | struct net_device *dev = info->user_ptr[1]; |
5987 | struct cfg80211_crypto_settings crypto; | ||
5988 | struct ieee80211_channel *chan; | 5987 | struct ieee80211_channel *chan; |
5989 | const u8 *bssid, *ssid, *ie = NULL, *prev_bssid = NULL; | 5988 | struct cfg80211_assoc_request req = {}; |
5990 | int err, ssid_len, ie_len = 0; | 5989 | const u8 *bssid, *ssid; |
5991 | bool use_mfp = false; | 5990 | int err, ssid_len = 0; |
5992 | u32 flags = 0; | ||
5993 | struct ieee80211_ht_cap *ht_capa = NULL; | ||
5994 | struct ieee80211_ht_cap *ht_capa_mask = NULL; | ||
5995 | struct ieee80211_vht_cap *vht_capa = NULL; | ||
5996 | struct ieee80211_vht_cap *vht_capa_mask = NULL; | ||
5997 | 5991 | ||
5998 | if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) | 5992 | if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) |
5999 | return -EINVAL; | 5993 | return -EINVAL; |
@@ -6021,54 +6015,58 @@ static int nl80211_associate(struct sk_buff *skb, struct genl_info *info) | |||
6021 | ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); | 6015 | ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); |
6022 | 6016 | ||
6023 | if (info->attrs[NL80211_ATTR_IE]) { | 6017 | if (info->attrs[NL80211_ATTR_IE]) { |
6024 | ie = nla_data(info->attrs[NL80211_ATTR_IE]); | 6018 | req.ie = nla_data(info->attrs[NL80211_ATTR_IE]); |
6025 | ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); | 6019 | req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); |
6026 | } | 6020 | } |
6027 | 6021 | ||
6028 | if (info->attrs[NL80211_ATTR_USE_MFP]) { | 6022 | if (info->attrs[NL80211_ATTR_USE_MFP]) { |
6029 | enum nl80211_mfp mfp = | 6023 | enum nl80211_mfp mfp = |
6030 | nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); | 6024 | nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); |
6031 | if (mfp == NL80211_MFP_REQUIRED) | 6025 | if (mfp == NL80211_MFP_REQUIRED) |
6032 | use_mfp = true; | 6026 | req.use_mfp = true; |
6033 | else if (mfp != NL80211_MFP_NO) | 6027 | else if (mfp != NL80211_MFP_NO) |
6034 | return -EINVAL; | 6028 | return -EINVAL; |
6035 | } | 6029 | } |
6036 | 6030 | ||
6037 | if (info->attrs[NL80211_ATTR_PREV_BSSID]) | 6031 | if (info->attrs[NL80211_ATTR_PREV_BSSID]) |
6038 | prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); | 6032 | req.prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); |
6039 | 6033 | ||
6040 | if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) | 6034 | if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) |
6041 | flags |= ASSOC_REQ_DISABLE_HT; | 6035 | req.flags |= ASSOC_REQ_DISABLE_HT; |
6042 | 6036 | ||
6043 | if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) | 6037 | if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) |
6044 | ht_capa_mask = | 6038 | memcpy(&req.ht_capa_mask, |
6045 | nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]); | 6039 | nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), |
6040 | sizeof(req.ht_capa_mask)); | ||
6046 | 6041 | ||
6047 | if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { | 6042 | if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { |
6048 | if (!ht_capa_mask) | 6043 | if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) |
6049 | return -EINVAL; | 6044 | return -EINVAL; |
6050 | ht_capa = nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); | 6045 | memcpy(&req.ht_capa, |
6046 | nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), | ||
6047 | sizeof(req.ht_capa)); | ||
6051 | } | 6048 | } |
6052 | 6049 | ||
6053 | if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) | 6050 | if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) |
6054 | flags |= ASSOC_REQ_DISABLE_VHT; | 6051 | req.flags |= ASSOC_REQ_DISABLE_VHT; |
6055 | 6052 | ||
6056 | if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) | 6053 | if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) |
6057 | vht_capa_mask = | 6054 | memcpy(&req.vht_capa_mask, |
6058 | nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]); | 6055 | nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), |
6056 | sizeof(req.vht_capa_mask)); | ||
6059 | 6057 | ||
6060 | if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { | 6058 | if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { |
6061 | if (!vht_capa_mask) | 6059 | if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) |
6062 | return -EINVAL; | 6060 | return -EINVAL; |
6063 | vht_capa = nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); | 6061 | memcpy(&req.vht_capa, |
6062 | nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), | ||
6063 | sizeof(req.vht_capa)); | ||
6064 | } | 6064 | } |
6065 | 6065 | ||
6066 | err = nl80211_crypto_settings(rdev, info, &crypto, 1); | 6066 | err = nl80211_crypto_settings(rdev, info, &req.crypto, 1); |
6067 | if (!err) | 6067 | if (!err) |
6068 | err = cfg80211_mlme_assoc(rdev, dev, chan, bssid, prev_bssid, | 6068 | err = cfg80211_mlme_assoc(rdev, dev, chan, bssid, |
6069 | ssid, ssid_len, ie, ie_len, use_mfp, | 6069 | ssid, ssid_len, &req); |
6070 | &crypto, flags, ht_capa, ht_capa_mask, | ||
6071 | vht_capa, vht_capa_mask); | ||
6072 | 6070 | ||
6073 | return err; | 6071 | return err; |
6074 | } | 6072 | } |
diff --git a/net/wireless/sme.c b/net/wireless/sme.c index 7da118c034f0..bad4c4b5e4eb 100644 --- a/net/wireless/sme.c +++ b/net/wireless/sme.c | |||
@@ -159,7 +159,7 @@ static int cfg80211_conn_do_work(struct wireless_dev *wdev) | |||
159 | { | 159 | { |
160 | struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy); | 160 | struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy); |
161 | struct cfg80211_connect_params *params; | 161 | struct cfg80211_connect_params *params; |
162 | const u8 *prev_bssid = NULL; | 162 | struct cfg80211_assoc_request req = {}; |
163 | int err; | 163 | int err; |
164 | 164 | ||
165 | ASSERT_WDEV_LOCK(wdev); | 165 | ASSERT_WDEV_LOCK(wdev); |
@@ -186,18 +186,20 @@ static int cfg80211_conn_do_work(struct wireless_dev *wdev) | |||
186 | BUG_ON(!rdev->ops->assoc); | 186 | BUG_ON(!rdev->ops->assoc); |
187 | wdev->conn->state = CFG80211_CONN_ASSOCIATING; | 187 | wdev->conn->state = CFG80211_CONN_ASSOCIATING; |
188 | if (wdev->conn->prev_bssid_valid) | 188 | if (wdev->conn->prev_bssid_valid) |
189 | prev_bssid = wdev->conn->prev_bssid; | 189 | req.prev_bssid = wdev->conn->prev_bssid; |
190 | err = __cfg80211_mlme_assoc(rdev, wdev->netdev, | 190 | req.ie = params->ie; |
191 | params->channel, params->bssid, | 191 | req.ie_len = params->ie_len; |
192 | prev_bssid, | 192 | req.use_mfp = params->mfp != NL80211_MFP_NO; |
193 | params->ssid, params->ssid_len, | 193 | req.crypto = params->crypto; |
194 | params->ie, params->ie_len, | 194 | req.flags = params->flags; |
195 | params->mfp != NL80211_MFP_NO, | 195 | req.ht_capa = params->ht_capa; |
196 | ¶ms->crypto, | 196 | req.ht_capa_mask = params->ht_capa_mask; |
197 | params->flags, ¶ms->ht_capa, | 197 | req.vht_capa = params->vht_capa; |
198 | ¶ms->ht_capa_mask, | 198 | req.vht_capa_mask = params->vht_capa_mask; |
199 | ¶ms->vht_capa, | 199 | |
200 | ¶ms->vht_capa_mask); | 200 | err = __cfg80211_mlme_assoc(rdev, wdev->netdev, params->channel, |
201 | params->bssid, params->ssid, | ||
202 | params->ssid_len, &req); | ||
201 | if (err) | 203 | if (err) |
202 | __cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid, | 204 | __cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid, |
203 | NULL, 0, | 205 | NULL, 0, |