Subject: Re: ath seems still buggy
To: David Young <dyoung@pobox.com>
From: Steven M. Bellovin <smb@cs.columbia.edu>
List: current-users
Date: 10/18/2005 20:01:31
In message <20051018230552.GW1513@che.ojctech.com>, David Young writes:
>
>--SCOJXUq1iwCn05li
>Content-Type: text/plain; charset=us-ascii
>Content-Disposition: inline
>
>On Tue, Oct 18, 2005 at 05:00:52PM -0400, Steven M. Bellovin wrote:
>> Sometimes, it works very well; in my house over the weekend (two access
>> points, with WEP), it worked flawlessly. Other places, it's worked
>> poorly or not at all, so much so that I'm contemplating starting to
>> travel with a wi card again.
>
>Steve,
>
>I think I have figured it out by re-reading some logs Perry sent me.
>I will tell you what I think is happening. When ath(4) doesn't receive
>the AP's beacon for a while, it times out and tries to reassociate with
>the AP. In a zone where there's 802.11 congestion, your ath might
>miss a lot of beacons and time-out often. Congestion may also cause
>reassociation to fail. If reassociation fails, then ath will scan
>for access points again. This is where things go haywire: a bug in
>the scanning code makes ath disregard your AP, because it failed to
>associate with it, until the AP is flushed from the scan table with
>ifconfig down/up.
That is certainly very consistent with what I've observed.
>
>You and Perry should try this patch.
>
I leave on a trip tomorrow, which means that I'll build a kernel with
that patch but *not* install it...
>
>--
>David Young OJC Technologies
>dyoung@ojctech.com Urbana, IL * (217) 278-3933
>
>--SCOJXUq1iwCn05li
>Content-Type: text/plain; charset=us-ascii
>Content-Disposition: attachment; filename=scan-patch
>
>Index: ieee80211_node.c
>===================================================================
>RCS file: /cvsroot/src/sys/net80211/ieee80211_node.c,v
>retrieving revision 1.44
>diff -u -u -r1.44 ieee80211_node.c
>--- ieee80211_node.c 25 Sep 2005 00:03:06 -0000 1.44
>+++ ieee80211_node.c 18 Oct 2005 22:18:24 -0000
>@@ -619,7 +619,7 @@
> ieee80211_end_scan(struct ieee80211com *ic)
> {
> struct ieee80211_node_table *nt = &ic->ic_scan;
>- struct ieee80211_node *ni, *selbs;
>+ struct ieee80211_node *next_ni, *ni, *selbs;
>
> ieee80211_cancel_scan(ic);
> ieee80211_notify_scan_done(ic);
>@@ -707,7 +707,8 @@
> IEEE80211_DPRINTF(ic, IEEE80211_MSG_SCAN, "\t%s\n",
> "macaddr bssid chan rssi rate flag wep essid");
> IEEE80211_NODE_LOCK(nt);
>- TAILQ_FOREACH(ni, &nt->nt_node, ni_list) {
>+ for (ni = TAILQ_FIRST(&nt->nt_node); ni != NULL; ni = next_ni) {
>+ next_ni = TAILQ_NEXT(ni, ni_list);
> if (ni->ni_fails) {
> /*
> * The configuration of the access points may change
>@@ -718,11 +719,8 @@
> "%s: skip scan candidate %s, fails %u\n",
> __func__, ether_sprintf(ni->ni_macaddr),
> ni->ni_fails);
>- ni->ni_fails++;
>-#if 0
> if (ni->ni_fails++ > 2)
> ieee80211_free_node(ni);
>-#endif
> continue;
> }
> if (ieee80211_match_bss(ic, ni) == 0) {
>
>--SCOJXUq1iwCn05li--
>
--Steven M. Bellovin, http://www.cs.columbia.edu/~smb