Skip to content

Commit

Permalink
wifi: cfg80211: simplify cfg80211_mlme_auth() prototype
Browse files Browse the repository at this point in the history
This function has far too many parameters now, move out
the BSS lookup and pass the request struct instead.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  • Loading branch information
Johannes Berg committed Jun 20, 2022
1 parent 0f48b8b commit 325839d
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 55 deletions.
8 changes: 1 addition & 7 deletions net/wireless/core.h
Original file line number Diff line number Diff line change
Expand Up @@ -363,13 +363,7 @@ int cfg80211_stop_ap(struct cfg80211_registered_device *rdev,
/* MLME */
int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev,
struct net_device *dev,
struct ieee80211_channel *chan,
enum nl80211_auth_type auth_type,
const u8 *bssid,
const u8 *ssid, int ssid_len,
const u8 *ie, int ie_len,
const u8 *key, int key_len, int key_idx,
const u8 *auth_data, int auth_data_len);
struct cfg80211_auth_request *req);
int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev,
struct net_device *dev,
struct cfg80211_assoc_request *req);
Expand Down
41 changes: 10 additions & 31 deletions net/wireless/mlme.c
Original file line number Diff line number Diff line change
Expand Up @@ -232,47 +232,26 @@ EXPORT_SYMBOL(cfg80211_michael_mic_failure);
/* some MLME handling for userspace SME */
int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev,
struct net_device *dev,
struct ieee80211_channel *chan,
enum nl80211_auth_type auth_type,
const u8 *bssid,
const u8 *ssid, int ssid_len,
const u8 *ie, int ie_len,
const u8 *key, int key_len, int key_idx,
const u8 *auth_data, int auth_data_len)
struct cfg80211_auth_request *req)
{
struct wireless_dev *wdev = dev->ieee80211_ptr;
struct cfg80211_auth_request req = {
.ie = ie,
.ie_len = ie_len,
.auth_data = auth_data,
.auth_data_len = auth_data_len,
.auth_type = auth_type,
.key = key,
.key_len = key_len,
.key_idx = key_idx,
};
int err;

ASSERT_WDEV_LOCK(wdev);

if (auth_type == NL80211_AUTHTYPE_SHARED_KEY)
if (!key || !key_len || key_idx < 0 || key_idx > 3)
if (!req->bss)
return -ENOENT;

if (req->auth_type == NL80211_AUTHTYPE_SHARED_KEY) {
if (!req->key || !req->key_len ||
req->key_idx < 0 || req->key_idx > 3)
return -EINVAL;
}

if (wdev->connected &&
ether_addr_equal(bssid, wdev->u.client.connected_addr))
ether_addr_equal(req->bss->bssid, wdev->u.client.connected_addr))
return -EALREADY;

req.bss = cfg80211_get_bss(&rdev->wiphy, chan, bssid, ssid, ssid_len,
IEEE80211_BSS_TYPE_ESS,
IEEE80211_PRIVACY_ANY);
if (!req.bss)
return -ENOENT;

err = rdev_auth(rdev, dev, &req);

cfg80211_put_bss(&rdev->wiphy, req.bss);
return err;
return rdev_auth(rdev, dev, req);
}

/* Do a logical ht_capa &= ht_capa_mask. */
Expand Down
32 changes: 22 additions & 10 deletions net/wireless/nl80211.c
Original file line number Diff line number Diff line change
Expand Up @@ -10168,11 +10168,12 @@ static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info)
struct cfg80211_registered_device *rdev = info->user_ptr[0];
struct net_device *dev = info->user_ptr[1];
struct ieee80211_channel *chan;
const u8 *bssid, *ssid, *ie = NULL, *auth_data = NULL;
int err, ssid_len, ie_len = 0, auth_data_len = 0;
const u8 *bssid, *ssid;
int err, ssid_len;
enum nl80211_auth_type auth_type;
struct key_parse key;
bool local_state_change;
struct cfg80211_auth_request req = {};
u32 freq;

if (!info->attrs[NL80211_ATTR_MAC])
Expand Down Expand Up @@ -10243,8 +10244,8 @@ static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info)
ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);

if (info->attrs[NL80211_ATTR_IE]) {
ie = nla_data(info->attrs[NL80211_ATTR_IE]);
ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
req.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
}

auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
Expand All @@ -10264,8 +10265,8 @@ static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info)
auth_type != NL80211_AUTHTYPE_FILS_SK_PFS &&
auth_type != NL80211_AUTHTYPE_FILS_PK)
return -EINVAL;
auth_data = nla_data(info->attrs[NL80211_ATTR_AUTH_DATA]);
auth_data_len = nla_len(info->attrs[NL80211_ATTR_AUTH_DATA]);
req.auth_data = nla_data(info->attrs[NL80211_ATTR_AUTH_DATA]);
req.auth_data_len = nla_len(info->attrs[NL80211_ATTR_AUTH_DATA]);
}

local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
Expand All @@ -10277,12 +10278,23 @@ static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info)
if (local_state_change)
return 0;

req.auth_type = auth_type;
req.key = key.p.key;
req.key_len = key.p.key_len;
req.key_idx = key.idx;

req.bss = cfg80211_get_bss(&rdev->wiphy, chan, bssid, ssid, ssid_len,
IEEE80211_BSS_TYPE_ESS,
IEEE80211_PRIVACY_ANY);
if (!req.bss)
return -ENOENT;

wdev_lock(dev->ieee80211_ptr);
err = cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid,
ssid, ssid_len, ie, ie_len,
key.p.key, key.p.key_len, key.idx,
auth_data, auth_data_len);
err = cfg80211_mlme_auth(rdev, dev, &req);
wdev_unlock(dev->ieee80211_ptr);

cfg80211_put_bss(&rdev->wiphy, req.bss);

return err;
}

Expand Down
20 changes: 13 additions & 7 deletions net/wireless/sme.c
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ static int cfg80211_conn_do_work(struct wireless_dev *wdev,
{
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
struct cfg80211_connect_params *params;
struct cfg80211_auth_request auth_req = {};
struct cfg80211_assoc_request req = {};
int err;

Expand All @@ -167,13 +168,18 @@ static int cfg80211_conn_do_work(struct wireless_dev *wdev,
if (WARN_ON(!rdev->ops->auth))
return -EOPNOTSUPP;
wdev->conn->state = CFG80211_CONN_AUTHENTICATING;
return cfg80211_mlme_auth(rdev, wdev->netdev,
params->channel, params->auth_type,
params->bssid,
params->ssid, params->ssid_len,
NULL, 0,
params->key, params->key_len,
params->key_idx, NULL, 0);
auth_req.key = params->key;
auth_req.key_len = params->key_len;
auth_req.key_idx = params->key_idx;
auth_req.auth_type = params->auth_type;
auth_req.bss = cfg80211_get_bss(&rdev->wiphy, params->channel,
params->bssid,
params->ssid, params->ssid_len,
IEEE80211_BSS_TYPE_ESS,
IEEE80211_PRIVACY_ANY);
err = cfg80211_mlme_auth(rdev, wdev->netdev, &auth_req);
cfg80211_put_bss(&rdev->wiphy, auth_req.bss);
return err;
case CFG80211_CONN_AUTH_FAILED_TIMEOUT:
*treason = NL80211_TIMEOUT_AUTH;
return -ENOTCONN;
Expand Down

0 comments on commit 325839d

Please sign in to comment.