348 lines
12 KiB
C
348 lines
12 KiB
C
/* $NetBSD: if_ieee80211.h,v 1.12 2001/09/19 04:09:56 onoe 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_
|
|
|
|
#include <net/if_ether.h>
|
|
|
|
#define IEEE80211_ADDR_LEN ETHER_ADDR_LEN
|
|
|
|
/*
|
|
* 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[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[IEEE80211_ADDR_LEN]; */
|
|
/* see below */
|
|
} __attribute__((__packed__));
|
|
|
|
struct ieee80211_frame_addr4 {
|
|
u_int8_t i_fc[2];
|
|
u_int8_t i_dur[2];
|
|
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[IEEE80211_ADDR_LEN];
|
|
} __attribute__((__packed__));
|
|
|
|
#define IEEE80211_FC0_VERSION_MASK 0x03
|
|
#define IEEE80211_FC0_VERSION_0 0x00
|
|
#define IEEE80211_FC0_TYPE_MASK 0x0c
|
|
#define IEEE80211_FC0_TYPE_MGT 0x00
|
|
#define IEEE80211_FC0_TYPE_CTL 0x04
|
|
#define IEEE80211_FC0_TYPE_DATA 0x08
|
|
|
|
#define IEEE80211_FC0_SUBTYPE_MASK 0xf0
|
|
/* for TYPE_MGT */
|
|
#define IEEE80211_FC0_SUBTYPE_ASSOC_REQ 0x00
|
|
#define IEEE80211_FC0_SUBTYPE_ASSOC_RESP 0x10
|
|
#define IEEE80211_FC0_SUBTYPE_REASSOC_REQ 0x20
|
|
#define IEEE80211_FC0_SUBTYPE_REASSOC_RESP 0x30
|
|
#define IEEE80211_FC0_SUBTYPE_PROBE_REQ 0x40
|
|
#define IEEE80211_FC0_SUBTYPE_PROBE_RESP 0x50
|
|
#define IEEE80211_FC0_SUBTYPE_BEACON 0x80
|
|
#define IEEE80211_FC0_SUBTYPE_ATIM 0x90
|
|
#define IEEE80211_FC0_SUBTYPE_DISASSOC 0xa0
|
|
#define IEEE80211_FC0_SUBTYPE_AUTH 0xb0
|
|
#define IEEE80211_FC0_SUBTYPE_DEAUTH 0xc0
|
|
/* for TYPE_CTL */
|
|
#define IEEE80211_FC0_SUBTYPE_PS_POLL 0xa0
|
|
#define IEEE80211_FC0_SUBTYPE_RTS 0xb0
|
|
#define IEEE80211_FC0_SUBTYPE_CTS 0xc0
|
|
#define IEEE80211_FC0_SUBTYPE_ACK 0xd0
|
|
#define IEEE80211_FC0_SUBTYPE_CF_END 0xe0
|
|
#define IEEE80211_FC0_SUBTYPE_CF_END_ACK 0xf0
|
|
/* for TYPE_DATA (bit combination) */
|
|
#define IEEE80211_FC0_SUBTYPE_CF_ACK 0x10
|
|
#define IEEE80211_FC0_SUBTYPE_CF_POLL 0x20
|
|
#define IEEE80211_FC0_SUBTYPE_NODATA 0x40
|
|
|
|
#define IEEE80211_FC1_DIR_MASK 0x03
|
|
#define IEEE80211_FC1_DIR_NODS 0x00 /* STA->STA */
|
|
#define IEEE80211_FC1_DIR_TODS 0x01 /* STA->AP */
|
|
#define IEEE80211_FC1_DIR_FROMDS 0x02 /* AP ->STA */
|
|
#define IEEE80211_FC1_DIR_DSTODS 0x03 /* AP ->AP */
|
|
|
|
#define IEEE80211_FC1_MORE_FRAG 0x04
|
|
#define IEEE80211_FC1_RETRY 0x08
|
|
#define IEEE80211_FC1_PWR_MGT 0x10
|
|
#define IEEE80211_FC1_MORE_DATA 0x20
|
|
#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
|
|
|
|
/*
|
|
* Management Frames
|
|
*/
|
|
|
|
#define IEEE80211_ELEMID_SSID 0
|
|
#define IEEE80211_ELEMID_RATES 1
|
|
#define IEEE80211_ELEMID_FHPARMS 2
|
|
#define IEEE80211_ELEMID_DSPARMS 3
|
|
#define IEEE80211_ELEMID_CFPARMS 4
|
|
#define IEEE80211_ELEMID_TIM 5
|
|
#define IEEE80211_ELEMID_IBSSPARMS 6
|
|
#define IEEE80211_ELEMID_CHALLENGE 16
|
|
|
|
#define IEEE80211_RATE_BASIC 0x80
|
|
#define IEEE80211_RATE_VAL 0x7f
|
|
|
|
#define IEEE80211_AUTH_ALG_OPEN 0x0000
|
|
#define IEEE80211_AUTH_ALG_SHARED 0x0001
|
|
|
|
#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_REASON_UNSPECIFIED 1
|
|
#define IEEE80211_REASON_AUTH_EXPIRE 2
|
|
#define IEEE80211_REASON_AUTH_LEAVE 3
|
|
#define IEEE80211_REASON_ASSOC_EXPIRE 4
|
|
#define IEEE80211_REASON_ASSOC_TOOMANY 5
|
|
#define IEEE80211_REASON_NOT_AUTHED 6
|
|
#define IEEE80211_REASON_NOT_ASSOCED 7
|
|
#define IEEE80211_REASON_ASSOC_LEAVE 8
|
|
#define IEEE80211_REASON_ASSOC_NOT_AUTHED 9
|
|
|
|
#define IEEE80211_STATUS_SUCCESS 0
|
|
#define IEEE80211_STATUS_UNSPECIFIED 1
|
|
#define IEEE80211_STATUS_CAPINFO 10
|
|
#define IEEE80211_STATUS_NOT_ASSOCED 11
|
|
#define IEEE80211_STATUS_OTHER 12
|
|
#define IEEE80211_STATUS_ALG 13
|
|
#define IEEE80211_STATUS_SEQUENCE 14
|
|
#define IEEE80211_STATUS_CHALLENGE 15
|
|
#define IEEE80211_STATUS_TIMEOUT 16
|
|
#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_WEP_KEYLEN 5 /* 40bit */
|
|
#define IEEE80211_WEP_IVLEN 3 /* 24bit */
|
|
#define IEEE80211_WEP_KIDLEN 1 /* 1 octet */
|
|
#define IEEE80211_WEP_CRCLEN 4 /* CRC-32 */
|
|
#define IEEE80211_WEP_NKID 4 /* number of key ids */
|
|
|
|
#define IEEE80211_NWID_LEN 32
|
|
|
|
#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))
|
|
|
|
/*
|
|
* ioctls
|
|
*/
|
|
|
|
/* nwid is pointed at by ifr.ifr_data */
|
|
struct ieee80211_nwid {
|
|
u_int8_t i_len;
|
|
u_int8_t i_nwid[IEEE80211_NWID_LEN];
|
|
};
|
|
|
|
#define SIOCS80211NWID _IOWR('i', 230, struct ifreq)
|
|
#define SIOCG80211NWID _IOWR('i', 231, struct ifreq)
|
|
|
|
/* the first member must be matched with struct ifreq */
|
|
struct ieee80211_nwkey {
|
|
char i_name[IFNAMSIZ]; /* if_name, e.g. "wi0" */
|
|
int i_wepon; /* wep enabled flag */
|
|
int i_defkid; /* default encrypt key id */
|
|
struct {
|
|
int i_keylen;
|
|
u_int8_t *i_keydat;
|
|
} i_key[IEEE80211_WEP_NKID];
|
|
};
|
|
#define SIOCS80211NWKEY _IOW('i', 232, struct ieee80211_nwkey)
|
|
#define SIOCG80211NWKEY _IOWR('i', 233, struct ieee80211_nwkey)
|
|
/* i_wepon */
|
|
#define IEEE80211_NWKEY_OPEN 0 /* No privacy */
|
|
#define IEEE80211_NWKEY_WEP 1 /* WEP enabled */
|
|
#define IEEE80211_NWKEY_EAP 2 /* EAP enabled */
|
|
#define IEEE80211_NWKEY_PERSIST 0x100 /* designate persist keyset */
|
|
|
|
/* power management parameters */
|
|
struct ieee80211_power {
|
|
char i_name[IFNAMSIZ]; /* if_name, e.g. "wi0" */
|
|
int i_enabled; /* 1 == on, 0 == off */
|
|
int i_maxsleep; /* max sleep in ms */
|
|
};
|
|
#define SIOCS80211POWER _IOW('i', 234, struct ieee80211_power)
|
|
#define SIOCG80211POWER _IOWR('i', 235, struct ieee80211_power)
|
|
|
|
|
|
#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 */
|
|
|
|
/*
|
|
* Structure for IEEE 802.11 drivers.
|
|
*/
|
|
|
|
#define IEEE80211_CHAN_MAX 255
|
|
#define IEEE80211_RATE_SIZE 12
|
|
#define IEEE80211_KEYBUF_SIZE 16
|
|
|
|
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 */
|
|
};
|
|
|
|
struct ieee80211_bss {
|
|
TAILQ_ENTRY(ieee80211_bss) bs_list;
|
|
u_int8_t bs_macaddr[IEEE80211_ADDR_LEN];
|
|
u_int8_t bs_bssid[IEEE80211_ADDR_LEN];
|
|
u_int8_t bs_esslen;
|
|
u_int8_t bs_essid[IEEE80211_NWID_LEN];
|
|
u_int8_t bs_tstamp[8];
|
|
u_int16_t bs_intval;
|
|
u_int16_t bs_capinfo;
|
|
u_int16_t bs_fhdwell;
|
|
u_int8_t bs_fhindex;
|
|
u_int16_t bs_associd;
|
|
u_int32_t bs_timoff;
|
|
u_int8_t bs_chan;
|
|
u_int8_t bs_rssi;
|
|
u_int8_t bs_rates[IEEE80211_RATE_SIZE];
|
|
u_int16_t bs_txseq;
|
|
u_int16_t bs_rxseq;
|
|
int bs_nrate;
|
|
int bs_fails;
|
|
int bs_txrate;
|
|
};
|
|
|
|
/* bs_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)
|
|
|
|
struct ieee80211_wepkey {
|
|
int wk_len;
|
|
u_int8_t wk_key[IEEE80211_KEYBUF_SIZE];
|
|
};
|
|
|
|
struct ieee80211com {
|
|
struct ethercom ic_ec;
|
|
int (*ic_newstate)(void *, enum ieee80211_state);
|
|
int (*ic_chancheck)(void *, u_char *);
|
|
u_int8_t ic_myaddr[IEEE80211_ADDR_LEN];
|
|
u_int8_t ic_sup_rates[IEEE80211_RATE_SIZE];
|
|
u_char ic_chan_avail[(IEEE80211_CHAN_MAX+1)/NBBY];
|
|
u_char ic_chan_active[(IEEE80211_CHAN_MAX+1)/NBBY];
|
|
struct ifqueue ic_mgtq;
|
|
int ic_flags;
|
|
enum ieee80211_state ic_state;
|
|
struct ieee80211_bss ic_bss;
|
|
u_int8_t ic_ibss_chan;
|
|
int ic_fixed_rate;
|
|
TAILQ_HEAD(, ieee80211_bss) ic_scan;
|
|
u_int16_t ic_lintval; /* listen interval */
|
|
int ic_mgt_timer; /* mgmt timeout */
|
|
int ic_scan_timer; /* scant wait */
|
|
int ic_des_esslen;
|
|
u_int8_t ic_des_essid[IEEE80211_NWID_LEN];
|
|
struct ieee80211_wepkey ic_nw_keys[IEEE80211_WEP_NKID];
|
|
int ic_wep_txkey;
|
|
void *ic_wep_ctx;
|
|
};
|
|
#define ic_if ic_ec.ec_if
|
|
#define ic_softc ic_ec.ec_if.if_softc
|
|
|
|
/* 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_ADHOC 0x00000800 /* CONF: adhoc mode */
|
|
#define IEEE80211_F_HASWEP 0x00010000 /* CAPABILITY: WEP available */
|
|
#define IEEE80211_F_HASIBSS 0x00020000 /* CAPABILITY: IBSS available */
|
|
#define IEEE80211_F_HASPMGT 0x00040000 /* CAPABILITY: Power mgmt */
|
|
|
|
/* 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_int);
|
|
int ieee80211_mgmt_output(struct ifnet *, 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_free_scan(struct ifnet *);
|
|
int ieee80211_fix_rate(struct ieee80211com *, struct ieee80211_bss *, int);
|
|
int ieee80211_new_state(struct ifnet *, enum ieee80211_state, int);
|
|
struct mbuf *ieee80211_wep_crypt(struct ifnet *, struct mbuf *, int);
|
|
|
|
int ieee80211_cfgget(struct ifnet *, u_long, caddr_t);
|
|
int ieee80211_cfgset(struct ifnet *, u_long, caddr_t);
|
|
|
|
#endif /* _KERNEL */
|
|
|
|
#endif /* _NET_IF_IEEE80211_H_ */
|