> 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. Heh. I might have done that, yeah. > Is this by design, or is automatic channel selection a desirable > feature? see attached patch, which seems to be working Seems we should do automatic selection, the patch looks ok to me. I wonder though, if we decide to create a new IBSS, which channel will we choose? > Daniel > plain text document attachment (ibss-channel.txt) > [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> Acked-by: Johannes Berg <johannes@xxxxxxxxxxxxxxxx> > > 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 */
Attachment:
signature.asc
Description: This is a digitally signed message part