qcacmn: Add local packet capture type based filtering

For the control frames regenerated by the host driver based on the
TxMon TLV, add the local packet capture type based filtering.

Change-Id: If6b47368ce36524e1c84c51c298278ced671b915
CRs-Fixed: 3531895
Этот коммит содержится в:
Srinivas Girigowda
2023-07-17 11:44:17 -07:00
коммит произвёл Rahul Choudhary
родитель 0728e55056
Коммит afd51dc121

Просмотреть файл

@@ -952,6 +952,58 @@ dp_tx_lite_mon_filtering(struct dp_pdev *pdev,
#endif
#ifdef WLAN_FEATURE_LOCAL_PKT_CAPTURE
/**
* dp_tx_mon_lpc_type_filtering() - Additional filtering for lpc
* @pdev: Pointer to physical device
* @tx_ppdu_info: pointer to dp_tx_ppdu_info structure
* @buf: qdf nbuf structure of buffer
*
* Return: QDF_STATUS
*/
static inline QDF_STATUS
dp_tx_mon_lpc_type_filtering(struct dp_pdev *pdev,
struct dp_tx_ppdu_info *tx_ppdu_info,
qdf_nbuf_t buf)
{
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
qdf_nbuf_t nbuf;
struct ieee80211_frame_min_one *wh;
uint16_t mgmt_filter, ctrl_filter, data_filter, type;
if (qdf_unlikely(!IS_LOCAL_PKT_CAPTURE_RUNNING(mon_pdev,
is_local_pkt_capture_running)))
return QDF_STATUS_E_ABORTED;
if (dp_tx_mon_nbuf_get_num_frag(buf)) {
wh = (struct ieee80211_frame_min_one *)qdf_nbuf_get_frag_addr(buf, 0);
} else {
nbuf = qdf_nbuf_get_ext_list(buf);
if (nbuf)
wh = (struct ieee80211_frame_min_one *)qdf_nbuf_data(nbuf);
else
return QDF_STATUS_E_ABORTED;
}
mgmt_filter = mon_pdev->fp_mgmt_filter;
ctrl_filter = mon_pdev->fp_ctrl_filter;
data_filter = mon_pdev->fp_data_filter;
type = (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK);
switch (type) {
case QDF_IEEE80211_FC0_TYPE_MGT:
return mgmt_filter ? QDF_STATUS_SUCCESS : QDF_STATUS_E_ABORTED;
case QDF_IEEE80211_FC0_TYPE_CTL:
return ctrl_filter ? QDF_STATUS_SUCCESS : QDF_STATUS_E_ABORTED;
case QDF_IEEE80211_FC0_TYPE_DATA:
return data_filter ? QDF_STATUS_SUCCESS : QDF_STATUS_E_ABORTED;
default:
return QDF_STATUS_E_ABORTED;
}
return QDF_STATUS_SUCCESS;
}
static int
dp_tx_handle_local_pkt_capture(struct dp_pdev *pdev, qdf_nbuf_t nbuf)
{
@@ -976,6 +1028,15 @@ dp_tx_handle_local_pkt_capture(struct dp_pdev *pdev, qdf_nbuf_t nbuf)
{
return 0;
}
static inline QDF_STATUS
dp_tx_mon_lpc_type_filtering(struct dp_pdev *pdev,
struct dp_tx_ppdu_info *tx_ppdu_info,
qdf_nbuf_t buf)
{
return QDF_STATUS_SUCCESS;
}
#endif
/**
@@ -1061,7 +1122,8 @@ dp_tx_mon_send_per_usr_mpdu(struct dp_pdev *pdev,
&ppdu_info->hal_txmon.rx_user_status[user_idx];
if (dp_tx_lite_mon_filtering(pdev, ppdu_info, buf,
++mpdu_count)) {
++mpdu_count) ||
dp_tx_mon_lpc_type_filtering(pdev, ppdu_info, buf)) {
qdf_nbuf_free(buf);
continue;
}