All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Alina Friedrichsen" <x-alina@gmx.net>
To: Larry Finger <Larry.Finger@lwfinger.net>, linville@tuxdriver.com
Cc: linux-wireless@vger.kernel.org, maximlevitsky@gmail.com,
	kalle.valo@iki.fi, samuel@sortiz.org
Subject: Re: Regression caused by commit e32b1b9a33759e8a83ac566c4c43f23ed5d6343b
Date: Fri, 23 Jan 2009 08:13:45 +0100	[thread overview]
Message-ID: <20090123071345.270730@gmx.net> (raw)
In-Reply-To: <4979567D.2020005@lwfinger.net>

[-- Attachment #1: Type: text/plain, Size: 711 bytes --]

Hello!

> > I reverted this in wireless-testing (and it never went anywhere
> > upstream).  Of course, now it looks like Samuel has a fix...maybe
> > I'll combine them...
> 
> Samuel's fix works for me.

If this works for the others too, I would propose the following patch. Without it, e.g. the beacon messages in IBSS mode are broken, if you set a fixed BSSID.

(The iwl4965 low level driver sends back an error code, if you want to set a fixed BSSID, so I think, we should simply ignore it, as it will be tried the next time when the initiated new network join is complete.)

Regards
Alina

-- 
Psssst! Schon vom neuen GMX MultiMessenger gehört? Der kann`s mit allen: http://www.gmx.net/de/go/multimessenger

[-- Attachment #2: fixed-bssid-revisited-v3.patch --]
[-- Type: text/x-patch, Size: 4158 bytes --]

diff -urN compat-wireless-2009-01-23.orig/net/mac80211/mlme.c compat-wireless-2009-01-23/net/mac80211/mlme.c
--- compat-wireless-2009-01-23.orig/net/mac80211/mlme.c	2009-01-23 06:12:14.000000000 +0100
+++ compat-wireless-2009-01-23/net/mac80211/mlme.c	2009-01-23 07:58:31.000000000 +0100
@@ -1614,6 +1614,7 @@
 
 	ieee80211_sta_def_wmm_params(sdata, bss);
 
+	ifsta->flags |= IEEE80211_STA_PREV_BSSID_SET;
 	ifsta->state = IEEE80211_STA_MLME_IBSS_JOINED;
 	mod_timer(&ifsta->timer, jiffies + IEEE80211_IBSS_MERGE_INTERVAL);
 
@@ -2177,19 +2178,18 @@
 	int i;
 	int ret;
 
-#if 0
-	/* Easier testing, use fixed BSSID. */
-	memset(bssid, 0xfe, ETH_ALEN);
-#else
-	/* Generate random, not broadcast, locally administered BSSID. Mix in
-	 * own MAC address to make sure that devices that do not have proper
-	 * random number generator get different BSSID. */
-	get_random_bytes(bssid, ETH_ALEN);
-	for (i = 0; i < ETH_ALEN; i++)
-		bssid[i] ^= sdata->dev->dev_addr[i];
-	bssid[0] &= ~0x01;
-	bssid[0] |= 0x02;
-#endif
+	if (sdata->u.sta.flags & IEEE80211_STA_BSSID_SET) {
+		memcpy(bssid, ifsta->bssid, ETH_ALEN);
+	} else {
+		/* Generate random, not broadcast, locally administered BSSID. Mix in
+		 * own MAC address to make sure that devices that do not have proper
+		 * random number generator get different BSSID. */
+		get_random_bytes(bssid, ETH_ALEN);
+		for (i = 0; i < ETH_ALEN; i++)
+			bssid[i] ^= sdata->dev->dev_addr[i];
+		bssid[0] &= ~0x01;
+		bssid[0] |= 0x02;
+	}
 
 	printk(KERN_DEBUG "%s: Creating new IBSS network, BSSID %pM\n",
 	       sdata->dev->name, bssid);
@@ -2250,6 +2250,9 @@
 		    memcmp(ifsta->ssid, bss->ssid, bss->ssid_len) != 0
 		    || !(bss->capability & WLAN_CAPABILITY_IBSS))
 			continue;
+		if ((ifsta->flags & IEEE80211_STA_BSSID_SET) &&
+		    memcmp(ifsta->bssid, bss->bssid, ETH_ALEN) != 0)
+			continue;
 #ifdef CONFIG_MAC80211_IBSS_DEBUG
 		printk(KERN_DEBUG "   bssid=%pM found\n", bss->bssid);
 #endif /* CONFIG_MAC80211_IBSS_DEBUG */
@@ -2266,7 +2269,9 @@
 		       "%pM\n", bssid, ifsta->bssid);
 #endif /* CONFIG_MAC80211_IBSS_DEBUG */
 
-	if (found && memcmp(ifsta->bssid, bssid, ETH_ALEN) != 0) {
+	if (found &&
+	    ((!(ifsta->flags & IEEE80211_STA_PREV_BSSID_SET)) ||
+	     memcmp(ifsta->bssid, bssid, ETH_ALEN) != 0)) {
 		int ret;
 		int search_freq;
 
@@ -2604,16 +2609,16 @@
 		memset(ifsta->ssid, 0, sizeof(ifsta->ssid));
 		memcpy(ifsta->ssid, ssid, len);
 		ifsta->ssid_len = len;
-		ifsta->flags &= ~IEEE80211_STA_PREV_BSSID_SET;
 	}
 
+	ifsta->flags &= ~IEEE80211_STA_PREV_BSSID_SET;
+
 	if (len)
 		ifsta->flags |= IEEE80211_STA_SSID_SET;
 	else
 		ifsta->flags &= ~IEEE80211_STA_SSID_SET;
 
-	if (sdata->vif.type == NL80211_IFTYPE_ADHOC &&
-	    !(ifsta->flags & IEEE80211_STA_BSSID_SET)) {
+	if (sdata->vif.type == NL80211_IFTYPE_ADHOC) {
 		ifsta->ibss_join_req = jiffies;
 		ifsta->state = IEEE80211_STA_MLME_IBSS_SEARCH;
 		return ieee80211_sta_find_ibss(sdata, ifsta);
@@ -2633,36 +2638,21 @@
 int ieee80211_sta_set_bssid(struct ieee80211_sub_if_data *sdata, u8 *bssid)
 {
 	struct ieee80211_if_sta *ifsta;
-	int res;
-	bool valid;
 
 	ifsta = &sdata->u.sta;
-	valid = is_valid_ether_addr(bssid);
 
-	if (memcmp(ifsta->bssid, bssid, ETH_ALEN) != 0) {
-		if(valid)
-			memcpy(ifsta->bssid, bssid, ETH_ALEN);
-		else
-			memset(ifsta->bssid, 0, ETH_ALEN);
-		res = 0;
-		/*
-		 * Hack! See also ieee80211_sta_set_ssid.
-		 */
-		if (netif_running(sdata->dev))
-			res = ieee80211_if_config(sdata, IEEE80211_IFCC_BSSID);
-		if (res) {
-			printk(KERN_DEBUG "%s: Failed to config new BSSID to "
-			       "the low-level driver\n", sdata->dev->name);
-			return res;
-		}
-	}
-
-	if (valid)
+	if (is_valid_ether_addr(bssid)) {
+		memcpy(ifsta->bssid, bssid, ETH_ALEN);
 		ifsta->flags |= IEEE80211_STA_BSSID_SET;
-	else
+	} else {
+		memset(ifsta->bssid, 0, ETH_ALEN);
 		ifsta->flags &= ~IEEE80211_STA_BSSID_SET;
+	}
 
-	return 0;
+	if (netif_running(sdata->dev))
+		ieee80211_if_config(sdata, IEEE80211_IFCC_BSSID);
+
+	return ieee80211_sta_set_ssid(sdata, ifsta->ssid, ifsta->ssid_len);
 }
 
 int ieee80211_sta_set_extra_ie(struct ieee80211_sub_if_data *sdata, char *ie, size_t len)

  reply	other threads:[~2009-01-23  7:13 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-01-23  2:08 Regression caused by commit e32b1b9a33759e8a83ac566c4c43f23ed5d6343b Larry Finger
2009-01-23  2:14 ` John W. Linville
2009-01-23  2:21   ` Alina Friedrichsen
2009-01-23  5:32   ` Larry Finger
2009-01-23  7:13     ` Alina Friedrichsen [this message]
2009-01-23  9:56       ` Sedat Dilek
2009-01-23 12:29       ` Samuel Ortiz
2009-01-23 23:16         ` Alina Friedrichsen
2009-01-23 16:33       ` Larry Finger
2009-01-23 20:18         ` Sedat Dilek
2009-01-23  5:17 ` Hin-Tak Leung
2009-01-23  5:40   ` Alina Friedrichsen
2009-01-23 15:47 ` Michael Buesch
2009-01-23 15:49   ` John W. Linville
2009-01-23 16:03     ` Michael Buesch

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=20090123071345.270730@gmx.net \
    --to=x-alina@gmx.net \
    --cc=Larry.Finger@lwfinger.net \
    --cc=kalle.valo@iki.fi \
    --cc=linux-wireless@vger.kernel.org \
    --cc=linville@tuxdriver.com \
    --cc=maximlevitsky@gmail.com \
    --cc=samuel@sortiz.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.