#ifndef _SYS_NET80211_H
#define _SYS_NET80211_H
#include <sys/mac.h>
#include <sys/mac_provider.h>
#include <sys/ethernet.h>
#include <sys/net80211_proto.h>
#include <sys/net80211_crypto.h>
#include <sys/net80211_ht.h>
#include <sys/net80211_amrr.h>
#include <net/wpa.h>
#ifdef __cplusplus
extern "C" {
#endif
#define IEEE80211_C_WEP 0x00000001
#define IEEE80211_C_TKIP 0x00000002
#define IEEE80211_C_AES 0x00000004
#define IEEE80211_C_AES_CCM 0x00000008
#define IEEE80211_C_CKIP 0x00000010
#define IEEE80211_C_FF 0x00000040
#define IEEE80211_C_TURBOP 0x00000080
#define IEEE80211_C_IBSS 0x00000100
#define IEEE80211_C_PMGT 0x00000200
#define IEEE80211_C_HOSTAP 0x00000400
#define IEEE80211_C_AHDEMO 0x00000800
#define IEEE80211_C_SWRETRY 0x00001000
#define IEEE80211_C_TXPMGT 0x00002000
#define IEEE80211_C_SHSLOT 0x00004000
#define IEEE80211_C_SHPREAMBLE 0x00008000
#define IEEE80211_C_MONITOR 0x00010000
#define IEEE80211_C_TKIPMIC 0x00020000
#define IEEE80211_C_WPA1 0x00800000
#define IEEE80211_C_WPA2 0x01000000
#define IEEE80211_C_WPA 0x01800000
#define IEEE80211_C_BURST 0x02000000
#define IEEE80211_C_WME 0x04000000
#define IEEE80211_C_WDS 0x08000000
#define IEEE80211_C_BGSCAN 0x20000000
#define IEEE80211_C_TXFRAG 0x40000000
#define IEEE80211_C_CRYPTO 0x0000001f
#define IEEE80211_HTC_AMPDU 0x00010000
#define IEEE80211_HTC_AMSDU 0x00020000
#define IEEE80211_HTC_HT 0x00040000
#define IEEE80211_F_FF 0x00000001
#define IEEE80211_F_TURBOP 0x00000002
#define IEEE80211_F_BURST 0x00000004
#define IEEE80211_F_PRIVACY 0x00000010
#define IEEE80211_F_PUREG 0x00000020
#define IEEE80211_F_SCANONLY 0x00000040
#define IEEE80211_F_SCAN 0x00000080
#define IEEE80211_F_ASCAN 0x00000100
#define IEEE80211_F_SIBSS 0x00000200
#define IEEE80211_F_SHSLOT 0x00000400
#define IEEE80211_F_PMGTON 0x00000800
#define IEEE80211_F_DESBSSID 0x00001000
#define IEEE80211_F_WME 0x00002000
#define IEEE80211_F_BGSCAN 0x00004000
#define IEEE80211_F_SWRETRY 0x00008000
#define IEEE80211_F_TXPOW_FIXED 0x00010000
#define IEEE80211_F_IBSSON 0x00020000
#define IEEE80211_F_SHPREAMBLE 0x00040000
#define IEEE80211_F_DATAPAD 0x00080000
#define IEEE80211_F_USEPROT 0x00100000
#define IEEE80211_F_USEBARKER 0x00200000
#define IEEE80211_F_TIMUPDATE 0x00400000
#define IEEE80211_F_WPA1 0x00800000
#define IEEE80211_F_WPA2 0x01000000
#define IEEE80211_F_WPA 0x01800000
#define IEEE80211_F_DROPUNENC 0x02000000
#define IEEE80211_F_COUNTERM 0x04000000
#define IEEE80211_F_HIDESSID 0x08000000
#define IEEE80211_F_NOBRIDGE 0x10000000
#define IEEE80211_F_WMEUPDATE 0x20000000
#define IEEE80211_FEXT_NONHT_PR 0x00000001
#define IEEE80211_FEXT_INACT 0x00000002
#define IEEE80211_FEXT_BGSCAN 0x00000008
#define IEEE80211_FEXT_ERPUPDATE 0x00000200
#define IEEE80211_FEXT_SWBMISS 0x00000400
#define IEEE80211_FEXT_PROBECHAN 0x00020000
#define IEEE80211_FEXT_HT 0x00080000
#define IEEE80211_FEXT_AMPDU_TX 0x00100000
#define IEEE80211_FEXT_AMPDU_RX 0x00200000
#define IEEE80211_FEXT_AMSDU_TX 0x00400000
#define IEEE80211_FEXT_AMSDU_RX 0x00800000
#define IEEE80211_FEXT_USEHT40 0x01000000
#define IEEE80211_FEXT_PUREN 0x02000000
#define IEEE80211_FEXT_SHORTGI20 0x04000000
#define IEEE80211_FEXT_SHORTGI40 0x08000000
#define IEEE80211_FEXT_HTCOMPAT 0x10000000
#define IEEE80211_CHAN_TURBO 0x00000010
#define IEEE80211_CHAN_CCK 0x00000020
#define IEEE80211_CHAN_OFDM 0x00000040
#define IEEE80211_CHAN_2GHZ 0x00000080
#define IEEE80211_CHAN_5GHZ 0x00000100
#define IEEE80211_CHAN_PASSIVE 0x00000200
#define IEEE80211_CHAN_DYN 0x00000400
#define IEEE80211_CHAN_GFSK 0x00000800
#define IEEE80211_CHAN_GSM 0x00001000
#define IEEE80211_CHAN_STURBO 0x00002000
#define IEEE80211_CHAN_HALF 0x00004000
#define IEEE80211_CHAN_QUARTER 0x00008000
#define IEEE80211_CHAN_HT20 0x00010000
#define IEEE80211_CHAN_HT40U 0x00020000
#define IEEE80211_CHAN_HT40D 0x00040000
#define IEEE80211_CHAN_DFS 0x00080000
#define IEEE80211_CHAN_4MSXMIT 0x00100000
#define IEEE80211_CHAN_NOADHOC 0x00200000
#define IEEE80211_CHAN_NOHOSTAP 0x00400000
#define IEEE80211_CHAN_11D 0x00800000
#define IEEE80211_CHAN_HT40 (IEEE80211_CHAN_HT40U | IEEE80211_CHAN_HT40D)
#define IEEE80211_CHAN_HT (IEEE80211_CHAN_HT20 | IEEE80211_CHAN_HT40)
#define IEEE80211_CHAN_MAX 255
#define IEEE80211_CHAN_BYTES 32
#define IEEE80211_CHAN_ANY 0xffff
#define IEEE80211_CHAN_ANYC \
((struct ieee80211_channel *)IEEE80211_CHAN_ANY)
#define IEEE80211_IS_CHAN_2GHZ(_c) \
(((_c)->ich_flags & IEEE80211_CHAN_2GHZ) != 0)
#define IEEE80211_IS_CHAN_5GHZ(_c) \
(((_c)->ich_flags & IEEE80211_CHAN_5GHZ) != 0)
#define IEEE80211_NODE_CHWUPDATE 0x0400
#define IEEE80211_NODE_HASHSIZE 32
#define IEEE80211_NODE_AUTH 0x0001
#define IEEE80211_NODE_QOS 0x0002
#define IEEE80211_NODE_ERP 0x0004
#define IEEE80211_NODE_PWR_MGT 0x0010
#define IEEE80211_NODE_AREF 0x0020
#define IEEE80211_NODE_HT 0x0040
#define IEEE80211_NODE_HTCOMPAT 0x0080
#define IEEE80211_NODE_AMPDU_RX 0x0400
#define IEEE80211_NODE_AMPDU_TX 0x0800
#define IEEE80211_NODE_AMPDU \
(IEEE80211_NODE_AMPDU_RX | IEEE80211_NODE_AMPDU_TX)
#define IEEE80211_FIXED_RATE_NONE 0
#define WME_OUI 0xf25000
#define WME_OUI_TYPE 0x02
#define WME_INFO_OUI_SUBTYPE 0x00
#define WME_PARAM_OUI_SUBTYPE 0x01
#define WME_VERSION 1
#define WME_AC_BE 0
#define WME_AC_BK 1
#define WME_AC_VI 2
#define WME_AC_VO 3
#define MAX_EVENT 16
#define MAX_IEEE80211STR 256
#define IEEE80211_RADIOTAP_F_CFP 0x01
#define IEEE80211_RADIOTAP_F_SHORTPRE 0x02
#define IEEE80211_RADIOTAP_F_WEP 0x04
#define IEEE80211_RADIOTAP_F_FRAG 0x08
#define IEEE80211_RADIOTAP_F_DATAPAD 0x20
#define IEEE80211_RADIOTAP_F_FCS 0x10
#define IEEE80211_RADIOTAP_F_BADFCS 0x40
#define IEEE80211_RADIOTAP_F_SHORTGI 0x80
enum ieee80211_authmode {
IEEE80211_AUTH_NONE = 0,
IEEE80211_AUTH_OPEN = 1,
IEEE80211_AUTH_SHARED = 2,
IEEE80211_AUTH_8021X = 3,
IEEE80211_AUTH_AUTO = 4,
IEEE80211_AUTH_WPA = 5
};
enum ieee80211_state {
IEEE80211_S_INIT = 0,
IEEE80211_S_SCAN = 1,
IEEE80211_S_AUTH = 2,
IEEE80211_S_ASSOC = 3,
IEEE80211_S_RUN = 4
};
#define IEEE80211_S_MAX (IEEE80211_S_RUN+1)
#define IEEE80211_RATE_MAXSIZE 15
#define IEEE80211_RATE_SIZE 8
#define IEEE80211_XRATE_SIZE (IEEE80211_RATE_MAXSIZE - IEEE80211_RATE_SIZE)
struct ieee80211_rateset {
uint8_t ir_nrates;
uint8_t ir_rates[IEEE80211_RATE_MAXSIZE];
};
#define IEEE80211_HTRATE_MAXSIZE 127
struct ieee80211_htrateset {
uint8_t rs_nrates;
uint8_t rs_rates[IEEE80211_HTRATE_MAXSIZE];
};
#define IEEE80211_RATE_MCS 0x80
struct ieee80211_channel {
uint16_t ich_freq;
uint32_t ich_flags;
};
struct ieee80211_device_stats {
uint32_t is_tx_frags;
uint32_t is_tx_bytes;
uint32_t is_tx_mcast;
uint32_t is_tx_failed;
uint32_t is_tx_retries;
uint32_t is_rts_success;
uint32_t is_rts_failure;
uint32_t is_ack_failure;
uint32_t is_rx_frags;
uint32_t is_rx_bytes;
uint32_t is_rx_mcast;
uint32_t is_rx_dups;
uint32_t is_fcs_errors;
uint32_t is_wep_errors;
uint32_t is_tx_nobuf;
uint32_t is_tx_unknownmgt;
};
struct ieee80211_crypto_state;
typedef struct ieee80211_node_table ieee80211_node_table_t;
typedef struct ieee80211_node ieee80211_node_t;
typedef struct ieee80211com ieee80211com_t;
struct ieee80211_node_table {
struct ieee80211com *nt_ic;
const char *nt_name;
int nt_inact_timer;
int nt_inact_init;
void (*nt_timeout)(struct ieee80211_node_table *);
uint32_t nt_scangen;
kmutex_t nt_scanlock;
kmutex_t nt_nodelock;
int nt_keyixmax;
struct ieee80211_node **nt_keyixmap;
list_t nt_node;
list_t nt_hash[IEEE80211_NODE_HASHSIZE];
};
#define IEEE80211_TID_SIZE (WME_NUM_TID+1)
#define IEEE80211_NONQOS_TID WME_NUM_TID
struct ieee80211_node {
struct ieee80211com *in_ic;
struct ieee80211_node_table *in_table;
uint8_t in_authmode;
uint16_t in_flags;
uint16_t in_associd;
uint16_t in_txpower;
uint16_t in_vlan;
uint16_t in_txseqs[IEEE80211_TID_SIZE];
uint16_t in_rxseqs[IEEE80211_TID_SIZE];
clock_t in_rxfragstamp;
mblk_t *in_rxfrag;
uint32_t in_scangen;
uint32_t in_refcnt;
uint32_t in_rstamp;
uint8_t in_rssi;
uint8_t in_macaddr[IEEE80211_ADDR_LEN];
uint8_t in_bssid[IEEE80211_ADDR_LEN];
union {
uint8_t data[8];
uint64_t tsf;
} in_tstamp;
uint16_t in_intval;
uint16_t in_capinfo;
uint8_t in_esslen;
uint8_t in_essid[IEEE80211_NWID_LEN];
struct ieee80211_rateset in_rates;
struct ieee80211_channel *in_chan;
enum ieee80211_phytype in_phytype;
uint16_t in_fhdwell;
uint8_t in_fhindex;
uint8_t in_erp;
uint16_t in_tim_off;
uint8_t in_dtim_period;
uint8_t in_dtim_count;
uint32_t *in_challenge;
struct ieee80211_key in_ucastkey;
uint8_t *in_wpa_ie;
uint8_t *in_wme_ie;
uint8_t *in_htcap_ie;
uint16_t in_htcap;
uint8_t in_htparam;
uint8_t in_htctlchan;
uint8_t in_ht2ndchan;
uint8_t in_htopmode;
uint8_t in_htstbc;
uint8_t in_reqcw;
uint8_t in_chw;
struct ieee80211_htrateset in_htrates;
struct ieee80211_tx_ampdu in_tx_ampdu[WME_NUM_AC];
struct ieee80211_rx_ampdu in_rx_ampdu[WME_NUM_TID];
int32_t in_fails;
int16_t in_inact;
int16_t in_inact_reload;
int32_t in_txrate;
list_node_t in_node;
list_node_t in_hash;
};
struct wmeParams {
uint8_t wmep_acm;
uint8_t wmep_aifsn;
uint8_t wmep_logcwmin;
uint8_t wmep_logcwmax;
uint8_t wmep_txopLimit;
uint8_t wmep_noackPolicy;
};
#define IEEE80211_TXOP_TO_US(_txop) ((_txop)<<5)
#define IEEE80211_US_TO_TXOP(_us) ((_us)>>5)
struct chanAccParams {
uint8_t cap_info;
struct wmeParams cap_wmeParams[WME_NUM_AC];
};
struct ieee80211_wme_state {
uint_t wme_flags;
#define WME_F_AGGRMODE 0x00000001
uint_t wme_hipri_traffic;
uint_t wme_hipri_switch_thresh;
uint_t wme_hipri_switch_hysteresis;
struct wmeParams wme_params[4];
struct chanAccParams wme_wmeChanParams;
struct chanAccParams wme_wmeBssChanParams;
struct chanAccParams wme_chanParams;
struct chanAccParams wme_bssChanParams;
int (*wme_update)(struct ieee80211com *);
};
struct ieee80211com {
mac_handle_t ic_mach;
uint8_t ic_macaddr[IEEE80211_ADDR_LEN];
uint32_t ic_caps;
uint32_t ic_htcaps;
enum ieee80211_phytype ic_phytype;
enum ieee80211_opmode ic_opmode;
enum ieee80211_state ic_state;
struct ieee80211_channel ic_sup_channels[IEEE80211_CHAN_MAX+1];
struct ieee80211_rateset ic_sup_rates[IEEE80211_MODE_MAX];
enum ieee80211_phymode ic_curmode;
struct ieee80211_channel *ic_curchan;
struct ieee80211_channel *ic_ibss_chan;
uint8_t ic_maxrssi;
uint16_t ic_modecaps;
uint8_t ic_chan_active[IEEE80211_CHAN_BYTES];
enum ieee80211_protmode ic_protmode;
uint16_t ic_bintval;
uint16_t ic_lintval;
uint16_t ic_txpowlimit;
uint8_t ic_bmissthreshold;
uint16_t ic_rtsthreshold;
uint16_t ic_fragthreshold;
uint8_t ic_fixed_rate;
int32_t ic_des_esslen;
uint8_t ic_des_essid[IEEE80211_NWID_LEN];
uint8_t ic_des_bssid[IEEE80211_ADDR_LEN];
struct ieee80211_channel *ic_des_chan;
void *ic_opt_ie;
uint16_t ic_opt_ie_len;
uint8_t ic_nickname[IEEE80211_NWID_LEN];
uint16_t ic_tim_len;
uint8_t *ic_tim_bitmap;
timeout_id_t ic_watchdog_timer;
struct ieee80211_crypto_state ic_crypto;
const struct ieee80211_cipher *ic_ciphers[IEEE80211_CIPHER_MAX];
kmutex_t ic_doorlock;
char ic_wpadoor[MAX_IEEE80211STR];
wpa_event_type ic_eventq[MAX_EVENT];
uint32_t ic_evq_head, ic_evq_tail;
uint32_t ic_flags;
uint32_t ic_flags_ext;
struct ieee80211_node *ic_bss;
struct ieee80211_device_stats ic_stats;
struct ieee80211_node_table ic_scan;
struct ieee80211_node_table ic_sta;
struct ieee80211_wme_state ic_wme;
int ic_ampdu_rxmax;
int ic_ampdu_density;
int ic_ampdu_limit;
int ic_amsdu_limit;
uint16_t ic_sta_assoc;
uint16_t ic_ht_sta_assoc;
uint16_t ic_ht40_sta_assoc;
uint8_t ic_curhtprotmode;
enum ieee80211_protmode ic_htprotmode;
int ic_lastnonerp;
int ic_lastnonht;
int ic_beaconmiss;
int (*ic_xmit)(ieee80211com_t *, mblk_t *, uint8_t);
void (*ic_watchdog)(void *);
void (*ic_set_tim)(ieee80211com_t *,
ieee80211_node_t *, int);
void (*ic_set_shortslot)(ieee80211com_t *, int);
void (*ic_node_newassoc)(ieee80211_node_t *, int);
int (*ic_reset)(ieee80211com_t *);
void (*ic_recv_mgmt)(ieee80211com_t *,
mblk_t *, ieee80211_node_t *,
int, int, uint32_t);
int (*ic_send_mgmt)(ieee80211com_t *,
ieee80211_node_t *, int, int);
int (*ic_newstate)(ieee80211com_t *,
enum ieee80211_state, int);
struct ieee80211_node *(*ic_node_alloc)(ieee80211com_t *);
void (*ic_node_cleanup)(ieee80211_node_t *);
void (*ic_node_free)(ieee80211_node_t *);
uint8_t (*ic_node_getrssi)(const ieee80211_node_t *);
void (*ic_set_channel)(ieee80211com_t *);
void (*ic_recv_action)(ieee80211_node_t *,
const uint8_t *, const uint8_t *);
int (*ic_send_action)(ieee80211_node_t *,
int, int, uint16_t[4]);
int (*ic_addba_request)(ieee80211_node_t *,
struct ieee80211_tx_ampdu *,
int, int, int);
int (*ic_addba_response)(ieee80211_node_t *,
struct ieee80211_tx_ampdu *,
int, int, int);
void (*ic_addba_stop)(ieee80211_node_t *,
struct ieee80211_tx_ampdu *);
kmutex_t ic_genlock;
void *ic_private;
};
#define ic_nw_keys ic_crypto.cs_nw_keys
#define ic_def_txkey ic_crypto.cs_def_txkey
extern const char *ieee80211_state_name[IEEE80211_S_MAX];
extern const char *ieee80211_wme_acnames[];
#define IEEE80211_RATE(_ix) \
(in->in_rates.ir_rates[(_ix)] & IEEE80211_RATE_VAL)
#define ieee80211_new_state(_ic, _nstate, _arg) \
(((_ic)->ic_newstate)((_ic), (_nstate), (_arg)))
#define ieee80211_macaddr_sprintf(_addr) \
ether_sprintf((struct ether_addr *)(_addr))
#include <sys/atomic.h>
#define ieee80211_node_initref(_in) \
((_in)->in_refcnt = 1)
#define ieee80211_node_incref(_in) \
atomic_inc_uint(&(_in)->in_refcnt)
#define ieee80211_node_decref(_in) \
atomic_dec_uint(&(_in)->in_refcnt)
#define ieee80211_node_decref_nv(_in) \
atomic_dec_uint_nv(&(_in)->in_refcnt)
#define ieee80211_node_refcnt(_in) \
(_in)->in_refcnt
typedef void ieee80211_iter_func(void *, ieee80211_node_t *);
void ieee80211_attach(ieee80211com_t *);
void ieee80211_detach(ieee80211com_t *);
void ieee80211_media_init(ieee80211com_t *);
int ieee80211_ioctl(ieee80211com_t *, queue_t *, mblk_t *);
void ieee80211_register_door(ieee80211com_t *, const char *, int);
int ieee80211_input(ieee80211com_t *, mblk_t *, ieee80211_node_t *,
int32_t, uint32_t);
mblk_t *ieee80211_encap(ieee80211com_t *, mblk_t *, ieee80211_node_t *);
mblk_t *ieee80211_beacon_alloc(ieee80211com_t *, ieee80211_node_t *,
struct ieee80211_beacon_offsets *);
int ieee80211_beacon_update(ieee80211com_t *, ieee80211_node_t *,
struct ieee80211_beacon_offsets *, mblk_t *, int);
void ieee80211_beacon_miss(ieee80211com_t *);
void ieee80211_begin_scan(ieee80211com_t *, boolean_t);
void ieee80211_next_scan(ieee80211com_t *);
void ieee80211_end_scan(ieee80211com_t *);
void ieee80211_cancel_scan(ieee80211com_t *);
void ieee80211_sta_join(ieee80211com_t *, ieee80211_node_t *);
void ieee80211_sta_leave(ieee80211com_t *, ieee80211_node_t *);
boolean_t ieee80211_ibss_merge(ieee80211_node_t *);
ieee80211_node_t *ieee80211_ref_node(ieee80211_node_t *);
void ieee80211_unref_node(ieee80211_node_t **);
void ieee80211_node_authorize(ieee80211_node_t *);
void ieee80211_node_unauthorize(ieee80211_node_t *);
ieee80211_node_t *ieee80211_alloc_node(ieee80211com_t *,
ieee80211_node_table_t *, const uint8_t *);
void ieee80211_free_node(ieee80211_node_t *);
void ieee80211_node_table_reset(ieee80211_node_table_t *);
void ieee80211_iterate_nodes(ieee80211_node_table_t *, ieee80211_iter_func *,
void *);
ieee80211_node_t *ieee80211_find_node(ieee80211_node_table_t *,
const uint8_t *);
ieee80211_node_t *ieee80211_find_node_with_ssid(ieee80211_node_table_t *,
const uint8_t *, uint32_t, const uint8_t *);
ieee80211_node_t *ieee80211_find_txnode(ieee80211com_t *,
const uint8_t *daddr);
ieee80211_node_t *ieee80211_find_rxnode(ieee80211com_t *,
const struct ieee80211_frame *);
extern struct ieee80211_key *ieee80211_crypto_encap(ieee80211com_t *, mblk_t *);
extern struct ieee80211_key *ieee80211_crypto_decap(ieee80211com_t *, mblk_t *,
int);
extern int ieee80211_crypto_newkey(ieee80211com_t *, int, int,
struct ieee80211_key *);
extern int ieee80211_crypto_delkey(ieee80211com_t *, struct ieee80211_key *);
extern int ieee80211_crypto_setkey(ieee80211com_t *, struct ieee80211_key *,
const uint8_t *macaddr);
int ieee80211_stat(ieee80211com_t *ic, uint_t stat, uint64_t *val);
uint32_t ieee80211_chan2ieee(ieee80211com_t *, struct ieee80211_channel *);
enum ieee80211_phymode ieee80211_chan2mode(ieee80211com_t *,
struct ieee80211_channel *);
uint32_t ieee80211_ieee2mhz(uint32_t, uint32_t);
void ieee80211_reset_chan(ieee80211com_t *);
void ieee80211_dump_pkt(const uint8_t *, int32_t, int32_t, int32_t);
void ieee80211_watchdog(void *);
void ieee80211_start_watchdog(ieee80211com_t *, uint32_t);
void ieee80211_stop_watchdog(ieee80211com_t *);
int ieee80211_classify(struct ieee80211com *, mblk_t *,
struct ieee80211_node *);
int ieee80211_hdrsize(const void *);
int ieee80211_hdrspace(ieee80211com_t *, const void *);
int ieee80211_anyhdrsize(const void *);
int ieee80211_anyhdrspace(ieee80211com_t *, const void *);
void *ieee80211_malloc(size_t);
void ieee80211_free(void *);
int ieee80211_setprop(void *, const char *, mac_prop_id_t, uint_t,
const void *);
int ieee80211_getprop(void *, const char *, mac_prop_id_t, uint_t, void *);
void ieee80211_propinfo(void *, const char *, mac_prop_id_t,
mac_prop_info_handle_t);
struct ieee80211_channel *ieee80211_find_channel(ieee80211com_t *, int, int);
const struct ieee80211_rateset *ieee80211_get_suprates(ieee80211com_t *,
struct ieee80211_channel *);
#ifdef __cplusplus
}
#endif
#endif