Previously, not all code paths set supp_rates, and a rate change did not reinitialize the rate control layer. This patch fixes those issues. (Hopefully not whitespace damaged this time) Signed-off-by: Adam Wozniak <awozniak@xxxxxxxxxx> --- diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c index 10d1385..474f66d 100644 --- a/net/mac80211/ibss.c +++ b/net/mac80211/ibss.c @@ -246,9 +246,13 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, if (!channel || channel->flags & IEEE80211_CHAN_DISABLED) return; + supp_rates = ieee80211_sta_get_rates(local, elems, band); + + /* make sure mandatory rates are always added */ + supp_rates |= ieee80211_mandatory_rates(local, band); + if (sdata->vif.type == NL80211_IFTYPE_ADHOC && elems->supp_rates && memcmp(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN) == 0) { - supp_rates = ieee80211_sta_get_rates(local, elems, band); rcu_read_lock(); @@ -257,12 +261,10 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, u32 prev_rates; prev_rates = sta->sta.supp_rates[band]; - /* make sure mandatory rates are always added */ - sta->sta.supp_rates[band] = supp_rates | - ieee80211_mandatory_rates(local, band); + sta->sta.supp_rates[band] = supp_rates; + if (sta->sta.supp_rates[band] != prev_rates) { #ifdef CONFIG_MAC80211_IBSS_DEBUG - if (sta->sta.supp_rates[band] != prev_rates) printk(KERN_DEBUG "%s: updated supp_rates set " "for %pM based on beacon info (0x%llx | " "0x%llx -> 0x%llx)\n", @@ -272,6 +274,8 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, (unsigned long long) supp_rates, (unsigned long long) sta->sta.supp_rates[band]); #endif + rate_control_rate_init(sta); + } } else ieee80211_ibss_add_sta(sdata, mgmt->bssid, mgmt->sa, supp_rates); @@ -415,6 +419,15 @@ struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata, sta->sta.supp_rates[band] = supp_rates | ieee80211_mandatory_rates(local, band); +#ifdef CONFIG_MAC80211_IBSS_DEBUG + printk(KERN_DEBUG "%s: initialized supp_rates set " + "for %pM (0x%llx) (band %d)\n", + sdata->dev->name, + sta->sta.addr, + (unsigned long long) sta->sta.supp_rates[band], + band); +#endif + rate_control_rate_init(sta); if (sta_info_insert(sta)) -- 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