qcacmn: Fill rate and bw info for HT/VHT frames in monitor mode
In monitor mode, while filling the radiotap header, rate and bw info for HT and VHT frames was not filled correctly due to which packets in tcpdump are showing incorrect rates and bw for HT/VHT frames. Fill rate and bw info for HT/VHT frames correctly in monitor mode. Change-Id: I2dc9677e48fcf9fe19d61f84a253353e253b16da CRs-Fixed: 2037501
This commit is contained in:
@@ -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];
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user