diff --git a/qdf/inc/qdf_nbuf.h b/qdf/inc/qdf_nbuf.h index 3255108b58..be767686e2 100644 --- a/qdf/inc/qdf_nbuf.h +++ b/qdf/inc/qdf_nbuf.h @@ -116,13 +116,15 @@ * @chan_num: Capture channel number * @chan_flags: Bitmap of Channel flags, IEEE80211_CHAN_TURBO, * IEEE80211_CHAN_CCK... - * @vht_flags: VHT flgs, only present for VHT frames. + * @ht_flags: HT flags, only present for HT frames. + * @vht_flags: VHT flags, only present for VHT frames. * @vht_flag_values1-5: Contains corresponding data for flags field * @rate: Rate in terms 500Kbps * @rtap_flags: Bit map of available fields in the radiotap * @ant_signal_db: Rx packet RSSI * @nr_ant: Number of Antennas used for streaming * @mcs: MCS index of Rx frame + * @bw: bandwidth of rx frame * @is_stbc: Is STBC enabled * @sgi: Rx frame short guard interval * @ldpc: ldpc enabled @@ -133,6 +135,7 @@ struct mon_rx_status { uint16_t chan_freq; uint16_t chan_num; uint16_t chan_flags; + uint16_t ht_flags; uint16_t vht_flags; uint16_t vht_flag_values6; uint8_t rate; @@ -140,6 +143,7 @@ struct mon_rx_status { uint8_t ant_signal_db; uint8_t nr_ant; uint8_t mcs; + uint8_t bw; uint8_t vht_flag_values1; uint8_t vht_flag_values2; uint8_t vht_flag_values3[4]; diff --git a/qdf/linux/src/qdf_nbuf.c b/qdf/linux/src/qdf_nbuf.c index eee4d3f340..9ed11cbc4d 100644 --- a/qdf/linux/src/qdf_nbuf.c +++ b/qdf/linux/src/qdf_nbuf.c @@ -2529,6 +2529,7 @@ static unsigned int qdf_nbuf_update_radiotap_vht_flags( IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH; put_unaligned_le16(vht_flags, &rtap_buf[rtap_len]); rtap_len += 2; + rtap_buf[rtap_len] |= (rx_status->is_stbc ? IEEE80211_RADIOTAP_VHT_FLAG_STBC : 0) | @@ -2537,8 +2538,8 @@ static unsigned int qdf_nbuf_update_radiotap_vht_flags( IEEE80211_RADIOTAP_VHT_FLAG_LDPC_EXTRA_OFDM_SYM : 0) | (rx_status->beamformed ? IEEE80211_RADIOTAP_VHT_FLAG_BEAMFORMED : 0); - rtap_len += 1; + rtap_buf[rtap_len] = (rx_status->vht_flag_values2); rtap_len += 1; rtap_buf[rtap_len] = (rx_status->vht_flag_values3[0]); @@ -2598,11 +2599,15 @@ unsigned int qdf_nbuf_update_radiotap(struct mon_rx_status *rx_status, rtap_len += 1; /* IEEE80211_RADIOTAP_RATE u8 500kb/s */ - rthdr->it_present |= cpu_to_le32(1 << IEEE80211_RADIOTAP_RATE); - rtap_buf[rtap_len] = rx_status->rate; + if (!rx_status->ht_flags && !rx_status->vht_flags) { + rthdr->it_present |= cpu_to_le32(1 << IEEE80211_RADIOTAP_RATE); + rtap_buf[rtap_len] = rx_status->rate; + } else + rtap_buf[rtap_len] = 0; rtap_len += 1; - rthdr->it_present |= cpu_to_le32(1 << IEEE80211_RADIOTAP_CHANNEL); + /* IEEE80211_RADIOTAP_CHANNEL 2 x __le16 MHz, bitmap */ + rthdr->it_present |= cpu_to_le32(1 << IEEE80211_RADIOTAP_CHANNEL); put_unaligned_le16(rx_status->chan_freq, &rtap_buf[rtap_len]); rtap_len += 2; /* Channel flags. */ @@ -2625,6 +2630,25 @@ unsigned int qdf_nbuf_update_radiotap(struct mon_rx_status *rx_status, rthdr->it_present |= cpu_to_le32(1 << IEEE80211_RADIOTAP_ANTENNA); rtap_buf[rtap_len] = rx_status->nr_ant; rtap_len += 1; + + if (rx_status->ht_flags) { + /* IEEE80211_RADIOTAP_VHT u8, u8, u8 */ + rthdr->it_present |= cpu_to_le32(1 << IEEE80211_RADIOTAP_MCS); + rtap_buf[rtap_len] = IEEE80211_RADIOTAP_MCS_HAVE_BW | + IEEE80211_RADIOTAP_MCS_HAVE_MCS | + IEEE80211_RADIOTAP_MCS_HAVE_GI; + rtap_len += 1; + + if (rx_status->sgi) + rtap_buf[rtap_len] |= IEEE80211_RADIOTAP_MCS_SGI; + if (rx_status->bw) + rtap_buf[rtap_len] |= IEEE80211_RADIOTAP_MCS_BW_40; + rtap_len += 1; + + rtap_buf[rtap_len] = rx_status->mcs; + rtap_len += 1; + } + if (rx_status->vht_flags) { /* IEEE80211_RADIOTAP_VHT u16, u8, u8, u8[4], u8, u8, u16 */ rthdr->it_present |= cpu_to_le32(1 << IEEE80211_RADIOTAP_VHT);