Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/ic Handle of AP_IN_RANGE/AP_OUT_RANGE, to fix a prob...
details: https://anonhg.NetBSD.org/src/rev/bb35d8581f11
branches: trunk
changeset: 537647:bb35d8581f11
user: onoe <onoe%NetBSD.org@localhost>
date: Fri Oct 04 04:23:20 2002 +0000
description:
Handle of AP_IN_RANGE/AP_OUT_RANGE, to fix a problem once the station
is out of ragen, it never comes up again.
For HostAP, prohibit sending DATA frame to an unassociated but authenticated
station.
diffstat:
sys/dev/ic/wi.c | 55 +++++++++++++++++++++++++++++++----------------------
sys/dev/ic/wivar.h | 3 +-
2 files changed, 34 insertions(+), 24 deletions(-)
diffs (161 lines):
diff -r 4940db450e5f -r bb35d8581f11 sys/dev/ic/wi.c
--- a/sys/dev/ic/wi.c Fri Oct 04 04:04:26 2002 +0000
+++ b/sys/dev/ic/wi.c Fri Oct 04 04:23:20 2002 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: wi.c,v 1.97 2002/10/03 22:32:37 onoe Exp $ */
+/* $NetBSD: wi.c,v 1.98 2002/10/04 04:23:20 onoe Exp $ */
/*
* Copyright (c) 1997, 1998, 1999
@@ -70,7 +70,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wi.c,v 1.97 2002/10/03 22:32:37 onoe Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wi.c,v 1.98 2002/10/04 04:23:20 onoe Exp $");
#define WI_HERMES_AUTOINC_WAR /* Work around data write autoinc bug. */
#define WI_HERMES_STATS_WAR /* Work around stats counter bug. */
@@ -494,7 +494,8 @@
if (status & WI_EV_INFO)
wi_info_intr(sc);
- if (!(ifp->if_flags & IFF_OACTIVE) &&
+ if ((ifp->if_flags & IFF_OACTIVE) == 0 &&
+ (sc->sc_flags & WI_FLAGS_OUTRANGE) == 0 &&
!IFQ_IS_EMPTY(&ifp->if_snd))
wi_start(ifp);
}
@@ -528,6 +529,7 @@
/* common 802.11 configuration */
ic->ic_flags &= ~IEEE80211_F_IBSSON;
+ sc->sc_flags &= ~WI_FLAGS_OUTRANGE;
switch (ic->ic_opmode) {
case IEEE80211_M_STA:
wi_write_val(sc, WI_RID_PORTTYPE, WI_PORTTYPE_BSS);
@@ -691,6 +693,7 @@
{
struct wi_softc *sc = ifp->if_softc;
struct ieee80211com *ic = &sc->sc_ic;
+ struct ieee80211_node *ni;
struct ieee80211_frame *wh;
struct mbuf *m0, *m;
struct wi_frame frmhdr;
@@ -698,6 +701,8 @@
if (ifp->if_flags & IFF_OACTIVE)
return;
+ if (sc->sc_flags & WI_FLAGS_OUTRANGE)
+ return;
memset(&frmhdr, 0, sizeof(frmhdr));
cur = sc->sc_txnext;
@@ -741,7 +746,8 @@
!IEEE80211_IS_MULTICAST(wh->i_addr1) &&
(wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) ==
IEEE80211_FC0_TYPE_DATA &&
- ieee80211_find_node(ic, wh->i_addr1) == NULL) {
+ ((ni = ieee80211_find_node(ic, wh->i_addr1)) ==
+ NULL || ni->ni_associd == 0)) {
m_freem(m0);
ifp->if_oerrors++;
continue;
@@ -1008,26 +1014,23 @@
imr->ifm_status = IFM_AVALID;
imr->ifm_active = IFM_IEEE80211;
- if (ic->ic_state == IEEE80211_S_RUN)
+ if (ic->ic_state == IEEE80211_S_RUN &&
+ (sc->sc_flags & WI_FLAGS_OUTRANGE) == 0)
imr->ifm_status |= IFM_ACTIVE;
- if (ic->ic_fixed_rate != -1)
- rate = ic->ic_sup_rates[ic->ic_fixed_rate] & IEEE80211_RATE_VAL;
+ len = sizeof(val);
+ if (wi_read_rid(sc, WI_RID_CUR_TX_RATE, &val, &len) != 0)
+ rate = 0;
else {
- len = sizeof(val);
- if (wi_read_rid(sc, WI_RID_CUR_TX_RATE, &val, &len) != 0)
- rate = 0;
- else {
- /* convert to 802.11 rate */
- rate = val * 2;
- if (sc->sc_firmware_type == WI_LUCENT) {
- if (rate == 10)
- rate = 11; /* 5.5Mbps */
- } else {
- if (rate == 4*2)
- rate = 11; /* 5.5Mbps */
- else if (rate == 8*2)
- rate = 22; /* 11Mbps */
- }
+ /* convert to 802.11 rate */
+ rate = val * 2;
+ if (sc->sc_firmware_type == WI_LUCENT) {
+ if (rate == 10)
+ rate = 11; /* 5.5Mbps */
+ } else {
+ if (rate == 4*2)
+ rate = 11; /* 5.5Mbps */
+ else if (rate == 8*2)
+ rate = 22; /* 11Mbps */
}
}
imr->ifm_active |= ieee80211_rate2media(rate, IEEE80211_T_DS);
@@ -1189,6 +1192,7 @@
DPRINTF(("wi_info_intr: LINK_STAT 0x%x\n", le16toh(stat)));
switch (le16toh(stat)) {
case CONNECTED:
+ sc->sc_flags &= ~WI_FLAGS_OUTRANGE;
if (ic->ic_state == IEEE80211_S_RUN)
break;
/* FALLTHROUGH */
@@ -1196,6 +1200,7 @@
ieee80211_new_state(ifp, IEEE80211_S_RUN, -1);
break;
case AP_IN_RANGE:
+ sc->sc_flags &= ~WI_FLAGS_OUTRANGE;
break;
case AP_OUT_OF_RANGE:
if (sc->sc_firmware_type == WI_SYMBOL &&
@@ -1205,7 +1210,9 @@
sc->sc_scan_timer = 0;
break;
}
- /* FALLTHROUGH */
+ if (ic->ic_opmode == IEEE80211_M_STA)
+ sc->sc_flags |= WI_FLAGS_OUTRANGE;
+ break;
case DISCONNECTED:
case ASSOC_FAILED:
if (ic->ic_opmode == IEEE80211_M_STA)
@@ -2003,9 +2010,11 @@
switch (nstate) {
case IEEE80211_S_INIT:
ic->ic_flags &= ~IEEE80211_F_SIBSS;
+ sc->sc_flags &= ~WI_FLAGS_OUTRANGE;
return 0;
case IEEE80211_S_RUN:
+ sc->sc_flags &= ~WI_FLAGS_OUTRANGE;
buflen = IEEE80211_ADDR_LEN;
wi_read_rid(sc, WI_RID_CURRENT_BSSID, ni->ni_bssid, &buflen);
IEEE80211_ADDR_COPY(ni->ni_macaddr, ni->ni_bssid);
diff -r 4940db450e5f -r bb35d8581f11 sys/dev/ic/wivar.h
--- a/sys/dev/ic/wivar.h Fri Oct 04 04:04:26 2002 +0000
+++ b/sys/dev/ic/wivar.h Fri Oct 04 04:23:20 2002 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: wivar.h,v 1.22 2002/09/30 15:48:45 onoe Exp $ */
+/* $NetBSD: wivar.h,v 1.23 2002/10/04 04:23:23 onoe Exp $ */
/*
* Copyright (c) 1997, 1998, 1999
@@ -100,6 +100,7 @@
/* Values for wi_flags. */
#define WI_FLAGS_ATTACHED 0x0001
#define WI_FLAGS_INITIALIZED 0x0002
+#define WI_FLAGS_OUTRANGE 0x0004
#define WI_FLAGS_HAS_MOR 0x0010
#define WI_FLAGS_HAS_ROAMING 0x0020
#define WI_FLAGS_HAS_DIVERSITY 0x0040
Home |
Main Index |
Thread Index |
Old Index