qcacld-3.0: Skip QOS NULL frames from monitor interface

Skip QOS NULL frames from monitor interface in
packet capture mode.

Change-Id: I132df424c6537fa0cc6f0621affae54e22a7d531
CRs-Fixed: 2644167
This commit is contained in:
Dundi Raviteja
2020-03-31 16:50:54 +05:30
committed by nshrivas
parent 0645234558
commit 49dcd5d662
5 changed files with 54 additions and 19 deletions

View File

@@ -185,4 +185,15 @@ uint32_t pkt_capture_drop_nbuf_list(qdf_nbuf_t buf_list);
* Return: None * Return: None
*/ */
void pkt_capture_record_channel(struct wlan_objmgr_vdev *vdev); void pkt_capture_record_channel(struct wlan_objmgr_vdev *vdev);
/**
* pkt_capture_mon() - Wrapper function to invoke mon cb
* @cb_ctx: packet capture callback context
* @msdu: packet
*
* Return: None
*/
void pkt_capture_mon(struct pkt_capture_cb_context *cb_ctx,
qdf_nbuf_t msdu);
#endif /* end of _WLAN_PKT_CAPTURE_MAIN_H_ */ #endif /* end of _WLAN_PKT_CAPTURE_MAIN_H_ */

View File

@@ -111,6 +111,20 @@ struct pkt_capture_mon_context {
bool is_mon_thread_suspended; bool is_mon_thread_suspended;
}; };
/**
* struct radiotap_header - base radiotap header
* @it_version: radiotap version, always 0
* @it_pad: padding (or alignment)
* @it_len: overall radiotap header length
* @it_present: (first) present word
*/
struct radiotap_header {
uint8_t it_version;
uint8_t it_pad;
__le16 it_len;
__le32 it_present;
} __packed;
/** /**
* pkt_capture_suspend_mon_thread() - suspend packet capture mon thread * pkt_capture_suspend_mon_thread() - suspend packet capture mon thread
* vdev: pointer to vdev object manager * vdev: pointer to vdev object manager

View File

@@ -528,12 +528,7 @@ pkt_capture_rx_data_cb(
*/ */
headroom = qdf_nbuf_headroom(msdu); headroom = qdf_nbuf_headroom(msdu);
qdf_nbuf_update_radiotap(&rx_status, msdu, headroom); qdf_nbuf_update_radiotap(&rx_status, msdu, headroom);
pkt_capture_mon(cb_ctx, msdu);
if (QDF_STATUS_SUCCESS !=
cb_ctx->mon_cb(cb_ctx->mon_ctx, msdu)) {
pkt_capture_err("Frame Rx to HDD failed");
qdf_nbuf_free(msdu);
}
msdu = next_buf; msdu = next_buf;
} }
@@ -706,13 +701,7 @@ pkt_capture_tx_data_cb(
*/ */
headroom = qdf_nbuf_headroom(msdu); headroom = qdf_nbuf_headroom(msdu);
qdf_nbuf_update_radiotap(&tx_status, msdu, headroom); qdf_nbuf_update_radiotap(&tx_status, msdu, headroom);
pkt_capture_mon(cb_ctx, msdu);
if (QDF_STATUS_SUCCESS !=
cb_ctx->mon_cb(cb_ctx->mon_ctx, msdu)) {
pkt_capture_err("Frame Tx to HDD failed");
qdf_nbuf_free(msdu);
}
msdu = next_buf; msdu = next_buf;
} }
return; return;

View File

@@ -100,11 +100,7 @@ pkt_capture_mgmtpkt_cb(void *context, void *ppdev, void *nbuf_list,
while (msdu) { while (msdu) {
next_buf = qdf_nbuf_queue_next(msdu); next_buf = qdf_nbuf_queue_next(msdu);
qdf_nbuf_set_next(msdu, NULL); /* Add NULL terminator */ qdf_nbuf_set_next(msdu, NULL); /* Add NULL terminator */
if (QDF_STATUS_SUCCESS != pkt_capture_mon(cb_ctx, msdu);
cb_ctx->mon_cb(cb_ctx->mon_ctx, msdu)) {
pkt_capture_err("Frame Rx to HDD failed");
qdf_nbuf_free(msdu);
}
msdu = next_buf; msdu = next_buf;
} }

View File

@@ -20,8 +20,33 @@
* DOC: Define internal APIs related to the packet capture component * DOC: Define internal APIs related to the packet capture component
*/ */
#include "wlan_pkt_capture_priv.h" #include "wlan_pkt_capture_mon_thread.h"
#include <linux/kthread.h> #include <linux/kthread.h>
#include "cds_ieee80211_common.h"
void pkt_capture_mon(struct pkt_capture_cb_context *cb_ctx,
qdf_nbuf_t msdu)
{
struct radiotap_header *rthdr;
uint8_t rtlen, type, sub_type;
struct ieee80211_frame *wh;
rthdr = (struct radiotap_header *)qdf_nbuf_data(msdu);
rtlen = rthdr->it_len;
wh = (struct ieee80211_frame *)(qdf_nbuf_data(msdu) + rtlen);
type = (wh)->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
sub_type = (wh)->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;
if ((type == QDF_IEEE80211_FC0_TYPE_DATA) &&
(sub_type == QDF_IEEE80211_FC0_SUBTYPE_QOS_NULL)) {
qdf_nbuf_free(msdu);
return;
}
if (cb_ctx->mon_cb(cb_ctx->mon_ctx, msdu) != QDF_STATUS_SUCCESS) {
pkt_capture_err("Frame Rx to HDD failed");
qdf_nbuf_free(msdu);
}
}
void pkt_capture_free_mon_pkt_freeq(struct pkt_capture_mon_context *mon_ctx) void pkt_capture_free_mon_pkt_freeq(struct pkt_capture_mon_context *mon_ctx)
{ {