Commit 57f16b5d authored by Amitkumar Karwar's avatar Amitkumar Karwar Committed by John W. Linville

mwifiex: fix simultaneous assoc and scan issue

When scan and assoc (infra/ibss) commands are simultaneously
given in two terminals, association response is erroneously
served while serving the scan response.

mwifiex_cfg80211_results() is the common routine for sending
ioctl (scan, assoc etc.) results to cfg80211 stack. In above
scenario even if the common routine is called for scan ioctl
context, it also tries to send information about assoc ioctl to
cfg80211 because "priv->assoc_request/priv->ibss_join_request"
flag is on at that time.

Fix the issue by updating request variable after assoc handling
and modifying the variable check in mwifiex_cfg80211_results.
Signed-off-by: default avatarAmitkumar Karwar <akarwar@marvell.com>
Signed-off-by: default avatarKiran Divekar <dkiran@marvell.com>
Signed-off-by: default avatarBing Zhao <bzhao@marvell.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 85e09b40
...@@ -1044,7 +1044,7 @@ mwifiex_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, ...@@ -1044,7 +1044,7 @@ mwifiex_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
goto done; goto done;
} }
priv->assoc_request = 1; priv->assoc_request = -EINPROGRESS;
wiphy_dbg(wiphy, "info: Trying to associate to %s and bssid %pM\n", wiphy_dbg(wiphy, "info: Trying to associate to %s and bssid %pM\n",
(char *) sme->ssid, sme->bssid); (char *) sme->ssid, sme->bssid);
...@@ -1052,6 +1052,7 @@ mwifiex_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, ...@@ -1052,6 +1052,7 @@ mwifiex_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
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);
priv->assoc_request = 1;
done: done:
priv->assoc_result = ret; priv->assoc_result = ret;
queue_work(priv->workqueue, &priv->cfg_workqueue); queue_work(priv->workqueue, &priv->cfg_workqueue);
...@@ -1080,7 +1081,7 @@ mwifiex_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *dev, ...@@ -1080,7 +1081,7 @@ mwifiex_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *dev,
goto done; goto done;
} }
priv->ibss_join_request = 1; priv->ibss_join_request = -EINPROGRESS;
wiphy_dbg(wiphy, "info: trying to join to %s and bssid %pM\n", wiphy_dbg(wiphy, "info: trying to join to %s and bssid %pM\n",
(char *) params->ssid, params->bssid); (char *) params->ssid, params->bssid);
...@@ -1088,6 +1089,8 @@ mwifiex_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *dev, ...@@ -1088,6 +1089,8 @@ 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->channel, NULL, params->privacy); params->channel, NULL, params->privacy);
priv->ibss_join_request = 1;
done: done:
priv->ibss_join_result = ret; priv->ibss_join_result = ret;
queue_work(priv->workqueue, &priv->cfg_workqueue); queue_work(priv->workqueue, &priv->cfg_workqueue);
...@@ -1380,7 +1383,7 @@ mwifiex_cfg80211_results(struct work_struct *work) ...@@ -1380,7 +1383,7 @@ mwifiex_cfg80211_results(struct work_struct *work)
kfree(scan_req); kfree(scan_req);
} }
if (priv->assoc_request) { if (priv->assoc_request == 1) {
if (!priv->assoc_result) { if (!priv->assoc_result) {
cfg80211_connect_result(priv->netdev, priv->cfg_bssid, cfg80211_connect_result(priv->netdev, priv->cfg_bssid,
NULL, 0, NULL, 0, NULL, 0, NULL, 0,
...@@ -1399,7 +1402,7 @@ mwifiex_cfg80211_results(struct work_struct *work) ...@@ -1399,7 +1402,7 @@ mwifiex_cfg80211_results(struct work_struct *work)
priv->assoc_result = 0; priv->assoc_result = 0;
} }
if (priv->ibss_join_request) { if (priv->ibss_join_request == 1) {
if (!priv->ibss_join_result) { if (!priv->ibss_join_result) {
cfg80211_ibss_joined(priv->netdev, priv->cfg_bssid, cfg80211_ibss_joined(priv->netdev, priv->cfg_bssid,
GFP_KERNEL); GFP_KERNEL);
......
...@@ -479,9 +479,9 @@ struct mwifiex_private { ...@@ -479,9 +479,9 @@ struct mwifiex_private {
u8 report_scan_result; u8 report_scan_result;
struct cfg80211_scan_request *scan_request; struct cfg80211_scan_request *scan_request;
int scan_result_status; int scan_result_status;
bool assoc_request; int assoc_request;
u16 assoc_result; u16 assoc_result;
bool ibss_join_request; int ibss_join_request;
u16 ibss_join_result; u16 ibss_join_result;
bool disconnect; bool disconnect;
u8 cfg_bssid[6]; u8 cfg_bssid[6];
......
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