On Fri, 2008-06-13 at 16:50 +0200, Vladimir Koutny wrote: > In IBSS mode prior to join/creation of new IBSS it is possible that > a frame from unknown station is received and an ibss_add_sta() is > called. This will cause a warning in rate_lowest_index() since the > list of supported rates of our station is not initialized yet. > > The fix is to add ibss stations with a rate we received that frame > at; this single-element set will be extended later based on beacon > data. Also there is no need to store stations from a foreign IBSS. Looks sane to me, but I don't really test/understand the IBSS code. > > Signed-off-by: Vladimir Koutny <vlado@xxxxxx> > > --- > > diff -Naur compat-wireless-2008-06-12-base/net/mac80211/ieee80211_i.h compat-wireless-2008-06-12/net/mac80211/ieee80211_i.h > --- compat-wireless-2008-06-12-base/net/mac80211/ieee80211_i.h 2008-06-13 15:53:03.000000000 +0200 > +++ compat-wireless-2008-06-12/net/mac80211/ieee80211_i.h 2008-06-13 16:17:11.000000000 +0200 > @@ -886,7 +886,7 @@ > int ieee80211_sta_set_extra_ie(struct net_device *dev, char *ie, size_t len); > struct sta_info *ieee80211_ibss_add_sta(struct net_device *dev, > struct sk_buff *skb, u8 *bssid, > - u8 *addr); > + u8 *addr, u64 supp_rates); > int ieee80211_sta_deauthenticate(struct net_device *dev, u16 reason); > int ieee80211_sta_disassociate(struct net_device *dev, u16 reason); > void ieee80211_bss_info_change_notify(struct ieee80211_sub_if_data *sdata, > diff -Naur compat-wireless-2008-06-12-base/net/mac80211/mlme.c compat-wireless-2008-06-12/net/mac80211/mlme.c > --- compat-wireless-2008-06-12-base/net/mac80211/mlme.c 2008-06-13 15:52:54.000000000 +0200 > +++ compat-wireless-2008-06-12/net/mac80211/mlme.c 2008-06-13 16:18:24.000000000 +0200 > @@ -2863,7 +2863,8 @@ > dev->name, print_mac(mac, mgmt->bssid)); > ieee80211_sta_join_ibss(dev, &sdata->u.sta, bss); > ieee80211_ibss_add_sta(dev, NULL, > - mgmt->bssid, mgmt->sa); > + mgmt->bssid, mgmt->sa, > + BIT(rx_status->rate_idx)); > } > } > > @@ -4307,12 +4308,13 @@ > > struct sta_info *ieee80211_ibss_add_sta(struct net_device *dev, > struct sk_buff *skb, u8 *bssid, > - u8 *addr) > + u8 *addr, u64 supp_rates) > { > struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); > struct sta_info *sta; > struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); > DECLARE_MAC_BUF(mac); > + int band = local->hw.conf.channel->band; > > /* TODO: Could consider removing the least recently used entry and > * allow new one to be added. */ > @@ -4324,6 +4326,9 @@ > return NULL; > } > > + if (!ieee80211_bssid_match(bssid, sdata->u.sta.bssid)) > + return NULL; > + > printk(KERN_DEBUG "%s: Adding new IBSS station %s (dev=%s)\n", > wiphy_name(local->hw.wiphy), print_mac(mac, addr), dev->name); > > @@ -4333,8 +4338,10 @@ > > set_sta_flags(sta, WLAN_STA_AUTHORIZED); > > - sta->supp_rates[local->hw.conf.channel->band] = > - sdata->u.sta.supp_rates_bits[local->hw.conf.channel->band]; > + if (supp_rates) > + sta->supp_rates[band] = supp_rates; > + else > + sta->supp_rates[band] = sdata->u.sta.supp_rates_bits[band]; > > rate_control_rate_init(sta, local); > > diff -Naur compat-wireless-2008-06-12-base/net/mac80211/rx.c compat-wireless-2008-06-12/net/mac80211/rx.c > --- compat-wireless-2008-06-12-base/net/mac80211/rx.c 2008-06-13 15:50:11.000000000 +0200 > +++ compat-wireless-2008-06-12/net/mac80211/rx.c 2008-06-13 16:17:11.000000000 +0200 > @@ -1846,8 +1846,13 @@ > if (!bssid) > return 0; > if ((rx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT && > - (rx->fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_BEACON) > + (rx->fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_BEACON) { > + if (!rx->sta) > + rx->sta = ieee80211_ibss_add_sta(sdata->dev, > + rx->skb, bssid, hdr->addr2, > + BIT(rx->status->rate_idx)); > return 1; > + } > else if (!ieee80211_bssid_match(bssid, sdata->u.sta.bssid)) { > if (!(rx->flags & IEEE80211_RX_IN_SCAN)) > return 0; > @@ -1860,7 +1865,8 @@ > rx->flags &= ~IEEE80211_RX_RA_MATCH; > } else if (!rx->sta) > rx->sta = ieee80211_ibss_add_sta(sdata->dev, rx->skb, > - bssid, hdr->addr2); > + bssid, hdr->addr2, > + BIT(rx->status->rate_idx)); > break; > case IEEE80211_IF_TYPE_MESH_POINT: > if (!multicast && > >
Attachment:
signature.asc
Description: This is a digitally signed message part