Subject: 80211 scan issue.
To: None <tech-net@netbsd.org>
From: Sean Boudreau <seanb@qnx.com>
List: tech-net
Date: 05/03/2006 12:28:56
Hi:

I'm seeing an issue when scanning for APs where
they are not all reported when found.  This
occurs when management frames are received during
the scan of the last channel.  When the WI_RID_READ_APS
ioctl is processed, ieee80211_iterate_nodes() ignores
those APs since the scangen number matches.  It looks 
like FreeBSD has seen this as well.  The following
is from their 1.72 of ieee80211_node.c:


Index: net80211/ieee80211_node.c
===================================================================
RCS file: /cvsroot/src/sys/net80211/ieee80211_node.c,v
retrieving revision 1.55
diff -c -r1.55 ieee80211_node.c
*** net80211/ieee80211_node.c	28 Mar 2006 00:48:10 -0000	1.55
--- net80211/ieee80211_node.c	3 May 2006 16:19:55 -0000
***************
*** 1874,1880 ****
  	isadhoc = (ic->ic_opmode == IEEE80211_M_IBSS ||
  		   ic->ic_opmode == IEEE80211_M_AHDEMO);
  	IEEE80211_SCAN_LOCK(nt);
! 	gen = nt->nt_scangen++;
  	IEEE80211_DPRINTF(ic, IEEE80211_MSG_NODE,
  		"%s: %s scangen %u\n", __func__, nt->nt_name, gen);
  restart:
--- 1874,1880 ----
  	isadhoc = (ic->ic_opmode == IEEE80211_M_IBSS ||
  		   ic->ic_opmode == IEEE80211_M_AHDEMO);
  	IEEE80211_SCAN_LOCK(nt);
! 	gen = ++nt->nt_scangen;
  	IEEE80211_DPRINTF(ic, IEEE80211_MSG_NODE,
  		"%s: %s scangen %u\n", __func__, nt->nt_name, gen);
  restart:
***************
*** 2018,2024 ****
  	u_int gen;
  
  	IEEE80211_SCAN_LOCK(nt);
! 	gen = nt->nt_scangen++;
  restart:
  	IEEE80211_NODE_LOCK(nt);
  	TAILQ_FOREACH(ni, &nt->nt_node, ni_list) {
--- 2018,2024 ----
  	u_int gen;
  
  	IEEE80211_SCAN_LOCK(nt);
! 	gen = ++nt->nt_scangen;
  restart:
  	IEEE80211_NODE_LOCK(nt);
  	TAILQ_FOREACH(ni, &nt->nt_node, ni_list) {