ieee80211_proto.h revision 283541
1314209Sadrian/*- 2314209Sadrian * Copyright (c) 2001 Atsushi Onoe 3314209Sadrian * Copyright (c) 2002-2009 Sam Leffler, Errno Consulting 4314209Sadrian * All rights reserved. 5314209Sadrian * 6314209Sadrian * Redistribution and use in source and binary forms, with or without 7314209Sadrian * modification, are permitted provided that the following conditions 8314209Sadrian * are met: 9314209Sadrian * 1. Redistributions of source code must retain the above copyright 10314209Sadrian * notice, this list of conditions and the following disclaimer. 11314209Sadrian * 2. Redistributions in binary form must reproduce the above copyright 12314209Sadrian * notice, this list of conditions and the following disclaimer in the 13314209Sadrian * documentation and/or other materials provided with the distribution. 14314209Sadrian * 15314209Sadrian * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16314209Sadrian * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17314209Sadrian * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18314209Sadrian * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19314209Sadrian * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20314209Sadrian * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21314209Sadrian * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22314209Sadrian * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23314209Sadrian * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24314209Sadrian * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25314209Sadrian * 26314209Sadrian * $FreeBSD: head/sys/net80211/ieee80211_proto.h 283541 2015-05-25 20:06:49Z glebius $ 27314209Sadrian */ 28314209Sadrian#ifndef _NET80211_IEEE80211_PROTO_H_ 29314209Sadrian#define _NET80211_IEEE80211_PROTO_H_ 30314209Sadrian 31314209Sadrian/* 32314209Sadrian * 802.11 protocol implementation definitions. 33314209Sadrian */ 34314209Sadrian 35314209Sadrianenum ieee80211_state { 36314209Sadrian IEEE80211_S_INIT = 0, /* default state */ 37314209Sadrian IEEE80211_S_SCAN = 1, /* scanning */ 38314209Sadrian IEEE80211_S_AUTH = 2, /* try to authenticate */ 39314209Sadrian IEEE80211_S_ASSOC = 3, /* try to assoc */ 40314209Sadrian IEEE80211_S_CAC = 4, /* doing channel availability check */ 41314209Sadrian IEEE80211_S_RUN = 5, /* operational (e.g. associated) */ 42314209Sadrian IEEE80211_S_CSA = 6, /* channel switch announce pending */ 43314209Sadrian IEEE80211_S_SLEEP = 7, /* power save */ 44314209Sadrian}; 45314209Sadrian#define IEEE80211_S_MAX (IEEE80211_S_SLEEP+1) 46314209Sadrian 47314209Sadrian#define IEEE80211_SEND_MGMT(_ni,_type,_arg) \ 48314209Sadrian ((*(_ni)->ni_ic->ic_send_mgmt)(_ni, _type, _arg)) 49314209Sadrian 50314209Sadrianextern const char *ieee80211_mgt_subtype_name[]; 51314209Sadrianextern const char *ieee80211_phymode_name[IEEE80211_MODE_MAX]; 52314209Sadrianextern const int ieee80211_opcap[IEEE80211_OPMODE_MAX]; 53314209Sadrian 54314209Sadrianvoid ieee80211_proto_attach(struct ieee80211com *); 55314209Sadrianvoid ieee80211_proto_detach(struct ieee80211com *); 56314209Sadrianvoid ieee80211_proto_vattach(struct ieee80211vap *); 57314209Sadrianvoid ieee80211_proto_vdetach(struct ieee80211vap *); 58314209Sadrian 59314209Sadrianvoid ieee80211_syncifflag_locked(struct ieee80211com *, int flag); 60314209Sadrianvoid ieee80211_syncflag(struct ieee80211vap *, int flag); 61314209Sadrianvoid ieee80211_syncflag_ht(struct ieee80211vap *, int flag); 62314209Sadrianvoid ieee80211_syncflag_ext(struct ieee80211vap *, int flag); 63314209Sadrian 64314209Sadrian#define IEEE80211_R_NF 0x0000001 /* global NF value valid */ 65314209Sadrian#define IEEE80211_R_RSSI 0x0000002 /* global RSSI value valid */ 66314209Sadrian#define IEEE80211_R_C_CHAIN 0x0000004 /* RX chain count valid */ 67314209Sadrian#define IEEE80211_R_C_NF 0x0000008 /* per-chain NF value valid */ 68314209Sadrian#define IEEE80211_R_C_RSSI 0x0000010 /* per-chain RSSI value valid */ 69314209Sadrian#define IEEE80211_R_C_EVM 0x0000020 /* per-chain EVM valid */ 70314209Sadrian#define IEEE80211_R_C_HT40 0x0000040 /* RX'ed packet is 40mhz, pilots 4,5 valid */ 71314209Sadrian#define IEEE80211_R_FREQ 0x0000080 /* Freq value populated, MHz */ 72314209Sadrian#define IEEE80211_R_IEEE 0x0000100 /* IEEE value populated */ 73314209Sadrian#define IEEE80211_R_BAND 0x0000200 /* Frequency band populated */ 74314209Sadrian 75314209Sadrianstruct ieee80211_rx_stats { 76314209Sadrian uint32_t r_flags; /* IEEE80211_R_* flags */ 77330455Seadler uint8_t c_chain; /* number of RX chains involved */ 78314209Sadrian int16_t c_nf_ctl[IEEE80211_MAX_CHAINS]; /* per-chain NF */ 79314209Sadrian int16_t c_nf_ext[IEEE80211_MAX_CHAINS]; /* per-chain NF */ 80314209Sadrian int16_t c_rssi_ctl[IEEE80211_MAX_CHAINS]; /* per-chain RSSI */ 81314209Sadrian int16_t c_rssi_ext[IEEE80211_MAX_CHAINS]; /* per-chain RSSI */ 82314209Sadrian uint8_t nf; /* global NF */ 83314209Sadrian uint8_t rssi; /* global RSSI */ 84314209Sadrian uint8_t evm[IEEE80211_MAX_CHAINS][IEEE80211_MAX_EVM_PILOTS]; 85314209Sadrian /* per-chain, per-pilot EVM values */ 86314209Sadrian uint16_t c_freq; 87314209Sadrian uint8_t c_ieee; 88314209Sadrian}; 89314209Sadrian 90314209Sadrian#define ieee80211_input(ni, m, rssi, nf) \ 91314209Sadrian ((ni)->ni_vap->iv_input(ni, m, NULL, rssi, nf)) 92314209Sadrianint ieee80211_input_all(struct ieee80211com *, struct mbuf *, int, int); 93314209Sadrian 94314209Sadrianint ieee80211_input_mimo(struct ieee80211_node *, struct mbuf *, 95314209Sadrian struct ieee80211_rx_stats *); 96314209Sadrianint ieee80211_input_mimo_all(struct ieee80211com *, struct mbuf *, 97314209Sadrian struct ieee80211_rx_stats *); 98314209Sadrian 99314209Sadrianstruct ieee80211_bpf_params; 100314209Sadrianint ieee80211_mgmt_output(struct ieee80211_node *, struct mbuf *, int, 101314209Sadrian struct ieee80211_bpf_params *); 102314209Sadrianint ieee80211_raw_xmit(struct ieee80211_node *, struct mbuf *, 103314209Sadrian const struct ieee80211_bpf_params *); 104314209Sadrianint ieee80211_output(struct ifnet *, struct mbuf *, 105314209Sadrian const struct sockaddr *, struct route *ro); 106314209Sadrianint ieee80211_vap_pkt_send_dest(struct ieee80211vap *, struct mbuf *, 107314209Sadrian struct ieee80211_node *); 108314209Sadrianint ieee80211_raw_output(struct ieee80211vap *, struct ieee80211_node *, 109314209Sadrian struct mbuf *, const struct ieee80211_bpf_params *); 110314209Sadrianvoid ieee80211_send_setup(struct ieee80211_node *, struct mbuf *, int, int, 111314209Sadrian const uint8_t [IEEE80211_ADDR_LEN], const uint8_t [IEEE80211_ADDR_LEN], 112314209Sadrian const uint8_t [IEEE80211_ADDR_LEN]); 113314209Sadrianint ieee80211_vap_transmit(struct ifnet *ifp, struct mbuf *m); 114314209Sadrianvoid ieee80211_vap_qflush(struct ifnet *ifp); 115314209Sadrianint ieee80211_send_nulldata(struct ieee80211_node *); 116314209Sadrianint ieee80211_classify(struct ieee80211_node *, struct mbuf *m); 117314209Sadrianstruct mbuf *ieee80211_mbuf_adjust(struct ieee80211vap *, int, 118314209Sadrian struct ieee80211_key *, struct mbuf *); 119314209Sadrianstruct mbuf *ieee80211_encap(struct ieee80211vap *, struct ieee80211_node *, 120314209Sadrian struct mbuf *); 121314209Sadrianint ieee80211_send_mgmt(struct ieee80211_node *, int, int); 122314209Sadrianstruct ieee80211_appie; 123314209Sadrianint ieee80211_send_probereq(struct ieee80211_node *ni, 124314209Sadrian const uint8_t sa[IEEE80211_ADDR_LEN], 125314209Sadrian const uint8_t da[IEEE80211_ADDR_LEN], 126314209Sadrian const uint8_t bssid[IEEE80211_ADDR_LEN], 127314209Sadrian const uint8_t *ssid, size_t ssidlen); 128314209Sadrianstruct mbuf * ieee80211_ff_encap1(struct ieee80211vap *, struct mbuf *, 129314209Sadrian const struct ether_header *); 130314209Sadrianvoid ieee80211_tx_complete(struct ieee80211_node *, 131314209Sadrian struct mbuf *, int); 132314209Sadrian 133314209Sadrian/* 134314209Sadrian * The formation of ProbeResponse frames requires guidance to 135314209Sadrian * deal with legacy clients. When the client is identified as 136314209Sadrian * "legacy 11b" ieee80211_send_proberesp is passed this token. 137314209Sadrian */ 138314209Sadrian#define IEEE80211_SEND_LEGACY_11B 0x1 /* legacy 11b client */ 139314209Sadrian#define IEEE80211_SEND_LEGACY_11 0x2 /* other legacy client */ 140314209Sadrian#define IEEE80211_SEND_LEGACY 0x3 /* any legacy client */ 141314209Sadrianstruct mbuf *ieee80211_alloc_proberesp(struct ieee80211_node *, int); 142314209Sadrianint ieee80211_send_proberesp(struct ieee80211vap *, 143314209Sadrian const uint8_t da[IEEE80211_ADDR_LEN], int); 144314209Sadrianstruct mbuf *ieee80211_alloc_rts(struct ieee80211com *ic, 145314209Sadrian const uint8_t [IEEE80211_ADDR_LEN], 146314209Sadrian const uint8_t [IEEE80211_ADDR_LEN], uint16_t); 147314209Sadrianstruct mbuf *ieee80211_alloc_cts(struct ieee80211com *, 148314209Sadrian const uint8_t [IEEE80211_ADDR_LEN], uint16_t); 149314209Sadrian 150314209Sadrianuint8_t *ieee80211_add_rates(uint8_t *, const struct ieee80211_rateset *); 151314209Sadrianuint8_t *ieee80211_add_xrates(uint8_t *, const struct ieee80211_rateset *); 152314209Sadrianuint8_t *ieee80211_add_ssid(uint8_t *, const uint8_t *, u_int); 153314209Sadrianuint8_t *ieee80211_add_wpa(uint8_t *, const struct ieee80211vap *); 154314209Sadrianuint8_t *ieee80211_add_rsn(uint8_t *, const struct ieee80211vap *); 155314209Sadrianuint8_t *ieee80211_add_qos(uint8_t *, const struct ieee80211_node *); 156314209Sadrianuint16_t ieee80211_getcapinfo(struct ieee80211vap *, 157314209Sadrian struct ieee80211_channel *); 158314209Sadrian 159314209Sadrianvoid ieee80211_reset_erp(struct ieee80211com *); 160314209Sadrianvoid ieee80211_set_shortslottime(struct ieee80211com *, int onoff); 161314209Sadrianint ieee80211_iserp_rateset(const struct ieee80211_rateset *); 162314209Sadrianvoid ieee80211_setbasicrates(struct ieee80211_rateset *, 163314209Sadrian enum ieee80211_phymode); 164314209Sadrianvoid ieee80211_addbasicrates(struct ieee80211_rateset *, 165314209Sadrian enum ieee80211_phymode); 166314209Sadrian 167314209Sadrian/* 168314209Sadrian * Return the size of the 802.11 header for a management or data frame. 169314209Sadrian */ 170314209Sadrianstatic __inline int 171314209Sadrianieee80211_hdrsize(const void *data) 172314209Sadrian{ 173314209Sadrian const struct ieee80211_frame *wh = data; 174314209Sadrian int size = sizeof(struct ieee80211_frame); 175314209Sadrian 176314209Sadrian /* NB: we don't handle control frames */ 177314209Sadrian KASSERT((wh->i_fc[0]&IEEE80211_FC0_TYPE_MASK) != IEEE80211_FC0_TYPE_CTL, 178314209Sadrian ("%s: control frame", __func__)); 179314209Sadrian if (IEEE80211_IS_DSTODS(wh)) 180314209Sadrian size += IEEE80211_ADDR_LEN; 181314209Sadrian if (IEEE80211_QOS_HAS_SEQ(wh)) 182314209Sadrian size += sizeof(uint16_t); 183314209Sadrian return size; 184314209Sadrian} 185314209Sadrian 186314209Sadrian/* 187314209Sadrian * Like ieee80211_hdrsize, but handles any type of frame. 188314209Sadrian */ 189314209Sadrianstatic __inline int 190314209Sadrianieee80211_anyhdrsize(const void *data) 191314209Sadrian{ 192314209Sadrian const struct ieee80211_frame *wh = data; 193314209Sadrian 194314209Sadrian if ((wh->i_fc[0]&IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_CTL) { 195314209Sadrian switch (wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) { 196314209Sadrian case IEEE80211_FC0_SUBTYPE_CTS: 197314209Sadrian case IEEE80211_FC0_SUBTYPE_ACK: 198314209Sadrian return sizeof(struct ieee80211_frame_ack); 199314209Sadrian case IEEE80211_FC0_SUBTYPE_BAR: 200314209Sadrian return sizeof(struct ieee80211_frame_bar); 201314209Sadrian } 202314209Sadrian return sizeof(struct ieee80211_frame_min); 203314209Sadrian } else 204314209Sadrian return ieee80211_hdrsize(data); 205314209Sadrian} 206314209Sadrian 207314209Sadrian/* 208314209Sadrian * Template for an in-kernel authenticator. Authenticators 209314209Sadrian * register with the protocol code and are typically loaded 210314209Sadrian * as separate modules as needed. One special authenticator 211314209Sadrian * is xauth; it intercepts requests so that protocols like 212314209Sadrian * WPA can be handled in user space. 213314209Sadrian */ 214314209Sadrianstruct ieee80211_authenticator { 215314209Sadrian const char *ia_name; /* printable name */ 216314209Sadrian int (*ia_attach)(struct ieee80211vap *); 217314209Sadrian void (*ia_detach)(struct ieee80211vap *); 218314209Sadrian void (*ia_node_join)(struct ieee80211_node *); 219314209Sadrian void (*ia_node_leave)(struct ieee80211_node *); 220314209Sadrian}; 221314209Sadrianvoid ieee80211_authenticator_register(int type, 222314209Sadrian const struct ieee80211_authenticator *); 223314209Sadrianvoid ieee80211_authenticator_unregister(int type); 224314209Sadrianconst struct ieee80211_authenticator *ieee80211_authenticator_get(int auth); 225314209Sadrian 226314209Sadrianstruct ieee80211req; 227314209Sadrian/* 228314209Sadrian * Template for an MAC ACL policy module. Such modules 229314209Sadrian * register with the protocol code and are passed the sender's 230314209Sadrian * address of each received auth frame for validation. 231314209Sadrian */ 232314209Sadrianstruct ieee80211_aclator { 233314209Sadrian const char *iac_name; /* printable name */ 234314209Sadrian int (*iac_attach)(struct ieee80211vap *); 235314209Sadrian void (*iac_detach)(struct ieee80211vap *); 236314209Sadrian int (*iac_check)(struct ieee80211vap *, 237314209Sadrian const struct ieee80211_frame *wh); 238314209Sadrian int (*iac_add)(struct ieee80211vap *, 239314209Sadrian const uint8_t mac[IEEE80211_ADDR_LEN]); 240314209Sadrian int (*iac_remove)(struct ieee80211vap *, 241314209Sadrian const uint8_t mac[IEEE80211_ADDR_LEN]); 242314209Sadrian int (*iac_flush)(struct ieee80211vap *); 243314209Sadrian int (*iac_setpolicy)(struct ieee80211vap *, int); 244314209Sadrian int (*iac_getpolicy)(struct ieee80211vap *); 245314209Sadrian int (*iac_setioctl)(struct ieee80211vap *, struct ieee80211req *); 246314209Sadrian int (*iac_getioctl)(struct ieee80211vap *, struct ieee80211req *); 247314209Sadrian}; 248314209Sadrianvoid ieee80211_aclator_register(const struct ieee80211_aclator *); 249314209Sadrianvoid ieee80211_aclator_unregister(const struct ieee80211_aclator *); 250314209Sadrianconst struct ieee80211_aclator *ieee80211_aclator_get(const char *name); 251314209Sadrian 252314209Sadrian/* flags for ieee80211_fix_rate() */ 253314209Sadrian#define IEEE80211_F_DOSORT 0x00000001 /* sort rate list */ 254314209Sadrian#define IEEE80211_F_DOFRATE 0x00000002 /* use fixed legacy rate */ 255314209Sadrian#define IEEE80211_F_DONEGO 0x00000004 /* calc negotiated rate */ 256314209Sadrian#define IEEE80211_F_DODEL 0x00000008 /* delete ignore rate */ 257314209Sadrian#define IEEE80211_F_DOBRS 0x00000010 /* check basic rate set */ 258314209Sadrian#define IEEE80211_F_JOIN 0x00000020 /* sta joining our bss */ 259314209Sadrian#define IEEE80211_F_DOFMCS 0x00000040 /* use fixed HT rate */ 260314209Sadrianint ieee80211_fix_rate(struct ieee80211_node *, 261314209Sadrian struct ieee80211_rateset *, int); 262314209Sadrian 263314209Sadrian/* 264314209Sadrian * WME/WMM support. 265314209Sadrian */ 266314209Sadrianstruct wmeParams { 267314209Sadrian uint8_t wmep_acm; 268314209Sadrian uint8_t wmep_aifsn; 269314209Sadrian uint8_t wmep_logcwmin; /* log2(cwmin) */ 270314209Sadrian uint8_t wmep_logcwmax; /* log2(cwmax) */ 271314209Sadrian uint8_t wmep_txopLimit; 272314209Sadrian uint8_t wmep_noackPolicy; /* 0 (ack), 1 (no ack) */ 273314209Sadrian}; 274314209Sadrian#define IEEE80211_TXOP_TO_US(_txop) ((_txop)<<5) 275314209Sadrian#define IEEE80211_US_TO_TXOP(_us) ((_us)>>5) 276314209Sadrian 277314209Sadrianstruct chanAccParams { 278314209Sadrian uint8_t cap_info; /* version of the current set */ 279314209Sadrian struct wmeParams cap_wmeParams[WME_NUM_AC]; 280314209Sadrian}; 281314209Sadrian 282314209Sadrianstruct ieee80211_wme_state { 283314209Sadrian u_int wme_flags; 284314209Sadrian#define WME_F_AGGRMODE 0x00000001 /* STATUS: WME agressive mode */ 285314209Sadrian u_int wme_hipri_traffic; /* VI/VO frames in beacon interval */ 286314209Sadrian u_int wme_hipri_switch_thresh;/* agressive mode switch thresh */ 287314209Sadrian u_int wme_hipri_switch_hysteresis;/* agressive mode switch hysteresis */ 288314209Sadrian 289314209Sadrian struct wmeParams wme_params[4]; /* from assoc resp for each AC*/ 290314209Sadrian struct chanAccParams wme_wmeChanParams; /* WME params applied to self */ 291314209Sadrian struct chanAccParams wme_wmeBssChanParams;/* WME params bcast to stations */ 292314209Sadrian struct chanAccParams wme_chanParams; /* params applied to self */ 293314209Sadrian struct chanAccParams wme_bssChanParams; /* params bcast to stations */ 294314209Sadrian 295314209Sadrian int (*wme_update)(struct ieee80211com *); 296314209Sadrian}; 297314209Sadrian 298314209Sadrianvoid ieee80211_wme_initparams(struct ieee80211vap *); 299314209Sadrianvoid ieee80211_wme_updateparams(struct ieee80211vap *); 300314209Sadrianvoid ieee80211_wme_updateparams_locked(struct ieee80211vap *); 301314209Sadrian 302314209Sadrian/* 303314209Sadrian * Return the WME TID from a QoS frame. If no TID 304314209Sadrian * is present return the index for the "non-QoS" entry. 305314209Sadrian */ 306314209Sadrianstatic __inline uint8_t 307314209Sadrianieee80211_gettid(const struct ieee80211_frame *wh) 308314209Sadrian{ 309314209Sadrian uint8_t tid; 310314209Sadrian 311314209Sadrian if (IEEE80211_QOS_HAS_SEQ(wh)) { 312314209Sadrian if (IEEE80211_IS_DSTODS(wh)) 313314209Sadrian tid = ((const struct ieee80211_qosframe_addr4 *)wh)-> 314314209Sadrian i_qos[0]; 315314209Sadrian else 316314209Sadrian tid = ((const struct ieee80211_qosframe *)wh)->i_qos[0]; 317314209Sadrian tid &= IEEE80211_QOS_TID; 318314209Sadrian } else 319314209Sadrian tid = IEEE80211_NONQOS_TID; 320314209Sadrian return tid; 321314209Sadrian} 322314209Sadrian 323314209Sadrianvoid ieee80211_waitfor_parent(struct ieee80211com *); 324314209Sadrianvoid ieee80211_start_locked(struct ieee80211vap *); 325314209Sadrianvoid ieee80211_init(void *); 326314209Sadrianvoid ieee80211_start_all(struct ieee80211com *); 327314209Sadrianvoid ieee80211_stop_locked(struct ieee80211vap *); 328314209Sadrianvoid ieee80211_stop(struct ieee80211vap *); 329314209Sadrianvoid ieee80211_stop_all(struct ieee80211com *); 330314209Sadrianvoid ieee80211_suspend_all(struct ieee80211com *); 331314209Sadrianvoid ieee80211_resume_all(struct ieee80211com *); 332314209Sadrianvoid ieee80211_dturbo_switch(struct ieee80211vap *, int newflags); 333314209Sadrianvoid ieee80211_swbmiss(void *arg); 334314209Sadrianvoid ieee80211_beacon_miss(struct ieee80211com *); 335314209Sadrianint ieee80211_new_state(struct ieee80211vap *, enum ieee80211_state, int); 336314209Sadrianint ieee80211_new_state_locked(struct ieee80211vap *, enum ieee80211_state, 337314209Sadrian int); 338314209Sadrianvoid ieee80211_print_essid(const uint8_t *, int); 339314209Sadrianvoid ieee80211_dump_pkt(struct ieee80211com *, 340314209Sadrian const uint8_t *, int, int, int); 341314209Sadrian 342314209Sadrianextern const char *ieee80211_opmode_name[]; 343extern const char *ieee80211_state_name[IEEE80211_S_MAX]; 344extern const char *ieee80211_wme_acnames[]; 345 346/* 347 * Beacon frames constructed by ieee80211_beacon_alloc 348 * have the following structure filled in so drivers 349 * can update the frame later w/ minimal overhead. 350 */ 351struct ieee80211_beacon_offsets { 352 uint8_t bo_flags[4]; /* update/state flags */ 353 uint16_t *bo_caps; /* capabilities */ 354 uint8_t *bo_cfp; /* start of CFParms element */ 355 uint8_t *bo_tim; /* start of atim/dtim */ 356 uint8_t *bo_wme; /* start of WME parameters */ 357 uint8_t *bo_tdma; /* start of TDMA parameters */ 358 uint8_t *bo_tim_trailer;/* start of fixed-size trailer */ 359 uint16_t bo_tim_len; /* atim/dtim length in bytes */ 360 uint16_t bo_tim_trailer_len;/* tim trailer length in bytes */ 361 uint8_t *bo_erp; /* start of ERP element */ 362 uint8_t *bo_htinfo; /* start of HT info element */ 363 uint8_t *bo_ath; /* start of ATH parameters */ 364 uint8_t *bo_appie; /* start of AppIE element */ 365 uint16_t bo_appie_len; /* AppIE length in bytes */ 366 uint16_t bo_csa_trailer_len; 367 uint8_t *bo_csa; /* start of CSA element */ 368 uint8_t *bo_quiet; /* start of Quiet element */ 369 uint8_t *bo_meshconf; /* start of MESHCONF element */ 370 uint8_t *bo_spare[3]; 371}; 372struct mbuf *ieee80211_beacon_alloc(struct ieee80211_node *, 373 struct ieee80211_beacon_offsets *); 374 375/* 376 * Beacon frame updates are signaled through calls to iv_update_beacon 377 * with one of the IEEE80211_BEACON_* tokens defined below. For devices 378 * that construct beacon frames on the host this can trigger a rebuild 379 * or defer the processing. For devices that offload beacon frame 380 * handling this callback can be used to signal a rebuild. The bo_flags 381 * array in the ieee80211_beacon_offsets structure is intended to record 382 * deferred processing requirements; ieee80211_beacon_update uses the 383 * state to optimize work. Since this structure is owned by the driver 384 * and not visible to the 802.11 layer drivers must supply an iv_update_beacon 385 * callback that marks the flag bits and schedules (as necessary) an update. 386 */ 387enum { 388 IEEE80211_BEACON_CAPS = 0, /* capabilities */ 389 IEEE80211_BEACON_TIM = 1, /* DTIM/ATIM */ 390 IEEE80211_BEACON_WME = 2, 391 IEEE80211_BEACON_ERP = 3, /* Extended Rate Phy */ 392 IEEE80211_BEACON_HTINFO = 4, /* HT Information */ 393 IEEE80211_BEACON_APPIE = 5, /* Application IE's */ 394 IEEE80211_BEACON_CFP = 6, /* CFParms */ 395 IEEE80211_BEACON_CSA = 7, /* Channel Switch Announcement */ 396 IEEE80211_BEACON_TDMA = 9, /* TDMA Info */ 397 IEEE80211_BEACON_ATH = 10, /* ATH parameters */ 398 IEEE80211_BEACON_MESHCONF = 11, /* Mesh Configuration */ 399}; 400int ieee80211_beacon_update(struct ieee80211_node *, 401 struct ieee80211_beacon_offsets *, struct mbuf *, int mcast); 402 403void ieee80211_csa_startswitch(struct ieee80211com *, 404 struct ieee80211_channel *, int mode, int count); 405void ieee80211_csa_completeswitch(struct ieee80211com *); 406void ieee80211_csa_cancelswitch(struct ieee80211com *); 407void ieee80211_cac_completeswitch(struct ieee80211vap *); 408 409/* 410 * Notification methods called from the 802.11 state machine. 411 * Note that while these are defined here, their implementation 412 * is OS-specific. 413 */ 414void ieee80211_notify_node_join(struct ieee80211_node *, int newassoc); 415void ieee80211_notify_node_leave(struct ieee80211_node *); 416void ieee80211_notify_scan_done(struct ieee80211vap *); 417void ieee80211_notify_wds_discover(struct ieee80211_node *); 418void ieee80211_notify_csa(struct ieee80211com *, 419 const struct ieee80211_channel *, int mode, int count); 420void ieee80211_notify_radar(struct ieee80211com *, 421 const struct ieee80211_channel *); 422enum ieee80211_notify_cac_event { 423 IEEE80211_NOTIFY_CAC_START = 0, /* CAC timer started */ 424 IEEE80211_NOTIFY_CAC_STOP = 1, /* CAC intentionally stopped */ 425 IEEE80211_NOTIFY_CAC_RADAR = 2, /* CAC stopped due to radar detectio */ 426 IEEE80211_NOTIFY_CAC_EXPIRE = 3, /* CAC expired w/o radar */ 427}; 428void ieee80211_notify_cac(struct ieee80211com *, 429 const struct ieee80211_channel *, 430 enum ieee80211_notify_cac_event); 431void ieee80211_notify_node_deauth(struct ieee80211_node *); 432void ieee80211_notify_node_auth(struct ieee80211_node *); 433void ieee80211_notify_country(struct ieee80211vap *, const uint8_t [], 434 const uint8_t cc[2]); 435void ieee80211_notify_radio(struct ieee80211com *, int); 436#endif /* _NET80211_IEEE80211_PROTO_H_ */ 437