Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys Add support for SIOC[SG]80211BSSID, SIOC[SG]80211CHANNEL.
details: https://anonhg.NetBSD.org/src/rev/09088542c862
branches: trunk
changeset: 537125:09088542c862
user: onoe <onoe%NetBSD.org@localhost>
date: Fri Sep 27 05:36:04 2002 +0000
description:
Add support for SIOC[SG]80211BSSID, SIOC[SG]80211CHANNEL.
Change the name of structure ieee80211_bss to ieee80211_node, which is
used for management of stations in hostap mode, and peers in ibss mode.
Split off ic_opmode, ic_phytype from ic_flags.
Preparation to merge 'wi' driver into 80211subr.c.
diffstat:
sys/dev/ic/awi.c | 262 ++++----
sys/net/if_ieee80211.h | 104 ++-
sys/net/if_ieee80211subr.c | 1191 +++++++++++++++++++++++--------------------
3 files changed, 831 insertions(+), 726 deletions(-)
diffs (truncated from 2975 to 300 lines):
diff -r 6437c2aaa9a3 -r 09088542c862 sys/dev/ic/awi.c
--- a/sys/dev/ic/awi.c Fri Sep 27 05:27:20 2002 +0000
+++ b/sys/dev/ic/awi.c Fri Sep 27 05:36:04 2002 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: awi.c,v 1.46 2002/09/03 14:54:00 onoe Exp $ */
+/* $NetBSD: awi.c,v 1.47 2002/09/27 05:36:06 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.46 2002/09/03 14:54:00 onoe Exp $");
+__KERNEL_RCSID(0, "$NetBSD: awi.c,v 1.47 2002/09/27 05:36:06 onoe Exp $");
#include "opt_inet.h"
#include "bpfilter.h"
@@ -235,17 +235,18 @@
memcpy(ifp->if_xname, sc->sc_dev.dv_xname, IFNAMSIZ);
if (sc->sc_mib_phy.IEEE_PHY_Type == AWI_PHY_TYPE_FH)
- ic->ic_flags = IEEE80211_F_FH;
+ ic->ic_phytype = IEEE80211_T_FH;
else
- ic->ic_flags = IEEE80211_F_DS;
- ic->ic_flags |=
+ ic->ic_phytype = IEEE80211_T_DS;
+ ic->ic_flags =
IEEE80211_F_HASWEP | IEEE80211_F_HASIBSS | IEEE80211_F_HASHAP;
+ ic->ic_opmode = IEEE80211_M_STA;
ic->ic_state = IEEE80211_S_INIT;
ic->ic_newstate = awi_newstate;
ic->ic_chancheck = awi_chan_check;
nrate = sc->sc_mib_phy.aSuprt_Data_Rates[1];
memcpy(ic->ic_sup_rates, sc->sc_mib_phy.aSuprt_Data_Rates + 2, nrate);
- memcpy(ic->ic_myaddr, sc->sc_mib_addr.aMAC_Address, IEEE80211_ADDR_LEN);
+ IEEE80211_ADDR_COPY(ic->ic_myaddr, sc->sc_mib_addr.aMAC_Address);
printf("%s: IEEE802.11 %s %dMbps (firmware %s)\n",
sc->sc_dev.dv_xname,
@@ -276,7 +277,7 @@
ADD(IFM_AUTO, IFM_IEEE80211_HOSTAP);
for (i = 0; i < nrate; i++) {
mword = ieee80211_rate2media(ic->ic_sup_rates[i],
- (ic->ic_flags & (IEEE80211_F_FH | IEEE80211_F_DS)));
+ ic->ic_phytype);
if (mword == 0)
continue;
ADD(mword, 0);
@@ -468,7 +469,7 @@
{
struct awi_softc *sc = ifp->if_softc;
struct ieee80211com *ic = &sc->sc_ic;
- struct ieee80211_bss *bs = &ic->ic_bss;
+ struct ieee80211_node *ni = &ic->ic_bss;
int i, error;
DPRINTF(("awi_init: enabled=%d\n", sc->sc_enabled));
@@ -486,9 +487,9 @@
ic->ic_state = IEEE80211_S_INIT;
sc->sc_mib_local.Network_Mode =
- (ic->ic_flags & IEEE80211_F_ADHOC) ? 0 : 1;
+ (ic->ic_opmode == IEEE80211_M_ADHOC) ? 0 : 1;
sc->sc_mib_local.Acting_as_AP =
- (ic->ic_flags & IEEE80211_F_HOSTAP) ? 1 : 0;
+ (ic->ic_opmode == IEEE80211_M_HOSTAP) ? 1 : 0;
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;
@@ -533,42 +534,42 @@
ifp->if_flags |= IFF_RUNNING;
ifp->if_flags &= ~IFF_OACTIVE;
- if (((ic->ic_flags & IEEE80211_F_ADHOC) && sc->sc_no_bssid) ||
- (ic->ic_flags & IEEE80211_F_HOSTAP)) {
- bs->bs_chan = ic->ic_ibss_chan;
- bs->bs_intval = ic->ic_lintval;
- bs->bs_rssi = 0;
- bs->bs_rstamp = 0;
- memset(bs->bs_tstamp, 0, sizeof(bs->bs_tstamp));
- bs->bs_nrate = 0;
+ if ((ic->ic_opmode == IEEE80211_M_ADHOC && sc->sc_no_bssid) ||
+ ic->ic_opmode == IEEE80211_M_HOSTAP) {
+ ni->ni_chan = ic->ic_ibss_chan;
+ ni->ni_intval = ic->ic_lintval;
+ ni->ni_rssi = 0;
+ ni->ni_rstamp = 0;
+ memset(ni->ni_tstamp, 0, sizeof(ni->ni_tstamp));
+ ni->ni_nrate = 0;
for (i = 0; i < IEEE80211_RATE_SIZE; i++) {
if (ic->ic_sup_rates[i])
- bs->bs_rates[bs->bs_nrate++] =
+ ni->ni_rates[ni->ni_nrate++] =
ic->ic_sup_rates[i];
}
- memcpy(bs->bs_macaddr, ic->ic_myaddr, IEEE80211_ADDR_LEN);
- if (ic->ic_flags & IEEE80211_F_HOSTAP) {
- memcpy(bs->bs_bssid, ic->ic_myaddr, IEEE80211_ADDR_LEN);
- bs->bs_esslen = ic->ic_des_esslen;
- memcpy(bs->bs_essid, ic->ic_des_essid, bs->bs_esslen);
- bs->bs_capinfo = IEEE80211_CAPINFO_ESS;
- if (ic->ic_flags & IEEE80211_F_FH) {
- bs->bs_fhdwell = 200; /* XXX */
- bs->bs_fhindex = 1;
+ IEEE80211_ADDR_COPY(ni->ni_macaddr, ic->ic_myaddr);
+ if (ic->ic_opmode == IEEE80211_M_HOSTAP) {
+ IEEE80211_ADDR_COPY(ni->ni_bssid, ic->ic_myaddr);
+ ni->ni_esslen = ic->ic_des_esslen;
+ memcpy(ni->ni_essid, ic->ic_des_essid, ni->ni_esslen);
+ ni->ni_capinfo = IEEE80211_CAPINFO_ESS;
+ if (ic->ic_phytype == IEEE80211_T_FH) {
+ ni->ni_fhdwell = 200; /* XXX */
+ ni->ni_fhindex = 1;
}
} else {
- bs->bs_capinfo = IEEE80211_CAPINFO_IBSS;
- memset(bs->bs_bssid, 0, IEEE80211_ADDR_LEN);
- bs->bs_esslen = 0;
+ ni->ni_capinfo = IEEE80211_CAPINFO_IBSS;
+ memset(ni->ni_bssid, 0, IEEE80211_ADDR_LEN);
+ ni->ni_esslen = 0;
}
if (ic->ic_flags & IEEE80211_F_WEPON)
- bs->bs_capinfo |= IEEE80211_CAPINFO_PRIVACY;
+ ni->ni_capinfo |= IEEE80211_CAPINFO_PRIVACY;
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);
} else {
- bs->bs_chan = sc->sc_cur_chan;
+ ni->ni_chan = sc->sc_cur_chan;
ieee80211_new_state(&ic->ic_if, IEEE80211_S_SCAN, -1);
}
return 0;
@@ -619,6 +620,7 @@
{
struct awi_softc *sc = ifp->if_softc;
struct ieee80211com *ic = &sc->sc_ic;
+ struct ieee80211_frame *wh;
struct mbuf *m, *m0;
int len, dowep;
u_int32_t txd, frame, ntxd;
@@ -675,6 +677,19 @@
ifp->if_oerrors++;
continue;
}
+ wh = mtod(m0, struct ieee80211_frame *);
+ if (!IEEE80211_IS_MULTICAST(wh->i_addr1) &&
+ ic->ic_opmode != IEEE80211_M_STA &&
+ sc->sc_no_bssid == 0 &&
+ sc->sc_adhoc_ap == 0 &&
+ (ifp->if_flags & IFF_LINK0) == 0 &&
+ (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) ==
+ IEEE80211_FC0_TYPE_DATA &&
+ ieee80211_find_node(ic, wh->i_addr1) == NULL) {
+ m_freem(m0);
+ ifp->if_oerrors++;
+ continue;
+ }
}
#if NBPFILTER > 0
if (ic->ic_rawbpf)
@@ -698,7 +713,7 @@
if ((ifp->if_flags & IFF_DEBUG) && (ifp->if_flags & IFF_LINK2))
ieee80211_dump_pkt(m0->m_data, m0->m_len,
- ic->ic_bss.bs_rates[ic->ic_bss.bs_txrate] &
+ ic->ic_bss.ni_rates[ic->ic_bss.ni_txrate] &
IEEE80211_RATE_VAL, -1);
for (m = m0, len = 0; m != NULL; m = m->m_next) {
@@ -707,7 +722,7 @@
len += m->m_len;
}
m_freem(m0);
- rate = (ic->ic_bss.bs_rates[ic->ic_bss.bs_txrate] &
+ rate = (ic->ic_bss.ni_rates[ic->ic_bss.ni_txrate] &
IEEE80211_RATE_VAL) * 5;
awi_write_1(sc, ntxd + AWI_TXD_STATE, 0);
awi_write_4(sc, txd + AWI_TXD_START, frame);
@@ -840,8 +855,7 @@
if (IFM_SUBTYPE(ime->ifm_media) == IFM_AUTO) {
ic->ic_fixed_rate = -1;
} else {
- rate = ieee80211_media2rate(ime->ifm_media,
- (ic->ic_flags & (IEEE80211_F_FH | IEEE80211_F_DS)));
+ rate = ieee80211_media2rate(ime->ifm_media, ic->ic_phytype);
if (rate == 0)
return EINVAL;
for (i = 0; i < IEEE80211_RATE_SIZE; i++) {
@@ -854,24 +868,31 @@
}
/*
- * ADHOC,-FLAG0 ADHOC|~HOSTAP, !no_bssid, !adhoc_ap IBSS
- * ADHOC, FLAG0 ADHOC|~HOSTAP, no_bssid, !adhoc_ap WaveLAN adhoc
- * -ADHOC, FLAG0 ADHOC|~HOSTAP, !no_bssid, adhoc_ap Melco old AP
- * also LINK0
- * -ADHOC,HOSTAP ~ADHOC|HOSTAP, !no_bssid, !adhoc_ap HostAP
- * -ADHOC,-FLAG0 ~ADHOC|~HOSTAP, !no_bssid, !adhoc_ap Infra
+ * 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
+ * also LINK0
+ * - - - STA 0 0 Infra Station
*/
- if (ime->ifm_media & IFM_IEEE80211_ADHOC) {
- if ((ic->ic_flags & IEEE80211_F_ADHOC) == 0 ||
- (ic->ic_flags & IEEE80211_F_IBSSON) == 0 ||
- (ic->ic_flags & IEEE80211_F_HOSTAP) ||
- sc->sc_adhoc_ap) {
- ic->ic_flags |= IEEE80211_F_ADHOC | IEEE80211_F_IBSSON;
- ic->ic_flags &= ~IEEE80211_F_HOSTAP;
+ 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;
}
- if (sc->sc_mib_phy.IEEE_PHY_Type != AWI_PHY_TYPE_FH &&
+ } 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;
+ }
+ if (ic->ic_phytype == IEEE80211_T_DS &&
(ime->ifm_media & IFM_FLAG0)) {
if (sc->sc_no_bssid == 0) {
sc->sc_no_bssid = 1;
@@ -884,36 +905,16 @@
}
}
} else if (ime->ifm_media & IFM_FLAG0) {
- if ((ic->ic_flags & IEEE80211_F_ADHOC) == 0 ||
- (ic->ic_flags & IEEE80211_F_IBSSON) ||
- (ic->ic_flags & IEEE80211_F_HOSTAP) ||
- sc->sc_no_bssid || !sc->sc_adhoc_ap) {
- ic->ic_flags |= IEEE80211_F_ADHOC;
- ic->ic_flags &=
- ~(IEEE80211_F_IBSSON | IEEE80211_F_HOSTAP);
- sc->sc_no_bssid = 0;
+ if (ic->ic_opmode != IEEE80211_M_ADHOC ||
+ sc->sc_adhoc_ap == 0) {
+ ic->ic_opmode = IEEE80211_M_ADHOC;
sc->sc_adhoc_ap = 1;
- error = ENETRESET;
- }
- } else if (ime->ifm_media & IFM_IEEE80211_HOSTAP) {
- if ((ic->ic_flags & IEEE80211_F_ADHOC) ||
- (ic->ic_flags & IEEE80211_F_IBSSON) ||
- (ic->ic_flags & IEEE80211_F_HOSTAP) == 0 ||
- sc->sc_no_bssid || sc->sc_adhoc_ap) {
- ic->ic_flags |= IEEE80211_F_HOSTAP;
- ic->ic_flags &=
- ~(IEEE80211_F_ADHOC | IEEE80211_F_IBSSON);
sc->sc_no_bssid = 0;
- sc->sc_adhoc_ap = 0;
error = ENETRESET;
}
} else {
- if ((ic->ic_flags & IEEE80211_F_ADHOC) ||
- (ic->ic_flags & IEEE80211_F_IBSSON) ||
- (ic->ic_flags & IEEE80211_F_HOSTAP) ||
- sc->sc_no_bssid || sc->sc_adhoc_ap) {
- ic->ic_flags &= ~(IEEE80211_F_ADHOC |
- IEEE80211_F_IBSSON | IEEE80211_F_HOSTAP);
+ 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;
@@ -940,7 +941,7 @@
imr->ifm_status |= IFM_ACTIVE;
imr->ifm_active = IFM_IEEE80211;
if (ic->ic_state == IEEE80211_S_RUN)
- rate = ic->ic_bss.bs_rates[ic->ic_bss.bs_txrate] &
+ rate = ic->ic_bss.ni_rates[ic->ic_bss.ni_txrate] &
IEEE80211_RATE_VAL;
else {
if (ic->ic_fixed_rate == -1)
@@ -949,11 +950,11 @@
rate = ic->ic_sup_rates[ic->ic_fixed_rate] &
IEEE80211_RATE_VAL;
}
- imr->ifm_active |= ieee80211_rate2media(rate,
- (ic->ic_flags & (IEEE80211_F_FH | IEEE80211_F_DS)));
- if (ic->ic_flags & IEEE80211_F_HOSTAP)
- imr->ifm_active |= IFM_IEEE80211_HOSTAP;
- else if (ic->ic_flags & IEEE80211_F_ADHOC) {
+ imr->ifm_active |= ieee80211_rate2media(rate, ic->ic_phytype);
Home |
Main Index |
Thread Index |
Old Index