Subject: Re: ath(4) and stealth AP
To: None <sam@errno.com>
From: Tatoku Ogaito <tacha@tack.fukui-med.ac.jp>
List: current-users
Date: 06/29/2006 19:42:44
Hello again.

>> In Message <4447B267.70201@errno.com>
 at Thu, 20 Apr 2006 09:10:15 -0700
 Sam Leffler <sam@errno.com> wrote:

 > I have changes in freebsd to dtrt.  I started to import them yesterday 

I digged a cvsweb.freebsd.org and found that you fixed the probelm in
http://freebsd.rambler.ru/bsdmail/cvs-src_2006/msg03210.html

Relevant diffs for our tree are as follows and this works for me well.
May I commit them ?

TIA

Tacha

Index: src/sys/net80211/ieee80211_input.c
===================================================================
RCS file: /cvsroot/NetBSD-cvs/main/src/sys/net80211/ieee80211_input.c,v
Prereq: 1.59
diff -u -p -r1.59 ieee80211_input.c
@@ -2092,6 +2092,18 @@ ieee80211_recv_mgmt(struct ieee80211com 
 		 * If scanning, just pass information to the scan module.
 		 */
 		if (ic->ic_flags & IEEE80211_F_SCAN) {
+			if (ic->ic_flags_ext & IEEE80211_FEXT_PROBECHAN) {
+				/*
+				 * Actively scanning a channel marked passive;
+				 * send a probe request now that we know there
+				 * is 802.11 traffic present.
+				 *
+				 * XXX check if the beacon we recv'd gives
+				 * us what we need and suppress the probe req
+				 */
+				ieee80211_probe_curchan(ic, 1);
+				ic->ic_flags_ext &= ~IEEE80211_FEXT_PROBECHAN;
+			}
 			ieee80211_add_scan(ic, &scan, wh,
 				subtype, rssi, rstamp);
 			return;


Index: src/sys/net80211/ieee80211_node.c
===================================================================
RCS file: /cvsroot/NetBSD-cvs/main/src/sys/net80211/ieee80211_node.c,v
Prereq: 1.56
diff -u -p -r1.56 ieee80211_node.c
@@ -340,6 +340,7 @@ ieee80211_next_scan(struct ieee80211com 
 	 * flushing anything queued in the driver and below.
 	 */
 	ic->ic_mgt_timer = 0;
+	ic->ic_flags_ext &= ~IEEE80211_FEXT_PROBECHAN;
 
 	chan = ic->ic_curchan;
 	do {
@@ -366,6 +367,31 @@ ieee80211_next_scan(struct ieee80211com 
 	return 0;
 }
 
+/*
+ * Probe the curent channel, if allowed, while scanning.
+ * If the channel is not marked passive-only then send
+ * a probe request immediately.  Otherwise mark state and
+ * listen for beacons on the channel; if we receive something
+ * then we'll transmit a probe request.
+ */
+void
+ieee80211_probe_curchan(struct ieee80211com *ic, int force)
+{
+	struct ifnet *ifp = ic->ic_ifp;
+
+	if ((ic->ic_curchan->ic_flags & IEEE80211_CHAN_PASSIVE) == 0 || force) {
+		/*
+		 * XXX send both broadcast+directed probe request
+		 */
+		ieee80211_send_probereq(ic->ic_bss,
+			ic->ic_myaddr, ifp->if_broadcastaddr,
+			ifp->if_broadcastaddr,
+			ic->ic_des_essid, ic->ic_des_esslen,
+			ic->ic_opt_ie, ic->ic_opt_ie_len);
+	} else
+		ic->ic_flags_ext |= IEEE80211_FEXT_PROBECHAN;
+}
+
 static __inline void
 copy_bss(struct ieee80211_node *nbss, const struct ieee80211_node *obss)
 {
@@ -610,6 +636,7 @@ ieee80211_cancel_scan(struct ieee80211co
 		(ic->ic_flags & IEEE80211_F_ASCAN) ?  "active" : "passive");
 
 	ic->ic_flags &= ~(IEEE80211_F_SCAN | IEEE80211_F_ASCAN);
+	ic->ic_flags_ext &= ~IEEE80211_FEXT_PROBECHAN;
 }
 
 /*


Index: src/sys/net80211/ieee80211_node.h
===================================================================
RCS file: /cvsroot/NetBSD-cvs/main/src/sys/net80211/ieee80211_node.h,v
Prereq: 1.21
diff -u -p -r1.21 ieee80211_node.h
@@ -191,6 +191,7 @@ void	ieee80211_node_unauthorize(struct i
 
 void	ieee80211_begin_scan(struct ieee80211com *, int);
 int	ieee80211_next_scan(struct ieee80211com *);
+void	ieee80211_probe_curchan(struct ieee80211com *, int);
 void	ieee80211_create_ibss(struct ieee80211com*, struct ieee80211_channel *);
 void	ieee80211_reset_bss(struct ieee80211com *);
 void	ieee80211_cancel_scan(struct ieee80211com *);


Index: src/sys/net80211/ieee80211_proto.c
===================================================================
RCS file: /cvsroot/NetBSD-cvs/main/src/sys/net80211/ieee80211_proto.c,v
Prereq: 1.24
diff -u -p -r1.24 ieee80211_proto.c
@@ -991,19 +991,11 @@ ieee80211_newstate(struct ieee80211com *
 			break;
 		case IEEE80211_S_SCAN:
 			/*
-			 * Scan next. If doing an active scan and the
-			 * channel is not marked passive-only then send
-			 * a probe request.  Otherwise just listen for
-			 * beacons on the channel.
+			 * Scan next. If doing an active scan probe
+			 * for the requested ap (if any).
 			 */
-			if ((ic->ic_flags & IEEE80211_F_ASCAN) &&
-			    (ic->ic_curchan->ic_flags & IEEE80211_CHAN_PASSIVE) == 0) {
-				ieee80211_send_probereq(ni,
-					ic->ic_myaddr, ifp->if_broadcastaddr,
-					ifp->if_broadcastaddr,
-					ic->ic_des_essid, ic->ic_des_esslen,
-					ic->ic_opt_ie, ic->ic_opt_ie_len);
-			}
+			if (ic->ic_flags & IEEE80211_F_ASCAN)
+				ieee80211_probe_curchan(ic, 0);
 			break;
 		case IEEE80211_S_RUN:
 			/* beacon miss */


Index: src/sys/net80211/ieee80211_var.h
===================================================================
RCS file: /cvsroot/NetBSD-cvs/main/src/sys/net80211/ieee80211_var.h,v
Prereq: 1.24
diff -u -p -r1.24 ieee80211_var.h
@@ -256,6 +256,7 @@ extern struct ieee80211com_head ieee8021
 #define	IEEE80211_FEXT_WDS	0x00000001	/* CONF: 4 addr allowed */
 /* 0x00000006 reserved */
 #define	IEEE80211_FEXT_BGSCAN	0x00000008	/* STATUS: enable full bgscan completion */
+#define	IEEE80211_FEXT_PROBECHAN 0x00020000	/* CONF: probe passive channel*/
 
 /* ic_caps */
 #define	IEEE80211_C_WEP		0x00000001	/* CAPABILITY: WEP available */