Explorar o código

cfg80211: use sme_state in ibss start/join path

CFG80211_DEV_WARN_ON() at "net/wireless/ibss.c line 63"
is unnecessarily triggered even after successful connection,
when cfg80211_ibss_joined() is called by driver inside
.join_ibss handler.

This patch fixes the problem by changing 'sme_state' in ibss path
and having WARN_ON() check for 'sme_state' similar to infra
association.

Signed-off-by: Amitkumar Karwar <akarwar@marvell.com>
Signed-off-by: Bing Zhao <bzhao@marvell.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Amitkumar Karwar %!s(int64=13) %!d(string=hai) anos
pai
achega
28f333666e
Modificáronse 1 ficheiros con 5 adicións e 1 borrados
  1. 5 1
      net/wireless/ibss.c

+ 5 - 1
net/wireless/ibss.c

@@ -42,6 +42,7 @@ void __cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid)
 	cfg80211_hold_bss(bss_from_pub(bss));
 	cfg80211_hold_bss(bss_from_pub(bss));
 	wdev->current_bss = bss_from_pub(bss);
 	wdev->current_bss = bss_from_pub(bss);
 
 
+	wdev->sme_state = CFG80211_SME_CONNECTED;
 	cfg80211_upload_connect_keys(wdev);
 	cfg80211_upload_connect_keys(wdev);
 
 
 	nl80211_send_ibss_bssid(wiphy_to_dev(wdev->wiphy), dev, bssid,
 	nl80211_send_ibss_bssid(wiphy_to_dev(wdev->wiphy), dev, bssid,
@@ -60,7 +61,7 @@ void cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid, gfp_t gfp)
 	struct cfg80211_event *ev;
 	struct cfg80211_event *ev;
 	unsigned long flags;
 	unsigned long flags;
 
 
-	CFG80211_DEV_WARN_ON(!wdev->ssid_len);
+	CFG80211_DEV_WARN_ON(wdev->sme_state != CFG80211_SME_CONNECTING);
 
 
 	ev = kzalloc(sizeof(*ev), gfp);
 	ev = kzalloc(sizeof(*ev), gfp);
 	if (!ev)
 	if (!ev)
@@ -115,9 +116,11 @@ int __cfg80211_join_ibss(struct cfg80211_registered_device *rdev,
 #ifdef CONFIG_CFG80211_WEXT
 #ifdef CONFIG_CFG80211_WEXT
 	wdev->wext.ibss.channel = params->channel;
 	wdev->wext.ibss.channel = params->channel;
 #endif
 #endif
+	wdev->sme_state = CFG80211_SME_CONNECTING;
 	err = rdev->ops->join_ibss(&rdev->wiphy, dev, params);
 	err = rdev->ops->join_ibss(&rdev->wiphy, dev, params);
 	if (err) {
 	if (err) {
 		wdev->connect_keys = NULL;
 		wdev->connect_keys = NULL;
+		wdev->sme_state = CFG80211_SME_IDLE;
 		return err;
 		return err;
 	}
 	}
 
 
@@ -169,6 +172,7 @@ static void __cfg80211_clear_ibss(struct net_device *dev, bool nowext)
 	}
 	}
 
 
 	wdev->current_bss = NULL;
 	wdev->current_bss = NULL;
+	wdev->sme_state = CFG80211_SME_IDLE;
 	wdev->ssid_len = 0;
 	wdev->ssid_len = 0;
 #ifdef CONFIG_CFG80211_WEXT
 #ifdef CONFIG_CFG80211_WEXT
 	if (!nowext)
 	if (!nowext)