From 616976e2ce367c468c25f3f15876931017012cb7 Mon Sep 17 00:00:00 2001 From: Vulupala Shashank Reddy Date: Thu, 20 Feb 2020 14:49:25 +0530 Subject: [PATCH] qcacmn: Add support to include ACK status and tx retry count Extend radiotap header to append ACK status and tx retry count for packets sent to virtual mon interface. Change-Id: I51037ffd11dfdee49278d43643fb7861a514ee18 CRs-Fixed: 2627710 --- qdf/inc/qdf_nbuf.h | 6 ++++++ qdf/linux/src/qdf_nbuf.c | 32 +++++++++++++++++++++++++++++++- wmi/src/wmi_unified_tlv.c | 1 + 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/qdf/inc/qdf_nbuf.h b/qdf/inc/qdf_nbuf.h index c54ad46cdd68..a32f3134edbe 100644 --- a/qdf/inc/qdf_nbuf.h +++ b/qdf/inc/qdf_nbuf.h @@ -242,6 +242,9 @@ * @rxpcu_filter_pass: Flag which indicates whether RX packets are received in * BSS mode(not in promisc mode) * @rssi_chain: Rssi chain per nss per bw + * @tx_status: packet tx status + * @tx_retry_cnt: tx retry count + * @add_rtap_ext: add radio tap extension */ struct mon_rx_status { uint64_t tsft; @@ -323,6 +326,9 @@ struct mon_rx_status { uint8_t rxpcu_filter_pass; int8_t rssi_chain[8][8]; uint32_t rx_antenna; + uint8_t tx_status; + uint8_t tx_retry_cnt; + bool add_rtap_ext; }; /** diff --git a/qdf/linux/src/qdf_nbuf.c b/qdf/linux/src/qdf_nbuf.c index ca4e6b14e0a0..d3a4921b067b 100644 --- a/qdf/linux/src/qdf_nbuf.c +++ b/qdf/linux/src/qdf_nbuf.c @@ -4067,6 +4067,8 @@ qdf_nbuf_update_radiotap_he_mu_other_flags(struct mon_rx_status *rx_status, return rtap_len; } +#define IEEE80211_RADIOTAP_TX_STATUS 0 +#define IEEE80211_RADIOTAP_RETRY_COUNT 1 /** * This is the length for radiotap, combined length @@ -4085,6 +4087,11 @@ qdf_nbuf_update_radiotap_he_mu_other_flags(struct mon_rx_status *rx_status, #define RADIOTAP_AMPDU_STATUS_LEN (8 + 3) #define RADIOTAP_VENDOR_NS_LEN \ (sizeof(struct qdf_radiotap_vendor_ns_ath) + 1) +/* This is Radio Tap Header Extension Length. + * 4 Bytes for Extended it_present bit map + + * 4 bytes padding for alignment + */ +#define RADIOTAP_HEADER_EXT_LEN (2 * sizeof(uint32_t)) #define RADIOTAP_HEADER_LEN (sizeof(struct ieee80211_radiotap_header) + \ RADIOTAP_FIXED_HEADER_LEN + \ RADIOTAP_HT_FLAGS_LEN + \ @@ -4093,7 +4100,8 @@ qdf_nbuf_update_radiotap_he_mu_other_flags(struct mon_rx_status *rx_status, RADIOTAP_HE_FLAGS_LEN + \ RADIOTAP_HE_MU_FLAGS_LEN + \ RADIOTAP_HE_MU_OTHER_FLAGS_LEN + \ - RADIOTAP_VENDOR_NS_LEN) + RADIOTAP_VENDOR_NS_LEN + \ + RADIOTAP_HEADER_EXT_LEN) #define IEEE80211_RADIOTAP_HE 23 #define IEEE80211_RADIOTAP_HE_MU 24 @@ -4152,6 +4160,14 @@ unsigned int qdf_nbuf_update_radiotap(struct mon_rx_status *rx_status, uint32_t rtap_len = rtap_hdr_len; uint8_t length = rtap_len; struct qdf_radiotap_vendor_ns_ath *radiotap_vendor_ns_ath; + uint32_t *rtap_ext = NULL; + + /* Adding Extended Header space */ + if (rx_status->add_rtap_ext) { + rtap_hdr_len += RADIOTAP_HEADER_EXT_LEN; + rtap_len = rtap_hdr_len; + } + length = rtap_len; /* IEEE80211_RADIOTAP_TSFT __le64 microseconds*/ rthdr->it_present = (1 << IEEE80211_RADIOTAP_TSFT); @@ -4335,6 +4351,20 @@ unsigned int qdf_nbuf_update_radiotap(struct mon_rx_status *rx_status, cpu_to_le32(rx_status->ppdu_timestamp); rtap_len += sizeof(*radiotap_vendor_ns_ath); + /* Add Extension to Radiotap Header & corresponding data */ + if (rx_status->add_rtap_ext) { + rthdr->it_present |= cpu_to_le32(1 << IEEE80211_RADIOTAP_EXT); + rtap_ext = (uint32_t *)&rthdr->it_present; + rtap_ext++; + *rtap_ext = cpu_to_le32(1 << IEEE80211_RADIOTAP_TX_STATUS); + *rtap_ext |= cpu_to_le32(1 << IEEE80211_RADIOTAP_RETRY_COUNT); + + rtap_buf[rtap_len] = rx_status->tx_status; + rtap_len += 1; + rtap_buf[rtap_len] = rx_status->tx_retry_cnt; + rtap_len += 1; + } + rthdr->it_len = cpu_to_le16(rtap_len); rthdr->it_present = cpu_to_le32(rthdr->it_present); diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index f936f7ea6a19..1aa2919594e0 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -13251,6 +13251,7 @@ extract_vdev_mgmt_offload_event_tlv(void *handle, void *evt_buf, params->buf_len = hdr->buf_len; params->tx_status = hdr->tx_status; params->buf = param_tlvs->bufp; + params->tx_retry_cnt = hdr->tx_retry_cnt; return QDF_STATUS_SUCCESS; } #endif /* WLAN_FEATURE_PKT_CAPTURE */