summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authoronoe <onoe@NetBSD.org>2002-09-30 15:48:41 +0000
committeronoe <onoe@NetBSD.org>2002-09-30 15:48:41 +0000
commit9fadcea3726baa167a47523cfa282a4e51cd4f3b (patch)
tree95621a8eaba8c054f0f24b01a931bb4aceeff576 /sys
parent92ef00aebaa1b02d89fcbfcbf52dac2678e445e0 (diff)
old lucent adhoc-demo mode (adhoc,flag0 or wiconfig -p 3) wasn't handled
correctly. To avoid massive extra code in each driver, now if_iee80211subr.c also handles non-standard old lucent adhoc-demo mode. This also fixes PR 14227.
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/ic/awi.c145
-rw-r--r--sys/dev/ic/awivar.h3
-rw-r--r--sys/dev/ic/wi.c93
-rw-r--r--sys/dev/ic/wivar.h3
-rw-r--r--sys/net/if_ieee80211.h8
-rw-r--r--sys/net/if_ieee80211subr.c70
6 files changed, 171 insertions, 151 deletions
diff --git a/sys/dev/ic/awi.c b/sys/dev/ic/awi.c
index b137aeb1f3d..e81f9748a07 100644
--- a/sys/dev/ic/awi.c
+++ b/sys/dev/ic/awi.c
@@ -1,4 +1,4 @@
-/* $NetBSD: awi.c,v 1.48 2002/09/30 06:38:10 onoe Exp $ */
+/* $NetBSD: awi.c,v 1.49 2002/09/30 15:48:46 onoe Exp $ */
/*-
* Copyright (c) 1999,2000,2001 The NetBSD Foundation, Inc.
@@ -85,7 +85,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: awi.c,v 1.48 2002/09/30 06:38:10 onoe Exp $");
+__KERNEL_RCSID(0, "$NetBSD: awi.c,v 1.49 2002/09/30 15:48:46 onoe Exp $");
#include "opt_inet.h"
#include "bpfilter.h"
@@ -234,12 +234,14 @@ awi_attach(struct awi_softc *sc)
IFQ_SET_READY(&ifp->if_snd);
memcpy(ifp->if_xname, sc->sc_dev.dv_xname, IFNAMSIZ);
+ ic->ic_flags =
+ IEEE80211_F_HASWEP | IEEE80211_F_HASIBSS | IEEE80211_F_HASHOSTAP;
if (sc->sc_mib_phy.IEEE_PHY_Type == AWI_PHY_TYPE_FH)
ic->ic_phytype = IEEE80211_T_FH;
- else
+ else {
ic->ic_phytype = IEEE80211_T_DS;
- ic->ic_flags =
- IEEE80211_F_HASWEP | IEEE80211_F_HASIBSS | IEEE80211_F_HASHAP;
+ ic->ic_flags |= IEEE80211_F_HASAHDEMO;
+ }
ic->ic_opmode = IEEE80211_M_STA;
ic->ic_state = IEEE80211_S_INIT;
ic->ic_newstate = awi_newstate;
@@ -486,10 +488,23 @@ awi_init(struct ifnet *ifp)
}
ic->ic_state = IEEE80211_S_INIT;
- sc->sc_mib_local.Network_Mode =
- (ic->ic_opmode == IEEE80211_M_ADHOC) ? 0 : 1;
- sc->sc_mib_local.Acting_as_AP =
- (ic->ic_opmode == IEEE80211_M_HOSTAP) ? 1 : 0;
+ ic->ic_flags &= ~IEEE80211_F_IBSSON;
+ switch (ic->ic_opmode) {
+ case IEEE80211_M_STA:
+ sc->sc_mib_local.Network_Mode = 1;
+ sc->sc_mib_local.Acting_as_AP = 0;
+ break;
+ case IEEE80211_M_IBSS:
+ ic->ic_flags |= IEEE80211_F_IBSSON;
+ case IEEE80211_M_AHDEMO:
+ sc->sc_mib_local.Network_Mode = 0;
+ sc->sc_mib_local.Acting_as_AP = 0;
+ break;
+ case IEEE80211_M_HOSTAP:
+ sc->sc_mib_local.Network_Mode = 1;
+ sc->sc_mib_local.Acting_as_AP = 1;
+ break;
+ }
memset(&sc->sc_mib_mac.aDesired_ESS_ID, 0, AWI_ESS_ID_SIZE);
sc->sc_mib_mac.aDesired_ESS_ID[0] = IEEE80211_ELEMID_SSID;
sc->sc_mib_mac.aDesired_ESS_ID[1] = ic->ic_des_esslen;
@@ -534,7 +549,7 @@ awi_init(struct ifnet *ifp)
ifp->if_flags |= IFF_RUNNING;
ifp->if_flags &= ~IFF_OACTIVE;
- if ((ic->ic_opmode == IEEE80211_M_ADHOC && sc->sc_no_bssid) ||
+ if (ic->ic_opmode == IEEE80211_M_AHDEMO ||
ic->ic_opmode == IEEE80211_M_HOSTAP) {
ni->ni_chan = ic->ic_ibss_chan;
ni->ni_intval = ic->ic_lintval;
@@ -564,7 +579,8 @@ awi_init(struct ifnet *ifp)
}
if (ic->ic_flags & IEEE80211_F_WEPON)
ni->ni_capinfo |= IEEE80211_CAPINFO_PRIVACY;
- ic->ic_flags |= IEEE80211_F_SIBSS;
+ if (ic->ic_opmode != IEEE80211_M_AHDEMO)
+ ic->ic_flags |= IEEE80211_F_SIBSS;
ic->ic_state = IEEE80211_S_SCAN; /*XXX*/
sc->sc_substate = AWI_ST_NONE;
ieee80211_new_state(&ic->ic_if, IEEE80211_S_RUN, -1);
@@ -679,8 +695,8 @@ awi_start(struct ifnet *ifp)
}
wh = mtod(m0, struct ieee80211_frame *);
if (!IEEE80211_IS_MULTICAST(wh->i_addr1) &&
- ic->ic_opmode != IEEE80211_M_STA &&
- sc->sc_no_bssid == 0 &&
+ (ic->ic_opmode == IEEE80211_M_HOSTAP ||
+ ic->ic_opmode == IEEE80211_M_IBSS) &&
sc->sc_adhoc_ap == 0 &&
(ifp->if_flags & IFF_LINK0) == 0 &&
(wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) ==
@@ -849,11 +865,12 @@ awi_media_change(struct ifnet *ifp)
struct awi_softc *sc = ifp->if_softc;
struct ieee80211com *ic = &sc->sc_ic;
struct ifmedia_entry *ime;
- int i, rate, error = 0;
+ enum ieee80211_opmode newmode;
+ int i, rate, newadhoc_ap, error = 0;
ime = sc->sc_media.ifm_cur;
if (IFM_SUBTYPE(ime->ifm_media) == IFM_AUTO) {
- ic->ic_fixed_rate = -1;
+ i = -1;
} else {
rate = ieee80211_media2rate(ime->ifm_media, ic->ic_phytype);
if (rate == 0)
@@ -864,64 +881,43 @@ awi_media_change(struct ifnet *ifp)
}
if (i == IEEE80211_RATE_SIZE)
return EINVAL;
+ }
+ if (ic->ic_fixed_rate != i) {
ic->ic_fixed_rate = i;
+ error = ENETRESET;
}
/*
* combination of mediaopt
*
- * hostap adhoc flag0 opmode no_bssid adhoc_ap comment
- * + - - HOSTAP 0 0 HostAP
- * - + - ADHOC 0 0 IBSS
- * - + + ADHOC 1 0 WaveLAN adhoc
- * - - + ADHOC 0 1 Melco old Sta
+ * hostap adhoc flag0 opmode adhoc_ap comment
+ * + - - HOSTAP 0 HostAP
+ * - + - IBSS 0 IBSS
+ * - + + AHDEMO 0 WaveLAN adhoc
+ * - - + IBSS 1 Melco old Sta
* also LINK0
- * - - - STA 0 0 Infra Station
+ * - - - STA 0 Infra Station
*/
- ic->ic_flags &= ~IEEE80211_F_IBSSON;
- if (ime->ifm_media & IFM_IEEE80211_HOSTAP) {
- if (ic->ic_opmode != IEEE80211_M_HOSTAP) {
- ic->ic_opmode = IEEE80211_M_HOSTAP;
- sc->sc_no_bssid = 0;
- sc->sc_adhoc_ap = 0;
- error = ENETRESET;
- }
- } else if (ime->ifm_media & IFM_IEEE80211_ADHOC) {
- if (ic->ic_opmode != IEEE80211_M_ADHOC ||
- sc->sc_adhoc_ap != 0) {
- ic->ic_opmode = IEEE80211_M_ADHOC;
- sc->sc_adhoc_ap = 0;
- error = ENETRESET;
- }
+ newadhoc_ap = 0;
+ if (ime->ifm_media & IFM_IEEE80211_HOSTAP)
+ newmode = IEEE80211_M_HOSTAP;
+ else if (ime->ifm_media & IFM_IEEE80211_ADHOC) {
if (ic->ic_phytype == IEEE80211_T_DS &&
- (ime->ifm_media & IFM_FLAG0)) {
- if (sc->sc_no_bssid == 0) {
- sc->sc_no_bssid = 1;
- error = ENETRESET;
- }
- } else {
- if (sc->sc_no_bssid) {
- sc->sc_no_bssid = 0;
- error = ENETRESET;
- }
- ic->ic_flags |= IEEE80211_F_IBSSON;
- }
+ (ime->ifm_media & IFM_FLAG0))
+ newmode = IEEE80211_M_AHDEMO;
+ else
+ newmode = IEEE80211_M_IBSS;
} else if (ime->ifm_media & IFM_FLAG0) {
- if (ic->ic_opmode != IEEE80211_M_ADHOC ||
- sc->sc_adhoc_ap == 0) {
- ic->ic_opmode = IEEE80211_M_ADHOC;
- sc->sc_adhoc_ap = 1;
- sc->sc_no_bssid = 0;
- error = ENETRESET;
- }
- } else {
- if (ic->ic_opmode != IEEE80211_M_STA) {
- ic->ic_opmode = IEEE80211_M_STA;
- sc->sc_no_bssid = 0;
- sc->sc_adhoc_ap = 0;
- error = ENETRESET;
- }
+ newmode = IEEE80211_M_IBSS;
+ newadhoc_ap = 1;
+ } else
+ newmode = IEEE80211_M_STA;
+ if (ic->ic_opmode != newmode || sc->sc_adhoc_ap != newadhoc_ap) {
+ ic->ic_opmode = newmode;
+ sc->sc_adhoc_ap = newadhoc_ap;
+ error = ENETRESET;
}
+
if (error == ENETRESET) {
if (sc->sc_enabled)
error = awi_init(ifp);
@@ -956,14 +952,14 @@ awi_media_status(struct ifnet *ifp, struct ifmediareq *imr)
switch (ic->ic_opmode) {
case IEEE80211_M_STA:
break;
- case IEEE80211_M_ADHOC:
+ case IEEE80211_M_IBSS:
if (sc->sc_adhoc_ap)
imr->ifm_active |= IFM_FLAG0;
- else {
+ else
imr->ifm_active |= IFM_IEEE80211_ADHOC;
- if (sc->sc_no_bssid)
- imr->ifm_active |= IFM_FLAG0;
- }
+ break;
+ case IEEE80211_M_AHDEMO:
+ imr->ifm_active |= IFM_IEEE80211_ADHOC | IFM_FLAG0;
break;
case IEEE80211_M_HOSTAP:
imr->ifm_active |= IFM_IEEE80211_HOSTAP;
@@ -1722,7 +1718,8 @@ awi_newstate(void *arg, enum ieee80211_state nstate)
awi_drvstate(sc, AWI_DRV_RESET);
break;
case IEEE80211_S_SCAN:
- if (ic->ic_opmode == IEEE80211_M_ADHOC)
+ if (ic->ic_opmode == IEEE80211_M_IBSS ||
+ ic->ic_opmode == IEEE80211_M_AHDEMO)
awi_drvstate(sc, AWI_DRV_ADHSC);
else
awi_drvstate(sc, AWI_DRV_INFSY);
@@ -1734,7 +1731,8 @@ awi_newstate(void *arg, enum ieee80211_state nstate)
awi_drvstate(sc, AWI_DRV_INFAUTH);
break;
case IEEE80211_S_RUN:
- if (ic->ic_opmode == IEEE80211_M_ADHOC)
+ if (ic->ic_opmode == IEEE80211_M_IBSS ||
+ ic->ic_opmode == IEEE80211_M_AHDEMO)
awi_drvstate(sc, AWI_DRV_ADHSY);
else
awi_drvstate(sc, AWI_DRV_INFASSOC);
@@ -1886,8 +1884,7 @@ awi_newstate(void *arg, enum ieee80211_state nstate)
awi_write_1(sc, AWI_CA_SYNC_IDX, 0);
awi_write_2(sc, AWI_CA_SYNC_DWELL, 0);
}
- if ((ic->ic_flags & IEEE80211_F_SIBSS) &&
- !sc->sc_no_bssid)
+ if (ic->ic_flags & IEEE80211_F_SIBSS)
awi_write_1(sc, AWI_CA_SYNC_STARTBSS, 1);
else
awi_write_1(sc, AWI_CA_SYNC_STARTBSS, 0);
@@ -1954,7 +1951,8 @@ awi_ether_encap(struct awi_softc *sc, struct mbuf *m)
*(u_int16_t *)wh->i_seq =
htole16(ni->ni_txseq << IEEE80211_SEQ_SEQ_SHIFT);
ni->ni_txseq++;
- if (ic->ic_opmode == IEEE80211_M_ADHOC) {
+ if (ic->ic_opmode == IEEE80211_M_IBSS ||
+ ic->ic_opmode == IEEE80211_M_AHDEMO) {
wh->i_fc[1] = IEEE80211_FC1_DIR_NODS;
if (sc->sc_adhoc_ap)
IEEE80211_ADDR_COPY(wh->i_addr1, ni->ni_macaddr);
@@ -1989,7 +1987,8 @@ awi_ether_modcap(struct awi_softc *sc, struct mbuf *m)
return m;
memcpy(&eh, mtod(m, caddr_t) + sizeof(wh), sizeof(eh));
m_adj(m, sizeof(eh) - sizeof(*llc));
- if (ic->ic_opmode == IEEE80211_M_ADHOC)
+ if (ic->ic_opmode == IEEE80211_M_IBSS ||
+ ic->ic_opmode == IEEE80211_M_AHDEMO)
IEEE80211_ADDR_COPY(wh.i_addr2, eh.ether_shost);
memcpy(mtod(m, caddr_t), &wh, sizeof(wh));
llc = (struct llc *)(mtod(m, caddr_t) + sizeof(wh));
diff --git a/sys/dev/ic/awivar.h b/sys/dev/ic/awivar.h
index f459ebf3e24..0a9362cd48e 100644
--- a/sys/dev/ic/awivar.h
+++ b/sys/dev/ic/awivar.h
@@ -1,4 +1,4 @@
-/* $NetBSD: awivar.h,v 1.16 2001/09/19 04:09:55 onoe Exp $ */
+/* $NetBSD: awivar.h,v 1.17 2002/09/30 15:48:48 onoe Exp $ */
/*-
* Copyright (c) 1999,2000,2001 The NetBSD Foundation, Inc.
@@ -87,7 +87,6 @@ struct awi_softc {
sc_busy:1,
sc_cansleep:1,
sc_enab_intr:1,
- sc_no_bssid:1,
sc_adhoc_ap:1,
sc_invalid:1;
struct ifmedia sc_media;
diff --git a/sys/dev/ic/wi.c b/sys/dev/ic/wi.c
index 2803a178fbb..3b0af7ac3ff 100644
--- a/sys/dev/ic/wi.c
+++ b/sys/dev/ic/wi.c
@@ -1,4 +1,4 @@
-/* $NetBSD: wi.c,v 1.90 2002/09/30 06:50:35 onoe Exp $ */
+/* $NetBSD: wi.c,v 1.91 2002/09/30 15:48:44 onoe Exp $ */
/*
* Copyright (c) 1997, 1998, 1999
@@ -70,7 +70,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wi.c,v 1.90 2002/09/30 06:50:35 onoe Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wi.c,v 1.91 2002/09/30 15:48:44 onoe Exp $");
#define WI_HERMES_AUTOINC_WAR /* Work around data write autoinc bug. */
#define WI_HERMES_STATS_WAR /* Work around stats counter bug. */
@@ -241,7 +241,7 @@ wi_attach(struct wi_softc *sc)
ic->ic_phytype = IEEE80211_T_DS;
ic->ic_opmode = IEEE80211_M_STA;
- ic->ic_flags = IEEE80211_F_HASPMGT;
+ ic->ic_flags = IEEE80211_F_HASPMGT | IEEE80211_F_HASAHDEMO;
ic->ic_state = IEEE80211_S_INIT;
ic->ic_newstate = wi_newstate;
@@ -290,7 +290,7 @@ wi_attach(struct wi_softc *sc)
sc->sc_flags |= WI_FLAGS_HAS_ROAMING;
sc->sc_flags |= WI_FLAGS_HAS_SYSSCALE;
if (sc->sc_sta_firmware_ver >= 800) {
- ic->ic_flags |= IEEE80211_F_HASHAP;
+ ic->ic_flags |= IEEE80211_F_HASHOSTAP;
ic->ic_flags |= IEEE80211_F_HASIBSS;
}
sc->sc_ibss_port = 0;
@@ -333,7 +333,7 @@ wi_attach(struct wi_softc *sc)
#define ADD(s, o) ifmedia_add(&sc->sc_media, \
IFM_MAKEWORD(IFM_IEEE80211, (s), (o), 0), 0, NULL)
ADD(IFM_AUTO, 0);
- if (ic->ic_flags & IEEE80211_F_HASHAP)
+ if (ic->ic_flags & IEEE80211_F_HASHOSTAP)
ADD(IFM_AUTO, IFM_IEEE80211_HOSTAP);
if (ic->ic_flags & IEEE80211_F_HASIBSS)
ADD(IFM_AUTO, IFM_IEEE80211_ADHOC);
@@ -346,7 +346,7 @@ wi_attach(struct wi_softc *sc)
printf("%s%d%sMbps", (i != 0 ? " " : ""),
(r & IEEE80211_RATE_VAL) / 2, ((r & 0x1) != 0 ? ".5" : ""));
ADD(mword, 0);
- if (ic->ic_flags & IEEE80211_F_HASHAP)
+ if (ic->ic_flags & IEEE80211_F_HASHOSTAP)
ADD(mword, IFM_IEEE80211_HOSTAP);
if (ic->ic_flags & IEEE80211_F_HASIBSS)
ADD(mword, IFM_IEEE80211_ADHOC);
@@ -531,9 +531,12 @@ wi_init(struct ifnet *ifp)
case IEEE80211_M_STA:
wi_write_val(sc, WI_RID_PORTTYPE, WI_PORTTYPE_BSS);
break;
- case IEEE80211_M_ADHOC:
+ case IEEE80211_M_IBSS:
wi_write_val(sc, WI_RID_PORTTYPE, sc->sc_ibss_port);
break;
+ case IEEE80211_M_AHDEMO:
+ wi_write_val(sc, WI_RID_PORTTYPE, WI_PORTTYPE_ADHOC);
+ break;
case IEEE80211_M_HOSTAP:
wi_write_val(sc, WI_RID_PORTTYPE, WI_PORTTYPE_HOSTAP);
break;
@@ -613,14 +616,17 @@ wi_init(struct ifnet *ifp)
sc->sc_txd[i].d_fid));
sc->sc_txd[i].d_len = 0;
}
+ if (ic->ic_opmode == IEEE80211_M_IBSS)
+ ic->ic_flags |= IEEE80211_F_IBSSON;
+ else
+ ic->ic_flags &= ~IEEE80211_F_IBSSON;
/* Enable port 0 */
wi_cmd(sc, WI_CMD_ENABLE | WI_PORT0, 0, 0, 0);
ifp->if_flags |= IFF_RUNNING;
ifp->if_flags &= ~IFF_OACTIVE;
- if ((ic->ic_opmode == IEEE80211_M_ADHOC &&
- (sc->sc_flags & WI_FLAGS_NO_BSSID)) ||
- (ic->ic_opmode == IEEE80211_M_HOSTAP))
+ if (ic->ic_opmode == IEEE80211_M_AHDEMO ||
+ ic->ic_opmode == IEEE80211_M_HOSTAP)
wi_newstate(sc, IEEE80211_S_RUN);
/* Enable interrupts */
@@ -936,11 +942,12 @@ wi_media_change(struct ifnet *ifp)
struct wi_softc *sc = ifp->if_softc;
struct ieee80211com *ic = &sc->sc_ic;
struct ifmedia_entry *ime;
+ enum ieee80211_opmode newmode;
int i, rate, error = 0;
ime = sc->sc_media.ifm_cur;
if (IFM_SUBTYPE(ime->ifm_media) == IFM_AUTO) {
- ic->ic_fixed_rate = -1;
+ i = -1;
} else {
rate = ieee80211_media2rate(ime->ifm_media, IEEE80211_T_DS);
if (rate == 0)
@@ -951,40 +958,24 @@ wi_media_change(struct ifnet *ifp)
}
if (i == IEEE80211_RATE_SIZE)
return EINVAL;
+ }
+ if (ic->ic_fixed_rate != i) {
ic->ic_fixed_rate = i;
+ error = ENETRESET;
}
if ((ime->ifm_media & IFM_IEEE80211_ADHOC) &&
- (ime->ifm_media & IFM_FLAG0)) {
- if (ic->ic_opmode != IEEE80211_M_ADHOC ||
- (sc->sc_flags & WI_FLAGS_NO_BSSID) == 0) {
- ic->ic_opmode = IEEE80211_M_ADHOC;
- ic->ic_flags &= ~IEEE80211_F_IBSSON;
- sc->sc_flags |= WI_FLAGS_NO_BSSID;
- error = ENETRESET;
- }
- } else if (ime->ifm_media & IFM_IEEE80211_ADHOC) {
- if (ic->ic_opmode != IEEE80211_M_ADHOC ||
- (sc->sc_flags & WI_FLAGS_NO_BSSID)) {
- ic->ic_opmode = IEEE80211_M_ADHOC;
- ic->ic_flags |= IEEE80211_F_IBSSON;
- sc->sc_flags &= ~WI_FLAGS_NO_BSSID;
- error = ENETRESET;
- }
- } else if (ime->ifm_media & IFM_IEEE80211_HOSTAP) {
- if (ic->ic_opmode != IEEE80211_M_HOSTAP) {
- ic->ic_opmode = IEEE80211_M_HOSTAP;
- ic->ic_flags &= ~IEEE80211_F_IBSSON;
- sc->sc_flags &= ~WI_FLAGS_NO_BSSID;
- error = ENETRESET;
- }
- } else {
- if (ic->ic_opmode != IEEE80211_M_STA) {
- ic->ic_opmode = IEEE80211_M_STA;
- ic->ic_flags &= ~IEEE80211_F_IBSSON;
- sc->sc_flags &= ~WI_FLAGS_NO_BSSID;
- error = ENETRESET;
- }
+ (ime->ifm_media & IFM_FLAG0))
+ newmode = IEEE80211_M_AHDEMO;
+ else if (ime->ifm_media & IFM_IEEE80211_ADHOC)
+ newmode = IEEE80211_M_IBSS;
+ else if (ime->ifm_media & IFM_IEEE80211_HOSTAP)
+ newmode = IEEE80211_M_HOSTAP;
+ else
+ newmode = IEEE80211_M_STA;
+ if (ic->ic_opmode != newmode) {
+ ic->ic_opmode = newmode;
+ error = ENETRESET;
}
if (error == ENETRESET) {
if (sc->sc_enabled)
@@ -994,7 +985,7 @@ wi_media_change(struct ifnet *ifp)
}
ifp->if_baudrate = ifmedia_baudrate(sc->sc_media.ifm_cur->ifm_media);
- return 0;
+ return error;
}
static void
@@ -1032,10 +1023,11 @@ wi_media_status(struct ifnet *ifp, struct ifmediareq *imr)
switch (ic->ic_opmode) {
case IEEE80211_M_STA:
break;
- case IEEE80211_M_ADHOC:
+ case IEEE80211_M_IBSS:
imr->ifm_active |= IFM_IEEE80211_ADHOC;
- if ((sc->sc_flags & WI_FLAGS_NO_BSSID))
- imr->ifm_active |= IFM_FLAG0;
+ break;
+ case IEEE80211_M_AHDEMO:
+ imr->ifm_active |= IFM_IEEE80211_ADHOC | IFM_FLAG0;
break;
case IEEE80211_M_HOSTAP:
imr->ifm_active |= IFM_IEEE80211_HOSTAP;
@@ -1199,11 +1191,7 @@ wi_info_intr(struct wi_softc *sc)
/* FALLTHROUGH */
case DISCONNECTED:
case ASSOC_FAILED:
- if ((ic->ic_opmode == IEEE80211_M_ADHOC &&
- (sc->sc_flags & WI_FLAGS_NO_BSSID)) ||
- ic->ic_opmode == IEEE80211_M_HOSTAP)
- ;
- else
+ if (ic->ic_opmode == IEEE80211_M_STA)
ieee80211_new_state(ifp, IEEE80211_S_INIT, -1);
break;
}
@@ -1537,6 +1525,7 @@ wi_set_cfg(struct ifnet *ifp, u_long cmd, caddr_t data)
sc->sc_nodelen = le16toh(wreq.wi_val[0]) * 2;
memcpy(sc->sc_nodename, &wreq.wi_val[1], sc->sc_nodelen);
break;
+
case WI_RID_MICROWAVE_OVEN:
case WI_RID_ROAMING_MODE:
case WI_RID_SYSTEM_SCALE:
@@ -1580,6 +1569,7 @@ wi_set_cfg(struct ifnet *ifp, u_long cmd, caddr_t data)
break;
}
break;
+
case WI_RID_TX_RATE:
switch (le16toh(wreq.wi_val[0])) {
case 3:
@@ -1598,10 +1588,12 @@ wi_set_cfg(struct ifnet *ifp, u_long cmd, caddr_t data)
if (sc->sc_enabled)
error = wi_write_txrate(sc);
break;
+
case WI_RID_SCAN_APS:
if (sc->sc_enabled && ic->ic_opmode != IEEE80211_M_HOSTAP)
error = wi_scan_ap(sc);
break;
+
case WI_RID_MGMT_XMIT:
if (!sc->sc_enabled) {
error = ENETDOWN;
@@ -1619,6 +1611,7 @@ wi_set_cfg(struct ifnet *ifp, u_long cmd, caddr_t data)
}
IF_ENQUEUE(&ic->ic_mgtq, m);
break;
+
default:
if (sc->sc_enabled) {
error = wi_write_rid(sc, wreq.wi_type, wreq.wi_val,
diff --git a/sys/dev/ic/wivar.h b/sys/dev/ic/wivar.h
index 9349b8cfbfa..49ecdc443ce 100644
--- a/sys/dev/ic/wivar.h
+++ b/sys/dev/ic/wivar.h
@@ -1,4 +1,4 @@
-/* $NetBSD: wivar.h,v 1.21 2002/09/30 06:50:36 onoe Exp $ */
+/* $NetBSD: wivar.h,v 1.22 2002/09/30 15:48:45 onoe Exp $ */
/*
* Copyright (c) 1997, 1998, 1999
@@ -100,7 +100,6 @@ struct wi_softc {
/* Values for wi_flags. */
#define WI_FLAGS_ATTACHED 0x0001
#define WI_FLAGS_INITIALIZED 0x0002
-#define WI_FLAGS_NO_BSSID 0x0004
#define WI_FLAGS_HAS_MOR 0x0010
#define WI_FLAGS_HAS_ROAMING 0x0020
#define WI_FLAGS_HAS_DIVERSITY 0x0040
diff --git a/sys/net/if_ieee80211.h b/sys/net/if_ieee80211.h
index e70ec856680..d3397aaac8e 100644
--- a/sys/net/if_ieee80211.h
+++ b/sys/net/if_ieee80211.h
@@ -1,4 +1,4 @@
-/* $NetBSD: if_ieee80211.h,v 1.21 2002/09/30 05:35:28 onoe Exp $ */
+/* $NetBSD: if_ieee80211.h,v 1.22 2002/09/30 15:48:41 onoe Exp $ */
/*-
* Copyright (c) 2000, 2001 The NetBSD Foundation, Inc.
@@ -375,7 +375,8 @@ enum ieee80211_phytype {
enum ieee80211_opmode {
IEEE80211_M_STA = 1, /* infrastructure station */
- IEEE80211_M_ADHOC = 0, /* IBSS (adhoc) station */
+ IEEE80211_M_IBSS = 0, /* IBSS (adhoc) station */
+ IEEE80211_M_AHDEMO = 3, /* Old lucent compatible adhoc demo */
IEEE80211_M_HOSTAP = 6 /* Software Access Point */
};
@@ -497,7 +498,8 @@ struct ieee80211com {
#define IEEE80211_F_HASWEP 0x00010000 /* CAPABILITY: WEP available */
#define IEEE80211_F_HASIBSS 0x00020000 /* CAPABILITY: IBSS available */
#define IEEE80211_F_HASPMGT 0x00040000 /* CAPABILITY: Power mgmt */
-#define IEEE80211_F_HASHAP 0x00080000 /* CAPABILITY: HOSTAP avail */
+#define IEEE80211_F_HASHOSTAP 0x00080000 /* CAPABILITY: HOSTAP avail */
+#define IEEE80211_F_HASAHDEMO 0x00100000 /* CAPABILITY: Old Adhoc Demo */
/* flags for ieee80211_fix_rate() */
#define IEEE80211_F_DOSORT 0x00000001 /* sort rate list */
diff --git a/sys/net/if_ieee80211subr.c b/sys/net/if_ieee80211subr.c
index c999c448500..097ebfc7b90 100644
--- a/sys/net/if_ieee80211subr.c
+++ b/sys/net/if_ieee80211subr.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_ieee80211subr.c,v 1.15 2002/09/30 05:35:28 onoe Exp $ */
+/* $NetBSD: if_ieee80211subr.c,v 1.16 2002/09/30 15:48:42 onoe Exp $ */
/*-
* Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -41,7 +41,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_ieee80211subr.c,v 1.15 2002/09/30 05:35:28 onoe Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ieee80211subr.c,v 1.16 2002/09/30 15:48:42 onoe Exp $");
#include "opt_inet.h"
#include "bpfilter.h"
@@ -219,6 +219,7 @@ ieee80211_ifdetach(struct ifnet *ifp)
}
ieee80211_free_allnodes(ic);
ether_ifdetach(ifp);
+ splx(s);
}
void
@@ -260,7 +261,8 @@ ieee80211_input(struct ifnet *ifp, struct mbuf *m, int rssi, u_int32_t rstamp)
goto out;
}
break;
- case IEEE80211_M_ADHOC:
+ case IEEE80211_M_IBSS:
+ case IEEE80211_M_AHDEMO:
case IEEE80211_M_HOSTAP:
if (dir == IEEE80211_FC1_DIR_NODS)
bssid = wh->i_addr3;
@@ -313,7 +315,8 @@ ieee80211_input(struct ifnet *ifp, struct mbuf *m, int rssi, u_int32_t rstamp)
goto out;
}
break;
- case IEEE80211_M_ADHOC:
+ case IEEE80211_M_IBSS:
+ case IEEE80211_M_AHDEMO:
if (dir != IEEE80211_FC1_DIR_NODS)
goto out;
break;
@@ -350,6 +353,8 @@ ieee80211_input(struct ifnet *ifp, struct mbuf *m, int rssi, u_int32_t rstamp)
case IEEE80211_FC0_TYPE_MGT:
if (dir != IEEE80211_FC1_DIR_NODS)
goto err;
+ if (ic->ic_opmode == IEEE80211_M_AHDEMO)
+ goto out;
subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;
/* drop frames without interest */
@@ -358,7 +363,7 @@ ieee80211_input(struct ifnet *ifp, struct mbuf *m, int rssi, u_int32_t rstamp)
subtype != IEEE80211_FC0_SUBTYPE_PROBE_RESP)
goto out;
} else {
- if (ic->ic_opmode != IEEE80211_M_ADHOC &&
+ if (ic->ic_opmode != IEEE80211_M_IBSS &&
subtype == IEEE80211_FC0_SUBTYPE_BEACON)
goto out;
}
@@ -373,7 +378,7 @@ ieee80211_input(struct ifnet *ifp, struct mbuf *m, int rssi, u_int32_t rstamp)
doprint = 1;
break;
case IEEE80211_FC0_SUBTYPE_PROBE_REQ:
- if (ic->ic_opmode == IEEE80211_M_ADHOC)
+ if (ic->ic_opmode == IEEE80211_M_IBSS)
doprint = 1;
break;
default:
@@ -444,7 +449,7 @@ ieee80211_mgmt_output(struct ifnet *ifp, struct ieee80211_node *ni,
if (ifp->if_flags & IFF_DEBUG) {
/* avoid to print too many frames */
- if (ic->ic_opmode == IEEE80211_M_ADHOC ||
+ if (ic->ic_opmode == IEEE80211_M_IBSS ||
(type & IEEE80211_FC0_SUBTYPE_MASK) !=
IEEE80211_FC0_SUBTYPE_PROBE_RESP)
printf("%s: sending %s to %s\n", ifp->if_xname,
@@ -476,7 +481,7 @@ ieee80211_encap(struct ifnet *ifp, struct mbuf *m)
memcpy(&eh, mtod(m, caddr_t), sizeof(struct ether_header));
if (!IEEE80211_IS_MULTICAST(eh.ether_dhost) &&
- (ic->ic_opmode == IEEE80211_M_ADHOC ||
+ (ic->ic_opmode == IEEE80211_M_IBSS ||
ic->ic_opmode == IEEE80211_M_HOSTAP)) {
ni = ieee80211_find_node(ic, eh.ether_dhost);
if (ni == NULL)
@@ -509,7 +514,8 @@ ieee80211_encap(struct ifnet *ifp, struct mbuf *m)
IEEE80211_ADDR_COPY(wh->i_addr2, eh.ether_shost);
IEEE80211_ADDR_COPY(wh->i_addr3, eh.ether_dhost);
break;
- case IEEE80211_M_ADHOC:
+ case IEEE80211_M_IBSS:
+ case IEEE80211_M_AHDEMO:
wh->i_fc[1] = IEEE80211_FC1_DIR_NODS;
IEEE80211_ADDR_COPY(wh->i_addr1, eh.ether_dhost);
IEEE80211_ADDR_COPY(wh->i_addr2, eh.ether_shost);
@@ -1026,7 +1032,7 @@ ieee80211_end_scan(struct ifnet *ifp)
if (ni == NULL) {
DPRINTF(("ieee80211_end_scan: no scan candidate\n"));
notfound:
- if (ic->ic_opmode == IEEE80211_M_ADHOC &&
+ if (ic->ic_opmode == IEEE80211_M_IBSS &&
(ic->ic_flags & IEEE80211_F_IBSSON) &&
ic->ic_des_esslen != 0) {
ni = &ic->ic_bss;
@@ -1092,7 +1098,7 @@ ieee80211_end_scan(struct ifnet *ifp)
if (ic->ic_des_chan != IEEE80211_CHAN_ANY &&
ni->ni_chan != ic->ic_des_chan)
fail |= 0x01;
- if (ic->ic_opmode == IEEE80211_M_ADHOC) {
+ if (ic->ic_opmode == IEEE80211_M_IBSS) {
if ((ni->ni_capinfo & IEEE80211_CAPINFO_IBSS) == 0)
fail |= 0x02;
} else {
@@ -1150,7 +1156,7 @@ ieee80211_end_scan(struct ifnet *ifp)
ic->ic_bss.ni_private = p;
if (p != NULL && ic->ic_bss_privlen)
memcpy(p, selbs->ni_private, ic->ic_bss_privlen);
- if (ic->ic_opmode == IEEE80211_M_ADHOC) {
+ if (ic->ic_opmode == IEEE80211_M_IBSS) {
ieee80211_fix_rate(ic, &ic->ic_bss, IEEE80211_F_DOFRATE |
IEEE80211_F_DONEGO | IEEE80211_F_DODEL);
if (ic->ic_bss.ni_nrate == 0) {
@@ -1186,9 +1192,7 @@ ieee80211_alloc_node(struct ieee80211com *ic, u_int8_t *macaddr, int copy)
hash = IEEE80211_NODE_HASH(macaddr);
TAILQ_INSERT_TAIL(&ic->ic_node, ni, ni_list);
LIST_INSERT_HEAD(&ic->ic_hash[hash], ni, ni_hash);
- if (ic->ic_opmode == IEEE80211_M_ADHOC ||
- ic->ic_opmode == IEEE80211_M_HOSTAP)
- ic->ic_inact_timer = IEEE80211_INACT_WAIT;
+ ic->ic_inact_timer = IEEE80211_INACT_WAIT;
return ni;
}
@@ -1351,7 +1355,7 @@ ieee80211_send_prresp(struct ieee80211com *ic, struct ieee80211_node *bs0,
frm += 8;
*(u_int16_t *)frm = htole16(ni->ni_intval);
frm += 2;
- if (ic->ic_opmode == IEEE80211_M_ADHOC)
+ if (ic->ic_opmode == IEEE80211_M_IBSS)
capinfo = IEEE80211_CAPINFO_IBSS;
else
capinfo = IEEE80211_CAPINFO_ESS;
@@ -1367,7 +1371,7 @@ ieee80211_send_prresp(struct ieee80211com *ic, struct ieee80211_node *bs0,
*frm++ = ni->ni_nrate;
memcpy(frm, ni->ni_rates, ni->ni_nrate);
frm += ni->ni_nrate;
- if (ic->ic_opmode == IEEE80211_M_ADHOC) {
+ if (ic->ic_opmode == IEEE80211_M_IBSS) {
*frm++ = IEEE80211_ELEMID_IBSSPARMS;
*frm++ = 2;
*frm++ = 0; *frm++ = 0; /* TODO: ATIM window */
@@ -1453,7 +1457,7 @@ ieee80211_send_asreq(struct ieee80211com *ic, struct ieee80211_node *ni,
frm = mtod(m, u_int8_t *);
capinfo = 0;
- if (ic->ic_opmode == IEEE80211_M_ADHOC)
+ if (ic->ic_opmode == IEEE80211_M_IBSS)
capinfo |= IEEE80211_CAPINFO_IBSS;
else /* IEEE80211_M_STA */
capinfo |= IEEE80211_CAPINFO_ESS;
@@ -1570,7 +1574,7 @@ ieee80211_recv_beacon(struct ieee80211com *ic, struct mbuf *m0, int rssi,
u_int8_t chan, fhindex;
u_int16_t fhdwell;
- if (ic->ic_opmode != IEEE80211_M_ADHOC &&
+ if (ic->ic_opmode != IEEE80211_M_IBSS &&
ic->ic_state != IEEE80211_S_SCAN) {
/* XXX: may be useful for background scan */
return;
@@ -1791,13 +1795,17 @@ ieee80211_recv_auth(struct ieee80211com *ic, struct mbuf *m0, int rssi,
return;
}
switch (ic->ic_opmode) {
- case IEEE80211_M_ADHOC:
+ case IEEE80211_M_IBSS:
if (ic->ic_state != IEEE80211_S_RUN || seq != 1)
return;
ieee80211_new_state(&ic->ic_if, IEEE80211_S_AUTH,
wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK);
break;
+ case IEEE80211_M_AHDEMO:
+ /* should not come here */
+ break;
+
case IEEE80211_M_HOSTAP:
if (ic->ic_state != IEEE80211_S_RUN || seq != 1)
return;
@@ -2971,6 +2979,26 @@ ieee80211_cfgset(struct ifnet *ifp, u_long cmd, caddr_t data)
case WI_RID_PORTTYPE:
if (wreq.wi_len != 1)
return EINVAL;
+ switch (le16toh(wreq.wi_val[0])) {
+ case IEEE80211_M_STA:
+ break;
+ case IEEE80211_M_IBSS:
+ if (!(ic->ic_flags & IEEE80211_F_HASIBSS))
+ return EINVAL;
+ break;
+ case IEEE80211_M_AHDEMO:
+ if (ic->ic_phytype != IEEE80211_T_DS ||
+ !(ic->ic_flags & IEEE80211_F_HASAHDEMO))
+ return EINVAL;
+ break;
+ case IEEE80211_M_HOSTAP:
+ if (!(ic->ic_flags & IEEE80211_F_HASHOSTAP))
+ return EINVAL;
+ break;
+ default:
+ return EINVAL;
+ break;
+ }
if (le16toh(wreq.wi_val[0]) != ic->ic_opmode) {
ic->ic_opmode = le16toh(wreq.wi_val[0]);
error = ENETRESET;
@@ -3014,7 +3042,7 @@ ieee80211_cfgset(struct ifnet *ifp, u_long cmd, caddr_t data)
return EINVAL;
if ((ic->ic_flags & IEEE80211_F_IBSSON) == 0) {
ic->ic_flags |= IEEE80211_F_IBSSON;
- if (ic->ic_opmode == IEEE80211_M_ADHOC &&
+ if (ic->ic_opmode == IEEE80211_M_IBSS &&
ic->ic_state == IEEE80211_S_SCAN)
error = ENETRESET;
}