1 /*        $NetBSD: ieee80211_var.h,v 1.35 2023/06/24 05:12:03 msaitoh Exp $     */
2 /*-
3  * Copyright (c) 2001 Atsushi Onoe
4  * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. The name of the author may not be used to endorse or promote products
16  *    derived from this software without specific prior written permission.
17  *
18  * Alternatively, this software may be distributed under the terms of the
19  * GNU General Public License ("GPL") version 2 as published by the Free
20  * Software Foundation.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  *
33  * $FreeBSD: src/sys/net80211/ieee80211_var.h,v 1.30 2005/08/10 16:22:29 sam Exp $
34  */
35 #ifndef _NET80211_IEEE80211_VAR_H_
36 #define _NET80211_IEEE80211_VAR_H_
37 
38 /*
39  * Definitions for IEEE 802.11 drivers.
40  */
41 #define   IEEE80211_DEBUG
42 #undef    IEEE80211_DEBUG_REFCNT                            /* node refcnt stuff */
43 
44 /* NB: portability glue must go first */
45 #ifdef __NetBSD__
46 #include <net80211/ieee80211_netbsd.h>
47 #elif __FreeBSD__
48 #include <net80211/ieee80211_freebsd.h>
49 #elif __linux__
50 #include <net80211/ieee80211_linux.h>
51 #else
52 #error    "No support for your operating system!"
53 #endif
54 
55 #include <sys/queue.h>        /* XXX */
56 
57 #include <net80211/_ieee80211.h>
58 #include <net80211/ieee80211.h>
59 #include <net80211/ieee80211_crypto.h>
60 #include <net80211/ieee80211_ioctl.h>             /* for ieee80211_stats */
61 #include <net80211/ieee80211_node.h>
62 #include <net80211/ieee80211_proto.h>
63 
64 #define   IEEE80211_TXPOWER_MAX         100       /* .5 dbM (XXX units?) */
65 #define   IEEE80211_TXPOWER_MIN         0         /* kill radio */
66 
67 #define   IEEE80211_DTIM_MAX  15        /* max DTIM period */
68 #define   IEEE80211_DTIM_MIN  1         /* min DTIM period */
69 #define   IEEE80211_DTIM_DEFAULT        1         /* default DTIM period */
70 
71 /* NB: min+max come from WiFi requirements */
72 #define   IEEE80211_BINTVAL_MAX         1000      /* max beacon interval (TU's) */
73 #define   IEEE80211_BINTVAL_MIN         25        /* min beacon interval (TU's) */
74 #define   IEEE80211_BINTVAL_DEFAULT 100 /* default beacon interval (TU's) */
75 
76 #define   IEEE80211_BMISS_MAX 2         /* maximum consecutive bmiss allowed */
77 
78 #define   IEEE80211_PS_SLEEP  0x1       /* STA is in power saving mode */
79 #define   IEEE80211_PS_MAX_QUEUE        50        /* maximum saved packets */
80 
81 #define   IEEE80211_FIXED_RATE_NONE     -1
82 #define   IEEE80211_MCAST_RATE_DEFAULT  (2*1)     /* default mcast rate (1M) */
83 
84 #define   IEEE80211_RTS_DEFAULT                   IEEE80211_RTS_MAX
85 #define   IEEE80211_FRAG_DEFAULT                  IEEE80211_FRAG_MAX
86 
87 #define   IEEE80211_MS_TO_TU(x)         (((x) * 1000) / 1024)
88 #define   IEEE80211_TU_TO_MS(x)         (((x) * 1024) / 1000)
89 
90 struct ieee80211_aclator;
91 
92 #define   IEEE80211_PS_SLEEP  0x1       /* STA is in power saving mode */
93 
94 #define   IEEE80211_PS_MAX_QUEUE        50        /* maximum saved packets */
95 
96 struct ieee80211com {
97           SLIST_ENTRY(ieee80211com) ic_next;
98           struct ifnet                  *ic_ifp;  /* associated device */
99           struct ieee80211_stats        ic_stats; /* statistics */
100           struct sysctllog    *ic_sysctllog;      /* for destroying sysctl tree */
101           u_int32_t           ic_debug; /* debug msg flags */
102           int                           ic_vap;             /* virtual AP index */
103           ieee80211_beacon_lock_t       ic_beaconlock;      /* beacon update lock */
104 
105           LIST_ENTRY(ieee80211com) ic_list;       /* chain of all ieee80211com */
106           int                           (*ic_reset)(struct ifnet *);
107           void                          (*ic_recv_mgmt)(struct ieee80211com *,
108                                             struct mbuf *, struct ieee80211_node *,
109                                             int, int, u_int32_t);
110           int                           (*ic_send_mgmt)(struct ieee80211com *,
111                                             struct ieee80211_node *, int, int);
112           int                           (*ic_newstate)(struct ieee80211com *,
113                                             enum ieee80211_state, int);
114           void                          (*ic_newassoc)(struct ieee80211_node *, int);
115           void                          (*ic_updateslot)(struct ifnet *);
116           void                          (*ic_set_tim)(struct ieee80211_node *, int);
117           u_int8_t            ic_myaddr[IEEE80211_ADDR_LEN];
118           struct ieee80211_rateset ic_sup_rates[IEEE80211_MODE_MAX];
119           struct ieee80211_channel ic_channels[IEEE80211_CHAN_MAX+1];
120           u_int8_t            ic_chan_avail[IEEE80211_CHAN_BYTES];
121           u_int8_t            ic_chan_active[IEEE80211_CHAN_BYTES];
122           u_int8_t            ic_chan_scan[IEEE80211_CHAN_BYTES];
123           struct ieee80211_node_table ic_scan;    /* scan candidates */
124           struct ifqueue                ic_mgtq;
125           u_int32_t           ic_flags; /* state flags */
126           u_int32_t           ic_flags_ext;       /* extended state flags */
127           u_int32_t           ic_caps;  /* capabilities */
128           u_int16_t           ic_modecaps;        /* set of mode capabilities */
129           u_int16_t           ic_curmode;         /* current mode */
130           enum ieee80211_phytype        ic_phytype;         /* XXX wrong for multi-mode */
131           enum ieee80211_opmode         ic_opmode;          /* operation mode */
132           enum ieee80211_state          ic_state; /* 802.11 state */
133           enum ieee80211_protmode       ic_protmode;        /* 802.11g protection mode */
134           enum ieee80211_roamingmode ic_roaming;  /* roaming mode */
135           struct ieee80211_node_table ic_sta;     /* stations/neighbors */
136           u_int32_t           *ic_aid_bitmap;     /* association id map */
137           u_int16_t           ic_max_aid;
138           u_int16_t           ic_sta_assoc;       /* stations associated */
139           u_int16_t           ic_ps_sta;          /* stations in power save */
140           u_int16_t           ic_ps_pending;      /* ps sta's w/ pending frames */
141           u_int8_t            *ic_tim_bitmap;     /* power-save stations w/ data*/
142           u_int16_t           ic_tim_len;         /* ic_tim_bitmap size (bytes) */
143           u_int8_t            ic_dtim_period;     /* DTIM period */
144           u_int8_t            ic_dtim_count;      /* DTIM count for last bcn */
145           struct ifmedia                ic_media; /* interface media config */
146           struct bpf_if *               ic_rawbpf;          /* packet filter structure */
147           struct ieee80211_node         *ic_bss;  /* information for this node */
148           struct ieee80211_channel *ic_ibss_chan;
149           struct ieee80211_channel *ic_curchan;   /* current channel */
150           int                           ic_fixed_rate;      /* index to ic_sup_rates[] */
151           int                           ic_mcast_rate;      /* rate for mcast frames */
152           u_int16_t           ic_rtsthreshold;
153           u_int16_t           ic_fragthreshold;
154           u_int8_t            ic_bmiss_count;     /* current beacon miss count */
155           int                           ic_bmiss_max;       /* max bmiss before scan */
156           struct ieee80211_node         *(*ic_node_alloc)(struct ieee80211_node_table*);
157           void                          (*ic_node_free)(struct ieee80211_node *);
158           void                          (*ic_node_cleanup)(struct ieee80211_node *);
159           u_int8_t            (*ic_node_getrssi)(const struct ieee80211_node*);
160           u_int16_t           ic_lintval;         /* listen interval */
161           u_int16_t           ic_bintval;         /* beacon interval */
162           u_int16_t           ic_holdover;        /* PM hold over duration */
163           u_int16_t           ic_txmin; /* min tx retry count */
164           u_int16_t           ic_txmax; /* max tx retry count */
165           u_int16_t           ic_txlifetime;      /* tx lifetime */
166           u_int16_t           ic_txpowlimit;      /* global tx power limit */
167           u_int16_t           ic_bmisstimeout;/* beacon miss threshold (ms) */
168           u_int16_t           ic_nonerpsta;       /* # non-ERP stations */
169           u_int16_t           ic_longslotsta;     /* # long slot time stations */
170           int                           ic_mgt_timer;       /* mgmt timeout */
171           int                           ic_inact_timer;     /* inactivity timer wait */
172           int                           ic_des_esslen;
173           u_int8_t            ic_des_essid[IEEE80211_NWID_LEN];
174           struct ieee80211_channel *ic_des_chan;  /* desired channel */
175           u_int8_t            ic_des_bssid[IEEE80211_ADDR_LEN];
176           void                          *ic_opt_ie;         /* user-specified IE's */
177           u_int16_t           ic_opt_ie_len;      /* length of ni_opt_ie */
178           /*
179            * Inactivity timer settings for nodes.
180            */
181           int                           ic_inact_init;      /* initial setting */
182           int                           ic_inact_auth;      /* auth but not assoc setting */
183           int                           ic_inact_run;       /* authorized setting */
184           int                           ic_inact_probe;     /* inactive probe time */
185 
186           /*
187            * WME/WMM state.
188            */
189           struct ieee80211_wme_state ic_wme;
190 
191           /*
192            * Cipher state/configuration.
193            */
194           struct ieee80211_crypto_state ic_crypto;
195 #define   ic_nw_keys          ic_crypto.cs_nw_keys          /* XXX compatibility */
196 #define   ic_def_txkey        ic_crypto.cs_def_txkey        /* XXX compatibility */
197 
198           /*
199            * 802.1x glue.  When an authenticator attaches it
200            * fills in this section.  We assume that when ic_ec
201            * is setup that the methods are safe to call.
202            */
203           const struct ieee80211_authenticator *ic_auth;
204           struct eapolcom               *ic_ec;
205 
206           /*
207            * Access control glue.  When a control agent attaches
208            * it fills in this section.  We assume that when ic_ac
209            * is setup that the methods are safe to call.
210            */
211           const struct ieee80211_aclator *ic_acl;
212           void                          *ic_as;
213 };
214 
215 LIST_HEAD(ieee80211com_head, ieee80211com);
216 
217 extern struct ieee80211com_head ieee80211com_head;
218 
219 #define   IEEE80211_ADDR_EQ(a1,a2)      (memcmp(a1,a2,IEEE80211_ADDR_LEN) == 0)
220 #define   IEEE80211_ADDR_COPY(dst,src)  memcpy(dst,src,IEEE80211_ADDR_LEN)
221 
222 /* ic_flags */
223 /* NB: bits 0x4c available */
224 #define   IEEE80211_F_FF                0x00000001          /* CONF: ATH FF enabled */
225 #define   IEEE80211_F_TURBOP  0x00000002          /* CONF: ATH Turbo enabled*/
226 /* NB: this is intentionally setup to be IEEE80211_CAPINFO_PRIVACY */
227 #define   IEEE80211_F_PRIVACY 0x00000010          /* CONF: privacy enabled */
228 #define   IEEE80211_F_PUREG   0x00000020          /* CONF: 11g w/o 11b sta's */
229 #define   IEEE80211_F_SCAN    0x00000080          /* STATUS: scanning */
230 #define   IEEE80211_F_ASCAN   0x00000100          /* STATUS: active scan */
231 #define   IEEE80211_F_SIBSS   0x00000200          /* STATUS: start IBSS */
232 /* NB: this is intentionally setup to be IEEE80211_CAPINFO_SHORT_SLOTTIME */
233 #define   IEEE80211_F_SHSLOT  0x00000400          /* STATUS: use short slot time*/
234 #define   IEEE80211_F_PMGTON  0x00000800          /* CONF: Power mgmt enable */
235 #define   IEEE80211_F_DESBSSID          0x00001000          /* CONF: des_bssid is set */
236 #define   IEEE80211_F_WME               0x00002000          /* CONF: enable WME use */
237 #define   IEEE80211_F_BGSCAN  0x00004000          /* CONF: bg scan enabled (???)*/
238 #define   IEEE80211_F_SWRETRY 0x00008000          /* CONF: sw tx retry enabled */
239 #define IEEE80211_F_TXPOW_FIXED         0x00010000          /* TX Power: fixed rate */
240 #define   IEEE80211_F_IBSSON  0x00020000          /* CONF: IBSS creation enable */
241 #define   IEEE80211_F_SHPREAMBLE        0x00040000          /* STATUS: use short preamble */
242 #define   IEEE80211_F_DATAPAD 0x00080000          /* CONF: do alignment pad */
243 #define   IEEE80211_F_USEPROT 0x00100000          /* STATUS: protection enabled */
244 #define   IEEE80211_F_USEBARKER         0x00200000          /* STATUS: use barker preamble*/
245 #define   IEEE80211_F_TIMUPDATE         0x00400000          /* STATUS: update beacon tim */
246 #define   IEEE80211_F_WPA1    0x00800000          /* CONF: WPA enabled */
247 #define   IEEE80211_F_WPA2    0x01000000          /* CONF: WPA2 enabled */
248 #define   IEEE80211_F_WPA               0x01800000          /* CONF: WPA/WPA2 enabled */
249 #define   IEEE80211_F_DROPUNENC         0x02000000          /* CONF: drop unencrypted */
250 #define   IEEE80211_F_COUNTERM          0x04000000          /* CONF: TKIP countermeasures */
251 #define   IEEE80211_F_HIDESSID          0x08000000          /* CONF: hide SSID in beacon */
252 #define   IEEE80211_F_NOBRIDGE          0x10000000          /* CONF: dis. internal bridge */
253 #define   IEEE80211_F_WMEUPDATE         0x20000000          /* STATUS: update beacon wme */
254 
255 /* ic_flags_ext */
256 #define   IEEE80211_FEXT_WDS  0x00000001          /* CONF: 4 addr allowed */
257 /* 0x00000006 reserved */
258 #define   IEEE80211_FEXT_BGSCAN         0x00000008          /* STATUS: enable full bgscan completion */
259 #define   IEEE80211_FEXT_PROBECHAN 0x00020000     /* CONF: probe passive channel*/
260 
261 /* ic_caps */
262 #define   IEEE80211_C_WEP               0x00000001          /* CAPABILITY: WEP available */
263 #define   IEEE80211_C_TKIP    0x00000002          /* CAPABILITY: TKIP available */
264 #define   IEEE80211_C_AES               0x00000004          /* CAPABILITY: AES OCB avail */
265 #define   IEEE80211_C_AES_CCM 0x00000008          /* CAPABILITY: AES CCM avail */
266 #define   IEEE80211_C_CKIP    0x00000020          /* CAPABILITY: CKIP available */
267 #define   IEEE80211_C_FF                0x00000040          /* CAPABILITY: ATH FF avail */
268 #define   IEEE80211_C_TURBOP  0x00000080          /* CAPABILITY: ATH Turbo avail*/
269 #define   IEEE80211_C_IBSS    0x00000100          /* CAPABILITY: IBSS available */
270 #define   IEEE80211_C_PMGT    0x00000200          /* CAPABILITY: Power mgmt */
271 #define   IEEE80211_C_HOSTAP  0x00000400          /* CAPABILITY: HOSTAP avail */
272 #define   IEEE80211_C_AHDEMO  0x00000800          /* CAPABILITY: Old Adhoc Demo */
273 #define   IEEE80211_C_SWRETRY 0x00001000          /* CAPABILITY: sw tx retry */
274 #define   IEEE80211_C_TXPMGT  0x00002000          /* CAPABILITY: tx power mgmt */
275 #define   IEEE80211_C_SHSLOT  0x00004000          /* CAPABILITY: short slottime */
276 #define   IEEE80211_C_SHPREAMBLE        0x00008000          /* CAPABILITY: short preamble */
277 #define   IEEE80211_C_MONITOR 0x00010000          /* CAPABILITY: monitor mode */
278 #define   IEEE80211_C_TKIPMIC 0x00020000          /* CAPABILITY: TKIP MIC avail */
279 #define IEEE80211_C_WME_TKIPMIC 0x00040000      /* CAPABILITY: TKIP MIC for QoS
280                                                                frame */
281 /* 0x780000 available */
282 #define   IEEE80211_C_WPA1    0x00800000          /* CAPABILITY: WPA1 avail */
283 #define   IEEE80211_C_WPA2    0x01000000          /* CAPABILITY: WPA2 avail */
284 #define   IEEE80211_C_WPA               0x01800000          /* CAPABILITY: WPA1+WPA2 avail*/
285 #define   IEEE80211_C_BURST   0x02000000          /* CAPABILITY: frame bursting */
286 #define   IEEE80211_C_WME               0x04000000          /* CAPABILITY: WME avail */
287 #define   IEEE80211_C_WDS               0x08000000          /* CAPABILITY: 4-addr support */
288 /* 0x10000000 reserved */
289 #define   IEEE80211_C_BGSCAN  0x20000000          /* CAPABILITY: bg scanning */
290 #define   IEEE80211_C_TXFRAG  0x40000000          /* CAPABILITY: tx fragments */
291 /* XXX protection/barker? */
292 
293 #define   IEEE80211_C_CRYPTO  0x0000002f          /* CAPABILITY: crypto alg's */
294 
295 void      ieee80211_ifattach(struct ieee80211com *);
296 void      ieee80211_ifdetach(struct ieee80211com *);
297 void      ieee80211_announce(struct ieee80211com *);
298 void      ieee80211_media_init(struct ieee80211com *,
299                     ifm_change_cb_t, ifm_stat_cb_t);
300 void      ieee80211_media_init_with_lock(struct ieee80211com *,
301                     ifm_change_cb_t, ifm_stat_cb_t, ieee80211_media_lock_t *);
302 struct ieee80211com *ieee80211_find_vap(const u_int8_t mac[IEEE80211_ADDR_LEN]);
303 int       ieee80211_media_change(struct ifnet *);
304 void      ieee80211_media_status(struct ifnet *, struct ifmediareq *);
305 int       ieee80211_ioctl(struct ieee80211com *, u_long, void *);
306 int       ieee80211_cfgget(struct ieee80211com *, u_long, void *);
307 int       ieee80211_cfgset(struct ieee80211com *, u_long, void *);
308 void      ieee80211_watchdog(struct ieee80211com *);
309 int       ieee80211_rate2media(struct ieee80211com *, int,
310                     enum ieee80211_phymode);
311 int       ieee80211_media2rate(int);
312 u_int     ieee80211_mhz2ieee(u_int, u_int);
313 u_int     ieee80211_chan2ieee(struct ieee80211com *, struct ieee80211_channel *);
314 u_int     ieee80211_ieee2mhz(u_int, u_int);
315 int       ieee80211_setmode(struct ieee80211com *, enum ieee80211_phymode);
316 enum ieee80211_phymode ieee80211_chan2mode(struct ieee80211com *,
317                     struct ieee80211_channel *);
318 int       ieee80211_get_rate(const struct ieee80211_node *);
319 
320 /*
321  * Key update synchronization methods.  XXX should not be visible.
322  */
323 static __inline void
ieee80211_key_update_begin(struct ieee80211com * ic)324 ieee80211_key_update_begin(struct ieee80211com *ic)
325 {
326           ic->ic_crypto.cs_key_update_begin(ic);
327 }
328 static __inline void
ieee80211_key_update_end(struct ieee80211com * ic)329 ieee80211_key_update_end(struct ieee80211com *ic)
330 {
331           ic->ic_crypto.cs_key_update_end(ic);
332 }
333 
334 /*
335  * XXX these need to be here for IEEE80211_F_DATAPAD
336  */
337 
338 /*
339  * Return the space occupied by the 802.11 header and any
340  * padding required by the driver.  This works for a
341  * management or data frame.
342  */
343 static __inline int
ieee80211_hdrspace(struct ieee80211com * ic,const void * data)344 ieee80211_hdrspace(struct ieee80211com *ic, const void *data)
345 {
346           int size = ieee80211_hdrsize(data);
347           if (ic->ic_flags & IEEE80211_F_DATAPAD)
348                     size = roundup(size, sizeof(u_int32_t));
349           return size;
350 }
351 
352 /*
353  * Like ieee80211_hdrspace, but handles any type of frame.
354  */
355 static __inline int
ieee80211_anyhdrspace(struct ieee80211com * ic,const void * data)356 ieee80211_anyhdrspace(struct ieee80211com *ic, const void *data)
357 {
358           int size = ieee80211_anyhdrsize(data);
359           if (ic->ic_flags & IEEE80211_F_DATAPAD)
360                     size = roundup(size, sizeof(u_int32_t));
361           return size;
362 }
363 
364 /* Flags set in ic_debug, used to print debug messages */
365 #define   IEEE80211_MSG_DEBUG 0x40000000          /* IFF_DEBUG equivalent */
366 #define   IEEE80211_MSG_DUMPPKTS        0x20000000          /* IFF_LINK2 equivalent */
367 #define   IEEE80211_MSG_CRYPTO          0x10000000          /* crypto work */
368 #define   IEEE80211_MSG_INPUT 0x08000000          /* input handling */
369 #define   IEEE80211_MSG_XRATE 0x04000000          /* rate set handling */
370 #define   IEEE80211_MSG_ELEMID          0x02000000          /* element id parsing */
371 #define   IEEE80211_MSG_NODE  0x01000000          /* node handling */
372 #define   IEEE80211_MSG_ASSOC 0x00800000          /* association handling */
373 #define   IEEE80211_MSG_AUTH  0x00400000          /* authentication handling */
374 #define   IEEE80211_MSG_SCAN  0x00200000          /* scanning */
375 #define   IEEE80211_MSG_OUTPUT          0x00100000          /* output handling */
376 #define   IEEE80211_MSG_STATE 0x00080000          /* state machine */
377 #define   IEEE80211_MSG_POWER 0x00040000          /* power save handling */
378 #define   IEEE80211_MSG_DOT1X 0x00020000          /* 802.1x authenticator */
379 #define   IEEE80211_MSG_DOT1XSM         0x00010000          /* 802.1x state machine */
380 #define   IEEE80211_MSG_RADIUS          0x00008000          /* 802.1x radius client */
381 #define   IEEE80211_MSG_RADDUMP         0x00004000          /* dump 802.1x radius packets */
382 #define   IEEE80211_MSG_RADKEYS         0x00002000          /* dump 802.1x keys */
383 #define   IEEE80211_MSG_WPA   0x00001000          /* WPA/RSN protocol */
384 #define   IEEE80211_MSG_ACL   0x00000800          /* ACL handling */
385 #define   IEEE80211_MSG_WME   0x00000400          /* WME protocol */
386 #define   IEEE80211_MSG_SUPERG          0x00000200          /* Atheros SuperG protocol */
387 #define   IEEE80211_MSG_DOTH  0x00000100          /* 802.11h support */
388 #define   IEEE80211_MSG_INACT 0x00000080          /* inactivity handling */
389 #define   IEEE80211_MSG_ROAM  0x00000040          /* sta-mode roaming */
390 #define   IEEE80211_MSG_ANY   0xffffffff          /* anything */
391 
392 #ifdef IEEE80211_DEBUG
393 #define   ieee80211_msg(_ic, _m)        ((_ic)->ic_debug & (_m))
394 #define   IEEE80211_DPRINTF(_ic, _m, _fmt, ...) do {                            \
395           if (ieee80211_msg(_ic, _m))                                           \
396                     ieee80211_note(_ic, _fmt, __VA_ARGS__);                     \
397 } while (0)
398 #define   IEEE80211_NOTE(_ic, _m, _ni, _fmt, ...) do {                          \
399           if (ieee80211_msg(_ic, _m))                                           \
400                     ieee80211_note_mac(_ic, (_ni)->ni_macaddr, _fmt, __VA_ARGS__);\
401 } while (0)
402 #define   IEEE80211_NOTE_MAC(_ic, _m, _mac, _fmt, ...) do {           \
403           if (ieee80211_msg(_ic, _m))                                           \
404                     ieee80211_note_mac(_ic, _mac, _fmt, __VA_ARGS__); \
405 } while (0)
406 void      ieee80211_note(struct ieee80211com *ic, const char *fmt, ...);
407 void      ieee80211_note_mac(struct ieee80211com *ic,
408                     const u_int8_t mac[IEEE80211_ADDR_LEN], const char *fmt, ...);
409 #define   ieee80211_msg_debug(_ic) \
410           ((_ic)->ic_debug & IEEE80211_MSG_DEBUG)
411 #define   ieee80211_msg_dumppkts(_ic) \
412           ((_ic)->ic_debug & IEEE80211_MSG_DUMPPKTS)
413 #define   ieee80211_msg_input(_ic) \
414           ((_ic)->ic_debug & IEEE80211_MSG_INPUT)
415 #define   ieee80211_msg_radius(_ic) \
416           ((_ic)->ic_debug & IEEE80211_MSG_RADIUS)
417 #define   ieee80211_msg_dumpradius(_ic) \
418           ((_ic)->ic_debug & IEEE80211_MSG_RADDUMP)
419 #define   ieee80211_msg_dumpradkeys(_ic) \
420           ((_ic)->ic_debug & IEEE80211_MSG_RADKEYS)
421 #define   ieee80211_msg_scan(_ic) \
422           ((_ic)->ic_debug & IEEE80211_MSG_SCAN)
423 #define   ieee80211_msg_assoc(_ic) \
424           ((_ic)->ic_debug & IEEE80211_MSG_ASSOC)
425 #else
426 #define   IEEE80211_DPRINTF(_ic, _m, _fmt, ...)
427 #define   IEEE80211_NOTE(_ic, _m, _ni, _fmt, ...)
428 #define   IEEE80211_NOTE_MAC(_ic, _m, _mac, _fmt, ...)
429 #define   ieee80211_msg_dumppkts(_ic)   0
430 #define   ieee80211_msg(_ic, _m)                  0
431 #endif
432 
433 #endif /* !_NET80211_IEEE80211_VAR_H_ */
434