cfg80211: let SME control reassociation vs. association
Since we don't really know that well in the kernel, let's let the SME control whether it wants to use reassociation or not, by allowing it to give the previous BSSID in the associate() parameters. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
committed by
John W. Linville
parent
2ffa5fede3
commit
3e5d7649a6
@@ -202,7 +202,8 @@ int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev,
|
||||
const u8 *ie, int ie_len);
|
||||
int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *dev, struct ieee80211_channel *chan,
|
||||
const u8 *bssid, const u8 *ssid, int ssid_len,
|
||||
const u8 *bssid, const u8 *prev_bssid,
|
||||
const u8 *ssid, int ssid_len,
|
||||
const u8 *ie, int ie_len, bool use_mfp,
|
||||
struct cfg80211_crypto_settings *crypt);
|
||||
int cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev,
|
||||
|
@@ -335,7 +335,8 @@ int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev,
|
||||
|
||||
int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *dev, struct ieee80211_channel *chan,
|
||||
const u8 *bssid, const u8 *ssid, int ssid_len,
|
||||
const u8 *bssid, const u8 *prev_bssid,
|
||||
const u8 *ssid, int ssid_len,
|
||||
const u8 *ie, int ie_len, bool use_mfp,
|
||||
struct cfg80211_crypto_settings *crypt)
|
||||
{
|
||||
@@ -353,6 +354,7 @@ int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev,
|
||||
req.ie_len = ie_len;
|
||||
memcpy(&req.crypto, crypt, sizeof(req.crypto));
|
||||
req.use_mfp = use_mfp;
|
||||
req.prev_bssid = prev_bssid;
|
||||
req.bss = cfg80211_get_bss(&rdev->wiphy, chan, bssid, ssid, ssid_len,
|
||||
WLAN_CAPABILITY_ESS, WLAN_CAPABILITY_ESS);
|
||||
if (!req.bss)
|
||||
|
@@ -71,6 +71,7 @@ static struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] __read_mostly = {
|
||||
[NL80211_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ-1 },
|
||||
|
||||
[NL80211_ATTR_MAC] = { .type = NLA_BINARY, .len = ETH_ALEN },
|
||||
[NL80211_ATTR_PREV_BSSID] = { .type = NLA_BINARY, .len = ETH_ALEN },
|
||||
|
||||
[NL80211_ATTR_KEY_DATA] = { .type = NLA_BINARY,
|
||||
.len = WLAN_MAX_KEY_LEN },
|
||||
@@ -3187,7 +3188,7 @@ static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
|
||||
struct net_device *dev;
|
||||
struct cfg80211_crypto_settings crypto;
|
||||
struct ieee80211_channel *chan;
|
||||
const u8 *bssid, *ssid, *ie = NULL;
|
||||
const u8 *bssid, *ssid, *ie = NULL, *prev_bssid = NULL;
|
||||
int err, ssid_len, ie_len = 0;
|
||||
bool use_mfp = false;
|
||||
|
||||
@@ -3248,10 +3249,13 @@ static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
|
||||
}
|
||||
}
|
||||
|
||||
if (info->attrs[NL80211_ATTR_PREV_BSSID])
|
||||
prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]);
|
||||
|
||||
err = nl80211_crypto_settings(info, &crypto, 1);
|
||||
if (!err)
|
||||
err = cfg80211_mlme_assoc(rdev, dev, chan, bssid, ssid,
|
||||
ssid_len, ie, ie_len, use_mfp,
|
||||
err = cfg80211_mlme_assoc(rdev, dev, chan, bssid, prev_bssid,
|
||||
ssid, ssid_len, ie, ie_len, use_mfp,
|
||||
&crypto);
|
||||
|
||||
out:
|
||||
|
@@ -125,8 +125,14 @@ static int cfg80211_conn_do_work(struct wireless_dev *wdev)
|
||||
case CFG80211_CONN_ASSOCIATE_NEXT:
|
||||
BUG_ON(!drv->ops->assoc);
|
||||
wdev->conn->state = CFG80211_CONN_ASSOCIATING;
|
||||
/*
|
||||
* We could, later, implement roaming here and then actually
|
||||
* set prev_bssid to non-NULL. But then we need to be aware
|
||||
* that some APs don't like that -- so we'd need to retry
|
||||
* the association.
|
||||
*/
|
||||
err = cfg80211_mlme_assoc(drv, wdev->netdev,
|
||||
params->channel, params->bssid,
|
||||
params->channel, params->bssid, NULL,
|
||||
params->ssid, params->ssid_len,
|
||||
params->ie, params->ie_len,
|
||||
false, ¶ms->crypto);
|
||||
|
Reference in New Issue
Block a user