Commit b7fd26c9 authored by Yen-lin Lai's avatar Yen-lin Lai Committed by Kalle Valo

mwifiex: Report connected BSS with cfg80211_connect_bss()

When a network is moved or reconfigured on the different channel, there
can be multiple BSSes with the same BSSID and SSID in scan result
before the old one expires. Then, it can cause cfg80211_connect_result
to map current_bss to a bss with the wrong channel.

Let mwifiex_cfg80211_assoc return the selected BSS and then the caller
can report it cfg80211_connect_bss.
Signed-off-by: default avatarYen-lin Lai <yenlinlai@chromium.org>
Reviewed-by: default avatarBrian Norris <briannorris@chromium.org>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/20210201070649.1667209-1-yenlinlai@chromium.org
parent 199276b9
...@@ -2173,7 +2173,8 @@ static int ...@@ -2173,7 +2173,8 @@ static int
mwifiex_cfg80211_assoc(struct mwifiex_private *priv, size_t ssid_len, mwifiex_cfg80211_assoc(struct mwifiex_private *priv, size_t ssid_len,
const u8 *ssid, const u8 *bssid, int mode, const u8 *ssid, const u8 *bssid, int mode,
struct ieee80211_channel *channel, struct ieee80211_channel *channel,
struct cfg80211_connect_params *sme, bool privacy) struct cfg80211_connect_params *sme, bool privacy,
struct cfg80211_bss **sel_bss)
{ {
struct cfg80211_ssid req_ssid; struct cfg80211_ssid req_ssid;
int ret, auth_type = 0; int ret, auth_type = 0;
...@@ -2307,17 +2308,31 @@ mwifiex_cfg80211_assoc(struct mwifiex_private *priv, size_t ssid_len, ...@@ -2307,17 +2308,31 @@ mwifiex_cfg80211_assoc(struct mwifiex_private *priv, size_t ssid_len,
} }
} }
if (bss)
cfg80211_ref_bss(priv->adapter->wiphy, bss);
ret = mwifiex_bss_start(priv, bss, &req_ssid); ret = mwifiex_bss_start(priv, bss, &req_ssid);
if (ret) if (ret)
return ret; goto cleanup;
if (mode == NL80211_IFTYPE_ADHOC) { if (mode == NL80211_IFTYPE_ADHOC) {
/* Inform the BSS information to kernel, otherwise /* Inform the BSS information to kernel, otherwise
* kernel will give a panic after successful assoc */ * kernel will give a panic after successful assoc */
if (mwifiex_cfg80211_inform_ibss_bss(priv)) if (mwifiex_cfg80211_inform_ibss_bss(priv)) {
return -EFAULT; ret = -EFAULT;
goto cleanup;
}
} }
/* Pass the selected BSS entry to caller. */
if (sel_bss) {
*sel_bss = bss;
bss = NULL;
}
cleanup:
if (bss)
cfg80211_put_bss(priv->adapter->wiphy, bss);
return ret; return ret;
} }
...@@ -2334,6 +2349,7 @@ mwifiex_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, ...@@ -2334,6 +2349,7 @@ mwifiex_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
{ {
struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
struct mwifiex_adapter *adapter = priv->adapter; struct mwifiex_adapter *adapter = priv->adapter;
struct cfg80211_bss *bss = NULL;
int ret; int ret;
if (GET_BSS_ROLE(priv) != MWIFIEX_BSS_ROLE_STA) { if (GET_BSS_ROLE(priv) != MWIFIEX_BSS_ROLE_STA) {
...@@ -2369,11 +2385,12 @@ mwifiex_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, ...@@ -2369,11 +2385,12 @@ mwifiex_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
cfg80211_sched_scan_stopped_locked(priv->wdev.wiphy, 0); cfg80211_sched_scan_stopped_locked(priv->wdev.wiphy, 0);
ret = mwifiex_cfg80211_assoc(priv, sme->ssid_len, sme->ssid, sme->bssid, ret = mwifiex_cfg80211_assoc(priv, sme->ssid_len, sme->ssid, sme->bssid,
priv->bss_mode, sme->channel, sme, 0); priv->bss_mode, sme->channel, sme, 0,
&bss);
if (!ret) { if (!ret) {
cfg80211_connect_result(priv->netdev, priv->cfg_bssid, NULL, 0, cfg80211_connect_bss(priv->netdev, priv->cfg_bssid, bss, NULL,
NULL, 0, WLAN_STATUS_SUCCESS, 0, NULL, 0, WLAN_STATUS_SUCCESS,
GFP_KERNEL); GFP_KERNEL, NL80211_TIMEOUT_UNSPECIFIED);
mwifiex_dbg(priv->adapter, MSG, mwifiex_dbg(priv->adapter, MSG,
"info: associated to bssid %pM successfully\n", "info: associated to bssid %pM successfully\n",
priv->cfg_bssid); priv->cfg_bssid);
...@@ -2504,7 +2521,7 @@ mwifiex_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *dev, ...@@ -2504,7 +2521,7 @@ mwifiex_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *dev,
ret = mwifiex_cfg80211_assoc(priv, params->ssid_len, params->ssid, ret = mwifiex_cfg80211_assoc(priv, params->ssid_len, params->ssid,
params->bssid, priv->bss_mode, params->bssid, priv->bss_mode,
params->chandef.chan, NULL, params->chandef.chan, NULL,
params->privacy); params->privacy, NULL);
done: done:
if (!ret) { if (!ret) {
cfg80211_ibss_joined(priv->netdev, priv->cfg_bssid, cfg80211_ibss_joined(priv->netdev, priv->cfg_bssid,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment