On Thu, Nov 17, 2016 at 02:58:21PM +0100, Stefan Sperling wrote:
> This change allows iwm(4) users to see which rates they're sending and
> receiving packets at (kinda useful for debugging rate scaling issues).

This is a follow-up fix to the diff quoted below (since committed).

Don't strip bits which indicate the "Number of Spatial Streams" (antennas).
These are part of the MCS index value.

Without this fix, MCS 8 and above are wrapped and displayed as MCS 0-7.

ok?

Index: if_iwm.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_iwm.c,v
retrieving revision 1.150
diff -u -p -r1.150 if_iwm.c
--- if_iwm.c    6 Dec 2016 12:57:20 -0000       1.150
+++ if_iwm.c    8 Dec 2016 16:43:46 -0000
@@ -3321,7 +3321,8 @@ iwm_rx_rx_mpdu(struct iwm_softc *sc, str
                if (phy_info->phy_flags &
                    htole16(IWM_RX_RES_PHY_FLAGS_OFDM_HT)) {
                        uint8_t mcs = (phy_info->rate_n_flags &
-                           htole32(IWM_RATE_HT_MCS_RATE_CODE_MSK));
+                           htole32(IWM_RATE_HT_MCS_RATE_CODE_MSK |
+                               IWM_RATE_HT_MCS_NSS_MSK));
                        tap->wr_rate = (0x80 | mcs);
                } else {
                        uint8_t rate = (phy_info->rate_n_flags &

> 
> To see rates in tcpdump you need to use -y and -v options.
> For example: tcpdump -i iwm0 -y IEEE802_11_RADIO -v type data
> 
> Writing to a pcap file and then looking at data rates in wirehark works, too:
> 
>   tcpdump -i iwm0 -y IEEE802_11_RADIO -v -s 1500 -w /tmp/pcap
>   wireshark /tmp/pcap
> 
> Index: if_iwm.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/if_iwm.c,v
> retrieving revision 1.146
> diff -u -p -r1.146 if_iwm.c
> --- if_iwm.c  1 Nov 2016 13:49:50 -0000       1.146
> +++ if_iwm.c  17 Nov 2016 13:46:24 -0000
> @@ -3319,12 +3319,9 @@ iwm_rx_rx_mpdu(struct iwm_softc *sc, str
>               tap->wr_tsft = phy_info->system_timestamp;
>               if (phy_info->phy_flags &
>                   htole16(IWM_RX_RES_PHY_FLAGS_OFDM_HT)) {
> -#ifdef notyet
>                       uint8_t mcs = (phy_info->rate_n_flags &
>                           htole32(IWM_RATE_HT_MCS_RATE_CODE_MSK));
> -#endif
> -                     /* XXX need a way to pass current MCS in 11n mode */
> -                     tap->wr_rate = 0;
> +                     tap->wr_rate = (0x80 | mcs);
>               } else {
>                       uint8_t rate = (phy_info->rate_n_flags &
>                           htole32(IWM_RATE_LEGACY_RATE_MSK));
> @@ -3940,9 +3937,11 @@ iwm_tx(struct iwm_softc *sc, struct mbuf
>               tap->wt_flags = 0;
>               tap->wt_chan_freq = htole16(ni->ni_chan->ic_freq);
>               tap->wt_chan_flags = htole16(ni->ni_chan->ic_flags);
> -             if (rinfo->plcp == IWM_RATE_INVM_PLCP) {
> -                     /* XXX need a way to pass current MCS in 11n mode */
> -                     tap->wt_rate = 0;
> +             if ((ni->ni_flags & IEEE80211_NODE_HT) &&
> +                 !IEEE80211_IS_MULTICAST(wh->i_addr1) &&
> +                 type == IEEE80211_FC0_TYPE_DATA &&
> +                 rinfo->plcp == IWM_RATE_INVM_PLCP) {
> +                     tap->wt_rate = (0x80 | rinfo->ht_plcp);
>               } else
>                       tap->wt_rate = rinfo->rate;
>               tap->wt_hwqueue = ac;
> 

Reply via email to