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
Šī revīzija ir iekļauta:
Himanshu Agarwal
2017-04-24 13:56:00 +05:30
revīziju iesūtīja snandini
vecāks 9d973df7e7
revīzija e5b7db3baa
2 mainīti faili ar 33 papildinājumiem un 5 dzēšanām

Parādīt failu

@@ -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];

Parādīt failu

@@ -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);