Linux wireless drivers development
 help / color / mirror / Atom feed
From: Johannes Berg <johannes@sipsolutions.net>
To: linux-wireless@vger.kernel.org
Cc: Jouni Malinen <j@w1.fi>, Michael Wu <flamingice@sourmilk.net>,
	Dan Williams <dcbw@redhat.com>, dragoran <drago01@gmail.com>
Subject: [RFC] mac80211: use IW_AUTH_PRIVACY_INVOKED rather than IW_AUTH_KEY_MGMT
Date: Mon, 29 Oct 2007 16:19:15 +0100	[thread overview]
Message-ID: <1193671155.5197.71.camel@johannes.berg> (raw)

In the long bug-hunt for why dynamic WEP networks didn't work it
turned out that mac80211 incorrectly uses IW_AUTH_KEY_MGMT while
it should use IW_AUTH_PRIVACY_INVOKED to determine whether to
associate to protected networks or not.

This patch changes the behaviour to be that way.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Cc: Jouni Malinen <j@w1.fi>

---
Dan or Dragoran, can you try this patch with a dynamic WEP network and
an unmodified wpa_supplicant (the one that previously didn't work)? It
might need the other patch I sent just before this one ("mac80211:
remove unused driver ops") to apply.

 net/mac80211/ieee80211_i.h     |    2 +-
 net/mac80211/ieee80211_ioctl.c |   16 +++++++++-------
 net/mac80211/ieee80211_sta.c   |    9 +++++----
 3 files changed, 15 insertions(+), 12 deletions(-)

--- linux-2.6.orig/net/mac80211/ieee80211_i.h	2007-10-29 16:05:21.829056966 +0100
+++ linux-2.6/net/mac80211/ieee80211_i.h	2007-10-29 16:06:16.299031412 +0100
@@ -230,6 +230,7 @@ struct ieee80211_if_vlan {
 #define IEEE80211_STA_AUTO_SSID_SEL	BIT(10)
 #define IEEE80211_STA_AUTO_BSSID_SEL	BIT(11)
 #define IEEE80211_STA_AUTO_CHANNEL_SEL	BIT(12)
+#define IEEE80211_STA_PRIVACY_INVOKED	BIT(13)
 struct ieee80211_if_sta {
 	enum {
 		IEEE80211_DISABLED, IEEE80211_AUTHENTICATE,
@@ -259,7 +260,6 @@ struct ieee80211_if_sta {
 	unsigned long request;
 	struct sk_buff_head skb_queue;
 
-	int key_management_enabled;
 	unsigned long last_probe;
 
 #define IEEE80211_AUTH_ALG_OPEN BIT(0)
--- linux-2.6.orig/net/mac80211/ieee80211_ioctl.c	2007-10-29 16:04:16.039043186 +0100
+++ linux-2.6/net/mac80211/ieee80211_ioctl.c	2007-10-29 16:08:53.269031358 +0100
@@ -926,19 +926,21 @@ static int ieee80211_ioctl_siwauth(struc
 	case IW_AUTH_CIPHER_GROUP:
 	case IW_AUTH_WPA_ENABLED:
 	case IW_AUTH_RX_UNENCRYPTED_EAPOL:
-	case IW_AUTH_PRIVACY_INVOKED:
-		break;
 	case IW_AUTH_KEY_MGMT:
+		break;
+	case IW_AUTH_PRIVACY_INVOKED:
 		if (sdata->type != IEEE80211_IF_TYPE_STA)
 			ret = -EINVAL;
 		else {
+			sdata->u.sta.flags &= ~IEEE80211_STA_PRIVACY_INVOKED;
 			/*
-			 * Key management was set by wpa_supplicant,
-			 * we only need this to associate to a network
-			 * that has privacy enabled regardless of not
-			 * having a key.
+			 * Privacy invoked by wpa_supplicant, store the
+			 * value and allow associating to a protected
+			 * network without having a key up front.
 			 */
-			sdata->u.sta.key_management_enabled = !!data->value;
+			if (data->value)
+				sdata->u.sta.flags |=
+					IEEE80211_STA_PRIVACY_INVOKED;
 		}
 		break;
 	case IW_AUTH_80211_AUTH_ALG:
--- linux-2.6.orig/net/mac80211/ieee80211_sta.c	2007-10-29 16:07:19.699065863 +0100
+++ linux-2.6/net/mac80211/ieee80211_sta.c	2007-10-29 16:08:48.599031196 +0100
@@ -705,9 +705,9 @@ static int ieee80211_privacy_mismatch(st
 	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
 	struct ieee80211_sta_bss *bss;
 	int res = 0;
+	int privacy;
 
-	if (!ifsta || (ifsta->flags & IEEE80211_STA_MIXED_CELL) ||
-	    ifsta->key_management_enabled)
+	if (!ifsta || (ifsta->flags & IEEE80211_STA_MIXED_CELL))
 		return 0;
 
 	bss = ieee80211_rx_bss_get(dev, ifsta->bssid, local->hw.conf.channel,
@@ -715,8 +715,9 @@ static int ieee80211_privacy_mismatch(st
 	if (!bss)
 		return 0;
 
-	if (ieee80211_sta_wep_configured(dev) !=
-	    !!(bss->capability & WLAN_CAPABILITY_PRIVACY))
+	privacy = !!(bss->capability & WLAN_CAPABILITY_PRIVACY);
+	if ((ieee80211_sta_wep_configured(dev) != privacy) &&
+	    !!((ifsta->flags & IEEE80211_STA_PRIVACY_INVOKED) != privacy))
 		res = 1;
 
 	ieee80211_rx_bss_put(dev, bss);



             reply	other threads:[~2007-10-29 16:08 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-10-29 15:19 Johannes Berg [this message]
2007-11-01 19:22 ` [RFC] mac80211: use IW_AUTH_PRIVACY_INVOKED rather than IW_AUTH_KEY_MGMT Michael Wu
2007-11-02  9:49   ` Johannes Berg
2007-11-03 13:11     ` [PATCH] " Johannes Berg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1193671155.5197.71.camel@johannes.berg \
    --to=johannes@sipsolutions.net \
    --cc=dcbw@redhat.com \
    --cc=drago01@gmail.com \
    --cc=flamingice@sourmilk.net \
    --cc=j@w1.fi \
    --cc=linux-wireless@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox