Search Linux Wireless

Re: mac80211 ad-hoc problems

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Daniel Drake wrote:
Looking at the code, ieee80211_sta_find_ibss() in mlme.c, I can't see how it's supposed to work. It's clear why it said it found the other network, because the ESSID matches. But it's also clear why it didn't actually bother to try and connect: the ieee80211_sta_join_ibss() call is surrounded in an if condition which checks the BSSID - but I (intentionally) didn't specify one, so the condition evaluates as false.

Oh, I misread the code. I thought it was only looking for a user-specified BSSID (but I had not specified one). Actually it is checking that we aren't attempting to join the same network that we are already on.

The problem that was preventing me from getting connectivity was channel. It was only accepting IBSSes on local->hw.conf.channel, so I was required to do "iwconfig wlan0 channel X" first.

Is this by design, or is automatic channel selection a desirable feature? see attached patch, which seems to be working

Daniel
[PATCH] mac80211: automatic IBSS channel selection

When joining an ad-hoc network, the user is currently required to specify
the channel. The network will not be joined otherwise, unless it happens
to be sitting on the currently active channel.

This patch implements automatic channel selection when the user has not
locked the interface onto a specific channel.

Signed-off-by: Daniel Drake <dsd@xxxxxxxxxx>

Index: linux-2.6.26-rc8/net/mac80211/mlme.c
===================================================================
--- linux-2.6.26-rc8.orig/net/mac80211/mlme.c
+++ linux-2.6.26-rc8/net/mac80211/mlme.c
@@ -3582,6 +3582,7 @@ static int ieee80211_sta_find_ibss(struc
 	int found = 0;
 	u8 bssid[ETH_ALEN];
 	int active_ibss;
+	int search_freq;
 	DECLARE_MAC_BUF(mac);
 	DECLARE_MAC_BUF(mac2);
 
@@ -3614,11 +3615,21 @@ static int ieee80211_sta_find_ibss(struc
 	printk(KERN_DEBUG "   sta_find_ibss: selected %s current "
 	       "%s\n", print_mac(mac, bssid), print_mac(mac2, ifsta->bssid));
 #endif /* CONFIG_MAC80211_IBSS_DEBUG */
-	if (found && memcmp(ifsta->bssid, bssid, ETH_ALEN) != 0 &&
-	    (bss = ieee80211_rx_bss_get(dev, bssid,
-					local->hw.conf.channel->center_freq,
-					ifsta->ssid, ifsta->ssid_len))) {
+
+	if (found && memcmp(ifsta->bssid, bssid, ETH_ALEN) != 0) {
 		int ret;
+		int search_freq;
+
+		if (ifsta->flags & IEEE80211_STA_AUTO_CHANNEL_SEL)
+			search_freq = bss->freq;
+		else
+			search_freq = local->hw.conf.channel->center_freq;
+
+		bss = ieee80211_rx_bss_get(dev, bssid, search_freq,
+					   ifsta->ssid, ifsta->ssid_len);
+		if (!bss)
+			goto dont_join;
+
 		printk(KERN_DEBUG "%s: Selected IBSS BSSID %s"
 		       " based on configured SSID\n",
 		       dev->name, print_mac(mac, bssid));
@@ -3626,6 +3637,8 @@ static int ieee80211_sta_find_ibss(struc
 		ieee80211_rx_bss_put(dev, bss);
 		return ret;
 	}
+
+dont_join:
 #ifdef CONFIG_MAC80211_IBSS_DEBUG
 	printk(KERN_DEBUG "   did not try to join ibss\n");
 #endif /* CONFIG_MAC80211_IBSS_DEBUG */

[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux