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
这个提交包含在:
Himanshu Agarwal
2017-04-24 13:56:00 +05:30
提交者 snandini
父节点 9d973df7e7
当前提交 e5b7db3baa
修改 2 个文件,包含 33 行新增5 行删除

查看文件

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