diff options
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/ic/if_wi_hostap.c | 8 | ||||
-rw-r--r-- | sys/net/if_ieee80211.h | 464 |
2 files changed, 423 insertions, 49 deletions
diff --git a/sys/dev/ic/if_wi_hostap.c b/sys/dev/ic/if_wi_hostap.c index 6be36bd6e73..adf0064eb22 100644 --- a/sys/dev/ic/if_wi_hostap.c +++ b/sys/dev/ic/if_wi_hostap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_wi_hostap.c,v 1.26 2003/08/15 20:32:17 tedu Exp $ */ +/* $OpenBSD: if_wi_hostap.c,v 1.27 2003/09/21 11:22:24 fgsch Exp $ */ /* * Copyright (c) 2002 @@ -592,7 +592,7 @@ wihap_auth_req(struct wi_softc *sc, struct wi_frame *rxfrm, /* Check for too many stations. */ if (whi->n_stations >= WIHAP_MAX_STATIONS) { - status = IEEE80211_STATUS_TOO_MANY_STATIONS; + status = IEEE80211_STATUS_TOOMANY; goto fail; } @@ -605,7 +605,7 @@ wihap_auth_req(struct wi_softc *sc, struct wi_frame *rxfrm, splx(s); if (sta == NULL) { /* Out of memory! */ - status = IEEE80211_STATUS_TOO_MANY_STATIONS; + status = IEEE80211_STATUS_TOOMANY; goto fail; } } @@ -787,7 +787,7 @@ wihap_assoc_req(struct wi_softc *sc, struct wi_frame *rxfrm, if (wihap_check_rates(sta, rates, rates_len) < 0) { if (sc->sc_arpcom.ac_if.if_flags & IFF_DEBUG) printf("wihap_assoc_req: rates mismatch.\n"); - status = IEEE80211_STATUS_RATES; + status = IEEE80211_STATUS_BASIC_RATE; goto fail; } diff --git a/sys/net/if_ieee80211.h b/sys/net/if_ieee80211.h index 2271acc0572..d5b68c8f500 100644 --- a/sys/net/if_ieee80211.h +++ b/sys/net/if_ieee80211.h @@ -1,42 +1,93 @@ -/* $OpenBSD: if_ieee80211.h,v 1.7 2002/03/28 20:49:39 mickey Exp $ */ -/* $NetBSD: if_ieee80211.h,v 1.6 2000/12/12 04:03:38 thorpej Exp $ */ +/* $OpenBSD: if_ieee80211.h,v 1.8 2003/09/21 11:22:24 fgsch Exp $ */ +/* $NetBSD: if_ieee80211.h,v 1.36 2003/07/06 20:54:24 dyoung Exp $ */ +/*- + * Copyright (c) 2000, 2001 The NetBSD Foundation, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ #ifndef _NET_IF_IEEE80211_H_ #define _NET_IF_IEEE80211_H_ +#define IEEE80211_ADDR_LEN ETHER_ADDR_LEN + +/* IEEE 802.11 PLCP header */ +struct ieee80211_plcp_hdr { + u_int16_t i_sfd; /* IEEE80211_PLCP_SFD */ + u_int8_t i_signal; /* MPDU data rate in 100Kb/s */ + u_int8_t i_service; /* IEEE80211_PLCP_SERVICE */ + u_int16_t i_length; /* MPDU duration in microseconds */ + u_int16_t i_crc; /* CRC16 of i_signal, i_service, + * i_length + */ +} __attribute__((__packed__)); + +#define IEEE80211_PLCP_SFD 0xF3A0 +#define IEEE80211_PLCP_SERVICE 0x00 + /* * generic definitions for IEEE 802.11 frames */ struct ieee80211_frame { u_int8_t i_fc[2]; u_int8_t i_dur[2]; - u_int8_t i_addr1[ETHER_ADDR_LEN]; - u_int8_t i_addr2[ETHER_ADDR_LEN]; - u_int8_t i_addr3[ETHER_ADDR_LEN]; + u_int8_t i_addr1[IEEE80211_ADDR_LEN]; + u_int8_t i_addr2[IEEE80211_ADDR_LEN]; + u_int8_t i_addr3[IEEE80211_ADDR_LEN]; u_int8_t i_seq[2]; - /* possibly followed by addr4[ETHER_ADDR_LEN]; */ + /* possibly followed by addr4[IEEE80211_ADDR_LEN]; */ /* see below */ }; struct ieee80211_frame_addr4 { u_int8_t i_fc[2]; u_int8_t i_dur[2]; - u_int8_t i_addr1[ETHER_ADDR_LEN]; - u_int8_t i_addr2[ETHER_ADDR_LEN]; - u_int8_t i_addr3[ETHER_ADDR_LEN]; + u_int8_t i_addr1[IEEE80211_ADDR_LEN]; + u_int8_t i_addr2[IEEE80211_ADDR_LEN]; + u_int8_t i_addr3[IEEE80211_ADDR_LEN]; u_int8_t i_seq[2]; - u_int8_t i_addr4[ETHER_ADDR_LEN]; + u_int8_t i_addr4[IEEE80211_ADDR_LEN]; }; #define IEEE80211_FC0_VERSION_MASK 0x03 +#define IEEE80211_FC0_VERSION_SHIFT 0 #define IEEE80211_FC0_VERSION_0 0x00 #define IEEE80211_FC0_TYPE_MASK 0x0c +#define IEEE80211_FC0_TYPE_SHIFT 2 #define IEEE80211_FC0_TYPE_MGT 0x00 #define IEEE80211_FC0_TYPE_CTL 0x04 #define IEEE80211_FC0_TYPE_DATA 0x08 #define IEEE80211_FC0_SUBTYPE_MASK 0xf0 +#define IEEE80211_FC0_SUBTYPE_SHIFT 4 /* for TYPE_MGT */ #define IEEE80211_FC0_SUBTYPE_ASSOC_REQ 0x00 #define IEEE80211_FC0_SUBTYPE_ASSOC_RESP 0x10 @@ -64,7 +115,7 @@ struct ieee80211_frame_addr4 { #define IEEE80211_FC0_SUBTYPE_NODATA 0x40 #define IEEE80211_FC0_SUBTYPE_CFACK 0x50 #define IEEE80211_FC0_SUBTYPE_CFPOLL 0x60 -#define IEEE80211_FC0_SUBTYPE_CF_ACK_CF_ACK 0x70 +#define IEEE80211_FC0_SUBTYPE_CF_ACK_CF_POLL 0x70 #define IEEE80211_FC1_DIR_MASK 0x03 #define IEEE80211_FC1_DIR_NODS 0x00 /* STA->STA */ @@ -79,31 +130,67 @@ struct ieee80211_frame_addr4 { #define IEEE80211_FC1_WEP 0x40 #define IEEE80211_FC1_ORDER 0x80 +#define IEEE80211_SEQ_FRAG_MASK 0x000f +#define IEEE80211_SEQ_FRAG_SHIFT 0 +#define IEEE80211_SEQ_SEQ_MASK 0xfff0 +#define IEEE80211_SEQ_SEQ_SHIFT 4 + #define IEEE80211_NWID_LEN 32 /* * BEACON management packets * - * octect timestamp[8] - * octect beacon interval[2] - * octect capability information[2] + * octet timestamp[8] + * octet beacon interval[2] + * octet capability information[2] * information element - * octect elemid - * octect length - * octect information[length[ + * octet elemid + * octet length + * octet information[length] */ -typedef u_int8_t *ieee80211_mgt_beacon_t; - -#define IEEE80211_BEACON_INTERVAL(beacon) (beacon[8] + (beacon[9] << 8)) -#define IEEE80211_BEACON_CAPABILITY(beacon) (beacon[10] + (beacon[11] << 8)) - -#define IEEE80211_CAPINFO_ESS 0x01 -#define IEEE80211_CAPINFO_IBSS 0x02 -#define IEEE80211_CAPINFO_CF_POLLABLE 0x04 -#define IEEE80211_CAPINFO_CF_POLLREQ 0x08 -#define IEEE80211_CAPINFO_PRIVACY 0x10 -#define IEEE80211_CAPINFO_BITS "\20\01ESS\02IBSS\03POLLABLE\04POLLREQ\5PRIVACY" +typedef uint8_t *ieee80211_mgt_beacon_t; + +#define IEEE80211_BEACON_INTERVAL(beacon) \ + ((beacon)[8] | ((beacon)[9] << 8)) +#define IEEE80211_BEACON_CAPABILITY(beacon) \ + ((beacon)[10] | ((beacon)[11] << 8)) + +#define IEEE80211_CAPINFO_ESS 0x0001 +#define IEEE80211_CAPINFO_IBSS 0x0002 +#define IEEE80211_CAPINFO_CF_POLLABLE 0x0004 +#define IEEE80211_CAPINFO_CF_POLLREQ 0x0008 +#define IEEE80211_CAPINFO_PRIVACY 0x0010 +#define IEEE80211_CAPINFO_SHORT_PREAMBLE 0x0020 +#define IEEE80211_CAPINFO_PBCC 0x0040 +#define IEEE80211_CAPINFO_CHNL_AGILITY 0x0080 +#define IEEE80211_CAPINFO_BITS "\20\01ESS\02IBSS\03POLLABLE\04POLLREQ\05PRIVACY\06SHORT_PREAMBLE\07PBCC\08CHNL_AGILITY" + +#define IEEE80211_RATE_BASIC 0x80 +#define IEEE80211_RATE_VAL 0x7f + +/* One Time Unit (TU) is 1Kus = 1024 microseconds. */ +#define IEEE80211_DUR_TU 1024 + +/* IEEE 802.11b durations for DSSS PHY in microseconds */ +#define IEEE80211_DUR_DS_LONG_PREAMBLE 144 +#define IEEE80211_DUR_DS_SHORT_PREAMBLE 72 +#define IEEE80211_DUR_DS_FAST_PLCPHDR 24 +#define IEEE80211_DUR_DS_SLOW_PLCPHDR 48 +#define IEEE80211_DUR_DS_SLOW_ACK 112 +#define IEEE80211_DUR_DS_FAST_ACK 56 +#define IEEE80211_DUR_DS_SLOW_CTS 112 +#define IEEE80211_DUR_DS_FAST_CTS 56 +#define IEEE80211_DUR_DS_SLOT 20 +#define IEEE80211_DUR_DS_SIFS 10 +#define IEEE80211_DUR_DS_PIFS (IEEE80211_DUR_DS_SIFS + IEEE80211_DUR_DS_SLOT) +#define IEEE80211_DUR_DS_DIFS (IEEE80211_DUR_DS_SIFS + \ + 2 * IEEE80211_DUR_DS_SLOT) +#define IEEE80211_DUR_DS_EIFS (IEEE80211_DUR_DS_SIFS + \ + IEEE80211_DUR_DS_SLOW_ACK + \ + IEEE80211_DUR_DS_LONG_PREAMBLE + \ + IEEE80211_DUR_DS_SLOW_PLCPHDR + \ + IEEE80211_DUR_DIFS) /* * Management information elements @@ -133,7 +220,7 @@ struct ieee80211_information { u_int8_t count; u_int8_t period; u_int8_t bitctl; - /* u_int8_t pvt[251]; The driver never needs to use this */ + /* u_int8_t pvt[251]; The driver needs to use this. */ } tim; struct ibss { u_int16_t atim; @@ -156,18 +243,22 @@ struct ieee80211_information { /* * AUTH management packets * - * octect algo[2] - * octect seq[2] - * octect status[2] - * octect chal.id - * octect chal.length - * octect chal.text[253] + * octet algo[2] + * octet seq[2] + * octet status[2] + * octet chal.id + * octet chal.length + * octet chal.text[253] */ + typedef u_int8_t *ieee80211_mgt_auth_t; -#define IEEE80211_AUTH_ALGORITHM(auth) (auth[0] + (auth[1] << 8)) -#define IEEE80211_AUTH_TRANSACTION(auth) (auth[2] + (auth[3] << 8)) -#define IEEE80211_AUTH_STATUS(auth) (auth[4] + (auth[5] << 8)) +#define IEEE80211_AUTH_ALGORITHM(auth) \ + ((auth)[0] | ((auth)[1] << 8)) +#define IEEE80211_AUTH_TRANSACTION(auth) \ + ((auth)[2] | ((auth)[3] << 8)) +#define IEEE80211_AUTH_STATUS(auth) \ + ((auth)[4] | ((auth)[5] << 8)) #define IEEE80211_AUTH_ALG_OPEN 0x0000 #define IEEE80211_AUTH_ALG_SHARED 0x0001 @@ -205,8 +296,13 @@ typedef u_int8_t *ieee80211_mgt_auth_t; #define IEEE80211_STATUS_SEQUENCE 14 #define IEEE80211_STATUS_CHALLENGE 15 #define IEEE80211_STATUS_TIMEOUT 16 -#define IEEE80211_STATUS_TOO_MANY_STATIONS 17 -#define IEEE80211_STATUS_RATES 18 +#define IEEE80211_STATUS_TOOMANY 17 +#define IEEE80211_STATUS_BASIC_RATE 18 +#define IEEE80211_STATUS_SP_REQUIRED 19 +#define IEEE80211_STATUS_PBCC_REQUIRED 20 +#define IEEE80211_STATUS_CA_REQUIRED 21 +#define IEEE80211_STATUS_TOO_MANY_STATIONS 22 +#define IEEE80211_STATUS_RATES 23 #define IEEE80211_WEP_KEYLEN 5 /* 40bit */ #define IEEE80211_WEP_IVLEN 3 /* 24bit */ @@ -214,6 +310,26 @@ typedef u_int8_t *ieee80211_mgt_auth_t; #define IEEE80211_WEP_CRCLEN 4 /* CRC-32 */ #define IEEE80211_WEP_NKID 4 /* number of key ids */ +#define IEEE80211_CRC_LEN 4 + +#define IEEE80211_MTU 1500 +#define IEEE80211_MAX_LEN (2300 + IEEE80211_CRC_LEN + \ + (IEEE80211_WEP_IVLEN + IEEE80211_WEP_KIDLEN + IEEE80211_WEP_CRCLEN)) + +#define IEEE80211_MAX_AID 2007 + +#define IEEE80211_AID_SET(b, w) \ + ((w)[((b) & ~0xc000) / 32] |= (1 << (((b) & ~0xc000) % 32))) +#define IEEE80211_AID_CLR(b, w) \ + ((w)[((b) & ~0xc000) / 32] &= ~(1 << (((b) & ~0xc000) % 32))) +#define IEEE80211_AID_ISSET(b, w) \ + ((w)[((b) & ~0xc000) / 32] & (1 << (((b) & ~0xc000) % 32))) + + +/* + * ioctls + */ + /* nwid is pointed at by ifr.ifr_data */ struct ieee80211_nwid { u_int8_t i_len; @@ -255,11 +371,269 @@ struct ieee80211_auth { int i_authtype; }; -#define IEEE80211_AUTH_NONE 0 -#define IEEE80211_AUTH_OPEN 1 -#define IEEE80211_AUTH_SHARED 2 +#define IEEE80211_AUTH_NONE 0 +#define IEEE80211_AUTH_OPEN 1 +#define IEEE80211_AUTH_SHARED 2 + +#define SIOCS80211AUTH _IOW('i', 236, struct ieee80211_auth) +#define SIOCG80211AUTH _IOWR('i', 237, struct ieee80211_auth) + +struct ieee80211_channel { + char i_name[IFNAMSIZ]; /* if_name, e.g. "wi0" */ + u_int16_t i_channel; +}; + +#define IEEE80211_CHAN_ANY 0xffff + +#define SIOCS80211CHANNEL _IOW('i', 238, struct ieee80211_channel) +#define SIOCG80211CHANNEL _IOWR('i', 239, struct ieee80211_channel) -#define SIOCS80211AUTH _IOW('i', 240, struct ieee80211_auth) -#define SIOCG80211AUTH _IOWR('i', 240, struct ieee80211_auth) +struct ieee80211_bssid { + char i_name[IFNAMSIZ]; /* if_name, e.g. "wi0" */ + u_int8_t i_bssid[IEEE80211_ADDR_LEN]; +}; + +#define SIOCS80211BSSID _IOW('i', 240, struct ieee80211_bssid) +#define SIOCG80211BSSID _IOWR('i', 241, struct ieee80211_bssid) + +#ifdef _KERNEL + +#define IEEE80211_ASCAN_WAIT 2 /* active scan wait */ +#define IEEE80211_PSCAN_WAIT 5 /* passive scan wait */ +#define IEEE80211_TRANS_WAIT 5 /* transition wait */ +#define IEEE80211_INACT_WAIT 5 /* inactivity timer interval */ +#define IEEE80211_INACT_MAX (300/IEEE80211_INACT_WAIT) + +/* + * Structure for IEEE 802.11 drivers. + */ + +#define IEEE80211_CHAN_MAX 255 +#define IEEE80211_RATE_SIZE 12 +#define IEEE80211_KEYBUF_SIZE 16 +#define IEEE80211_NODE_HASHSIZE 32 +/* simple hash is enough for variation of macaddr */ +#define IEEE80211_NODE_HASH(addr) \ + (((u_int8_t *)(addr))[IEEE80211_ADDR_LEN - 1] % IEEE80211_NODE_HASHSIZE) + +enum ieee80211_phytype { + IEEE80211_T_DS, + IEEE80211_T_FH, + IEEE80211_T_OFDM +}; + +enum ieee80211_opmode { + IEEE80211_M_STA = 1, /* infrastructure station */ + IEEE80211_M_IBSS = 0, /* IBSS (adhoc) station */ + IEEE80211_M_AHDEMO = 3, /* Old lucent compatible adhoc demo */ + IEEE80211_M_HOSTAP = 6, /* Software Access Point */ + IEEE80211_M_MONITOR = 8 /* Monitor mode (doesn't correspond + to a PRISM port like the others) */ +}; + +enum ieee80211_state { + IEEE80211_S_INIT, /* default state */ + IEEE80211_S_SCAN, /* scanning */ + IEEE80211_S_AUTH, /* try to authenticate */ + IEEE80211_S_ASSOC, /* try to assoc */ + IEEE80211_S_RUN /* associated */ +}; + +/* + * Node specific information. + */ +struct ieee80211_node { + TAILQ_ENTRY(ieee80211_node) ni_list; + LIST_ENTRY(ieee80211_node) ni_hash; + + /* hardware */ + u_int8_t ni_rssi; + u_int32_t ni_rstamp; + + /* header */ + u_int8_t ni_macaddr[IEEE80211_ADDR_LEN]; + u_int8_t ni_bssid[IEEE80211_ADDR_LEN]; + + /* beacon, probe response */ + u_int8_t ni_tstamp[8]; + u_int16_t ni_intval; + u_int16_t ni_capinfo; + u_int8_t ni_esslen; + u_int8_t ni_essid[IEEE80211_NWID_LEN]; + int ni_nrate; + u_int8_t ni_rates[IEEE80211_RATE_SIZE]; + u_int8_t ni_chan; + u_int16_t ni_fhdwell; /* FH only */ + u_int8_t ni_fhindex; /* FH only */ + + /* power saving mode */ + + u_int8_t ni_pwrsave; + struct ifqueue ni_savedq; /* packets queued for pspoll */ + + /* others */ + u_int16_t ni_associd; /* assoc response */ + u_int16_t ni_txseq; /* seq to be transmitted */ + u_int16_t ni_rxseq; /* seq previous received */ + int ni_fails; /* failure count to associate */ + int ni_inact; /* inactivity mark count */ + int ni_txrate; /* index to ni_rates[] */ + void *ni_private; /* driver private */ +}; + +/* ni_chan encoding for FH phy */ +#define IEEE80211_FH_CHANMOD 80 +#define IEEE80211_FH_CHAN(set,pat) (((set)-1)*IEEE80211_FH_CHANMOD+(pat)) +#define IEEE80211_FH_CHANSET(chan) ((chan)/IEEE80211_FH_CHANMOD+1) +#define IEEE80211_FH_CHANPAT(chan) ((chan)%IEEE80211_FH_CHANMOD) + +#define IEEE80211_PS_SLEEP 0x1 /* STA is in power saving mode */ + +#define IEEE80211_PS_MAX_QUEUE 50 /* maximum saved packets */ + +struct ieee80211_wepkey { + int wk_len; + u_int8_t wk_key[IEEE80211_KEYBUF_SIZE]; +}; + +struct ieee80211com { +#ifdef __NetBSD__ + struct ethercom ic_ec; +#endif +#ifdef __FreeBSD__ + struct arpcom ic_ac; + struct mtx ic_mtx; +#endif +#ifdef __OpenBSD__ + struct arpcom ic_ac; +#endif + void (*ic_recv_mgmt[16])(struct ieee80211com *, + struct mbuf *, int, u_int32_t); + int (*ic_send_mgmt[16])(struct ieee80211com *, + struct ieee80211_node *, int, int); + int (*ic_newstate)(void *, enum ieee80211_state); + int (*ic_chancheck)(void *, u_char *); + int (*ic_set_tim)(struct ieee80211com *, int, int); + u_int8_t ic_myaddr[IEEE80211_ADDR_LEN]; + u_int8_t ic_sup_rates[IEEE80211_RATE_SIZE]; + u_char ic_chan_avail[roundup(IEEE80211_CHAN_MAX,NBBY)]; + u_char ic_chan_active[roundup(IEEE80211_CHAN_MAX, NBBY)]; + u_char ic_chan_scan[roundup(IEEE80211_CHAN_MAX, NBBY)]; + struct ifqueue ic_mgtq; + struct ifqueue ic_pwrsaveq; + int ic_flags; + int ic_hdrlen; /* either 0 or extended header + * length, e.g. for addr4 + */ + + enum ieee80211_phytype ic_phytype; + enum ieee80211_opmode ic_opmode; + enum ieee80211_state ic_state; + caddr_t ic_rawbpf; /* packet filter structure */ + struct ieee80211_node ic_bss; /* information for this node */ + int ic_node_privlen;/* size for ni_private */ + void (*ic_node_free)(struct ieee80211com *, + struct ieee80211_node *); /* callback */ + u_int8_t ic_ibss_chan; + int ic_fixed_rate; /* index to ic_sup_rates[] */ + TAILQ_HEAD(, ieee80211_node) ic_node; /* information of all nodes */ + LIST_HEAD(, ieee80211_node) ic_hash[IEEE80211_NODE_HASHSIZE]; + u_int16_t ic_lintval; /* listen interval */ + int ic_mgt_timer; /* mgmt timeout */ + int ic_scan_timer; /* scant wait */ + int ic_inact_timer; /* inactivity timer wait */ + int ic_des_esslen; + u_int8_t ic_des_essid[IEEE80211_NWID_LEN]; + int ic_des_chan; /* desired channel */ + u_int8_t ic_des_bssid[IEEE80211_ADDR_LEN]; + struct ieee80211_wepkey ic_nw_keys[IEEE80211_WEP_NKID]; + int ic_wep_txkey; /* default tx key index */ + void *ic_wep_ctx; /* wep crypt context */ + u_int32_t ic_iv; /* initial vector for wep */ + u_int32_t ic_aid_bitmap[IEEE80211_MAX_AID / 32 + 1]; + u_int16_t ic_max_aid; + struct ifmedia ic_media; +}; +#ifdef __NetBSD__ +#define ic_if ic_ec.ec_if +#endif +#if defined(__FreeBSD__) || defined(__OpenBSD__) +#define ic_if ic_ac.ac_if +#endif +#define ic_softc ic_if.if_softc + +#define IEEE80211_HEADER_LEN(ic) (((ic)->ic_hdrlen > 0) \ + ? (ic)->ic_hdrlen : sizeof(struct ieee80211_frame)) + +#define IEEE80211_SEND_MGMT(ic,ni,type,arg) do { \ + if ((ic)->ic_send_mgmt[(type)>>IEEE80211_FC0_SUBTYPE_SHIFT] != NULL) \ + (*(ic)->ic_send_mgmt[(type)>>IEEE80211_FC0_SUBTYPE_SHIFT]) \ + (ic,ni,type,arg); \ +} while (/*CONSTCOND*/ 0) + +#define IEEE80211_ADDR_EQ(a1,a2) (memcmp(a1,a2,IEEE80211_ADDR_LEN) == 0) +#define IEEE80211_ADDR_COPY(dst,src) memcpy(dst,src,IEEE80211_ADDR_LEN) + +#define IEEE80211_IS_MULTICAST(a) ETHER_IS_MULTICAST(a) + +/* ic_flags */ +#define IEEE80211_F_ASCAN 0x00000001 /* STATUS: active scan */ +#define IEEE80211_F_SIBSS 0x00000002 /* STATUS: start IBSS */ +#define IEEE80211_F_WEPON 0x00000100 /* CONF: WEP enabled */ +#define IEEE80211_F_IBSSON 0x00000200 /* CONF: IBSS creation enable */ +#define IEEE80211_F_PMGTON 0x00000400 /* CONF: Power mgmt enable */ +#define IEEE80211_F_DESBSSID 0x00000800 /* CONF: des_bssid is set */ +#define IEEE80211_F_SCANAP 0x00001000 /* CONF: Scanning AP */ +#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_HASHOSTAP 0x00080000 /* CAPABILITY: HOSTAP avail */ +#define IEEE80211_F_HASAHDEMO 0x00100000 /* CAPABILITY: Old Adhoc Demo */ +#define IEEE80211_F_HASMONITOR 0x00200000 /* CAPABILITY: Monitor mode */ + +/* flags for ieee80211_fix_rate() */ +#define IEEE80211_F_DOSORT 0x00000001 /* sort rate list */ +#define IEEE80211_F_DOFRATE 0x00000002 /* use fixed rate */ +#define IEEE80211_F_DONEGO 0x00000004 /* calc negotiated rate */ +#define IEEE80211_F_DODEL 0x00000008 /* delete ignore rate */ + +void ieee80211_ifattach(struct ifnet *); +void ieee80211_ifdetach(struct ifnet *); +void ieee80211_input(struct ifnet *, struct mbuf *, int, u_int32_t); +int ieee80211_mgmt_output(struct ifnet *, struct ieee80211_node *, + struct mbuf *, int); +struct mbuf *ieee80211_encap(struct ifnet *, struct mbuf *); +struct mbuf *ieee80211_decap(struct ifnet *, struct mbuf *); +int ieee80211_ioctl(struct ifnet *, u_long, caddr_t); +void ieee80211_print_essid(u_int8_t *, int); +void ieee80211_dump_pkt(u_int8_t *, int, int, int); +void ieee80211_watchdog(struct ifnet *); +void ieee80211_next_scan(struct ifnet *); +void ieee80211_end_scan(struct ifnet *); +void ieee80211_create_ibss(struct ieee80211com *); +int ieee80211_match_bss(struct ieee80211com *, struct ieee80211_node *); +int ieee80211_get_rate(struct ieee80211com *); +int ieee80211_get_channel(struct ieee80211com *); +struct ieee80211_node *ieee80211_alloc_node(struct ieee80211com *, u_int8_t *, + int); +struct ieee80211_node *ieee80211_find_node(struct ieee80211com *, u_int8_t *); +void ieee80211_free_node(struct ieee80211com *, struct ieee80211_node *); +void ieee80211_free_allnodes(struct ieee80211com *); +int ieee80211_fix_rate(struct ieee80211com *, struct ieee80211_node *, int); +int ieee80211_new_state(struct ifnet *, enum ieee80211_state, int); +struct mbuf *ieee80211_wep_crypt(struct ifnet *, struct mbuf *, int); +int ieee80211_rate2media(int, enum ieee80211_phytype); +int ieee80211_media2rate(int, enum ieee80211_phytype); + +int ieee80211_cfgget(struct ifnet *, u_long, caddr_t); +int ieee80211_cfgset(struct ifnet *, u_long, caddr_t); + +void ieee80211_pwrsave(struct ieee80211com *, struct ieee80211_node *, + struct mbuf *); + +int ieee80211_media_change(struct ifnet *); +void ieee80211_media_status(struct ifnet *, struct ifmediareq *); + +#endif /* _KERNEL */ #endif /* _NET_IF_IEEE80211_H_ */ |