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 */