1 | /*- |
---|
2 | * Copyright (c) 2001 Atsushi Onoe |
---|
3 | * Copyright (c) 2002-2009 Sam Leffler, Errno Consulting |
---|
4 | * All rights reserved. |
---|
5 | * |
---|
6 | * Redistribution and use in source and binary forms, with or without |
---|
7 | * modification, are permitted provided that the following conditions |
---|
8 | * are met: |
---|
9 | * 1. Redistributions of source code must retain the above copyright |
---|
10 | * notice, this list of conditions and the following disclaimer. |
---|
11 | * 2. Redistributions in binary form must reproduce the above copyright |
---|
12 | * notice, this list of conditions and the following disclaimer in the |
---|
13 | * documentation and/or other materials provided with the distribution. |
---|
14 | * |
---|
15 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
---|
16 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
---|
17 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
---|
18 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
---|
19 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
---|
20 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
---|
21 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
---|
22 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
---|
23 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
---|
24 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
---|
25 | * |
---|
26 | * $FreeBSD$ |
---|
27 | */ |
---|
28 | #ifndef _NET80211_IEEE80211_PROTO_H_ |
---|
29 | #define _NET80211_IEEE80211_PROTO_H_ |
---|
30 | |
---|
31 | /* |
---|
32 | * 802.11 protocol implementation definitions. |
---|
33 | */ |
---|
34 | |
---|
35 | enum ieee80211_state { |
---|
36 | IEEE80211_S_INIT = 0, /* default state */ |
---|
37 | IEEE80211_S_SCAN = 1, /* scanning */ |
---|
38 | IEEE80211_S_AUTH = 2, /* try to authenticate */ |
---|
39 | IEEE80211_S_ASSOC = 3, /* try to assoc */ |
---|
40 | IEEE80211_S_CAC = 4, /* doing channel availability check */ |
---|
41 | IEEE80211_S_RUN = 5, /* operational (e.g. associated) */ |
---|
42 | IEEE80211_S_CSA = 6, /* channel switch announce pending */ |
---|
43 | IEEE80211_S_SLEEP = 7, /* power save */ |
---|
44 | }; |
---|
45 | #define IEEE80211_S_MAX (IEEE80211_S_SLEEP+1) |
---|
46 | |
---|
47 | #define IEEE80211_SEND_MGMT(_ni,_type,_arg) \ |
---|
48 | ((*(_ni)->ni_ic->ic_send_mgmt)(_ni, _type, _arg)) |
---|
49 | |
---|
50 | extern const char *mgt_subtype_name[]; |
---|
51 | extern const char *ctl_subtype_name[]; |
---|
52 | extern const char *ieee80211_phymode_name[IEEE80211_MODE_MAX]; |
---|
53 | extern const int ieee80211_opcap[IEEE80211_OPMODE_MAX]; |
---|
54 | |
---|
55 | static __inline const char * |
---|
56 | ieee80211_mgt_subtype_name(uint8_t subtype) |
---|
57 | { |
---|
58 | return mgt_subtype_name[(subtype & IEEE80211_FC0_SUBTYPE_MASK) >> |
---|
59 | IEEE80211_FC0_SUBTYPE_SHIFT]; |
---|
60 | } |
---|
61 | |
---|
62 | static __inline const char * |
---|
63 | ieee80211_ctl_subtype_name(uint8_t subtype) |
---|
64 | { |
---|
65 | return ctl_subtype_name[(subtype & IEEE80211_FC0_SUBTYPE_MASK) >> |
---|
66 | IEEE80211_FC0_SUBTYPE_SHIFT]; |
---|
67 | } |
---|
68 | |
---|
69 | const char *ieee80211_reason_to_string(uint16_t); |
---|
70 | |
---|
71 | void ieee80211_proto_attach(struct ieee80211com *); |
---|
72 | void ieee80211_proto_detach(struct ieee80211com *); |
---|
73 | void ieee80211_proto_vattach(struct ieee80211vap *); |
---|
74 | void ieee80211_proto_vdetach(struct ieee80211vap *); |
---|
75 | |
---|
76 | void ieee80211_promisc(struct ieee80211vap *, bool); |
---|
77 | void ieee80211_allmulti(struct ieee80211vap *, bool); |
---|
78 | void ieee80211_syncflag(struct ieee80211vap *, int flag); |
---|
79 | void ieee80211_syncflag_ht(struct ieee80211vap *, int flag); |
---|
80 | void ieee80211_syncflag_vht(struct ieee80211vap *, int flag); |
---|
81 | void ieee80211_syncflag_ext(struct ieee80211vap *, int flag); |
---|
82 | |
---|
83 | #define ieee80211_input(ni, m, rssi, nf) \ |
---|
84 | ((ni)->ni_vap->iv_input(ni, m, NULL, rssi, nf)) |
---|
85 | int ieee80211_input_all(struct ieee80211com *, struct mbuf *, int, int); |
---|
86 | |
---|
87 | int ieee80211_input_mimo(struct ieee80211_node *, struct mbuf *); |
---|
88 | int ieee80211_input_mimo_all(struct ieee80211com *, struct mbuf *); |
---|
89 | |
---|
90 | struct ieee80211_bpf_params; |
---|
91 | int ieee80211_mgmt_output(struct ieee80211_node *, struct mbuf *, int, |
---|
92 | struct ieee80211_bpf_params *); |
---|
93 | int ieee80211_raw_xmit(struct ieee80211_node *, struct mbuf *, |
---|
94 | const struct ieee80211_bpf_params *); |
---|
95 | int ieee80211_output(struct ifnet *, struct mbuf *, |
---|
96 | const struct sockaddr *, struct route *ro); |
---|
97 | int ieee80211_vap_pkt_send_dest(struct ieee80211vap *, struct mbuf *, |
---|
98 | struct ieee80211_node *); |
---|
99 | int ieee80211_raw_output(struct ieee80211vap *, struct ieee80211_node *, |
---|
100 | struct mbuf *, const struct ieee80211_bpf_params *); |
---|
101 | void ieee80211_send_setup(struct ieee80211_node *, struct mbuf *, int, int, |
---|
102 | const uint8_t [IEEE80211_ADDR_LEN], const uint8_t [IEEE80211_ADDR_LEN], |
---|
103 | const uint8_t [IEEE80211_ADDR_LEN]); |
---|
104 | int ieee80211_vap_transmit(struct ifnet *ifp, struct mbuf *m); |
---|
105 | void ieee80211_vap_qflush(struct ifnet *ifp); |
---|
106 | int ieee80211_send_nulldata(struct ieee80211_node *); |
---|
107 | int ieee80211_classify(struct ieee80211_node *, struct mbuf *m); |
---|
108 | struct mbuf *ieee80211_mbuf_adjust(struct ieee80211vap *, int, |
---|
109 | struct ieee80211_key *, struct mbuf *); |
---|
110 | struct mbuf *ieee80211_encap(struct ieee80211vap *, struct ieee80211_node *, |
---|
111 | struct mbuf *); |
---|
112 | void ieee80211_free_mbuf(struct mbuf *); |
---|
113 | int ieee80211_send_mgmt(struct ieee80211_node *, int, int); |
---|
114 | struct ieee80211_appie; |
---|
115 | int ieee80211_send_probereq(struct ieee80211_node *ni, |
---|
116 | const uint8_t sa[IEEE80211_ADDR_LEN], |
---|
117 | const uint8_t da[IEEE80211_ADDR_LEN], |
---|
118 | const uint8_t bssid[IEEE80211_ADDR_LEN], |
---|
119 | const uint8_t *ssid, size_t ssidlen); |
---|
120 | struct mbuf * ieee80211_ff_encap1(struct ieee80211vap *, struct mbuf *, |
---|
121 | const struct ether_header *); |
---|
122 | void ieee80211_tx_complete(struct ieee80211_node *, |
---|
123 | struct mbuf *, int); |
---|
124 | |
---|
125 | /* |
---|
126 | * The formation of ProbeResponse frames requires guidance to |
---|
127 | * deal with legacy clients. When the client is identified as |
---|
128 | * "legacy 11b" ieee80211_send_proberesp is passed this token. |
---|
129 | */ |
---|
130 | #define IEEE80211_SEND_LEGACY_11B 0x1 /* legacy 11b client */ |
---|
131 | #define IEEE80211_SEND_LEGACY_11 0x2 /* other legacy client */ |
---|
132 | #define IEEE80211_SEND_LEGACY 0x3 /* any legacy client */ |
---|
133 | struct mbuf *ieee80211_alloc_proberesp(struct ieee80211_node *, int); |
---|
134 | int ieee80211_send_proberesp(struct ieee80211vap *, |
---|
135 | const uint8_t da[IEEE80211_ADDR_LEN], int); |
---|
136 | struct mbuf *ieee80211_alloc_rts(struct ieee80211com *ic, |
---|
137 | const uint8_t [IEEE80211_ADDR_LEN], |
---|
138 | const uint8_t [IEEE80211_ADDR_LEN], uint16_t); |
---|
139 | struct mbuf *ieee80211_alloc_cts(struct ieee80211com *, |
---|
140 | const uint8_t [IEEE80211_ADDR_LEN], uint16_t); |
---|
141 | |
---|
142 | uint8_t *ieee80211_add_rates(uint8_t *, const struct ieee80211_rateset *); |
---|
143 | uint8_t *ieee80211_add_xrates(uint8_t *, const struct ieee80211_rateset *); |
---|
144 | uint8_t *ieee80211_add_ssid(uint8_t *, const uint8_t *, u_int); |
---|
145 | uint8_t *ieee80211_add_wpa(uint8_t *, const struct ieee80211vap *); |
---|
146 | uint8_t *ieee80211_add_rsn(uint8_t *, const struct ieee80211vap *); |
---|
147 | uint8_t *ieee80211_add_qos(uint8_t *, const struct ieee80211_node *); |
---|
148 | uint16_t ieee80211_getcapinfo(struct ieee80211vap *, |
---|
149 | struct ieee80211_channel *); |
---|
150 | struct ieee80211_wme_state; |
---|
151 | uint8_t * ieee80211_add_wme_info(uint8_t *frm, struct ieee80211_wme_state *wme); |
---|
152 | |
---|
153 | void ieee80211_reset_erp(struct ieee80211com *); |
---|
154 | void ieee80211_set_shortslottime(struct ieee80211com *, int onoff); |
---|
155 | int ieee80211_iserp_rateset(const struct ieee80211_rateset *); |
---|
156 | void ieee80211_setbasicrates(struct ieee80211_rateset *, |
---|
157 | enum ieee80211_phymode); |
---|
158 | void ieee80211_addbasicrates(struct ieee80211_rateset *, |
---|
159 | enum ieee80211_phymode); |
---|
160 | |
---|
161 | /* |
---|
162 | * Return the size of the 802.11 header for a management or data frame. |
---|
163 | */ |
---|
164 | static __inline int |
---|
165 | ieee80211_hdrsize(const void *data) |
---|
166 | { |
---|
167 | const struct ieee80211_frame *wh = data; |
---|
168 | int size = sizeof(struct ieee80211_frame); |
---|
169 | |
---|
170 | /* NB: we don't handle control frames */ |
---|
171 | KASSERT((wh->i_fc[0]&IEEE80211_FC0_TYPE_MASK) != IEEE80211_FC0_TYPE_CTL, |
---|
172 | ("%s: control frame", __func__)); |
---|
173 | if (IEEE80211_IS_DSTODS(wh)) |
---|
174 | size += IEEE80211_ADDR_LEN; |
---|
175 | if (IEEE80211_QOS_HAS_SEQ(wh)) |
---|
176 | size += sizeof(uint16_t); |
---|
177 | return size; |
---|
178 | } |
---|
179 | |
---|
180 | /* |
---|
181 | * Like ieee80211_hdrsize, but handles any type of frame. |
---|
182 | */ |
---|
183 | static __inline int |
---|
184 | ieee80211_anyhdrsize(const void *data) |
---|
185 | { |
---|
186 | const struct ieee80211_frame *wh = data; |
---|
187 | |
---|
188 | if ((wh->i_fc[0]&IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_CTL) { |
---|
189 | switch (wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) { |
---|
190 | case IEEE80211_FC0_SUBTYPE_CTS: |
---|
191 | case IEEE80211_FC0_SUBTYPE_ACK: |
---|
192 | return sizeof(struct ieee80211_frame_ack); |
---|
193 | case IEEE80211_FC0_SUBTYPE_BAR: |
---|
194 | return sizeof(struct ieee80211_frame_bar); |
---|
195 | } |
---|
196 | return sizeof(struct ieee80211_frame_min); |
---|
197 | } else |
---|
198 | return ieee80211_hdrsize(data); |
---|
199 | } |
---|
200 | |
---|
201 | /* |
---|
202 | * Template for an in-kernel authenticator. Authenticators |
---|
203 | * register with the protocol code and are typically loaded |
---|
204 | * as separate modules as needed. One special authenticator |
---|
205 | * is xauth; it intercepts requests so that protocols like |
---|
206 | * WPA can be handled in user space. |
---|
207 | */ |
---|
208 | struct ieee80211_authenticator { |
---|
209 | const char *ia_name; /* printable name */ |
---|
210 | int (*ia_attach)(struct ieee80211vap *); |
---|
211 | void (*ia_detach)(struct ieee80211vap *); |
---|
212 | void (*ia_node_join)(struct ieee80211_node *); |
---|
213 | void (*ia_node_leave)(struct ieee80211_node *); |
---|
214 | }; |
---|
215 | void ieee80211_authenticator_register(int type, |
---|
216 | const struct ieee80211_authenticator *); |
---|
217 | void ieee80211_authenticator_unregister(int type); |
---|
218 | const struct ieee80211_authenticator *ieee80211_authenticator_get(int auth); |
---|
219 | |
---|
220 | struct ieee80211req; |
---|
221 | /* |
---|
222 | * Template for an MAC ACL policy module. Such modules |
---|
223 | * register with the protocol code and are passed the sender's |
---|
224 | * address of each received auth frame for validation. |
---|
225 | */ |
---|
226 | struct ieee80211_aclator { |
---|
227 | const char *iac_name; /* printable name */ |
---|
228 | int (*iac_attach)(struct ieee80211vap *); |
---|
229 | void (*iac_detach)(struct ieee80211vap *); |
---|
230 | int (*iac_check)(struct ieee80211vap *, |
---|
231 | const struct ieee80211_frame *wh); |
---|
232 | int (*iac_add)(struct ieee80211vap *, |
---|
233 | const uint8_t mac[IEEE80211_ADDR_LEN]); |
---|
234 | int (*iac_remove)(struct ieee80211vap *, |
---|
235 | const uint8_t mac[IEEE80211_ADDR_LEN]); |
---|
236 | int (*iac_flush)(struct ieee80211vap *); |
---|
237 | int (*iac_setpolicy)(struct ieee80211vap *, int); |
---|
238 | int (*iac_getpolicy)(struct ieee80211vap *); |
---|
239 | int (*iac_setioctl)(struct ieee80211vap *, struct ieee80211req *); |
---|
240 | int (*iac_getioctl)(struct ieee80211vap *, struct ieee80211req *); |
---|
241 | }; |
---|
242 | void ieee80211_aclator_register(const struct ieee80211_aclator *); |
---|
243 | void ieee80211_aclator_unregister(const struct ieee80211_aclator *); |
---|
244 | const struct ieee80211_aclator *ieee80211_aclator_get(const char *name); |
---|
245 | |
---|
246 | /* flags for ieee80211_fix_rate() */ |
---|
247 | #define IEEE80211_F_DOSORT 0x00000001 /* sort rate list */ |
---|
248 | #define IEEE80211_F_DOFRATE 0x00000002 /* use fixed legacy rate */ |
---|
249 | #define IEEE80211_F_DONEGO 0x00000004 /* calc negotiated rate */ |
---|
250 | #define IEEE80211_F_DODEL 0x00000008 /* delete ignore rate */ |
---|
251 | #define IEEE80211_F_DOBRS 0x00000010 /* check basic rate set */ |
---|
252 | #define IEEE80211_F_JOIN 0x00000020 /* sta joining our bss */ |
---|
253 | #define IEEE80211_F_DOFMCS 0x00000040 /* use fixed HT rate */ |
---|
254 | int ieee80211_fix_rate(struct ieee80211_node *, |
---|
255 | struct ieee80211_rateset *, int); |
---|
256 | |
---|
257 | /* |
---|
258 | * WME/WMM support. |
---|
259 | */ |
---|
260 | struct wmeParams { |
---|
261 | uint8_t wmep_acm; |
---|
262 | uint8_t wmep_aifsn; |
---|
263 | uint8_t wmep_logcwmin; /* log2(cwmin) */ |
---|
264 | uint8_t wmep_logcwmax; /* log2(cwmax) */ |
---|
265 | uint8_t wmep_txopLimit; |
---|
266 | uint8_t wmep_noackPolicy; /* 0 (ack), 1 (no ack) */ |
---|
267 | }; |
---|
268 | #define IEEE80211_TXOP_TO_US(_txop) ((_txop)<<5) |
---|
269 | #define IEEE80211_US_TO_TXOP(_us) ((_us)>>5) |
---|
270 | |
---|
271 | struct chanAccParams { |
---|
272 | uint8_t cap_info; /* version of the current set */ |
---|
273 | struct wmeParams cap_wmeParams[WME_NUM_AC]; |
---|
274 | }; |
---|
275 | |
---|
276 | struct ieee80211_wme_state { |
---|
277 | u_int wme_flags; |
---|
278 | #define WME_F_AGGRMODE 0x00000001 /* STATUS: WME aggressive mode */ |
---|
279 | u_int wme_hipri_traffic; /* VI/VO frames in beacon interval */ |
---|
280 | u_int wme_hipri_switch_thresh;/* aggressive mode switch thresh */ |
---|
281 | u_int wme_hipri_switch_hysteresis;/* aggressive mode switch hysteresis */ |
---|
282 | |
---|
283 | struct wmeParams wme_params[4]; /* from assoc resp for each AC*/ |
---|
284 | struct chanAccParams wme_wmeChanParams; /* WME params applied to self */ |
---|
285 | struct chanAccParams wme_wmeBssChanParams;/* WME params bcast to stations */ |
---|
286 | struct chanAccParams wme_chanParams; /* params applied to self */ |
---|
287 | struct chanAccParams wme_bssChanParams; /* params bcast to stations */ |
---|
288 | |
---|
289 | int (*wme_update)(struct ieee80211com *); |
---|
290 | }; |
---|
291 | |
---|
292 | void ieee80211_wme_initparams(struct ieee80211vap *); |
---|
293 | void ieee80211_wme_updateparams(struct ieee80211vap *); |
---|
294 | void ieee80211_wme_updateparams_locked(struct ieee80211vap *); |
---|
295 | |
---|
296 | /* |
---|
297 | * Return the WME TID from a QoS frame. If no TID |
---|
298 | * is present return the index for the "non-QoS" entry. |
---|
299 | */ |
---|
300 | static __inline uint8_t |
---|
301 | ieee80211_gettid(const struct ieee80211_frame *wh) |
---|
302 | { |
---|
303 | uint8_t tid; |
---|
304 | |
---|
305 | if (IEEE80211_QOS_HAS_SEQ(wh)) { |
---|
306 | if (IEEE80211_IS_DSTODS(wh)) |
---|
307 | tid = ((const struct ieee80211_qosframe_addr4 *)wh)-> |
---|
308 | i_qos[0]; |
---|
309 | else |
---|
310 | tid = ((const struct ieee80211_qosframe *)wh)->i_qos[0]; |
---|
311 | tid &= IEEE80211_QOS_TID; |
---|
312 | } else |
---|
313 | tid = IEEE80211_NONQOS_TID; |
---|
314 | return tid; |
---|
315 | } |
---|
316 | |
---|
317 | void ieee80211_waitfor_parent(struct ieee80211com *); |
---|
318 | void ieee80211_start_locked(struct ieee80211vap *); |
---|
319 | void ieee80211_init(void *); |
---|
320 | void ieee80211_start_all(struct ieee80211com *); |
---|
321 | void ieee80211_stop_locked(struct ieee80211vap *); |
---|
322 | void ieee80211_stop(struct ieee80211vap *); |
---|
323 | void ieee80211_stop_all(struct ieee80211com *); |
---|
324 | void ieee80211_suspend_all(struct ieee80211com *); |
---|
325 | void ieee80211_resume_all(struct ieee80211com *); |
---|
326 | void ieee80211_restart_all(struct ieee80211com *); |
---|
327 | void ieee80211_dturbo_switch(struct ieee80211vap *, int newflags); |
---|
328 | void ieee80211_swbmiss(void *arg); |
---|
329 | void ieee80211_beacon_miss(struct ieee80211com *); |
---|
330 | int ieee80211_new_state(struct ieee80211vap *, enum ieee80211_state, int); |
---|
331 | int ieee80211_new_state_locked(struct ieee80211vap *, enum ieee80211_state, |
---|
332 | int); |
---|
333 | void ieee80211_print_essid(const uint8_t *, int); |
---|
334 | void ieee80211_dump_pkt(struct ieee80211com *, |
---|
335 | const uint8_t *, int, int, int); |
---|
336 | |
---|
337 | extern const char *ieee80211_opmode_name[]; |
---|
338 | extern const char *ieee80211_state_name[IEEE80211_S_MAX]; |
---|
339 | extern const char *ieee80211_wme_acnames[]; |
---|
340 | |
---|
341 | /* |
---|
342 | * Beacon frames constructed by ieee80211_beacon_alloc |
---|
343 | * have the following structure filled in so drivers |
---|
344 | * can update the frame later w/ minimal overhead. |
---|
345 | */ |
---|
346 | struct ieee80211_beacon_offsets { |
---|
347 | uint8_t bo_flags[4]; /* update/state flags */ |
---|
348 | uint16_t *bo_caps; /* capabilities */ |
---|
349 | uint8_t *bo_cfp; /* start of CFParms element */ |
---|
350 | uint8_t *bo_tim; /* start of atim/dtim */ |
---|
351 | uint8_t *bo_wme; /* start of WME parameters */ |
---|
352 | uint8_t *bo_tdma; /* start of TDMA parameters */ |
---|
353 | uint8_t *bo_tim_trailer;/* start of fixed-size trailer */ |
---|
354 | uint16_t bo_tim_len; /* atim/dtim length in bytes */ |
---|
355 | uint16_t bo_tim_trailer_len;/* tim trailer length in bytes */ |
---|
356 | uint8_t *bo_erp; /* start of ERP element */ |
---|
357 | uint8_t *bo_htinfo; /* start of HT info element */ |
---|
358 | uint8_t *bo_ath; /* start of ATH parameters */ |
---|
359 | uint8_t *bo_appie; /* start of AppIE element */ |
---|
360 | uint16_t bo_appie_len; /* AppIE length in bytes */ |
---|
361 | uint16_t bo_csa_trailer_len; |
---|
362 | uint8_t *bo_csa; /* start of CSA element */ |
---|
363 | uint8_t *bo_quiet; /* start of Quiet element */ |
---|
364 | uint8_t *bo_meshconf; /* start of MESHCONF element */ |
---|
365 | uint8_t *bo_vhtinfo; /* start of VHT info element (XXX VHTCAP?) */ |
---|
366 | uint8_t *bo_spare[2]; |
---|
367 | }; |
---|
368 | struct mbuf *ieee80211_beacon_alloc(struct ieee80211_node *); |
---|
369 | |
---|
370 | /* |
---|
371 | * Beacon frame updates are signaled through calls to iv_update_beacon |
---|
372 | * with one of the IEEE80211_BEACON_* tokens defined below. For devices |
---|
373 | * that construct beacon frames on the host this can trigger a rebuild |
---|
374 | * or defer the processing. For devices that offload beacon frame |
---|
375 | * handling this callback can be used to signal a rebuild. The bo_flags |
---|
376 | * array in the ieee80211_beacon_offsets structure is intended to record |
---|
377 | * deferred processing requirements; ieee80211_beacon_update uses the |
---|
378 | * state to optimize work. Since this structure is owned by the driver |
---|
379 | * and not visible to the 802.11 layer drivers must supply an iv_update_beacon |
---|
380 | * callback that marks the flag bits and schedules (as necessary) an update. |
---|
381 | */ |
---|
382 | enum { |
---|
383 | IEEE80211_BEACON_CAPS = 0, /* capabilities */ |
---|
384 | IEEE80211_BEACON_TIM = 1, /* DTIM/ATIM */ |
---|
385 | IEEE80211_BEACON_WME = 2, |
---|
386 | IEEE80211_BEACON_ERP = 3, /* Extended Rate Phy */ |
---|
387 | IEEE80211_BEACON_HTINFO = 4, /* HT Information */ |
---|
388 | IEEE80211_BEACON_APPIE = 5, /* Application IE's */ |
---|
389 | IEEE80211_BEACON_CFP = 6, /* CFParms */ |
---|
390 | IEEE80211_BEACON_CSA = 7, /* Channel Switch Announcement */ |
---|
391 | IEEE80211_BEACON_TDMA = 9, /* TDMA Info */ |
---|
392 | IEEE80211_BEACON_ATH = 10, /* ATH parameters */ |
---|
393 | IEEE80211_BEACON_MESHCONF = 11, /* Mesh Configuration */ |
---|
394 | }; |
---|
395 | int ieee80211_beacon_update(struct ieee80211_node *, |
---|
396 | struct mbuf *, int mcast); |
---|
397 | |
---|
398 | void ieee80211_csa_startswitch(struct ieee80211com *, |
---|
399 | struct ieee80211_channel *, int mode, int count); |
---|
400 | void ieee80211_csa_completeswitch(struct ieee80211com *); |
---|
401 | void ieee80211_csa_cancelswitch(struct ieee80211com *); |
---|
402 | void ieee80211_cac_completeswitch(struct ieee80211vap *); |
---|
403 | |
---|
404 | /* |
---|
405 | * Notification methods called from the 802.11 state machine. |
---|
406 | * Note that while these are defined here, their implementation |
---|
407 | * is OS-specific. |
---|
408 | */ |
---|
409 | void ieee80211_notify_node_join(struct ieee80211_node *, int newassoc); |
---|
410 | void ieee80211_notify_node_leave(struct ieee80211_node *); |
---|
411 | void ieee80211_notify_scan_done(struct ieee80211vap *); |
---|
412 | void ieee80211_notify_wds_discover(struct ieee80211_node *); |
---|
413 | void ieee80211_notify_csa(struct ieee80211com *, |
---|
414 | const struct ieee80211_channel *, int mode, int count); |
---|
415 | void ieee80211_notify_radar(struct ieee80211com *, |
---|
416 | const struct ieee80211_channel *); |
---|
417 | enum ieee80211_notify_cac_event { |
---|
418 | IEEE80211_NOTIFY_CAC_START = 0, /* CAC timer started */ |
---|
419 | IEEE80211_NOTIFY_CAC_STOP = 1, /* CAC intentionally stopped */ |
---|
420 | IEEE80211_NOTIFY_CAC_RADAR = 2, /* CAC stopped due to radar detectio */ |
---|
421 | IEEE80211_NOTIFY_CAC_EXPIRE = 3, /* CAC expired w/o radar */ |
---|
422 | }; |
---|
423 | void ieee80211_notify_cac(struct ieee80211com *, |
---|
424 | const struct ieee80211_channel *, |
---|
425 | enum ieee80211_notify_cac_event); |
---|
426 | void ieee80211_notify_node_deauth(struct ieee80211_node *); |
---|
427 | void ieee80211_notify_node_auth(struct ieee80211_node *); |
---|
428 | void ieee80211_notify_country(struct ieee80211vap *, const uint8_t [], |
---|
429 | const uint8_t cc[2]); |
---|
430 | void ieee80211_notify_radio(struct ieee80211com *, int); |
---|
431 | #endif /* _NET80211_IEEE80211_PROTO_H_ */ |
---|