Return-path: Received: from smtp1.irobot.com ([206.83.81.187]:35962 "EHLO smtp1.irobot.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754411AbZKLWiE (ORCPT ); Thu, 12 Nov 2009 17:38:04 -0500 Message-ID: <4AFC8E4F.5090307@irobot.com> Date: Thu, 12 Nov 2009 14:38:07 -0800 From: Adam Wozniak MIME-Version: 1.0 To: Christian Lamparter CC: Derek Smithies , linux-wireless@vger.kernel.org, nbd@openwrt.org Subject: Re: compat-wireless and minstrel References: <4AF0D54D.4090303@irobot.com> <4AFC655A.5020706@irobot.com> <200911122103.27455.chunkeey@googlemail.com> In-Reply-To: <200911122103.27455.chunkeey@googlemail.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Sender: linux-wireless-owner@vger.kernel.org List-ID: I see what you're doing there. That didn't quite work, but I'm fairly confident this one will. I'm running my long term test now. Note the added call to rate_control_init() when the rate is updated. This *should* be rate_control_rate_update, but it doesn't look to me like that method is implemented in minstrel or the PID code. *** compat-wireless-2009-11-09/net/mac80211/ibss.c 2009-11-08 21:15:06.000000000 -0800 --- compat-wireless-2009-11-09b/net/mac80211/ibss.c 2009-11-12 14:29:16.308550923 -0800 *************** *** 246,254 **** if (!channel || channel->flags & IEEE80211_CHAN_DISABLED) return; 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(); --- 246,258 ---- 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 = 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) { rcu_read_lock(); *************** *** 257,268 **** 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); #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", --- 261,270 ---- u32 prev_rates; prev_rates = sta->sta.supp_rates[band]; ! sta->sta.supp_rates[band] = supp_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", *************** *** 271,276 **** --- 273,284 ---- (unsigned long long) prev_rates, (unsigned long long) supp_rates, (unsigned long long) sta->sta.supp_rates[band]); + + /* TODO: implement rate_update in minstrel/pid, + * then change this to rate_control_rate_update. + */ + rate_control_rate_init(sta); + } #endif } else ieee80211_ibss_add_sta(sdata, mgmt->bssid, mgmt->sa, supp_rates); Christian Lamparter wrote: > On Thursday 12 November 2009 20:43:22 Adam Wozniak wrote: > >> I was hoping for more of an "ah-ha!" response. =) >> >> It worked well initially, but when I let it run overnight it fell back >> into that same failure mode. >> >> > > great... :\ > > what about this patch? > --- > diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c > index fbffce9..bde89f7 100644 > --- a/net/mac80211/ibss.c > +++ b/net/mac80211/ibss.c > @@ -250,6 +250,9 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, > memcmp(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN) == 0) { > supp_rates = ieee80211_sta_get_rates(local, elems, band); > > + /* make sure mandatory rates are always added */ > + supp_rates |= ieee80211_mandatory_rates(local, band); > + > rcu_read_lock(); > > sta = sta_info_get(local, mgmt->sa); > @@ -257,9 +260,7 @@ 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; > > #ifdef CONFIG_MAC80211_IBSS_DEBUG > if (sta->sta.supp_rates[band] != prev_rates) >