From owner-p4-projects@FreeBSD.ORG Fri Feb 8 23:12:42 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id AF54716A41B; Fri, 8 Feb 2008 23:12:41 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 541D016A418 for ; Fri, 8 Feb 2008 23:12:41 +0000 (UTC) (envelope-from sam@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 3DC5513C45A for ; Fri, 8 Feb 2008 23:12:41 +0000 (UTC) (envelope-from sam@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m18NCfWH018106 for ; Fri, 8 Feb 2008 23:12:41 GMT (envelope-from sam@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m18NCfBW018103 for perforce@freebsd.org; Fri, 8 Feb 2008 23:12:41 GMT (envelope-from sam@freebsd.org) Date: Fri, 8 Feb 2008 23:12:41 GMT Message-Id: <200802082312.m18NCfBW018103@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to sam@freebsd.org using -f From: Sam Leffler To: Perforce Change Reviews Cc: Subject: PERFORCE change 135066 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 08 Feb 2008 23:12:42 -0000 http://perforce.freebsd.org/chv.cgi?CH=135066 Change 135066 by sam@sam_ebb on 2008/02/08 23:12:26 updates; add show all vaps/a Affected files ... .. //depot/projects/vap/sys/net80211/ieee80211_ddb.c#4 edit Differences ... ==== //depot/projects/vap/sys/net80211/ieee80211_ddb.c#4 (text+ko) ==== @@ -76,7 +76,7 @@ "\21MONITOR\22TKIPMIC\30WPA1\31WPA2\32BURST\33WME\34WDS\36BGSCAN" \ "\37TXFRAG" -#define IEEE80211_HTCAP_BITS \ +#define IEEE80211_C_HTCAP_BITS \ "\20\1LDPC\2CHWIDTH40\5GREENFIELD\6SHORTGI20\7SHORTGI40\10TXSTBC" \ "\21AMPDU\22AMSDU\23HT" @@ -85,8 +85,30 @@ "\20\5TURBO\6CCK\7OFDM\0102GHZ\0115GHZ\12PASSIVE\13DYN\14GFSK" \ "\15STURBO\16HALF\17QUARTER\20HT20\21HT40U\22HT40D\23DFS" +#define IEEE80211_NODE_BITS \ + "\20\1AUTH\2QOS\3ERP\5PWR_MGT\6AREF\7HT\10HTCOMPAT\11WPS\12TSN" \ + "\13AMPDU_RX\14AMPDU_TX" + +#define IEEE80211_ERP_BITS \ + "\20\1NON_ERP_PRESENT\2USE_PROTECTION\3LONG_PREAMBLE" + +#define IEEE80211_CAPINFO_BITS \ + "\20\1ESS\2IBSS\3CF_POLLABLE\4CF_POLLREQ\5PRIVACY\6SHORT_PREAMBLE" \ + "\7PBCC\10CHNL_AGILITY\11SPECTRUM_MGMT\13SHORT_SLOTTIME\14RSN" \ + "\16DSSOFDM" + +#define IEEE80211_HTCAP_BITS \ + "\20\1LDPC\2CHWIDTH40\5GREENFIELD\6SHORTGI20\7SHORTGI40\10TXSTBC" \ + "\13DELBA\14AMSDU(7935)\15DSSSCCK40\16PSMP\1740INTOLERANT" \ + "\20LSIGTXOPPROT" + +#define IEEE80211_AGGR_BITS \ + "\20\1IMMEDIATE\2XCHGPEND\3RUNNING\4SETUP\5NAK" + static void _db_show_sta(const struct ieee80211_node *); static void _db_show_vap(const struct ieee80211vap *, int); +static void _db_show_com(const struct ieee80211com *, + int showvaps, int showsta, int showprocs); static void _db_show_channel(const char *tag, const struct ieee80211_channel *); static void _db_show_ssid(const char *tag, int ix, int len, const uint8_t *); @@ -130,14 +152,12 @@ DB_SHOW_COMMAND(com, db_show_com) { const struct ieee80211com *ic; - const struct ieee80211vap *vap; int i, showprocs = 0, showvaps = 0, showsta = 0; if (!have_addr) { db_printf("usage: show com \n"); return; } - ic = (const struct ieee80211com *) addr; for (i = 0; modif[i] != '\0'; i++) switch (modif[i]) { case 'a': @@ -154,204 +174,127 @@ break; } - db_printf("%p:", ic); - TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) - db_printf(" %s(%p)", vap->iv_ifp->if_xname, vap); - db_printf("\n"); - db_printf("\tifp %p", ic->ic_ifp); - db_printf(" comlock %p", &ic->ic_comlock); - db_printf(" mgtq %p", &ic->ic_mgtq); - db_printf("\n"); - _db_show_stats(&ic->ic_stats); - db_printf("\theadroom %d", ic->ic_headroom); - db_printf(" phytype %d", ic->ic_phytype); - db_printf(" opmode %s", ieee80211_opmode_name[ic->ic_opmode]); - db_printf("\n"); - db_printf("\tmedia %p", &ic->ic_media); - db_printf(" myaddr %s", ether_sprintf(ic->ic_myaddr)); - db_printf(" inact %p", &ic->ic_inact); - db_printf("\n"); - - db_printf("\tflags=%b\n", ic->ic_flags, IEEE80211_F_BITS); - db_printf("\tflags_ext=%b\n", ic->ic_flags_ext, IEEE80211_FEXT_BITS); - db_printf("\tflags_ven=%b\n", ic->ic_flags_ven, IEEE80211_FVEN_BITS); - db_printf("\tcaps=%b\n", ic->ic_caps, IEEE80211_C_BITS); - db_printf("\thtcaps=%b\n", ic->ic_htcaps, IEEE80211_HTCAP_BITS); - -#if 0 - uint8_t ic_modecaps[2]; /* set of mode capabilities */ -#endif - db_printf("\tcurmode %u", ic->ic_curmode); - db_printf(" promisc %u", ic->ic_promisc); - db_printf(" allmulti %u", ic->ic_allmulti); - db_printf(" nrunning %u", ic->ic_nrunning); - db_printf("\n"); - db_printf("\tbintval %u", ic->ic_bintval); - db_printf(" lintval %u", ic->ic_lintval); - db_printf(" holdover %u", ic->ic_holdover); - db_printf(" txpowlimit %u", ic->ic_txpowlimit); - db_printf("\n"); -#if 0 - struct ieee80211_rateset ic_sup_rates[IEEE80211_MODE_MAX]; -#endif - /* - * Channel state: - * - * ic_channels is the set of available channels for the device; - * it is setup by the driver - * ic_nchans is the number of valid entries in ic_channels - * ic_chan_avail is a bit vector of these channels used to check - * whether a channel is available w/o searching the channel table. - * ic_chan_active is a (potentially) constrained subset of - * ic_chan_avail that reflects any mode setting or user-specified - * limit on the set of channels to use/scan - * ic_curchan is the current channel the device is set to; it may - * be different from ic_bsschan when we are off-channel scanning - * or otherwise doing background work - * ic_bsschan is the channel selected for operation; it may - * be undefined (IEEE80211_CHAN_ANYC) - * ic_prevchan is a cached ``previous channel'' used to optimize - * lookups when switching back+forth between two channels - * (e.g. for dynamic turbo) - */ - db_printf("\tnchans %d", ic->ic_nchans); -#if 0 - struct ieee80211_channel ic_channels[IEEE80211_CHAN_MAX+1]; - uint8_t ic_chan_avail[IEEE80211_CHAN_BYTES]; - uint8_t ic_chan_active[IEEE80211_CHAN_BYTES]; - uint8_t ic_chan_scan[IEEE80211_CHAN_BYTES]; -#endif - db_printf("\n"); - _db_show_channel("\tcurchan", ic->ic_curchan); - db_printf("\n"); - _db_show_channel("\tbsschan", ic->ic_bsschan); - db_printf("\n"); - _db_show_channel("\tprevchan", ic->ic_prevchan); - db_printf("\n"); - db_printf("\tregdomain %p", &ic->ic_regdomain); - db_printf("\n"); - - _db_show_channel("\tcsa_newchan", ic->ic_csa_newchan); - db_printf(" csa_count %d", ic->ic_csa_count); - db_printf( "dfs %p", &ic->ic_dfs); - db_printf("\n"); - - db_printf("\tscan %p", ic->ic_scan); - db_printf(" lastdata %d", ic->ic_lastdata); - db_printf(" lastscan %d", ic->ic_lastscan); - db_printf("\n"); - - db_printf("\tmax_keyix %d", ic->ic_max_keyix); - db_printf(" sta %p", &ic->ic_sta); - db_printf(" wme %p", &ic->ic_wme); - db_printf("\n"); - - db_printf("\tprotmode %d", ic->ic_protmode); - db_printf(" nonerpsta %u", ic->ic_nonerpsta); - db_printf(" longslotsta %u", ic->ic_longslotsta); - db_printf(" lastnonerp %d", ic->ic_lastnonerp); - db_printf("\n"); - db_printf("\tsta_assoc %u", ic->ic_sta_assoc); - db_printf(" ht_sta_assoc %u", ic->ic_ht_sta_assoc); - db_printf(" ht40_sta_assoc %u", ic->ic_ht40_sta_assoc); - db_printf("\n"); - db_printf("\tcurhtprotmode 0x%x", ic->ic_curhtprotmode); - db_printf(" htprotmode %d", ic->ic_htprotmode); - db_printf(" lastnonht %d", ic->ic_lastnonht); - db_printf("\n"); - - if (showprocs) { - db_printf("\tic_vap_create %p\n", ic->ic_vap_create); - db_printf("\tic_vap_delete %p\n", ic->ic_vap_delete); -#if 0 - /* operating mode attachment */ - ieee80211vap_attach ic_vattach[IEEE80211_OPMODE_MAX]; -#endif - db_printf("\tic_newassoc %p\n", ic->ic_newassoc); - db_printf("\tic_getradiocaps %p\n", ic->ic_getradiocaps); - db_printf("\tic_setregdomain %p\n", ic->ic_setregdomain); - db_printf("\tic_send_mgmt %p\n", ic->ic_send_mgmt); - db_printf("\tic_raw_xmit %p\n", ic->ic_raw_xmit); - db_printf("\tic_updateslot %p\n", ic->ic_updateslot); - db_printf("\tic_update_mcast %p\n", ic->ic_update_mcast); - db_printf("\tic_update_promisc %p\n", ic->ic_update_promisc); - db_printf("\tic_node_alloc %p\n", ic->ic_node_alloc); - db_printf("\tic_node_free %p\n", ic->ic_node_free); - db_printf("\tic_node_cleanup %p\n", ic->ic_node_cleanup); - db_printf("\tic_node_getrssi %p\n", ic->ic_node_getrssi); - db_printf("\tic_node_getsignal %p\n", ic->ic_node_getsignal); - db_printf("\tic_node_getmimoinfo %p\n", ic->ic_node_getmimoinfo); - db_printf("\tic_scan_start %p\n", ic->ic_scan_start); - db_printf("\tic_scan_end %p\n", ic->ic_scan_end); - db_printf("\tic_set_channel %p\n", ic->ic_set_channel); - db_printf("\tic_scan_curchan %p\n", ic->ic_scan_curchan); - db_printf("\tic_scan_mindwell %p\n", ic->ic_scan_mindwell); - db_printf("\tic_recv_action %p\n", ic->ic_recv_action); - db_printf("\tic_send_action %p\n", ic->ic_send_action); - db_printf("\tic_addba_request %p\n", ic->ic_addba_request); - db_printf("\tic_addba_response %p\n", ic->ic_addba_response); - db_printf("\tic_addba_stop %p\n", ic->ic_addba_stop); - } - if (showvaps && !TAILQ_EMPTY(&ic->ic_vaps)) { - db_printf("\n"); - TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) - _db_show_vap(vap, showprocs); - } - if (showsta && !TAILQ_EMPTY(&ic->ic_sta.nt_node)) { - const struct ieee80211_node_table *nt = &ic->ic_sta; - const struct ieee80211_node *ni; - - db_printf("\n"); - TAILQ_FOREACH(ni, &nt->nt_node, ni_list) - _db_show_sta(ni); - } + ic = (const struct ieee80211com *) addr; + _db_show_com(ic, showvaps, showsta, showprocs); } DB_SHOW_ALL_COMMAND(vaps, db_show_all_vaps) { const struct ifnet *ifp; + int i, showall = 0; + for (i = 0; modif[i] != '\0'; i++) + switch (modif[i]) { + case 'a': + showall = 1; + break; + } + TAILQ_FOREACH(ifp, &ifnet, if_list) if (ifp->if_type == IFT_IEEE80211) { const struct ieee80211com *ic = ifp->if_softc; - const struct ieee80211vap *vap; - db_printf("%s: com %p vaps:", ifp->if_xname, ic); - TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) - db_printf(" %s(%p)", vap->iv_ifp->if_xname, vap); - db_printf("\n"); + if (!showall) { + const struct ieee80211vap *vap; + db_printf("%s: com %p vaps:", + ifp->if_xname, ic); + TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) + db_printf(" %s(%p)", + vap->iv_ifp->if_xname, vap); + db_printf("\n"); + } else + _db_show_com(ic, 1, 1, 1); } } static void +_db_show_txampdu(const char *sep, int ix, const struct ieee80211_tx_ampdu *tap) +{ + db_printf("%stxampdu[%d]: %p flags %b ac %u\n", + sep, ix, tap, tap->txa_flags, IEEE80211_AGGR_BITS, tap->txa_ac); + db_printf("%s token %u qbytes %d qframes %d seqstart %u start %u wnd %u\n", + sep, tap->txa_token, tap->txa_qbytes, tap->txa_qframes, + tap->txa_seqstart, tap->txa_start, tap->txa_wnd); + db_printf("%s attempts %d lastrequest %d\n", + sep, tap->txa_attempts, tap->txa_lastrequest); + /* XXX packet q + timer */ +} + +static void +_db_show_rxampdu(const char *sep, int ix, const struct ieee80211_rx_ampdu *rap) +{ + db_printf("%srxampdu[%d]: %p flags 0x%x tid %u\n", + sep, ix, rap, rap->rxa_flags, ix /*XXX */); + db_printf("%s qbytes %d qframes %d seqstart %u start %u wnd %u\n", + sep, rap->rxa_qbytes, rap->rxa_qframes, + rap->rxa_seqstart, rap->rxa_start, rap->rxa_wnd); + db_printf("%s age %d nframes %d\n", + sep, rap->rxa_age, rap->rxa_nframes); +} + +static void _db_show_sta(const struct ieee80211_node *ni) { + int i; + db_printf("0x%p: mac %s refcnt %d\n", ni, ether_sprintf(ni->ni_macaddr), ieee80211_node_refcnt(ni)); - db_printf("\tscangen %u authmode %u flags 0x%x\n", - ni->ni_scangen, ni->ni_authmode, ni->ni_flags); + db_printf("\tvap %p wdsvap %p ic %p table %p\n", + ni->ni_vap, ni->ni_wdsvap, ni->ni_ic, ni->ni_table); + db_printf("\tflags=%b\n", ni->ni_flags, IEEE80211_NODE_BITS); + db_printf("\tscangen %u authmode %u ath_flags 0x%x ath_defkeyix %u\n", + ni->ni_scangen, ni->ni_authmode, + ni->ni_ath_flags, ni->ni_ath_defkeyix); db_printf("\tassocid 0x%x txpower %u vlan %u\n", ni->ni_associd, ni->ni_txpower, ni->ni_vlan); + db_printf("\tjointime %d (%lu secs) challenge %p\n", + ni->ni_jointime, (unsigned long)(time_uptime - ni->ni_jointime), + ni->ni_challenge); + db_printf("\ties: data %p len %d\n", ni->ni_ies.data, ni->ni_ies.len); + db_printf("\t[wpa_ie %p rsn_ie %p wme_ie %p ath_ie %p\n", + ni->ni_ies.wpa_ie, ni->ni_ies.rsn_ie, ni->ni_ies.wme_ie, + ni->ni_ies.ath_ie); + db_printf("\t htcap_ie %p htinfo_ie %p]\n", + ni->ni_ies.htcap_ie, ni->ni_ies.htinfo_ie); db_printf("\ttxseq %u rxseq %u fragno %u rxfragstamp %u\n", ni->ni_txseqs[IEEE80211_NONQOS_TID], ni->ni_rxseqs[IEEE80211_NONQOS_TID] >> IEEE80211_SEQ_SEQ_SHIFT, ni->ni_rxseqs[IEEE80211_NONQOS_TID] & IEEE80211_SEQ_FRAG_MASK, ni->ni_rxfragstamp); - db_printf("\trstamp %u avgrssi 0x%x noise %d intval %u capinfo 0x%x\n", - ni->ni_rstamp, ni->ni_avgrssi, ni->ni_noise, - ni->ni_intval, ni->ni_capinfo); + db_printf("\trxfrag[0] %p rxfrag[1] %p rxfrag[2] %p\n", + ni->ni_rxfrag[0], ni->ni_rxfrag[1], ni->ni_rxfrag[2]); + db_printf("\trstamp %u avgrssi 0x%x (rssi %d) noise %d\n", + ni->ni_rstamp, ni->ni_avgrssi, + IEEE80211_RSSI_GET(ni->ni_avgrssi), ni->ni_noise); + db_printf("\tintval %u capinfo %b\n", + ni->ni_intval, ni->ni_capinfo, IEEE80211_CAPINFO_BITS); db_printf("\tbssid %s", ether_sprintf(ni->ni_bssid)); _db_show_ssid(" essid ", 0, ni->ni_esslen, ni->ni_essid); db_printf("\n"); _db_show_channel("\tchannel", ni->ni_chan); db_printf("\n"); - db_printf("\tinact %u txrate %u\n", - ni->ni_inact, ni->ni_txrate); - db_printf("\thtcap %x htparam %x htctlchan %u ht2ndchan %u\n", - ni->ni_htcap, ni->ni_htparam, - ni->ni_htctlchan, ni->ni_ht2ndchan); - db_printf("\thtopmode %x htstbc %x chw %u\n", - ni->ni_htopmode, ni->ni_htstbc, ni->ni_chw); + db_printf("\terp %b dtim_period %u dtim_count %u\n", + ni->ni_erp, IEEE80211_ERP_BITS, + ni->ni_dtim_period, ni->ni_dtim_count); + + db_printf("\thtcap %b htparam 0x%x htctlchan %u ht2ndchan %u\n", + ni->ni_htcap, IEEE80211_HTCAP_BITS, + ni->ni_htparam, ni->ni_htctlchan, ni->ni_ht2ndchan); + db_printf("\thtopmode 0x%x htstbc 0x%x reqcw %u chw %u\n", + ni->ni_htopmode, ni->ni_htstbc, ni->ni_reqcw, ni->ni_chw); + + /* XXX ampdu state */ + for (i = 0; i < WME_NUM_AC; i++) + if (ni->ni_tx_ampdu[i].txa_flags & IEEE80211_AGGR_SETUP) + _db_show_txampdu("\t", i, &ni->ni_tx_ampdu[i]); + for (i = 0; i < WME_NUM_TID; i++) + if (ni->ni_rx_ampdu[i].rxa_nframes) + _db_show_rxampdu("\t", i, &ni->ni_rx_ampdu[i]); + + db_printf("\tinact %u inact_reload %u txrate %u\n", + ni->ni_inact, ni->ni_inact_reload, ni->ni_txrate); + /* XXX savedq */ + /* XXX wdsq */ } static void @@ -384,7 +327,7 @@ db_printf("\tflags_ext=%b\n", vap->iv_flags_ext, IEEE80211_FEXT_BITS); db_printf("\tflags_ven=%b\n", vap->iv_flags_ven, IEEE80211_FVEN_BITS); db_printf("\tcaps=%b\n", vap->iv_caps, IEEE80211_C_BITS); - db_printf("\thtcaps=%b\n", vap->iv_htcaps, IEEE80211_HTCAP_BITS); + db_printf("\thtcaps=%b\n", vap->iv_htcaps, IEEE80211_C_HTCAP_BITS); _db_show_stats(&vap->iv_stats); @@ -414,15 +357,15 @@ db_printf("\tscanreq_duration %u", vap->iv_scanreq_duration); db_printf(" scanreq_mindwell %u", vap->iv_scanreq_mindwell); db_printf(" scanreq_maxdwell %u", vap->iv_scanreq_maxdwell); + db_printf("\n"); db_printf(" scanreq_flags 0x%x", vap->iv_scanreq_flags); - db_printf("\n"); db_printf("\tscanreq_nssid %d", vap->iv_scanreq_nssid); for (i = 0; i < vap->iv_scanreq_nssid; i++) _db_show_ssid(" scanreq_ssid[%u]", i, vap->iv_scanreq_ssid[i].len, vap->iv_scanreq_ssid[i].ssid); db_printf(" roaming %d", vap->iv_roaming); db_printf("\n"); - for (i = 0; i < IEEE80211_MODE_MAX; i++) + for (i = IEEE80211_MODE_11A; i < IEEE80211_MODE_MAX; i++) if (isset(ic->ic_modecaps, i)) { _db_show_roamparams("\troamparms[%s]", ieee80211_phymode_name[i], &vap->iv_roamparms[i]); @@ -463,7 +406,7 @@ db_printf(" fragthreshold %u", vap->iv_fragthreshold); db_printf(" inact_timer %d", vap->iv_inact_timer); db_printf("\n"); - for (i = 0; i < IEEE80211_MODE_MAX; i++) + for (i = IEEE80211_MODE_11A; i < IEEE80211_MODE_MAX; i++) if (isset(ic->ic_modecaps, i)) { _db_show_txparams("\ttxparms[%s]", ieee80211_phymode_name[i], &vap->iv_txparms[i]); @@ -516,6 +459,165 @@ } static void +_db_show_com(const struct ieee80211com *ic, int showvaps, int showsta, int showprocs) +{ + struct ieee80211vap *vap; + + db_printf("%p:", ic); + TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) + db_printf(" %s(%p)", vap->iv_ifp->if_xname, vap); + db_printf("\n"); + db_printf("\tifp %p", ic->ic_ifp); + db_printf(" comlock %p", &ic->ic_comlock); + db_printf(" mgtq %p", &ic->ic_mgtq); + db_printf("\n"); + _db_show_stats(&ic->ic_stats); + db_printf("\theadroom %d", ic->ic_headroom); + db_printf(" phytype %d", ic->ic_phytype); + db_printf(" opmode %s", ieee80211_opmode_name[ic->ic_opmode]); + db_printf("\n"); + db_printf("\tmedia %p", &ic->ic_media); + db_printf(" myaddr %s", ether_sprintf(ic->ic_myaddr)); + db_printf(" inact %p", &ic->ic_inact); + db_printf("\n"); + + db_printf("\tflags=%b\n", ic->ic_flags, IEEE80211_F_BITS); + db_printf("\tflags_ext=%b\n", ic->ic_flags_ext, IEEE80211_FEXT_BITS); + db_printf("\tflags_ven=%b\n", ic->ic_flags_ven, IEEE80211_FVEN_BITS); + db_printf("\tcaps=%b\n", ic->ic_caps, IEEE80211_C_BITS); + db_printf("\thtcaps=%b\n", ic->ic_htcaps, IEEE80211_HTCAP_BITS); + +#if 0 + uint8_t ic_modecaps[2]; /* set of mode capabilities */ +#endif + db_printf("\tcurmode %u", ic->ic_curmode); + db_printf(" promisc %u", ic->ic_promisc); + db_printf(" allmulti %u", ic->ic_allmulti); + db_printf(" nrunning %u", ic->ic_nrunning); + db_printf("\n"); + db_printf("\tbintval %u", ic->ic_bintval); + db_printf(" lintval %u", ic->ic_lintval); + db_printf(" holdover %u", ic->ic_holdover); + db_printf(" txpowlimit %u", ic->ic_txpowlimit); + db_printf("\n"); +#if 0 + struct ieee80211_rateset ic_sup_rates[IEEE80211_MODE_MAX]; +#endif + /* + * Channel state: + * + * ic_channels is the set of available channels for the device; + * it is setup by the driver + * ic_nchans is the number of valid entries in ic_channels + * ic_chan_avail is a bit vector of these channels used to check + * whether a channel is available w/o searching the channel table. + * ic_chan_active is a (potentially) constrained subset of + * ic_chan_avail that reflects any mode setting or user-specified + * limit on the set of channels to use/scan + * ic_curchan is the current channel the device is set to; it may + * be different from ic_bsschan when we are off-channel scanning + * or otherwise doing background work + * ic_bsschan is the channel selected for operation; it may + * be undefined (IEEE80211_CHAN_ANYC) + * ic_prevchan is a cached ``previous channel'' used to optimize + * lookups when switching back+forth between two channels + * (e.g. for dynamic turbo) + */ + db_printf("\tnchans %d", ic->ic_nchans); +#if 0 + struct ieee80211_channel ic_channels[IEEE80211_CHAN_MAX+1]; + uint8_t ic_chan_avail[IEEE80211_CHAN_BYTES]; + uint8_t ic_chan_active[IEEE80211_CHAN_BYTES]; + uint8_t ic_chan_scan[IEEE80211_CHAN_BYTES]; +#endif + db_printf("\n"); + _db_show_channel("\tcurchan", ic->ic_curchan); + db_printf("\n"); + _db_show_channel("\tbsschan", ic->ic_bsschan); + db_printf("\n"); + _db_show_channel("\tprevchan", ic->ic_prevchan); + db_printf("\n"); + db_printf("\tregdomain %p", &ic->ic_regdomain); + db_printf("\n"); + + _db_show_channel("\tcsa_newchan", ic->ic_csa_newchan); + db_printf(" csa_count %d", ic->ic_csa_count); + db_printf( "dfs %p", &ic->ic_dfs); + db_printf("\n"); + + db_printf("\tscan %p", ic->ic_scan); + db_printf(" lastdata %d", ic->ic_lastdata); + db_printf(" lastscan %d", ic->ic_lastscan); + db_printf("\n"); + + db_printf("\tmax_keyix %d", ic->ic_max_keyix); + db_printf(" sta %p", &ic->ic_sta); + db_printf(" wme %p", &ic->ic_wme); + db_printf("\n"); + + db_printf("\tprotmode %d", ic->ic_protmode); + db_printf(" nonerpsta %u", ic->ic_nonerpsta); + db_printf(" longslotsta %u", ic->ic_longslotsta); + db_printf(" lastnonerp %d", ic->ic_lastnonerp); + db_printf("\n"); + db_printf("\tsta_assoc %u", ic->ic_sta_assoc); + db_printf(" ht_sta_assoc %u", ic->ic_ht_sta_assoc); + db_printf(" ht40_sta_assoc %u", ic->ic_ht40_sta_assoc); + db_printf("\n"); + db_printf("\tcurhtprotmode 0x%x", ic->ic_curhtprotmode); + db_printf(" htprotmode %d", ic->ic_htprotmode); + db_printf(" lastnonht %d", ic->ic_lastnonht); + db_printf("\n"); + + if (showprocs) { + db_printf("\tic_vap_create %p\n", ic->ic_vap_create); + db_printf("\tic_vap_delete %p\n", ic->ic_vap_delete); +#if 0 + /* operating mode attachment */ + ieee80211vap_attach ic_vattach[IEEE80211_OPMODE_MAX]; +#endif + db_printf("\tic_newassoc %p\n", ic->ic_newassoc); + db_printf("\tic_getradiocaps %p\n", ic->ic_getradiocaps); + db_printf("\tic_setregdomain %p\n", ic->ic_setregdomain); + db_printf("\tic_send_mgmt %p\n", ic->ic_send_mgmt); + db_printf("\tic_raw_xmit %p\n", ic->ic_raw_xmit); + db_printf("\tic_updateslot %p\n", ic->ic_updateslot); + db_printf("\tic_update_mcast %p\n", ic->ic_update_mcast); + db_printf("\tic_update_promisc %p\n", ic->ic_update_promisc); + db_printf("\tic_node_alloc %p\n", ic->ic_node_alloc); + db_printf("\tic_node_free %p\n", ic->ic_node_free); + db_printf("\tic_node_cleanup %p\n", ic->ic_node_cleanup); + db_printf("\tic_node_getrssi %p\n", ic->ic_node_getrssi); + db_printf("\tic_node_getsignal %p\n", ic->ic_node_getsignal); + db_printf("\tic_node_getmimoinfo %p\n", ic->ic_node_getmimoinfo); + db_printf("\tic_scan_start %p\n", ic->ic_scan_start); + db_printf("\tic_scan_end %p\n", ic->ic_scan_end); + db_printf("\tic_set_channel %p\n", ic->ic_set_channel); + db_printf("\tic_scan_curchan %p\n", ic->ic_scan_curchan); + db_printf("\tic_scan_mindwell %p\n", ic->ic_scan_mindwell); + db_printf("\tic_recv_action %p\n", ic->ic_recv_action); + db_printf("\tic_send_action %p\n", ic->ic_send_action); + db_printf("\tic_addba_request %p\n", ic->ic_addba_request); + db_printf("\tic_addba_response %p\n", ic->ic_addba_response); + db_printf("\tic_addba_stop %p\n", ic->ic_addba_stop); + } + if (showvaps && !TAILQ_EMPTY(&ic->ic_vaps)) { + db_printf("\n"); + TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) + _db_show_vap(vap, showprocs); + } + if (showsta && !TAILQ_EMPTY(&ic->ic_sta.nt_node)) { + const struct ieee80211_node_table *nt = &ic->ic_sta; + const struct ieee80211_node *ni; + + TAILQ_FOREACH(ni, &nt->nt_node, ni_list) { + db_printf("\n"); + _db_show_sta(ni); + } + } +} + +static void _db_show_channel(const char *tag, const struct ieee80211_channel *c) { db_printf("%s ", tag); @@ -641,13 +743,14 @@ static void printrate(const char *tag, int v) { - if (v == 11) + if (v == IEEE80211_FIXED_RATE_NONE) + db_printf(" %s ", tag); + else if (v == 11) db_printf(" %s 5.5", tag); - else if (v & IEEE80211_RATE_MCS) { + else if (v & IEEE80211_RATE_MCS) db_printf(" %s MCS%d", tag, v &~ IEEE80211_RATE_MCS); - } else { + else db_printf(" %s %d", tag, v/2); - } } static void