2 * Copyright (c) 2007-2009 Sam Leffler, Errno Consulting
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 * $FreeBSD: head/sys/net80211/ieee80211_ddb.c 196019 2009-08-01 19:26:27Z rwatson $
33 * IEEE 802.11 DDB support
35 #include <sys/param.h>
36 #include <sys/systm.h>
37 #include <sys/kernel.h>
38 #include <sys/socket.h>
41 #include <net/if_dl.h>
42 #include <net/if_media.h>
43 #include <net/if_types.h>
44 #include <net/ethernet.h>
45 #include <net/route.h>
47 #include <netproto/802_11/ieee80211_var.h>
48 #ifdef IEEE80211_SUPPORT_TDMA
49 #include <netproto/802_11/ieee80211_tdma.h>
51 #ifdef IEEE80211_SUPPORT_MESH
52 #include <netproto/802_11/ieee80211_mesh.h>
56 #include <ddb/db_sym.h>
58 #define DB_PRINTSYM(prefix, name, addr) do { \
59 db_printf("%s%-25s : ", prefix, name); \
60 db_printsym((db_addr_t) addr, DB_STGY_ANY); \
64 static void _db_show_sta(const struct ieee80211_node
*);
65 static void _db_show_vap(const struct ieee80211vap
*, int);
66 static void _db_show_com(const struct ieee80211com
*,
67 int showvaps
, int showsta
, int showprocs
);
69 static void _db_show_node_table(const char *tag
,
70 const struct ieee80211_node_table
*);
71 static void _db_show_channel(const char *tag
, const struct ieee80211_channel
*);
72 static void _db_show_ssid(const char *tag
, int ix
, int len
, const uint8_t *);
73 static void _db_show_appie(const char *tag
, const struct ieee80211_appie
*);
74 static void _db_show_key(const char *tag
, int ix
, const struct ieee80211_key
*);
75 static void _db_show_roamparams(const char *tag
, const void *arg
,
76 const struct ieee80211_roamparam
*rp
);
77 static void _db_show_txparams(const char *tag
, const void *arg
,
78 const struct ieee80211_txparam
*tp
);
79 static void _db_show_ageq(const char *tag
, const struct ieee80211_ageq
*q
);
80 static void _db_show_stats(const struct ieee80211_stats
*);
82 #ifdef IEEE80211_SUPPORT_MESH
83 static void _db_show_mesh(const struct ieee80211_mesh_state
*);
87 DB_SHOW_COMMAND(sta
, db_show_sta
)
90 db_printf("usage: show sta <addr>\n");
93 _db_show_sta((const struct ieee80211_node
*) addr
);
96 DB_SHOW_COMMAND(statab
, db_show_statab
)
99 db_printf("usage: show statab <addr>\n");
102 _db_show_node_table("", (const struct ieee80211_node_table
*) addr
);
105 DB_SHOW_COMMAND(vap
, db_show_vap
)
107 int i
, showprocs
= 0;
110 db_printf("usage: show vap <addr>\n");
113 for (i
= 0; modif
[i
] != '\0'; i
++)
122 _db_show_vap((const struct ieee80211vap
*) addr
, showprocs
);
125 DB_SHOW_COMMAND(com
, db_show_com
)
127 const struct ieee80211com
*ic
;
128 int i
, showprocs
= 0, showvaps
= 0, showsta
= 0;
131 db_printf("usage: show com <addr>\n");
134 for (i
= 0; modif
[i
] != '\0'; i
++)
137 showsta
= showvaps
= showprocs
= 1;
150 ic
= (const struct ieee80211com
*) addr
;
151 _db_show_com(ic
, showvaps
, showsta
, showprocs
);
155 DB_SHOW_ALL_COMMAND(vaps
, db_show_all_vaps
)
157 const struct ifnet
*ifp
;
160 for (i
= 0; modif
[i
] != '\0'; i
++)
167 TAILQ_FOREACH(ifp
, &ifnet
, if_list
) {
168 if (ifp
->if_type
== IFT_IEEE80211
) {
169 const struct ieee80211com
*ic
= ifp
->if_l2com
;
172 const struct ieee80211vap
*vap
;
173 db_printf("%s: com %p vaps:",
175 TAILQ_FOREACH(vap
, &ic
->ic_vaps
,
178 vap
->iv_ifp
->if_xname
, vap
);
181 _db_show_com(ic
, 1, 1, 1);
188 #ifdef IEEE80211_SUPPORT_MESH
189 DB_SHOW_ALL_COMMAND(mesh
, db_show_mesh
)
191 const struct ieee80211_mesh_state
*ms
;
194 db_printf("usage: show mesh <addr>\n");
197 ms
= (const struct ieee80211_mesh_state
*) addr
;
200 #endif /* IEEE80211_SUPPORT_MESH */
204 _db_show_txampdu(const char *sep
, int ix
, const struct ieee80211_tx_ampdu
*tap
)
206 db_printf("%stxampdu[%d]: %p flags %b %s\n",
207 sep
, ix
, tap
, tap
->txa_flags
, IEEE80211_AGGR_BITS
,
208 ieee80211_wme_acnames
[tap
->txa_ac
]);
209 db_printf("%s token %u lastsample %d pkts %d avgpps %d qbytes %d qframes %d\n",
210 sep
, tap
->txa_token
, tap
->txa_lastsample
, tap
->txa_pkts
,
211 tap
->txa_avgpps
, tap
->txa_qbytes
, tap
->txa_qframes
);
212 db_printf("%s start %u seqpending %u wnd %u attempts %d nextrequest %d\n",
213 sep
, tap
->txa_start
, tap
->txa_seqpending
, tap
->txa_wnd
,
214 tap
->txa_attempts
, tap
->txa_nextrequest
);
219 _db_show_rxampdu(const char *sep
, int ix
, const struct ieee80211_rx_ampdu
*rap
)
223 db_printf("%srxampdu[%d]: %p flags 0x%x tid %u\n",
224 sep
, ix
, rap
, rap
->rxa_flags
, ix
/*XXX */);
225 db_printf("%s qbytes %d qframes %d seqstart %u start %u wnd %u\n",
226 sep
, rap
->rxa_qbytes
, rap
->rxa_qframes
,
227 rap
->rxa_seqstart
, rap
->rxa_start
, rap
->rxa_wnd
);
228 db_printf("%s age %d nframes %d\n", sep
,
229 rap
->rxa_age
, rap
->rxa_nframes
);
230 for (i
= 0; i
< IEEE80211_AGGR_BAWMAX
; i
++)
231 if (rap
->rxa_m
[i
] != NULL
)
232 db_printf("%s m[%2u:%4u] %p\n", sep
, i
,
233 IEEE80211_SEQ_ADD(rap
->rxa_start
, i
),
238 _db_show_sta(const struct ieee80211_node
*ni
)
242 db_printf("0x%p: mac %6D refcnt %d\n", ni
,
243 ni
->ni_macaddr
, ":", ieee80211_node_refcnt(ni
));
244 db_printf("\tvap %p wdsvap %p ic %p table %p\n",
245 ni
->ni_vap
, ni
->ni_wdsvap
, ni
->ni_ic
, ni
->ni_table
);
246 db_printf("\tflags=%b\n", ni
->ni_flags
, IEEE80211_NODE_BITS
);
247 db_printf("\tscangen %u authmode %u ath_flags 0x%x ath_defkeyix %u\n",
248 ni
->ni_scangen
, ni
->ni_authmode
,
249 ni
->ni_ath_flags
, ni
->ni_ath_defkeyix
);
250 db_printf("\tassocid 0x%x txpower %u vlan %u\n",
251 ni
->ni_associd
, ni
->ni_txpower
, ni
->ni_vlan
);
252 db_printf("\tjointime %d (%lu secs) challenge %p\n",
253 ni
->ni_jointime
, (unsigned long)(time_second
- ni
->ni_jointime
),
255 db_printf("\ties: data %p len %d\n", ni
->ni_ies
.data
, ni
->ni_ies
.len
);
256 db_printf("\t[wpa_ie %p rsn_ie %p wme_ie %p ath_ie %p\n",
257 ni
->ni_ies
.wpa_ie
, ni
->ni_ies
.rsn_ie
, ni
->ni_ies
.wme_ie
,
259 db_printf("\t htcap_ie %p htinfo_ie %p]\n",
260 ni
->ni_ies
.htcap_ie
, ni
->ni_ies
.htinfo_ie
);
261 if (ni
->ni_flags
& IEEE80211_NODE_QOS
) {
262 for (i
= 0; i
< WME_NUM_TID
; i
++) {
263 if (ni
->ni_txseqs
[i
] || ni
->ni_rxseqs
[i
])
264 db_printf("\t[%u] txseq %u rxseq %u fragno %u\n",
266 ni
->ni_rxseqs
[i
] >> IEEE80211_SEQ_SEQ_SHIFT
,
267 ni
->ni_rxseqs
[i
] & IEEE80211_SEQ_FRAG_MASK
);
270 db_printf("\ttxseq %u rxseq %u fragno %u rxfragstamp %u\n",
271 ni
->ni_txseqs
[IEEE80211_NONQOS_TID
],
272 ni
->ni_rxseqs
[IEEE80211_NONQOS_TID
] >> IEEE80211_SEQ_SEQ_SHIFT
,
273 ni
->ni_rxseqs
[IEEE80211_NONQOS_TID
] & IEEE80211_SEQ_FRAG_MASK
,
275 db_printf("\trxfrag[0] %p rxfrag[1] %p rxfrag[2] %p\n",
276 ni
->ni_rxfrag
[0], ni
->ni_rxfrag
[1], ni
->ni_rxfrag
[2]);
277 _db_show_key("\tucastkey", 0, &ni
->ni_ucastkey
);
278 db_printf("\tavgrssi 0x%x (rssi %d) noise %d\n",
279 ni
->ni_avgrssi
, IEEE80211_RSSI_GET(ni
->ni_avgrssi
),
281 db_printf("\tintval %u capinfo %b\n",
282 ni
->ni_intval
, ni
->ni_capinfo
, IEEE80211_CAPINFO_BITS
);
283 db_printf("\tbssid %6D", ni
->ni_bssid
, ":");
284 _db_show_ssid(" essid ", 0, ni
->ni_esslen
, ni
->ni_essid
);
286 _db_show_channel("\tchannel", ni
->ni_chan
);
288 db_printf("\terp %b dtim_period %u dtim_count %u\n",
289 ni
->ni_erp
, IEEE80211_ERP_BITS
,
290 ni
->ni_dtim_period
, ni
->ni_dtim_count
);
292 db_printf("\thtcap %b htparam 0x%x htctlchan %u ht2ndchan %u\n",
293 ni
->ni_htcap
, IEEE80211_HTCAP_BITS
,
294 ni
->ni_htparam
, ni
->ni_htctlchan
, ni
->ni_ht2ndchan
);
295 db_printf("\thtopmode 0x%x htstbc 0x%x chw %u\n",
296 ni
->ni_htopmode
, ni
->ni_htstbc
, ni
->ni_chw
);
298 /* XXX ampdu state */
299 for (i
= 0; i
< WME_NUM_AC
; i
++)
300 if (ni
->ni_tx_ampdu
[i
].txa_flags
& IEEE80211_AGGR_SETUP
)
301 _db_show_txampdu("\t", i
, &ni
->ni_tx_ampdu
[i
]);
302 for (i
= 0; i
< WME_NUM_TID
; i
++)
303 if (ni
->ni_rx_ampdu
[i
].rxa_flags
)
304 _db_show_rxampdu("\t", i
, &ni
->ni_rx_ampdu
[i
]);
306 db_printf("\tinact %u inact_reload %u txrate %u\n",
307 ni
->ni_inact
, ni
->ni_inact_reload
, ni
->ni_txrate
);
308 #ifdef IEEE80211_SUPPORT_MESH
309 _db_show_ssid("\tmeshid ", 0, ni
->ni_meshidlen
, ni
->ni_meshid
);
310 db_printf(" mlstate %b mllid 0x%x mlpid 0x%x mlrcnt %u mltval %u\n",
311 ni
->ni_mlstate
, IEEE80211_MESH_MLSTATE_BITS
,
312 ni
->ni_mllid
, ni
->ni_mlpid
, ni
->ni_mlrcnt
, ni
->ni_mltval
);
316 #ifdef IEEE80211_SUPPORT_TDMA
318 _db_show_tdma(const char *sep
, const struct ieee80211_tdma_state
*ts
, int showprocs
)
320 db_printf("%stdma %p:\n", sep
, ts
);
321 db_printf("%s version %u slot %u bintval %u peer %p\n", sep
,
322 ts
->tdma_version
, ts
->tdma_slot
, ts
->tdma_bintval
, ts
->tdma_peer
);
323 db_printf("%s slotlen %u slotcnt %u", sep
,
324 ts
->tdma_slotlen
, ts
->tdma_slotcnt
);
325 db_printf(" inuse 0x%x active 0x%x count %d\n",
326 ts
->tdma_inuse
[0], ts
->tdma_active
[0], ts
->tdma_count
);
328 DB_PRINTSYM(sep
, " tdma_newstate", ts
->tdma_newstate
);
329 DB_PRINTSYM(sep
, " tdma_recv_mgmt", ts
->tdma_recv_mgmt
);
330 DB_PRINTSYM(sep
, " tdma_opdetach", ts
->tdma_opdetach
);
333 #endif /* IEEE80211_SUPPORT_TDMA */
336 _db_show_vap(const struct ieee80211vap
*vap
, int showprocs
)
338 const struct ieee80211com
*ic
= vap
->iv_ic
;
341 db_printf("%p:", vap
);
342 db_printf(" bss %p", vap
->iv_bss
);
343 db_printf(" myaddr %6D", vap
->iv_myaddr
, ":");
346 db_printf("\topmode %s", ieee80211_opmode_name
[vap
->iv_opmode
]);
347 db_printf(" state %s", ieee80211_state_name
[vap
->iv_state
]);
348 db_printf(" ifp %p(%s)", vap
->iv_ifp
, vap
->iv_ifp
->if_xname
);
351 db_printf("\tic %p", vap
->iv_ic
);
352 db_printf(" media %p", &vap
->iv_media
);
353 db_printf(" bpf_if %p", vap
->iv_rawbpf
);
354 db_printf(" mgtsend %p", &vap
->iv_mgtsend
);
356 struct sysctllog
*iv_sysctl
; /* dynamic sysctl context */
359 db_printf("\tdebug=%b\n", vap
->iv_debug
, IEEE80211_MSG_BITS
);
361 db_printf("\tflags=%b\n", vap
->iv_flags
, IEEE80211_F_BITS
);
362 db_printf("\tflags_ext=%b\n", vap
->iv_flags_ext
, IEEE80211_FEXT_BITS
);
363 db_printf("\tflags_ht=%b\n", vap
->iv_flags_ht
, IEEE80211_FHT_BITS
);
364 db_printf("\tflags_ven=%b\n", vap
->iv_flags_ven
, IEEE80211_FVEN_BITS
);
365 db_printf("\tcaps=%b\n", vap
->iv_caps
, IEEE80211_C_BITS
);
366 db_printf("\thtcaps=%b\n", vap
->iv_htcaps
, IEEE80211_C_HTCAP_BITS
);
368 _db_show_stats(&vap
->iv_stats
);
370 db_printf("\tinact_init %d", vap
->iv_inact_init
);
371 db_printf(" inact_auth %d", vap
->iv_inact_auth
);
372 db_printf(" inact_run %d", vap
->iv_inact_run
);
373 db_printf(" inact_probe %d", vap
->iv_inact_probe
);
376 db_printf("\tdes_nssid %d", vap
->iv_des_nssid
);
377 if (vap
->iv_des_nssid
)
378 _db_show_ssid(" des_ssid[%u] ", 0,
379 vap
->iv_des_ssid
[0].len
, vap
->iv_des_ssid
[0].ssid
);
380 db_printf(" des_bssid %6D", vap
->iv_des_bssid
, ":");
382 db_printf("\tdes_mode %d", vap
->iv_des_mode
);
383 _db_show_channel(" des_chan", vap
->iv_des_chan
);
386 int iv_nicknamelen
; /* XXX junk */
387 uint8_t iv_nickname
[IEEE80211_NWID_LEN
];
389 db_printf("\tbgscanidle %u", vap
->iv_bgscanidle
);
390 db_printf(" bgscanintvl %u", vap
->iv_bgscanintvl
);
391 db_printf(" scanvalid %u", vap
->iv_scanvalid
);
393 db_printf("\tscanreq_duration %u", vap
->iv_scanreq_duration
);
394 db_printf(" scanreq_mindwell %u", vap
->iv_scanreq_mindwell
);
395 db_printf(" scanreq_maxdwell %u", vap
->iv_scanreq_maxdwell
);
397 db_printf("\tscanreq_flags 0x%x", vap
->iv_scanreq_flags
);
398 db_printf(" scanreq_nssid %d", vap
->iv_scanreq_nssid
);
399 for (i
= 0; i
< vap
->iv_scanreq_nssid
; i
++)
400 _db_show_ssid(" scanreq_ssid[%u]", i
,
401 vap
->iv_scanreq_ssid
[i
].len
, vap
->iv_scanreq_ssid
[i
].ssid
);
402 db_printf(" roaming %d", vap
->iv_roaming
);
404 for (i
= IEEE80211_MODE_11A
; i
< IEEE80211_MODE_MAX
; i
++)
405 if (isset(ic
->ic_modecaps
, i
)) {
406 _db_show_roamparams("\troamparms[%s]",
407 ieee80211_phymode_name
[i
], &vap
->iv_roamparms
[i
]);
411 db_printf("\tbmissthreshold %u", vap
->iv_bmissthreshold
);
412 db_printf(" bmiss_max %u", vap
->iv_bmiss_count
);
413 db_printf(" bmiss_max %d", vap
->iv_bmiss_max
);
415 db_printf("\tswbmiss_count %u", vap
->iv_swbmiss_count
);
416 db_printf(" swbmiss_period %u", vap
->iv_swbmiss_period
);
417 db_printf(" swbmiss %p", &vap
->iv_swbmiss
);
420 db_printf("\tampdu_rxmax %d", vap
->iv_ampdu_rxmax
);
421 db_printf(" ampdu_density %d", vap
->iv_ampdu_density
);
422 db_printf(" ampdu_limit %d", vap
->iv_ampdu_limit
);
423 db_printf(" amsdu_limit %d", vap
->iv_amsdu_limit
);
426 db_printf("\tmax_aid %u", vap
->iv_max_aid
);
427 db_printf(" aid_bitmap %p", vap
->iv_aid_bitmap
);
429 db_printf("\tsta_assoc %u", vap
->iv_sta_assoc
);
430 db_printf(" ps_sta %u", vap
->iv_ps_sta
);
431 db_printf(" ps_pending %u", vap
->iv_ps_pending
);
432 db_printf(" tim_len %u", vap
->iv_tim_len
);
433 db_printf(" tim_bitmap %p", vap
->iv_tim_bitmap
);
435 db_printf("\tdtim_period %u", vap
->iv_dtim_period
);
436 db_printf(" dtim_count %u", vap
->iv_dtim_count
);
437 db_printf(" set_tim %p", vap
->iv_set_tim
);
438 db_printf(" csa_count %d", vap
->iv_csa_count
);
441 db_printf("\trtsthreshold %u", vap
->iv_rtsthreshold
);
442 db_printf(" fragthreshold %u", vap
->iv_fragthreshold
);
443 db_printf(" inact_timer %d", vap
->iv_inact_timer
);
445 for (i
= IEEE80211_MODE_11A
; i
< IEEE80211_MODE_MAX
; i
++)
446 if (isset(ic
->ic_modecaps
, i
)) {
447 _db_show_txparams("\ttxparms[%s]",
448 ieee80211_phymode_name
[i
], &vap
->iv_txparms
[i
]);
452 /* application-specified IE's to attach to mgt frames */
453 _db_show_appie("\tappie_beacon", vap
->iv_appie_beacon
);
454 _db_show_appie("\tappie_probereq", vap
->iv_appie_probereq
);
455 _db_show_appie("\tappie_proberesp", vap
->iv_appie_proberesp
);
456 _db_show_appie("\tappie_assocreq", vap
->iv_appie_assocreq
);
457 _db_show_appie("\tappie_asscoresp", vap
->iv_appie_assocresp
);
458 _db_show_appie("\tappie_wpa", vap
->iv_appie_wpa
);
459 if (vap
->iv_wpa_ie
!= NULL
|| vap
->iv_rsn_ie
!= NULL
) {
460 if (vap
->iv_wpa_ie
!= NULL
)
461 db_printf("\twpa_ie %p", vap
->iv_wpa_ie
);
462 if (vap
->iv_rsn_ie
!= NULL
)
463 db_printf("\trsn_ie %p", vap
->iv_rsn_ie
);
466 db_printf("\tmax_keyix %u", vap
->iv_max_keyix
);
467 db_printf(" def_txkey %d", vap
->iv_def_txkey
);
469 for (i
= 0; i
< IEEE80211_WEP_NKID
; i
++)
470 _db_show_key("\tnw_keys[%u]", i
, &vap
->iv_nw_keys
[i
]);
472 db_printf("\tauth %p(%s)", vap
->iv_auth
, vap
->iv_auth
->ia_name
);
473 db_printf(" ec %p", vap
->iv_ec
);
475 db_printf(" acl %p", vap
->iv_acl
);
476 db_printf(" as %p", vap
->iv_as
);
478 #ifdef IEEE80211_SUPPORT_TDMA
479 if (vap
->iv_tdma
!= NULL
)
480 _db_show_tdma("\t", vap
->iv_tdma
, showprocs
);
481 #endif /* IEEE80211_SUPPORT_TDMA */
483 DB_PRINTSYM("\t", "iv_key_alloc", vap
->iv_key_alloc
);
484 DB_PRINTSYM("\t", "iv_key_delete", vap
->iv_key_delete
);
485 DB_PRINTSYM("\t", "iv_key_set", vap
->iv_key_set
);
486 DB_PRINTSYM("\t", "iv_key_update_begin", vap
->iv_key_update_begin
);
487 DB_PRINTSYM("\t", "iv_key_update_end", vap
->iv_key_update_end
);
488 DB_PRINTSYM("\t", "iv_opdetach", vap
->iv_opdetach
);
489 DB_PRINTSYM("\t", "iv_input", vap
->iv_input
);
490 DB_PRINTSYM("\t", "iv_recv_mgmt", vap
->iv_recv_mgmt
);
491 DB_PRINTSYM("\t", "iv_deliver_data", vap
->iv_deliver_data
);
492 DB_PRINTSYM("\t", "iv_bmiss", vap
->iv_bmiss
);
493 DB_PRINTSYM("\t", "iv_reset", vap
->iv_reset
);
494 DB_PRINTSYM("\t", "iv_update_beacon", vap
->iv_update_beacon
);
495 DB_PRINTSYM("\t", "iv_newstate", vap
->iv_newstate
);
496 DB_PRINTSYM("\t", "iv_output", vap
->iv_output
);
501 _db_show_com(const struct ieee80211com
*ic
, int showvaps
, int showsta
, int showprocs
)
503 struct ieee80211vap
*vap
;
505 db_printf("%p:", ic
);
506 TAILQ_FOREACH(vap
, &ic
->ic_vaps
, iv_next
)
507 db_printf(" %s(%p)", vap
->iv_ifp
->if_xname
, vap
);
509 db_printf("\tifp %p(%s)", ic
->ic_ifp
, ic
->ic_ifp
->if_xname
);
511 db_printf("\theadroom %d", ic
->ic_headroom
);
512 db_printf(" phytype %d", ic
->ic_phytype
);
513 db_printf(" opmode %s", ieee80211_opmode_name
[ic
->ic_opmode
]);
515 db_printf("\tmedia %p", &ic
->ic_media
);
516 db_printf(" inact %p", &ic
->ic_inact
);
519 db_printf("\tflags=%b\n", ic
->ic_flags
, IEEE80211_F_BITS
);
520 db_printf("\tflags_ext=%b\n", ic
->ic_flags_ext
, IEEE80211_FEXT_BITS
);
521 db_printf("\tflags_ht=%b\n", ic
->ic_flags_ht
, IEEE80211_FHT_BITS
);
522 db_printf("\tflags_ven=%b\n", ic
->ic_flags_ven
, IEEE80211_FVEN_BITS
);
523 db_printf("\tcaps=%b\n", ic
->ic_caps
, IEEE80211_C_BITS
);
524 db_printf("\tcryptocaps=%b\n",
525 ic
->ic_cryptocaps
, IEEE80211_CRYPTO_BITS
);
526 db_printf("\thtcaps=%b\n", ic
->ic_htcaps
, IEEE80211_HTCAP_BITS
);
529 uint8_t ic_modecaps
[2]; /* set of mode capabilities */
531 db_printf("\tcurmode %u", ic
->ic_curmode
);
532 db_printf(" promisc %u", ic
->ic_promisc
);
533 db_printf(" allmulti %u", ic
->ic_allmulti
);
534 db_printf(" nrunning %u", ic
->ic_nrunning
);
536 db_printf("\tbintval %u", ic
->ic_bintval
);
537 db_printf(" lintval %u", ic
->ic_lintval
);
538 db_printf(" holdover %u", ic
->ic_holdover
);
539 db_printf(" txpowlimit %u", ic
->ic_txpowlimit
);
542 struct ieee80211_rateset ic_sup_rates
[IEEE80211_MODE_MAX
];
547 * ic_channels is the set of available channels for the device;
548 * it is setup by the driver
549 * ic_nchans is the number of valid entries in ic_channels
550 * ic_chan_avail is a bit vector of these channels used to check
551 * whether a channel is available w/o searching the channel table.
552 * ic_chan_active is a (potentially) constrained subset of
553 * ic_chan_avail that reflects any mode setting or user-specified
554 * limit on the set of channels to use/scan
555 * ic_curchan is the current channel the device is set to; it may
556 * be different from ic_bsschan when we are off-channel scanning
557 * or otherwise doing background work
558 * ic_bsschan is the channel selected for operation; it may
559 * be undefined (IEEE80211_CHAN_ANYC)
560 * ic_prevchan is a cached ``previous channel'' used to optimize
561 * lookups when switching back+forth between two channels
562 * (e.g. for dynamic turbo)
564 db_printf("\tnchans %d", ic
->ic_nchans
);
566 struct ieee80211_channel ic_channels
[IEEE80211_CHAN_MAX
];
567 uint8_t ic_chan_avail
[IEEE80211_CHAN_BYTES
];
568 uint8_t ic_chan_active
[IEEE80211_CHAN_BYTES
];
569 uint8_t ic_chan_scan
[IEEE80211_CHAN_BYTES
];
572 _db_show_channel("\tcurchan", ic
->ic_curchan
);
574 _db_show_channel("\tbsschan", ic
->ic_bsschan
);
576 _db_show_channel("\tprevchan", ic
->ic_prevchan
);
578 db_printf("\tregdomain %p", &ic
->ic_regdomain
);
581 _db_show_channel("\tcsa_newchan", ic
->ic_csa_newchan
);
582 db_printf(" csa_count %d", ic
->ic_csa_count
);
583 db_printf( "dfs %p", &ic
->ic_dfs
);
586 db_printf("\tscan %p", ic
->ic_scan
);
587 db_printf(" lastdata %d", ic
->ic_lastdata
);
588 db_printf(" lastscan %d", ic
->ic_lastscan
);
591 db_printf("\tmax_keyix %d", ic
->ic_max_keyix
);
592 db_printf(" hash_key 0x%x", ic
->ic_hash_key
);
593 db_printf(" wme %p", &ic
->ic_wme
);
595 db_printf(" sta %p", &ic
->ic_sta
);
597 db_printf("\tstageq@%p:\n", &ic
->ic_stageq
);
598 _db_show_ageq("\t", &ic
->ic_stageq
);
600 _db_show_node_table("\t", &ic
->ic_sta
);
602 db_printf("\tprotmode %d", ic
->ic_protmode
);
603 db_printf(" nonerpsta %u", ic
->ic_nonerpsta
);
604 db_printf(" longslotsta %u", ic
->ic_longslotsta
);
605 db_printf(" lastnonerp %d", ic
->ic_lastnonerp
);
607 db_printf("\tsta_assoc %u", ic
->ic_sta_assoc
);
608 db_printf(" ht_sta_assoc %u", ic
->ic_ht_sta_assoc
);
609 db_printf(" ht40_sta_assoc %u", ic
->ic_ht40_sta_assoc
);
611 db_printf("\tcurhtprotmode 0x%x", ic
->ic_curhtprotmode
);
612 db_printf(" htprotmode %d", ic
->ic_htprotmode
);
613 db_printf(" lastnonht %d", ic
->ic_lastnonht
);
616 db_printf("\tsuperg %p\n", ic
->ic_superg
);
618 db_printf("\tmontaps %d th %p txchan %p rh %p rxchan %p\n",
619 ic
->ic_montaps
, ic
->ic_th
, ic
->ic_txchan
, ic
->ic_rh
, ic
->ic_rxchan
);
622 DB_PRINTSYM("\t", "ic_vap_create", ic
->ic_vap_create
);
623 DB_PRINTSYM("\t", "ic_vap_delete", ic
->ic_vap_delete
);
625 /* operating mode attachment */
626 ieee80211vap_attach ic_vattach
[IEEE80211_OPMODE_MAX
];
628 DB_PRINTSYM("\t", "ic_newassoc", ic
->ic_newassoc
);
629 DB_PRINTSYM("\t", "ic_getradiocaps", ic
->ic_getradiocaps
);
630 DB_PRINTSYM("\t", "ic_setregdomain", ic
->ic_setregdomain
);
631 DB_PRINTSYM("\t", "ic_send_mgmt", ic
->ic_send_mgmt
);
632 DB_PRINTSYM("\t", "ic_raw_xmit", ic
->ic_raw_xmit
);
633 DB_PRINTSYM("\t", "ic_updateslot", ic
->ic_updateslot
);
634 DB_PRINTSYM("\t", "ic_update_mcast", ic
->ic_update_mcast
);
635 DB_PRINTSYM("\t", "ic_update_promisc", ic
->ic_update_promisc
);
636 DB_PRINTSYM("\t", "ic_node_alloc", ic
->ic_node_alloc
);
637 DB_PRINTSYM("\t", "ic_node_free", ic
->ic_node_free
);
638 DB_PRINTSYM("\t", "ic_node_cleanup", ic
->ic_node_cleanup
);
639 DB_PRINTSYM("\t", "ic_node_getrssi", ic
->ic_node_getrssi
);
640 DB_PRINTSYM("\t", "ic_node_getsignal", ic
->ic_node_getsignal
);
641 DB_PRINTSYM("\t", "ic_node_getmimoinfo", ic
->ic_node_getmimoinfo
);
642 DB_PRINTSYM("\t", "ic_scan_start", ic
->ic_scan_start
);
643 DB_PRINTSYM("\t", "ic_scan_end", ic
->ic_scan_end
);
644 DB_PRINTSYM("\t", "ic_set_channel", ic
->ic_set_channel
);
645 DB_PRINTSYM("\t", "ic_scan_curchan", ic
->ic_scan_curchan
);
646 DB_PRINTSYM("\t", "ic_scan_mindwell", ic
->ic_scan_mindwell
);
647 DB_PRINTSYM("\t", "ic_recv_action", ic
->ic_recv_action
);
648 DB_PRINTSYM("\t", "ic_send_action", ic
->ic_send_action
);
649 DB_PRINTSYM("\t", "ic_addba_request", ic
->ic_addba_request
);
650 DB_PRINTSYM("\t", "ic_addba_response", ic
->ic_addba_response
);
651 DB_PRINTSYM("\t", "ic_addba_stop", ic
->ic_addba_stop
);
653 if (showvaps
&& !TAILQ_EMPTY(&ic
->ic_vaps
)) {
655 TAILQ_FOREACH(vap
, &ic
->ic_vaps
, iv_next
)
656 _db_show_vap(vap
, showprocs
);
658 if (showsta
&& !TAILQ_EMPTY(&ic
->ic_sta
.nt_node
)) {
659 const struct ieee80211_node_table
*nt
= &ic
->ic_sta
;
660 const struct ieee80211_node
*ni
;
662 TAILQ_FOREACH(ni
, &nt
->nt_node
, ni_list
) {
670 _db_show_node_table(const char *tag
, const struct ieee80211_node_table
*nt
)
674 db_printf("%s%s@%p:\n", tag
, nt
->nt_name
, nt
);
675 db_printf(" inact_init %d", nt
->nt_inact_init
);
676 db_printf(" scangen %u\n", nt
->nt_scangen
);
677 db_printf("%s keyixmax %d keyixmap %p\n",
678 tag
, nt
->nt_keyixmax
, nt
->nt_keyixmap
);
679 for (i
= 0; i
< nt
->nt_keyixmax
; i
++) {
680 const struct ieee80211_node
*ni
= nt
->nt_keyixmap
[i
];
682 db_printf("%s [%3u] %p %6D\n", tag
, i
, ni
,
683 ni
->ni_macaddr
, ":");
688 _db_show_channel(const char *tag
, const struct ieee80211_channel
*c
)
690 db_printf("%s ", tag
);
693 else if (c
== IEEE80211_CHAN_ANYC
)
696 db_printf("[%u (%u) flags=%b maxreg %d maxpow %d minpow %d state 0x%x extieee %u]",
697 c
->ic_freq
, c
->ic_ieee
,
698 c
->ic_flags
, IEEE80211_CHAN_BITS
,
699 c
->ic_maxregpower
, c
->ic_maxpower
, c
->ic_minpower
,
700 c
->ic_state
, c
->ic_extieee
);
704 _db_show_ssid(const char *tag
, int ix
, int len
, const uint8_t *ssid
)
711 if (len
> IEEE80211_NWID_LEN
)
712 len
= IEEE80211_NWID_LEN
;
713 /* determine printable or not */
714 for (i
= 0, p
= ssid
; i
< len
; i
++, p
++) {
715 if (*p
< ' ' || *p
> 0x7e)
720 for (i
= 0, p
= ssid
; i
< len
; i
++, p
++)
725 for (i
= 0, p
= ssid
; i
< len
; i
++, p
++)
726 db_printf("%02x", *p
);
731 _db_show_appie(const char *tag
, const struct ieee80211_appie
*ie
)
738 db_printf("%s [0x", tag
);
739 for (i
= 0, p
= ie
->ie_data
; i
< ie
->ie_len
; i
++, p
++)
740 db_printf("%02x", *p
);
745 _db_show_key(const char *tag
, int ix
, const struct ieee80211_key
*wk
)
747 static const uint8_t zerodata
[IEEE80211_KEYBUF_SIZE
];
748 const struct ieee80211_cipher
*cip
= wk
->wk_cipher
;
749 int keylen
= wk
->wk_keylen
;
752 switch (cip
->ic_cipher
) {
753 case IEEE80211_CIPHER_WEP
:
755 db_printf(" wepkey %u:%s", wk
->wk_keyix
,
756 keylen
<= 5 ? "40-bit" :
757 keylen
<= 13 ? "104-bit" : "128-bit");
759 case IEEE80211_CIPHER_TKIP
:
761 keylen
-= 128/8; /* ignore MIC for now */
762 db_printf(" TKIP %u:%u-bit", wk
->wk_keyix
, 8*keylen
);
764 case IEEE80211_CIPHER_AES_OCB
:
765 db_printf(" AES-OCB %u:%u-bit", wk
->wk_keyix
, 8*keylen
);
767 case IEEE80211_CIPHER_AES_CCM
:
768 db_printf(" AES-CCM %u:%u-bit", wk
->wk_keyix
, 8*keylen
);
770 case IEEE80211_CIPHER_CKIP
:
771 db_printf(" CKIP %u:%u-bit", wk
->wk_keyix
, 8*keylen
);
773 case IEEE80211_CIPHER_NONE
:
774 db_printf(" NULL %u:%u-bit", wk
->wk_keyix
, 8*keylen
);
777 db_printf(" UNKNOWN (0x%x) %u:%u-bit",
778 cip
->ic_cipher
, wk
->wk_keyix
, 8*keylen
);
781 if (wk
->wk_rxkeyix
!= wk
->wk_keyix
)
782 db_printf(" rxkeyix %u", wk
->wk_rxkeyix
);
783 if (memcmp(wk
->wk_key
, zerodata
, keylen
) != 0) {
787 for (i
= 0; i
< keylen
; i
++)
788 db_printf("%02x", wk
->wk_key
[i
]);
790 if (cip
->ic_cipher
!= IEEE80211_CIPHER_WEP
&&
791 wk
->wk_keyrsc
[IEEE80211_NONQOS_TID
] != 0)
792 db_printf(" rsc %ju", (uintmax_t)wk
->wk_keyrsc
[IEEE80211_NONQOS_TID
]);
793 if (cip
->ic_cipher
!= IEEE80211_CIPHER_WEP
&&
795 db_printf(" tsc %ju", (uintmax_t)wk
->wk_keytsc
);
796 db_printf(" flags=%b", wk
->wk_flags
, IEEE80211_KEY_BITS
);
802 printrate(const char *tag
, int v
)
804 if (v
== IEEE80211_FIXED_RATE_NONE
)
805 db_printf(" %s <none>", tag
);
807 db_printf(" %s 5.5", tag
);
808 else if (v
& IEEE80211_RATE_MCS
)
809 db_printf(" %s MCS%d", tag
, v
&~ IEEE80211_RATE_MCS
);
811 db_printf(" %s %d", tag
, v
/2);
815 _db_show_roamparams(const char *tag
, const void *arg
,
816 const struct ieee80211_roamparam
*rp
)
821 db_printf(" rssi %u.5", rp
->rssi
/2);
823 db_printf(" rssi %u", rp
->rssi
/2);
824 printrate("rate", rp
->rate
);
828 _db_show_txparams(const char *tag
, const void *arg
,
829 const struct ieee80211_txparam
*tp
)
833 printrate("ucastrate", tp
->ucastrate
);
834 printrate("mcastrate", tp
->mcastrate
);
835 printrate("mgmtrate", tp
->mgmtrate
);
836 db_printf(" maxretry %d", tp
->maxretry
);
840 _db_show_ageq(const char *tag
, const struct ieee80211_ageq
*q
)
842 const struct mbuf
*m
;
844 db_printf("%s len %d maxlen %d drops %d head %p tail %p\n",
845 tag
, q
->aq_len
, q
->aq_maxlen
, q
->aq_drops
,
846 q
->aq_head
, q
->aq_tail
);
847 for (m
= q
->aq_head
; m
!= NULL
; m
= m
->m_nextpkt
)
848 db_printf("%s %p (len %d, %b)\n", tag
, m
, m
->m_len
,
849 /* XXX could be either TX or RX but is mostly TX */
850 m
->m_flags
, IEEE80211_MBUF_TX_FLAG_BITS
);
854 _db_show_stats(const struct ieee80211_stats
*is
)
859 #ifdef IEEE80211_SUPPORT_MESH
861 _db_show_mesh(const struct ieee80211_mesh_state
*ms
)
863 struct ieee80211_mesh_route
*rt
;
866 _db_show_ssid(" meshid ", 0, ms
->ms_idlen
, ms
->ms_id
);
867 db_printf("nextseq %u ttl %u flags 0x%x\n", ms
->ms_seq
,
868 ms
->ms_ttl
, ms
->ms_flags
);
869 db_printf("routing table:\n");
871 TAILQ_FOREACH(rt
, &ms
->ms_routes
, rt_next
) {
872 db_printf("entry %d:\tdest: %6D nexthop: %6D metric: %u", i
,
873 rt
->rt_dest
, ":", rt
->rt_nexthop
, ":", rt
->rt_metric
);
874 db_printf("\tlifetime: %u lastseq: %u priv: %p\n",
875 rt
->rt_lifetime
, rt
->rt_lastmseq
, rt
->rt_priv
);
879 #endif /* IEEE80211_SUPPORT_MESH */