On Wed, 2008-01-23 at 15:48 +0100, Johannes Berg wrote: > > enable IBSS cell merging. if an IBSS beacon with the same ESSID and a TSF > > higher than the local TSF (mactime) is received, we have to join its BSSID. > > Can you back that up with standard references? I see no such requirement > in the standard text. I can see that under some circumstances this may > be desirable, but maybe not. > > In fact, this seems to *break* standard behaviour, as per 11.1.3.1: > (emphasis mine) The way I understood Ad-Hoc to work was that if you weren't using the SSID + BSSID as somebody else, you weren't part of that adhoc network. Ad-Hoc + roaming isn't supported and is even less defined, which is what this patch would enable IIUC. When joining an adhoc network, your card/driver must scan around to find the SSID + (optionally) BSSID of that adhoc network. If it finds one that matches criteria, it joins that adhoc network, which means using the same BSSID. If it doesn't, it creates a new adhoc network with a generated BSSID and the specified SSID. If this patch were applied, then you'd pretty quickly get split adhoc networks where some people were automatically moved to a different BSSID and the rest are left on the old BSSID (maybe missed a beacon, or whatever), and therefore can't talk to each other. If only because mac80211 would jump adhoc BSSIDs, while all other drivers (including fullmac parts) would not. A cell is identified uniquely by the combination of BSSID + SSID, nothing less. You don't combine infrastructure networks of the same SSID and a different BSSID, nor does this happen for adhoc. Dan > When a STA starts a BSS, that STA shall determine the BSSID of > the BSS. If the BSSType indicates an infrastructure BSS, then > the STA shall start an infrastructure BSS and the BSSID shall be > equal to the STA’s dot11StationID. ***The value of the BSSID > shall remain unchanged***, even if the value of dot11StationID > is changed after the completion of the MLME-START.request. If > the BSSType indicates an IBSS, the STA shall start an IBSS, and > the BSSID shall be an individual locally administered IEEE MAC > address as defined in 5.2 of IEEE Std 802-1990. The remaining 46 > bits of that MAC address shall be a number selected in a manner > that minimizes the probability of STAs generating the same > number, even when those STAs are subjected to the same initial > conditions. > > Remember that BSSIDs, *not* SSIDs are used to identify BSSes uniquely. > > Of course you could argue that "merging" is simply tearing down the own > and then joining the other IBSS. > > Comments on the code now. > > > --- a/net/mac80211/ieee80211_sta.c > > +++ b/net/mac80211/ieee80211_sta.c > > @@ -80,6 +80,9 @@ static void ieee80211_rx_bss_put(struct net_device *dev, > > struct ieee80211_sta_bss *bss); > > static int ieee80211_sta_find_ibss(struct net_device *dev, > > struct ieee80211_if_sta *ifsta); > > +static int ieee80211_sta_join_ibss(struct net_device *dev, > > + struct ieee80211_if_sta *ifsta, > > + struct ieee80211_sta_bss *bss); > > No way, order the code properly, this mess needs to be cleaned up not > added to. > > > - if (bss->probe_resp && beacon) { > > + if (sdata->vif.type != IEEE80211_IF_TYPE_IBSS && > > + bss->probe_resp && beacon) { > > /* Do not allow beacon to override data from Probe Response. */ > > Ahem. Comment update required. > > > + /* check if we need to merge IBSS */ > > Could use a plural, but whatever. > > > + if (sdata->vif.type == IEEE80211_IF_TYPE_IBSS && beacon && > > + !local->sta_sw_scanning && !local->sta_hw_scanning && > > + mgmt->u.beacon.capab_info & WLAN_CAPABILITY_IBSS && > > + memcmp(elems.ssid, sdata->u.sta.ssid, sdata->u.sta.ssid_len) == 0) { > > I think that needs a check "&& ssid_len" or something. Someone's bound > to try making an IBSS with a hidden SSID and we really don't want that > to work. > > > +#ifdef CONFIG_MAC80211_IBSS_DEBUG > > + static unsigned long last_tsf_debug; > > +#endif > > Let's just get rid of that, it's not usable with multiple devices. > > > + if (rx_status->flag & RX_FLAG_TSFT) > > + mactime = rx_status->mactime; > > + else { > > + mactime = -1LLU; > > + printk(KERN_WARNING "%s: IBSS mode needs mactime for " > > + "beacons\n", dev->name); > > Very bad, you'll be flooded by this when others send beacons. Also, I > doubt its truthfulness. > > > + printk(KERN_DEBUG "%s: beacon TSF higher than local TSF" > > + " -> IBSS merge with BSSID %s\n", > > + dev->name, print_mac(mac, mgmt->bssid)); > > No way. At the very least you need to ratelimit this. > > johannes - To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html