2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2007-2009 Sam Leffler, Errno Consulting
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
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.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 #include <sys/cdefs.h>
34 * IEEE 802.11 DDB support
36 #include <sys/param.h>
37 #include <sys/systm.h>
38 #include <sys/kernel.h>
39 #include <sys/malloc.h>
40 #include <sys/socket.h>
43 #include <net/if_var.h>
44 #include <net/if_dl.h>
45 #include <net/if_media.h>
46 #include <net/if_types.h>
47 #include <net/ethernet.h>
50 #include <net80211/ieee80211_var.h>
51 #include <net80211/ieee80211_ratectl.h>
52 #ifdef IEEE80211_SUPPORT_TDMA
53 #include <net80211/ieee80211_tdma.h>
55 #ifdef IEEE80211_SUPPORT_MESH
56 #include <net80211/ieee80211_mesh.h>
60 #include <ddb/db_sym.h>
62 #define DB_PRINTSYM(prefix, name, addr) do { \
63 db_printf("%s%-25s : ", prefix, name); \
64 db_printsym((db_addr_t) addr, DB_STGY_ANY); \
68 static void _db_show_sta(const struct ieee80211_node
*);
69 static void _db_show_vap(const struct ieee80211vap
*, int, int);
70 static void _db_show_com(const struct ieee80211com
*,
71 int showvaps
, int showsta
, int showmesh
, int showprocs
, int);
73 static void _db_show_all_vaps(void *, struct ieee80211com
*);
75 static void _db_show_node_table(const char *tag
,
76 const struct ieee80211_node_table
*);
77 static void _db_show_channel(const char *tag
, const struct ieee80211_channel
*);
78 static void _db_show_ssid(const char *tag
, int ix
, int len
, const uint8_t *);
79 static void _db_show_appie(const char *tag
, const struct ieee80211_appie
*);
80 static void _db_show_key(const char *tag
, int ix
, const struct ieee80211_key
*);
81 static void _db_show_roamparams(const char *tag
, const void *arg
,
82 const struct ieee80211_roamparam
*rp
);
83 static void _db_show_txparams(const char *tag
, const void *arg
,
84 const struct ieee80211_txparam
*tp
);
85 static void _db_show_ageq(const char *tag
, const struct ieee80211_ageq
*q
);
86 static void _db_show_stats(const struct ieee80211_stats
*);
87 #ifdef IEEE80211_SUPPORT_MESH
88 static void _db_show_mesh(const struct ieee80211_mesh_state
*);
91 DB_SHOW_COMMAND(sta
, db_show_sta
)
94 db_printf("usage: show sta <addr>\n");
97 _db_show_sta((const struct ieee80211_node
*) addr
);
100 DB_SHOW_COMMAND(statab
, db_show_statab
)
103 db_printf("usage: show statab <addr>\n");
106 _db_show_node_table("", (const struct ieee80211_node_table
*) addr
);
109 DB_SHOW_COMMAND(vap
, db_show_vap
)
111 int i
, showmesh
= 0, showprocs
= 0;
114 db_printf("usage: show vap <addr>\n");
117 for (i
= 0; modif
[i
] != '\0'; i
++)
130 _db_show_vap((const struct ieee80211vap
*) addr
, showmesh
, showprocs
);
133 DB_SHOW_COMMAND(com
, db_show_com
)
135 const struct ieee80211com
*ic
;
136 int i
, showprocs
= 0, showvaps
= 0, showsta
= 0, showmesh
= 0, showscan
= 0;
139 db_printf("usage: show com <addr>\n");
142 for (i
= 0; modif
[i
] != '\0'; i
++)
145 showsta
= showmesh
= showvaps
= showprocs
= showscan
= 1;
164 ic
= (const struct ieee80211com
*) addr
;
165 _db_show_com(ic
, showvaps
, showsta
, showmesh
, showprocs
, showscan
);
168 DB_SHOW_ALL_COMMAND(vaps
, db_show_all_vaps
)
172 for (i
= 0; modif
[i
] != '\0'; i
++)
179 ieee80211_iterate_coms(_db_show_all_vaps
, &showall
);
182 #ifdef IEEE80211_SUPPORT_MESH
183 DB_SHOW_ALL_COMMAND(mesh
, db_show_mesh
)
185 const struct ieee80211_mesh_state
*ms
;
188 db_printf("usage: show mesh <addr>\n");
191 ms
= (const struct ieee80211_mesh_state
*) addr
;
194 #endif /* IEEE80211_SUPPORT_MESH */
197 _db_show_txampdu(const char *sep
, int ix
, const struct ieee80211_tx_ampdu
*tap
)
199 db_printf("%stxampdu[%d]: %p flags %b %s\n",
200 sep
, ix
, tap
, tap
->txa_flags
, IEEE80211_AGGR_BITS
,
201 ieee80211_wme_acnames
[TID_TO_WME_AC(tap
->txa_tid
)]);
202 db_printf("%s token %u lastsample %d pkts %d avgpps %d qbytes %d qframes %d\n",
203 sep
, tap
->txa_token
, tap
->txa_lastsample
, tap
->txa_pkts
,
204 tap
->txa_avgpps
, tap
->txa_qbytes
, tap
->txa_qframes
);
205 db_printf("%s start %u seqpending %u wnd %u attempts %d nextrequest %d\n",
206 sep
, tap
->txa_start
, tap
->txa_seqpending
, tap
->txa_wnd
,
207 tap
->txa_attempts
, tap
->txa_nextrequest
);
212 _db_show_rxampdu(const char *sep
, int ix
, const struct ieee80211_rx_ampdu
*rap
)
217 db_printf("%srxampdu[%d]: %p flags 0x%x tid %u\n",
218 sep
, ix
, rap
, rap
->rxa_flags
, ix
/*XXX */);
219 db_printf("%s qbytes %d qframes %d seqstart %u start %u wnd %u\n",
220 sep
, rap
->rxa_qbytes
, rap
->rxa_qframes
,
221 rap
->rxa_seqstart
, rap
->rxa_start
, rap
->rxa_wnd
);
222 db_printf("%s age %d nframes %d\n", sep
,
223 rap
->rxa_age
, rap
->rxa_nframes
);
224 for (i
= 0; i
< IEEE80211_AGGR_BAWMAX
; i
++)
225 if (!mbufq_empty(&rap
->rxa_mq
[i
])) {
226 db_printf("%s m[%2u:%4u] ", sep
, i
,
227 IEEE80211_SEQ_ADD(rap
->rxa_start
, i
));
228 STAILQ_FOREACH(m
, &rap
->rxa_mq
[i
].mq_head
,
237 _db_show_sta(const struct ieee80211_node
*ni
)
241 db_printf("STA: %p: mac %s refcnt %d\n", ni
,
242 ether_sprintf(ni
->ni_macaddr
), ieee80211_node_refcnt(ni
));
243 db_printf("\tvap %p wdsvap %p ic %p table %p\n",
244 ni
->ni_vap
, ni
->ni_wdsvap
, ni
->ni_ic
, ni
->ni_table
);
245 db_printf("\tflags=%b\n", ni
->ni_flags
, IEEE80211_NODE_BITS
);
246 db_printf("\tauthmode %u ath_flags 0x%x ath_defkeyix %u\n",
247 ni
->ni_authmode
, ni
->ni_ath_flags
, ni
->ni_ath_defkeyix
);
248 db_printf("\tassocid 0x%x txpower %u vlan %u\n",
249 ni
->ni_associd
, ni
->ni_txpower
, ni
->ni_vlan
);
250 db_printf("\tjointime %d (%lu secs) challenge %p\n",
251 ni
->ni_jointime
, (unsigned long)(time_uptime
- ni
->ni_jointime
),
253 db_printf("\ties: data %p len %d\n", ni
->ni_ies
.data
, ni
->ni_ies
.len
);
254 db_printf("\t[wpa_ie %p rsn_ie %p wme_ie %p ath_ie %p\n",
255 ni
->ni_ies
.wpa_ie
, ni
->ni_ies
.rsn_ie
, ni
->ni_ies
.wme_ie
,
257 db_printf("\t htcap_ie %p htinfo_ie %p]\n",
258 ni
->ni_ies
.htcap_ie
, ni
->ni_ies
.htinfo_ie
);
259 db_printf("\t vhtcap_ie %p vhtopmode_ie %p vhtpwrenv_ie %p]\n",
260 ni
->ni_ies
.vhtcap_ie
, ni
->ni_ies
.vhtopmode_ie
,
261 ni
->ni_ies
.vhtpwrenv_ie
);
262 if (ni
->ni_flags
& IEEE80211_NODE_QOS
) {
263 for (i
= 0; i
< WME_NUM_TID
; i
++) {
264 if (ni
->ni_txseqs
[i
] || ni
->ni_rxseqs
[i
])
265 db_printf("\t[%u] txseq %u rxseq %u fragno %u\n",
267 ni
->ni_rxseqs
[i
] >> IEEE80211_SEQ_SEQ_SHIFT
,
268 ni
->ni_rxseqs
[i
] & IEEE80211_SEQ_FRAG_MASK
);
272 db_printf("\ttxseq %u rxseq %u fragno %u rxfragstamp %u\n",
273 ni
->ni_txseqs
[IEEE80211_NONQOS_TID
],
274 ni
->ni_rxseqs
[IEEE80211_NONQOS_TID
] >> IEEE80211_SEQ_SEQ_SHIFT
,
275 ni
->ni_rxseqs
[IEEE80211_NONQOS_TID
] & IEEE80211_SEQ_FRAG_MASK
,
277 db_printf("\trxfrag[0] %p rxfrag[1] %p rxfrag[2] %p\n",
278 ni
->ni_rxfrag
[0], ni
->ni_rxfrag
[1], ni
->ni_rxfrag
[2]);
279 _db_show_key("\tucastkey", 0, &ni
->ni_ucastkey
);
280 db_printf("\tavgrssi 0x%x (rssi %d) noise %d\n",
281 ni
->ni_avgrssi
, IEEE80211_RSSI_GET(ni
->ni_avgrssi
),
283 db_printf("\tintval %u capinfo %b\n",
284 ni
->ni_intval
, ni
->ni_capinfo
, IEEE80211_CAPINFO_BITS
);
285 db_printf("\tbssid %s", ether_sprintf(ni
->ni_bssid
));
286 _db_show_ssid(" essid ", 0, ni
->ni_esslen
, ni
->ni_essid
);
288 _db_show_channel("\tchannel", ni
->ni_chan
);
290 db_printf("\terp %b dtim_period %u dtim_count %u\n",
291 ni
->ni_erp
, IEEE80211_ERP_BITS
,
292 ni
->ni_dtim_period
, ni
->ni_dtim_count
);
294 db_printf("\thtcap %b htparam 0x%x htctlchan %u ht2ndchan %u\n",
295 ni
->ni_htcap
, IEEE80211_HTCAP_BITS
,
296 ni
->ni_htparam
, ni
->ni_htctlchan
, ni
->ni_ht2ndchan
);
297 db_printf("\thtopmode 0x%x htstbc 0x%x chw %d (%s)\n",
298 ni
->ni_htopmode
, ni
->ni_htstbc
,
299 ni
->ni_chw
, ieee80211_ni_chw_to_str(ni
->ni_chw
));
301 /* XXX ampdu state */
302 for (i
= 0; i
< WME_NUM_TID
; i
++)
303 if (ni
->ni_tx_ampdu
[i
].txa_flags
& IEEE80211_AGGR_SETUP
)
304 _db_show_txampdu("\t", i
, &ni
->ni_tx_ampdu
[i
]);
305 for (i
= 0; i
< WME_NUM_TID
; i
++)
306 if (ni
->ni_rx_ampdu
[i
].rxa_flags
)
307 _db_show_rxampdu("\t", i
, &ni
->ni_rx_ampdu
[i
]);
309 db_printf("\tinact %u inact_reload %u txrate %u\n",
310 ni
->ni_inact
, ni
->ni_inact_reload
, ni
->ni_txrate
);
311 #ifdef IEEE80211_SUPPORT_MESH
312 _db_show_ssid("\tmeshid ", 0, ni
->ni_meshidlen
, ni
->ni_meshid
);
313 db_printf(" mlstate %b mllid 0x%x mlpid 0x%x mlrcnt %u mltval %u\n",
314 ni
->ni_mlstate
, IEEE80211_MESH_MLSTATE_BITS
,
315 ni
->ni_mllid
, ni
->ni_mlpid
, ni
->ni_mlrcnt
, ni
->ni_mltval
);
319 db_printf("\tvhtcap %b vht_basicmcs %#06x vht_pad2 %#06x\n",
320 ni
->ni_vhtcap
, IEEE80211_VHTCAP_BITS
,
321 ni
->ni_vht_basicmcs
, ni
->ni_vht_pad2
);
322 db_printf("\tvht_mcsinfo: { rx_mcs_map %#06x rx_highest %#06x "
323 "tx_mcs_map %#06x tx_highest %#06x }\n",
324 ni
->ni_vht_mcsinfo
.rx_mcs_map
, ni
->ni_vht_mcsinfo
.rx_highest
,
325 ni
->ni_vht_mcsinfo
.tx_mcs_map
, ni
->ni_vht_mcsinfo
.tx_highest
);
326 db_printf("\tvht_chan1/chan2 %u/%u vht_chanwidth %#04x\n",
327 ni
->ni_vht_chan1
, ni
->ni_vht_chan2
, ni
->ni_vht_chanwidth
);
328 db_printf("\tvht_pad1 %#04x vht_spare { %#x %#x %#x %#x %#x %#x %#x %#x }\n",
329 ni
->ni_vht_pad1
, ni
->ni_vht_spare
[0], ni
->ni_vht_spare
[1],
330 ni
->ni_vht_spare
[2], ni
->ni_vht_spare
[3], ni
->ni_vht_spare
[4],
331 ni
->ni_vht_spare
[5], ni
->ni_vht_spare
[6], ni
->ni_vht_spare
[7]);
333 db_printf("\tni_tx_superg[] = {");
334 for (i
= 0; i
< WME_NUM_TID
; i
++)
335 db_printf(" %p%s", ni
->ni_tx_superg
[i
], (i
== 0) ? "" : ",");
338 db_printf("\tni_rctls = %p", ni
->ni_rctls
);
339 db_printf("\tni_drv_data = %p", ni
->ni_drv_data
);
342 db_printf("\tni_spare[3] = { %#jx %#jx %#jx }",
343 ni
->ni_spare
[0], ni
->ni_spare
[1], ni
->ni_spare
[2]);
347 struct ieee80211_psq ni_psq
; /* power save queue */
348 struct ieee80211_nodestats ni_stats
; /* per-node statistics */
350 /* quiet time IE state for the given node */
351 uint32_t ni_quiet_ie_set
; /* Quiet time IE was seen */
352 struct ieee80211_quiet_ie ni_quiet_ie
; /* last seen quiet IE */
355 uint8_t ni_uapsd
; /* U-APSD per-node flags matching WMM STA QoS Info field */
359 #ifdef IEEE80211_SUPPORT_TDMA
361 _db_show_tdma(const char *sep
, const struct ieee80211_tdma_state
*ts
, int showprocs
)
363 db_printf("%stdma %p:\n", sep
, ts
);
364 db_printf("%s version %u slot %u bintval %u peer %p\n", sep
,
365 ts
->tdma_version
, ts
->tdma_slot
, ts
->tdma_bintval
, ts
->tdma_peer
);
366 db_printf("%s slotlen %u slotcnt %u", sep
,
367 ts
->tdma_slotlen
, ts
->tdma_slotcnt
);
368 db_printf(" inuse 0x%x active 0x%x count %d\n",
369 ts
->tdma_inuse
[0], ts
->tdma_active
[0], ts
->tdma_count
);
371 DB_PRINTSYM(sep
, " tdma_newstate", ts
->tdma_newstate
);
372 DB_PRINTSYM(sep
, " tdma_recv_mgmt", ts
->tdma_recv_mgmt
);
373 DB_PRINTSYM(sep
, " tdma_opdetach", ts
->tdma_opdetach
);
376 #endif /* IEEE80211_SUPPORT_TDMA */
379 _db_show_scan(const struct ieee80211_scan_state
*ss
, int showprocs
)
382 const struct ieee80211_scanner
*ss_ops
;
384 db_printf("SCAN %p:", ss
);
385 db_printf(" vap %p ic %p", ss
->ss_vap
, ss
->ss_ic
);
388 db_printf("\tss_ops %p (%s) ss_priv %p",
389 ss
->ss_ops
, ss
->ss_ops
->scan_name
, ss
->ss_priv
);
393 DB_PRINTSYM("\t", "scan_attach", ss_ops
->scan_attach
);
394 DB_PRINTSYM("\t", "scan_detach", ss_ops
->scan_detach
);
395 DB_PRINTSYM("\t", "scan_start", ss_ops
->scan_start
);
396 DB_PRINTSYM("\t", "scan_restart", ss_ops
->scan_restart
);
397 DB_PRINTSYM("\t", "scan_cancel", ss_ops
->scan_cancel
);
398 DB_PRINTSYM("\t", "scan_end", ss_ops
->scan_end
);
399 DB_PRINTSYM("\t", "scan_flush", ss_ops
->scan_flush
);
400 DB_PRINTSYM("\t", "scan_pickchan", ss_ops
->scan_pickchan
);
401 DB_PRINTSYM("\t", "scan_add", ss_ops
->scan_add
);
402 DB_PRINTSYM("\t", "scan_age", ss_ops
->scan_age
);
403 DB_PRINTSYM("\t", "scan_assoc_fail", ss_ops
->scan_assoc_fail
);
404 DB_PRINTSYM("\t", "scan_assoc_success", ss_ops
->scan_assoc_success
);
405 DB_PRINTSYM("\t", "scan_iterate", ss_ops
->scan_iterate
);
406 DB_PRINTSYM("\t", "scan_spare0", ss_ops
->scan_spare0
);
407 DB_PRINTSYM("\t", "scan_spare1", ss_ops
->scan_spare1
);
408 DB_PRINTSYM("\t", "scan_spare2", ss_ops
->scan_spare2
);
409 DB_PRINTSYM("\t", "scan_spare3", ss_ops
->scan_spare3
);
412 db_printf("\tss_flags %b", ss
->ss_flags
, IEEE80211_SS_FLAGS_BITS
);
415 db_printf("\tss_nssid %u", ss
->ss_nssid
);
416 for (i
= 0; i
< ss
->ss_nssid
&& i
< IEEE80211_SCAN_MAX_SSID
; i
++)
417 _db_show_ssid(" ss_nssid[%d]", i
,
418 ss
->ss_ssid
[i
].len
, ss
->ss_ssid
[i
].ssid
);
421 db_printf("\tss_chans:\n");
422 for (i
= 0; i
< ss
->ss_last
&& i
< IEEE80211_SCAN_MAX
; i
++) {
423 db_printf("\t%-3d", i
);
424 _db_show_channel(" ", ss
->ss_chans
[i
]);
428 db_printf("\tss_next %u ss_last %u ss_mindwell %lu ss_maxdwell %lu",
429 ss
->ss_next
, ss
->ss_last
, ss
->ss_mindwell
, ss
->ss_maxdwell
);
434 _db_show_rate(const struct ieee80211_ratectl
*rate
, const void *rs
,
438 db_printf("\tiv_rate %p", rate
);
439 db_printf(" iv_rs %p", rs
);
442 db_printf("\t ir_name %s", rate
->ir_name
);
444 DB_PRINTSYM("\t ", "ir_attach", rate
->ir_attach
);
445 DB_PRINTSYM("\t ", "ir_detach", rate
->ir_detach
);
446 DB_PRINTSYM("\t ", "ir_init", rate
->ir_init
);
447 DB_PRINTSYM("\t ", "ir_deinit", rate
->ir_deinit
);
448 DB_PRINTSYM("\t ", "ir_node_init", rate
->ir_node_init
);
449 DB_PRINTSYM("\t ", "ir_node_deinit", rate
->ir_node_deinit
);
450 DB_PRINTSYM("\t ", "ir_rate", rate
->ir_rate
);
451 DB_PRINTSYM("\t ", "ir_tx_complete", rate
->ir_tx_complete
);
452 DB_PRINTSYM("\t ", "ir_tx_update", rate
->ir_tx_update
);
453 DB_PRINTSYM("\t ", "ir_setinterval", rate
->ir_setinterval
);
454 DB_PRINTSYM("\t ", "ir_node_stats", rate
->ir_node_stats
);
459 _db_show_vap(const struct ieee80211vap
*vap
, int showmesh
, int showprocs
)
461 const struct ieee80211com
*ic
= vap
->iv_ic
;
464 db_printf("VAP %p:", vap
);
465 db_printf(" bss %p", vap
->iv_bss
);
466 db_printf(" myaddr %s", ether_sprintf(vap
->iv_myaddr
));
469 db_printf("\topmode %s", ieee80211_opmode_name
[vap
->iv_opmode
]);
470 #ifdef IEEE80211_SUPPORT_MESH
471 if (vap
->iv_opmode
== IEEE80211_M_MBSS
)
472 db_printf("(%p)", vap
->iv_mesh
);
474 db_printf(" state %#x %s", vap
->iv_state
,
475 ieee80211_state_name
[vap
->iv_state
]);
476 db_printf(" ifp %p(%s)", vap
->iv_ifp
, if_name(vap
->iv_ifp
));
479 db_printf("\tic %p", vap
->iv_ic
);
480 db_printf(" media %p", &vap
->iv_media
);
481 db_printf(" bpf_if %p", vap
->iv_rawbpf
);
482 db_printf(" mgtsend %p", &vap
->iv_mgtsend
);
484 struct sysctllog
*iv_sysctl
; /* dynamic sysctl context */
488 db_printf("\tiv_nstate %#x %s iv_nstate_b %d iv_nstate_n %d\n",
489 vap
->iv_nstate
, ieee80211_state_name
[vap
->iv_nstate
], /* historic */
490 vap
->iv_nstate_b
, vap
->iv_nstate_n
);
491 for (i
= 0; i
< NET80211_IV_NSTATE_NUM
; i
++) {
492 db_printf("\t [%d] iv_nstates %#x %s _task %p _args %d\n", i
,
493 vap
->iv_nstates
[i
], ieee80211_state_name
[vap
->iv_nstates
[i
]],
494 &vap
->iv_nstate_task
[i
], vap
->iv_nstate_args
[i
]);
497 db_printf("\tdebug=%b\n", vap
->iv_debug
, IEEE80211_MSG_BITS
);
499 db_printf("\tflags=%b\n", vap
->iv_flags
, IEEE80211_F_BITS
);
500 db_printf("\tflags_ext=%b\n", vap
->iv_flags_ext
, IEEE80211_FEXT_BITS
);
501 db_printf("\tflags_ht=%b\n", vap
->iv_flags_ht
, IEEE80211_FHT_BITS
);
502 db_printf("\tflags_ven=%b\n", vap
->iv_flags_ven
, IEEE80211_FVEN_BITS
);
503 db_printf("\tcaps=%b\n", vap
->iv_caps
, IEEE80211_C_BITS
);
504 db_printf("\thtcaps=%b\n", vap
->iv_htcaps
, IEEE80211_C_HTCAP_BITS
);
505 db_printf("\tvhtcap=%b\n", vap
->iv_vht_cap
.vht_cap_info
, IEEE80211_VHTCAP_BITS
);
507 _db_show_stats(&vap
->iv_stats
);
509 db_printf("\tinact_init %d", vap
->iv_inact_init
);
510 db_printf(" inact_auth %d", vap
->iv_inact_auth
);
511 db_printf(" inact_run %d", vap
->iv_inact_run
);
512 db_printf(" inact_probe %d", vap
->iv_inact_probe
);
515 db_printf("\tdes_nssid %d", vap
->iv_des_nssid
);
516 if (vap
->iv_des_nssid
)
517 _db_show_ssid(" des_ssid[%u] ", 0,
518 vap
->iv_des_ssid
[0].len
, vap
->iv_des_ssid
[0].ssid
);
519 db_printf(" des_bssid %s", ether_sprintf(vap
->iv_des_bssid
));
521 db_printf("\tdes_mode %d", vap
->iv_des_mode
);
522 _db_show_channel(" des_chan", vap
->iv_des_chan
);
525 int iv_nicknamelen
; /* XXX junk */
526 uint8_t iv_nickname
[IEEE80211_NWID_LEN
];
528 db_printf("\tbgscanidle %u", vap
->iv_bgscanidle
);
529 db_printf(" bgscanintvl %u", vap
->iv_bgscanintvl
);
530 db_printf(" scanvalid %u", vap
->iv_scanvalid
);
532 db_printf("\tscanreq_duration %u", vap
->iv_scanreq_duration
);
533 db_printf(" scanreq_mindwell %u", vap
->iv_scanreq_mindwell
);
534 db_printf(" scanreq_maxdwell %u", vap
->iv_scanreq_maxdwell
);
536 db_printf("\tscanreq_flags 0x%x", vap
->iv_scanreq_flags
);
537 db_printf(" scanreq_nssid %d", vap
->iv_scanreq_nssid
);
538 for (i
= 0; i
< vap
->iv_scanreq_nssid
; i
++)
539 _db_show_ssid(" scanreq_ssid[%u]", i
,
540 vap
->iv_scanreq_ssid
[i
].len
, vap
->iv_scanreq_ssid
[i
].ssid
);
541 db_printf(" roaming %d", vap
->iv_roaming
);
543 for (i
= IEEE80211_MODE_11A
; i
< IEEE80211_MODE_MAX
; i
++)
544 if (isset(ic
->ic_modecaps
, i
)) {
545 _db_show_roamparams("\troamparms[%s]",
546 ieee80211_phymode_name
[i
], &vap
->iv_roamparms
[i
]);
550 db_printf("\tbmissthreshold %u", vap
->iv_bmissthreshold
);
551 db_printf(" bmiss_max %u", vap
->iv_bmiss_count
);
552 db_printf(" bmiss_max %d", vap
->iv_bmiss_max
);
554 db_printf("\tswbmiss_count %u", vap
->iv_swbmiss_count
);
555 db_printf(" swbmiss_period %u", vap
->iv_swbmiss_period
);
556 db_printf(" swbmiss %p", &vap
->iv_swbmiss
);
559 db_printf("\tampdu_rxmax %d", vap
->iv_ampdu_rxmax
);
560 db_printf(" ampdu_density %d", vap
->iv_ampdu_density
);
561 db_printf(" ampdu_limit %d", vap
->iv_ampdu_limit
);
562 db_printf(" amsdu_limit %d", vap
->iv_amsdu_limit
);
565 db_printf("\tmax_aid %u", vap
->iv_max_aid
);
566 db_printf(" aid_bitmap %p", vap
->iv_aid_bitmap
);
568 db_printf("\tsta_assoc %u", vap
->iv_sta_assoc
);
569 db_printf(" ps_sta %u", vap
->iv_ps_sta
);
570 db_printf(" ps_pending %u", vap
->iv_ps_pending
);
571 db_printf(" tim_len %u", vap
->iv_tim_len
);
572 db_printf(" tim_bitmap %p", vap
->iv_tim_bitmap
);
574 db_printf("\tdtim_period %u", vap
->iv_dtim_period
);
575 db_printf(" dtim_count %u", vap
->iv_dtim_count
);
576 db_printf(" set_tim %p", vap
->iv_set_tim
);
577 db_printf(" csa_count %d", vap
->iv_csa_count
);
580 db_printf("\trtsthreshold %u", vap
->iv_rtsthreshold
);
581 db_printf(" fragthreshold %u", vap
->iv_fragthreshold
);
582 db_printf(" inact_timer %d", vap
->iv_inact_timer
);
584 for (i
= IEEE80211_MODE_11A
; i
< IEEE80211_MODE_MAX
; i
++)
585 if (isset(ic
->ic_modecaps
, i
)) {
586 _db_show_txparams("\ttxparms[%s]",
587 ieee80211_phymode_name
[i
], &vap
->iv_txparms
[i
]);
591 /* application-specified IE's to attach to mgt frames */
592 _db_show_appie("\tappie_beacon", vap
->iv_appie_beacon
);
593 _db_show_appie("\tappie_probereq", vap
->iv_appie_probereq
);
594 _db_show_appie("\tappie_proberesp", vap
->iv_appie_proberesp
);
595 _db_show_appie("\tappie_assocreq", vap
->iv_appie_assocreq
);
596 _db_show_appie("\tappie_asscoresp", vap
->iv_appie_assocresp
);
597 _db_show_appie("\tappie_wpa", vap
->iv_appie_wpa
);
598 if (vap
->iv_wpa_ie
!= NULL
|| vap
->iv_rsn_ie
!= NULL
) {
599 if (vap
->iv_wpa_ie
!= NULL
)
600 db_printf("\twpa_ie %p", vap
->iv_wpa_ie
);
601 if (vap
->iv_rsn_ie
!= NULL
)
602 db_printf("\trsn_ie %p", vap
->iv_rsn_ie
);
605 db_printf("\tmax_keyix %u", vap
->iv_max_keyix
);
606 db_printf(" def_txkey %d", vap
->iv_def_txkey
);
608 for (i
= 0; i
< IEEE80211_WEP_NKID
; i
++)
609 _db_show_key("\tnw_keys[%u]", i
, &vap
->iv_nw_keys
[i
]);
611 db_printf("\tauth %p(%s)", vap
->iv_auth
, vap
->iv_auth
->ia_name
);
612 db_printf(" ec %p", vap
->iv_ec
);
614 db_printf(" acl %p", vap
->iv_acl
);
615 db_printf(" as %p", vap
->iv_as
);
617 #ifdef IEEE80211_SUPPORT_MESH
618 if (showmesh
&& vap
->iv_mesh
!= NULL
)
619 _db_show_mesh(vap
->iv_mesh
);
621 #ifdef IEEE80211_SUPPORT_TDMA
622 if (vap
->iv_tdma
!= NULL
)
623 _db_show_tdma("\t", vap
->iv_tdma
, showprocs
);
624 #endif /* IEEE80211_SUPPORT_TDMA */
626 db_printf("\tsta_assoc %u", vap
->iv_sta_assoc
);
627 db_printf(" ht_sta_assoc %u", vap
->iv_ht_sta_assoc
);
628 db_printf(" ht40_sta_assoc %u", vap
->iv_ht40_sta_assoc
);
630 db_printf("\tnonerpsta %u", vap
->iv_nonerpsta
);
631 db_printf(" longslotsta %u", vap
->iv_longslotsta
);
632 db_printf(" lastnonerp %d", vap
->iv_lastnonerp
);
633 db_printf(" lastnonht %d", vap
->iv_lastnonht
);
635 if (vap
->iv_rate
!= NULL
)
636 _db_show_rate(vap
->iv_rate
, vap
->iv_rs
, showprocs
);
639 DB_PRINTSYM("\t", "iv_key_alloc", vap
->iv_key_alloc
);
640 DB_PRINTSYM("\t", "iv_key_delete", vap
->iv_key_delete
);
641 DB_PRINTSYM("\t", "iv_key_set", vap
->iv_key_set
);
642 DB_PRINTSYM("\t", "iv_key_update_begin", vap
->iv_key_update_begin
);
643 DB_PRINTSYM("\t", "iv_key_update_end", vap
->iv_key_update_end
);
644 DB_PRINTSYM("\t", "iv_opdetach", vap
->iv_opdetach
);
645 DB_PRINTSYM("\t", "iv_input", vap
->iv_input
);
646 DB_PRINTSYM("\t", "iv_recv_mgmt", vap
->iv_recv_mgmt
);
647 DB_PRINTSYM("\t", "iv_deliver_data", vap
->iv_deliver_data
);
648 DB_PRINTSYM("\t", "iv_bmiss", vap
->iv_bmiss
);
649 DB_PRINTSYM("\t", "iv_reset", vap
->iv_reset
);
650 DB_PRINTSYM("\t", "iv_update_beacon", vap
->iv_update_beacon
);
651 DB_PRINTSYM("\t", "iv_newstate", vap
->iv_newstate
);
652 DB_PRINTSYM("\t", "iv_output", vap
->iv_output
);
657 _db_show_com(const struct ieee80211com
*ic
, int showvaps
, int showsta
,
658 int showmesh
, int showprocs
, int showscan
)
660 struct ieee80211vap
*vap
;
662 db_printf("COM: %p:", ic
);
663 TAILQ_FOREACH(vap
, &ic
->ic_vaps
, iv_next
)
664 db_printf(" %s(%p)", if_name(vap
->iv_ifp
), vap
);
666 db_printf("\tsoftc %p", ic
->ic_softc
);
667 db_printf("\tname %s", ic
->ic_name
);
668 db_printf(" comlock %p", &ic
->ic_comlock
);
669 db_printf(" txlock %p", &ic
->ic_txlock
);
670 db_printf(" fflock %p", &ic
->ic_fflock
);
672 db_printf("\theadroom %d", ic
->ic_headroom
);
673 db_printf(" phytype %d", ic
->ic_phytype
);
674 db_printf(" opmode %s", ieee80211_opmode_name
[ic
->ic_opmode
]);
676 db_printf("\tinact %p", &ic
->ic_inact
);
679 db_printf("\tflags=%b\n", ic
->ic_flags
, IEEE80211_F_BITS
);
680 db_printf("\tflags_ext=%b\n", ic
->ic_flags_ext
, IEEE80211_FEXT_BITS
);
681 db_printf("\tflags_ht=%b\n", ic
->ic_flags_ht
, IEEE80211_FHT_BITS
);
682 db_printf("\tflags_ven=%b\n", ic
->ic_flags_ven
, IEEE80211_FVEN_BITS
);
683 db_printf("\tcaps=%b\n", ic
->ic_caps
, IEEE80211_C_BITS
);
684 db_printf("\tcryptocaps=%b\n",
685 ic
->ic_cryptocaps
, IEEE80211_CRYPTO_BITS
);
686 db_printf("\thtcaps=%b\n", ic
->ic_htcaps
, IEEE80211_HTCAP_BITS
);
687 db_printf("\tvhtcaps=%b\n", ic
->ic_vht_cap
.vht_cap_info
, IEEE80211_VHTCAP_BITS
);
690 uint8_t ic_modecaps
[2]; /* set of mode capabilities */
692 db_printf("\tcurmode %u", ic
->ic_curmode
);
693 db_printf(" promisc %u", ic
->ic_promisc
);
694 db_printf(" allmulti %u", ic
->ic_allmulti
);
695 db_printf(" nrunning %u", ic
->ic_nrunning
);
697 db_printf("\tbintval %u", ic
->ic_bintval
);
698 db_printf(" lintval %u", ic
->ic_lintval
);
699 db_printf(" holdover %u", ic
->ic_holdover
);
700 db_printf(" txpowlimit %u", ic
->ic_txpowlimit
);
703 struct ieee80211_rateset ic_sup_rates
[IEEE80211_MODE_MAX
];
708 * ic_channels is the set of available channels for the device;
709 * it is setup by the driver
710 * ic_nchans is the number of valid entries in ic_channels
711 * ic_chan_avail is a bit vector of these channels used to check
712 * whether a channel is available w/o searching the channel table.
713 * ic_chan_active is a (potentially) constrained subset of
714 * ic_chan_avail that reflects any mode setting or user-specified
715 * limit on the set of channels to use/scan
716 * ic_curchan is the current channel the device is set to; it may
717 * be different from ic_bsschan when we are off-channel scanning
718 * or otherwise doing background work
719 * ic_bsschan is the channel selected for operation; it may
720 * be undefined (IEEE80211_CHAN_ANYC)
721 * ic_prevchan is a cached ``previous channel'' used to optimize
722 * lookups when switching back+forth between two channels
723 * (e.g. for dynamic turbo)
725 db_printf("\tnchans %d", ic
->ic_nchans
);
727 struct ieee80211_channel ic_channels
[IEEE80211_CHAN_MAX
];
728 uint8_t ic_chan_avail
[IEEE80211_CHAN_BYTES
];
729 uint8_t ic_chan_active
[IEEE80211_CHAN_BYTES
];
730 uint8_t ic_chan_scan
[IEEE80211_CHAN_BYTES
];
733 _db_show_channel("\tcurchan", ic
->ic_curchan
);
735 _db_show_channel("\tbsschan", ic
->ic_bsschan
);
737 _db_show_channel("\tprevchan", ic
->ic_prevchan
);
739 db_printf("\tregdomain %p", &ic
->ic_regdomain
);
742 _db_show_channel("\tcsa_newchan", ic
->ic_csa_newchan
);
743 db_printf(" csa_count %d", ic
->ic_csa_count
);
744 db_printf( "dfs %p", &ic
->ic_dfs
);
747 db_printf("\tscan %p", ic
->ic_scan
);
748 db_printf(" lastdata %d", ic
->ic_lastdata
);
749 db_printf(" lastscan %d", ic
->ic_lastscan
);
752 db_printf("\tmax_keyix %d", ic
->ic_max_keyix
);
753 db_printf(" hash_key 0x%x", ic
->ic_hash_key
);
754 db_printf(" wme %p", &ic
->ic_wme
);
756 db_printf(" sta %p", &ic
->ic_sta
);
758 db_printf("\tstageq@%p:\n", &ic
->ic_stageq
);
759 _db_show_ageq("\t", &ic
->ic_stageq
);
761 _db_show_node_table("\t", &ic
->ic_sta
);
763 db_printf("\tprotmode %d", ic
->ic_protmode
);
764 db_printf("\tcurhtprotmode 0x%x", ic
->ic_curhtprotmode
);
765 db_printf(" htprotmode %d", ic
->ic_htprotmode
);
768 db_printf("\tsuperg %p\n", ic
->ic_superg
);
770 db_printf("\tmontaps %d th %p txchan %p rh %p rxchan %p\n",
771 ic
->ic_montaps
, ic
->ic_th
, ic
->ic_txchan
, ic
->ic_rh
, ic
->ic_rxchan
);
774 DB_PRINTSYM("\t", "ic_vap_create", ic
->ic_vap_create
);
775 DB_PRINTSYM("\t", "ic_vap_delete", ic
->ic_vap_delete
);
777 /* operating mode attachment */
778 ieee80211vap_attach ic_vattach
[IEEE80211_OPMODE_MAX
];
780 DB_PRINTSYM("\t", "ic_newassoc", ic
->ic_newassoc
);
781 DB_PRINTSYM("\t", "ic_getradiocaps", ic
->ic_getradiocaps
);
782 DB_PRINTSYM("\t", "ic_setregdomain", ic
->ic_setregdomain
);
783 DB_PRINTSYM("\t", "ic_send_mgmt", ic
->ic_send_mgmt
);
784 DB_PRINTSYM("\t", "ic_raw_xmit", ic
->ic_raw_xmit
);
785 DB_PRINTSYM("\t", "ic_updateslot", ic
->ic_updateslot
);
786 DB_PRINTSYM("\t", "ic_update_mcast", ic
->ic_update_mcast
);
787 DB_PRINTSYM("\t", "ic_update_promisc", ic
->ic_update_promisc
);
788 DB_PRINTSYM("\t", "ic_node_alloc", ic
->ic_node_alloc
);
789 DB_PRINTSYM("\t", "ic_node_free", ic
->ic_node_free
);
790 DB_PRINTSYM("\t", "ic_node_cleanup", ic
->ic_node_cleanup
);
791 DB_PRINTSYM("\t", "ic_node_getrssi", ic
->ic_node_getrssi
);
792 DB_PRINTSYM("\t", "ic_node_getsignal", ic
->ic_node_getsignal
);
793 DB_PRINTSYM("\t", "ic_node_getmimoinfo", ic
->ic_node_getmimoinfo
);
794 DB_PRINTSYM("\t", "ic_scan_start", ic
->ic_scan_start
);
795 DB_PRINTSYM("\t", "ic_scan_end", ic
->ic_scan_end
);
796 DB_PRINTSYM("\t", "ic_set_channel", ic
->ic_set_channel
);
797 DB_PRINTSYM("\t", "ic_scan_curchan", ic
->ic_scan_curchan
);
798 DB_PRINTSYM("\t", "ic_scan_mindwell", ic
->ic_scan_mindwell
);
799 DB_PRINTSYM("\t", "ic_recv_action", ic
->ic_recv_action
);
800 DB_PRINTSYM("\t", "ic_send_action", ic
->ic_send_action
);
801 DB_PRINTSYM("\t", "ic_addba_request", ic
->ic_addba_request
);
802 DB_PRINTSYM("\t", "ic_addba_response", ic
->ic_addba_response
);
803 DB_PRINTSYM("\t", "ic_addba_stop", ic
->ic_addba_stop
);
807 _db_show_scan(ic
->ic_scan
, showprocs
);
809 if (showvaps
&& !TAILQ_EMPTY(&ic
->ic_vaps
)) {
811 TAILQ_FOREACH(vap
, &ic
->ic_vaps
, iv_next
)
812 _db_show_vap(vap
, showmesh
, showprocs
);
814 if (showsta
&& !TAILQ_EMPTY(&ic
->ic_sta
.nt_node
)) {
815 const struct ieee80211_node_table
*nt
= &ic
->ic_sta
;
816 const struct ieee80211_node
*ni
;
818 TAILQ_FOREACH(ni
, &nt
->nt_node
, ni_list
) {
826 _db_show_all_vaps(void *arg
, struct ieee80211com
*ic
)
828 int showall
= *(int *)arg
;
831 const struct ieee80211vap
*vap
;
832 db_printf("%s: com %p vaps:", ic
->ic_name
, ic
);
833 TAILQ_FOREACH(vap
, &ic
->ic_vaps
, iv_next
)
834 db_printf(" %s(%p)", if_name(vap
->iv_ifp
), vap
);
837 _db_show_com(ic
, 1, 1, 1, 1, 1);
841 _db_show_node_table(const char *tag
, const struct ieee80211_node_table
*nt
)
845 db_printf("%s%s@%p:\n", tag
, nt
->nt_name
, nt
);
846 db_printf("%s nodelock %p", tag
, &nt
->nt_nodelock
);
847 db_printf(" inact_init %d", nt
->nt_inact_init
);
848 db_printf("%s keyixmax %d keyixmap %p\n",
849 tag
, nt
->nt_keyixmax
, nt
->nt_keyixmap
);
850 for (i
= 0; i
< nt
->nt_keyixmax
; i
++) {
851 const struct ieee80211_node
*ni
= nt
->nt_keyixmap
[i
];
853 db_printf("%s [%3u] %p %s\n", tag
, i
, ni
,
854 ether_sprintf(ni
->ni_macaddr
));
859 _db_show_channel(const char *tag
, const struct ieee80211_channel
*c
)
861 db_printf("%s ", tag
);
864 else if (c
== IEEE80211_CHAN_ANYC
)
867 db_printf("[%u (%u) flags=%b maxreg %d maxpow %d minpow %d state 0x%x extieee %u]",
868 c
->ic_freq
, c
->ic_ieee
,
869 c
->ic_flags
, IEEE80211_CHAN_BITS
,
870 c
->ic_maxregpower
, c
->ic_maxpower
, c
->ic_minpower
,
871 c
->ic_state
, c
->ic_extieee
);
875 _db_show_ssid(const char *tag
, int ix
, int len
, const uint8_t *ssid
)
882 if (len
> IEEE80211_NWID_LEN
)
883 len
= IEEE80211_NWID_LEN
;
884 /* determine printable or not */
885 for (i
= 0, p
= ssid
; i
< len
; i
++, p
++) {
886 if (*p
< ' ' || *p
> 0x7e)
891 for (i
= 0, p
= ssid
; i
< len
; i
++, p
++)
896 for (i
= 0, p
= ssid
; i
< len
; i
++, p
++)
897 db_printf("%02x", *p
);
902 _db_show_appie(const char *tag
, const struct ieee80211_appie
*ie
)
909 db_printf("%s [0x", tag
);
910 for (i
= 0, p
= ie
->ie_data
; i
< ie
->ie_len
; i
++, p
++)
911 db_printf("%02x", *p
);
916 _db_show_key(const char *tag
, int ix
, const struct ieee80211_key
*wk
)
918 static const uint8_t zerodata
[IEEE80211_KEYBUF_SIZE
];
919 const struct ieee80211_cipher
*cip
= wk
->wk_cipher
;
920 int keylen
= wk
->wk_keylen
;
923 switch (cip
->ic_cipher
) {
924 case IEEE80211_CIPHER_WEP
:
926 db_printf(" wepkey %u:%s", wk
->wk_keyix
,
927 keylen
<= 5 ? "40-bit" :
928 keylen
<= 13 ? "104-bit" : "128-bit");
930 case IEEE80211_CIPHER_TKIP
:
932 keylen
-= 128/8; /* ignore MIC for now */
933 db_printf(" TKIP %u:%u-bit", wk
->wk_keyix
, 8*keylen
);
935 case IEEE80211_CIPHER_AES_OCB
:
936 db_printf(" AES-OCB %u:%u-bit", wk
->wk_keyix
, 8*keylen
);
938 case IEEE80211_CIPHER_AES_CCM
:
939 db_printf(" AES-CCM %u:%u-bit", wk
->wk_keyix
, 8*keylen
);
941 case IEEE80211_CIPHER_CKIP
:
942 db_printf(" CKIP %u:%u-bit", wk
->wk_keyix
, 8*keylen
);
944 case IEEE80211_CIPHER_NONE
:
945 db_printf(" NULL %u:%u-bit", wk
->wk_keyix
, 8*keylen
);
948 db_printf(" UNKNOWN (0x%x) %u:%u-bit",
949 cip
->ic_cipher
, wk
->wk_keyix
, 8*keylen
);
952 if (wk
->wk_rxkeyix
!= wk
->wk_keyix
)
953 db_printf(" rxkeyix %u", wk
->wk_rxkeyix
);
954 if (memcmp(wk
->wk_key
, zerodata
, keylen
) != 0) {
958 for (i
= 0; i
< keylen
; i
++)
959 db_printf("%02x", wk
->wk_key
[i
]);
961 if (cip
->ic_cipher
!= IEEE80211_CIPHER_WEP
&&
962 wk
->wk_keyrsc
[IEEE80211_NONQOS_TID
] != 0)
963 db_printf(" rsc %ju", (uintmax_t)wk
->wk_keyrsc
[IEEE80211_NONQOS_TID
]);
964 if (cip
->ic_cipher
!= IEEE80211_CIPHER_WEP
&&
966 db_printf(" tsc %ju", (uintmax_t)wk
->wk_keytsc
);
967 db_printf(" flags=%b", wk
->wk_flags
, IEEE80211_KEY_BITS
);
973 printrate(const char *tag
, int v
)
975 if (v
== IEEE80211_FIXED_RATE_NONE
)
976 db_printf(" %s <none>", tag
);
978 db_printf(" %s 5.5", tag
);
979 else if (v
& IEEE80211_RATE_MCS
)
980 db_printf(" %s MCS%d", tag
, v
&~ IEEE80211_RATE_MCS
);
982 db_printf(" %s %d", tag
, v
/2);
986 _db_show_roamparams(const char *tag
, const void *arg
,
987 const struct ieee80211_roamparam
*rp
)
992 db_printf(" rssi %u.5", rp
->rssi
/2);
994 db_printf(" rssi %u", rp
->rssi
/2);
995 printrate("rate", rp
->rate
);
999 _db_show_txparams(const char *tag
, const void *arg
,
1000 const struct ieee80211_txparam
*tp
)
1003 db_printf(tag
, arg
);
1004 printrate("ucastrate", tp
->ucastrate
);
1005 printrate("mcastrate", tp
->mcastrate
);
1006 printrate("mgmtrate", tp
->mgmtrate
);
1007 db_printf(" maxretry %d", tp
->maxretry
);
1011 _db_show_ageq(const char *tag
, const struct ieee80211_ageq
*q
)
1013 const struct mbuf
*m
;
1015 db_printf("%s lock %p len %d maxlen %d drops %d head %p tail %p\n",
1016 tag
, &q
->aq_lock
, q
->aq_len
, q
->aq_maxlen
, q
->aq_drops
,
1017 q
->aq_head
, q
->aq_tail
);
1018 for (m
= q
->aq_head
; m
!= NULL
; m
= m
->m_nextpkt
)
1019 db_printf("%s %p (len %d, %b)\n", tag
, m
, m
->m_len
,
1020 /* XXX could be either TX or RX but is mostly TX */
1021 m
->m_flags
, IEEE80211_MBUF_TX_FLAG_BITS
);
1025 _db_show_stats(const struct ieee80211_stats
*is
)
1029 #ifdef IEEE80211_SUPPORT_MESH
1031 _db_show_mesh(const struct ieee80211_mesh_state
*ms
)
1033 struct ieee80211_mesh_route
*rt
;
1036 _db_show_ssid(" meshid ", 0, ms
->ms_idlen
, ms
->ms_id
);
1037 db_printf("nextseq %u ttl %u flags 0x%x\n", ms
->ms_seq
,
1038 ms
->ms_ttl
, ms
->ms_flags
);
1039 db_printf("routing table:\n");
1041 TAILQ_FOREACH(rt
, &ms
->ms_routes
, rt_next
) {
1042 db_printf("entry %d:\tdest: %6D nexthop: %6D metric: %u", i
,
1043 rt
->rt_dest
, ":", rt
->rt_nexthop
, ":", rt
->rt_metric
);
1045 db_printf("\tlifetime: %u lastseq: %u priv: %p\n",
1046 ieee80211_mesh_rt_update(rt
, 0),
1047 rt
->rt_lastmseq
, rt
->rt_priv
);
1051 #endif /* IEEE80211_SUPPORT_MESH */