2015-07-16 22:05 GMT+03:00 Stefan Sperling <[email protected]>: > Make tcpdump show 11n HT capabilities. > > OK? > > Index: print-802_11.c > =================================================================== > RCS file: /cvs/src/usr.sbin/tcpdump/print-802_11.c,v > retrieving revision 1.18 > diff -u -p -r1.18 print-802_11.c > --- print-802_11.c 15 Jul 2015 03:05:00 -0000 1.18 > +++ print-802_11.c 16 Jul 2015 19:02:12 -0000 > @@ -78,6 +78,7 @@ int ieee80211_hdr(struct ieee80211_fram > int ieee80211_data(struct ieee80211_frame *, u_int); > void ieee80211_print_element(u_int8_t *, u_int); > void ieee80211_print_essid(u_int8_t *, u_int); > +void ieee80211_print_htcaps(u_int8_t *, u_int); > int ieee80211_elements(struct ieee80211_frame *, u_int); > int ieee80211_frame(struct ieee80211_frame *, u_int); > int ieee80211_print(struct ieee80211_frame *, u_int); > @@ -230,6 +231,82 @@ ieee80211_print_essid(u_int8_t *essid, u > ieee80211_print_element(essid, len); > } > > +/* Caller checks len */ > +void > +ieee80211_print_htcaps(u_int8_t *data, u_int len) > +{ > + u_int16_t htcaps; > + int smps, rxstbc; > + > + if (len < 2) { > + ieee80211_print_element(data, len); > + return; > + } > + > + htcaps = (data[0]) | (data[1] << 8); > + printf("=<"); > + > + /* channel width */ > + if (htcaps & IEEE80211_HTCAP_CBW20_40) > + printf("20/40MHz"); > + else > + printf("20MHz"); > + > + /* LDPC coding */ > + if (htcaps & IEEE80211_HTCAP_LDPC) > + printf(",LDPC"); > + > + /* spacial mulitplexing power save mode */ > + smps = (htcaps & IEEE80211_HTCAP_SMPS_MASK) > + >> IEEE80211_HTCAP_SMPS_SHIFT; > + if (smps == 0) > + printf(",SMPS static"); > + else if (smps == 1) > + printf(",SMPS dynamic"); > + > + /* 11n greenfield mode */ > + if (htcaps & IEEE80211_HTCAP_GF) > + printf(",greenfield"); > + > + /* short guard interval */ > + if (htcaps & IEEE80211_HTCAP_SGI20) > + printf(",SGI@20MHz"); > + if (htcaps & IEEE80211_HTCAP_SGI40) > + printf(",SGI@40MHz"); > + > + /* space-time block coding */ > + if (htcaps & IEEE80211_HTCAP_TXSTBC) > + printf(",TXSTBC"); > + rxstbc = (htcaps & IEEE80211_HTCAP_RXSTBC_MASK) > + >> IEEE80211_HTCAP_RXSTBC_SHIFT; > + if (rxstbc > 0 && rxstbc < 4) > + printf(",RXSTBC %d stream", rxstbc); > + > + /* delayed block-ack */ > + if (htcaps & IEEE80211_HTCAP_DELAYEDBA) > + printf(",delayed BA"); > + > + /* max A-MSDU length */ > + if (htcaps & IEEE80211_HTCAP_AMSDU7935) > + printf(",A-MSDU 7935"); > + else > + printf(",A-MSDU 3839"); > + > + /* DSSS/CCK in 40MHz mode */ > + if (htcaps & IEEE80211_HTCAP_DSSSCCK40) > + printf(",DSSS/CCK@40MHz"); > + > + /* 40MHz intolerant */ > + if (htcaps & IEEE80211_HTCAP_40INTOLERANT) > + printf(",40MHz intolerant"); > + > + /* L-SIG TXOP protection */ > + if (htcaps & IEEE80211_HTCAP_LSIGTXOPPROT) > + printf(",L-SIG TXOP prot"); > + > + printf(">"); > +} > + > int > ieee80211_elements(struct ieee80211_frame *wh, u_int flen) > { > @@ -354,6 +431,11 @@ ieee80211_elements(struct ieee80211_fram > printf(", tpcrequest"); > if (vflag) > ieee80211_print_element(data, len); > + break; > + case IEEE80211_ELEMID_HTCAPS: > + printf(", htcaps"); > + if (vflag) > + ieee80211_print_htcaps(data, len); > break; > case IEEE80211_ELEMID_VENDOR: > printf(", vendor");
Works for me: 22:36:15.013854 802.11 flags=0<>: beacon, timestamp 611060224384, interval 100, caps=2061<ESS,PRIVACY,SHORT_PREAMBLE,SHORT_SLOTTIME>, ssid (Net), rates 1M 2M 5M 11M 6M 9M 12M 18M, ds (chan 4), tim 0x00010010, erp 0x00, htcaps=<20/40MHz,SGI@20MHz,SGI@40MHz,A-MSDU 3839,DSSS/CCK@40MHz>, rsn 0x0100000fac040200000fac04000fac020100000fac02000f, xrates 24M 36M 48M 54M, <radiotap v0, tsf 1641869086, 1Mbit/s, chan 4, 11g, sig 39dBm, noise -85dBm> okay zhuk@ -- WBR, Vadim Zhukov
