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