Linux wireless drivers development
 help / color / mirror / Atom feed
* [PATCH] cfg80211: sme: deauthenticate on assoc failure
@ 2009-10-20  6:08 Johannes Berg
  2009-10-20  6:24 ` Luis R. Rodriguez
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Johannes Berg @ 2009-10-20  6:08 UTC (permalink / raw)
  To: John Linville; +Cc: linux-wireless, Luis R. Rodriguez

When the in-kernel SME gets an association failure from
the AP we don't deauthenticate, and thus get into a very
confused state which will lead to warnings later on. Fix
this by actually deauthenticating when the AP indicates
an association failure.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
---
 net/wireless/core.h |    1 +
 net/wireless/mlme.c |    9 +++++++++
 net/wireless/sme.c  |   21 +++++++++++++++++++--
 3 files changed, 29 insertions(+), 2 deletions(-)

--- wireless-testing.orig/net/wireless/core.h	2009-10-20 15:02:15.000000000 +0900
+++ wireless-testing/net/wireless/core.h	2009-10-20 15:03:20.000000000 +0900
@@ -358,6 +358,7 @@ int cfg80211_mgd_wext_connect(struct cfg
 			      struct wireless_dev *wdev);
 
 void cfg80211_conn_work(struct work_struct *work);
+void cfg80211_sme_failed_assoc(struct wireless_dev *wdev);
 bool cfg80211_sme_failed_reassoc(struct wireless_dev *wdev);
 
 /* internal helpers */
--- wireless-testing.orig/net/wireless/mlme.c	2009-10-20 15:02:15.000000000 +0900
+++ wireless-testing/net/wireless/mlme.c	2009-10-20 15:03:20.000000000 +0900
@@ -62,6 +62,7 @@ void cfg80211_send_rx_assoc(struct net_d
 	u8 *ie = mgmt->u.assoc_resp.variable;
 	int i, ieoffs = offsetof(struct ieee80211_mgmt, u.assoc_resp.variable);
 	struct cfg80211_internal_bss *bss = NULL;
+	bool need_connect_result = true;
 
 	wdev_lock(wdev);
 
@@ -94,6 +95,14 @@ void cfg80211_send_rx_assoc(struct net_d
 		}
 
 		WARN_ON(!bss);
+	} else if (wdev->conn) {
+		cfg80211_sme_failed_assoc(wdev);
+		need_connect_result = false;
+		/*
+		 * do not call connect_result() now because the
+		 * sme will schedule work that does it later.
+		 */
+		goto out;
 	}
 
 	if (!wdev->conn && wdev->sme_state == CFG80211_SME_IDLE) {
--- wireless-testing.orig/net/wireless/sme.c	2009-10-20 15:02:15.000000000 +0900
+++ wireless-testing/net/wireless/sme.c	2009-10-20 15:03:20.000000000 +0900
@@ -26,6 +26,7 @@ struct cfg80211_conn {
 		CFG80211_CONN_AUTHENTICATING,
 		CFG80211_CONN_ASSOCIATE_NEXT,
 		CFG80211_CONN_ASSOCIATING,
+		CFG80211_CONN_DEAUTH_ASSOC_FAIL,
 	} state;
 	u8 bssid[ETH_ALEN], prev_bssid[ETH_ALEN];
 	u8 *ie;
@@ -148,6 +149,12 @@ static int cfg80211_conn_do_work(struct 
 					       NULL, 0,
 					       WLAN_REASON_DEAUTH_LEAVING);
 		return err;
+	case CFG80211_CONN_DEAUTH_ASSOC_FAIL:
+		__cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid,
+				       NULL, 0,
+				       WLAN_REASON_DEAUTH_LEAVING);
+		/* return an error so that we call __cfg80211_connect_result() */
+		return -EINVAL;
 	default:
 		return 0;
 	}
@@ -158,6 +165,7 @@ void cfg80211_conn_work(struct work_stru
 	struct cfg80211_registered_device *rdev =
 		container_of(work, struct cfg80211_registered_device, conn_work);
 	struct wireless_dev *wdev;
+	u8 bssid[ETH_ALEN];
 
 	rtnl_lock();
 	cfg80211_lock_rdev(rdev);
@@ -173,10 +181,10 @@ void cfg80211_conn_work(struct work_stru
 			wdev_unlock(wdev);
 			continue;
 		}
+		memcpy(bssid, wdev->conn->params.bssid, ETH_ALEN);
 		if (cfg80211_conn_do_work(wdev))
 			__cfg80211_connect_result(
-					wdev->netdev,
-					wdev->conn->params.bssid,
+					wdev->netdev, bssid,
 					NULL, 0, NULL, 0,
 					WLAN_STATUS_UNSPECIFIED_FAILURE,
 					false, NULL);
@@ -337,6 +345,15 @@ bool cfg80211_sme_failed_reassoc(struct 
 	return true;
 }
 
+void cfg80211_sme_failed_assoc(struct wireless_dev *wdev)
+{
+	struct wiphy *wiphy = wdev->wiphy;
+	struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
+
+	wdev->conn->state = CFG80211_CONN_DEAUTH_ASSOC_FAIL;
+	schedule_work(&rdev->conn_work);
+}
+
 void __cfg80211_connect_result(struct net_device *dev, const u8 *bssid,
 			       const u8 *req_ie, size_t req_ie_len,
 			       const u8 *resp_ie, size_t resp_ie_len,



^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2009-10-23 13:35 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-10-20  6:08 [PATCH] cfg80211: sme: deauthenticate on assoc failure Johannes Berg
2009-10-20  6:24 ` Luis R. Rodriguez
2009-10-20  6:26   ` Johannes Berg
2009-10-20  7:33 ` Sedat Dilek
2009-10-20  7:41   ` Sedat Dilek
2009-10-20  7:46   ` Sedat Dilek
2009-10-20  7:49     ` Luis R. Rodriguez
2009-10-23  4:07 ` Jouni Malinen
2009-10-23 13:35   ` Johannes Berg

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox