qca-wifi: Enable peer filtering for enhanced RX capture.
Enable peer filtering for enhanced RX capture mode Change-Id: Icaf8ba680a9b77cf9c07003f0ce18798c9b62d8f
This commit is contained in:
@@ -28,8 +28,10 @@
|
||||
#define RX_ENH_CB_BUF_ALIGNMENT 4
|
||||
|
||||
#define RX_ENH_CAPTURE_TRAILER_LEN 8
|
||||
#define RX_ENH_CAPTURE_MODE_MASK 0x0F
|
||||
#define CDP_RX_ENH_CAPTURE_MODE_MASK 0x0F
|
||||
#define RX_ENH_CAPTURE_TRAILER_ENABLE_MASK 0x10
|
||||
#define CDP_RX_ENH_CAPTURE_PEER_MASK 0xFFFFFFF0
|
||||
#define CDP_RX_ENH_CAPTURE_PEER_LSB 4
|
||||
|
||||
/**
|
||||
* struct cdp_rx_indication_mpdu_info - Rx MPDU info
|
||||
|
@@ -367,6 +367,34 @@ uint16_t dp_rx_mon_enh_capture_update_trailer(struct dp_pdev *pdev,
|
||||
return sizeof(trailer);
|
||||
}
|
||||
|
||||
/**
|
||||
* dp_rx_enh_capture_is_peer_enabled() - Is peer based enh capture enabled.
|
||||
* @soc: core txrx main context
|
||||
* @ppdu_info: Structure for rx ppdu info
|
||||
* @user_id: user id for MU Rx packet
|
||||
*
|
||||
* Return: none
|
||||
*/
|
||||
static inline bool
|
||||
dp_rx_enh_capture_is_peer_enabled(struct dp_soc *soc,
|
||||
struct hal_rx_ppdu_info *ppdu_info,
|
||||
uint32_t user_id)
|
||||
{
|
||||
struct dp_peer *peer;
|
||||
struct dp_ast_entry *ast_entry;
|
||||
uint32_t ast_index;
|
||||
|
||||
ast_index = ppdu_info->rx_user_status[user_id].ast_index;
|
||||
if (ast_index < wlan_cfg_get_max_ast_idx(soc->wlan_cfg_ctx)) {
|
||||
ast_entry = soc->ast_table[ast_index];
|
||||
if (ast_entry) {
|
||||
peer = ast_entry->peer;
|
||||
if (peer && (peer->peer_ids[0] != HTT_INVALID_PEER))
|
||||
return peer->rx_cap_enabled;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
/*
|
||||
* dp_rx_handle_enh_capture() - Deliver Rx enhanced capture data
|
||||
* @pdev: pdev ctx
|
||||
@@ -391,10 +419,16 @@ dp_rx_handle_enh_capture(struct dp_soc *soc, struct dp_pdev *pdev,
|
||||
while (!qdf_nbuf_is_queue_empty(mpdu_q) && user < MAX_MU_USERS) {
|
||||
msdu_list = &pdev->msdu_list[user];
|
||||
dp_rx_free_msdu_list(msdu_list);
|
||||
mpdu_ind = &pdev->mpdu_ind[user];
|
||||
mpdu_info = &mpdu_ind->mpdu_info;
|
||||
pdev->is_mpdu_hdr[user] = true;
|
||||
|
||||
|
||||
if (pdev->rx_enh_capture_peer &&
|
||||
!dp_rx_enh_capture_is_peer_enabled(
|
||||
soc, ppdu_info, user)) {
|
||||
qdf_nbuf_queue_free(mpdu_q);
|
||||
} else {
|
||||
mpdu_ind = &pdev->mpdu_ind;
|
||||
mpdu_info = &mpdu_ind->mpdu_info;
|
||||
dp_rx_populate_cdp_indication_mpdu_info(
|
||||
pdev, &pdev->ppdu_info, mpdu_info, user);
|
||||
|
||||
@@ -405,8 +439,11 @@ dp_rx_handle_enh_capture(struct dp_soc *soc, struct dp_pdev *pdev,
|
||||
QDF_NBUF_CB_RX_FCS_ERR(mpdu_head);
|
||||
|
||||
dp_wdi_event_handler(WDI_EVENT_RX_MPDU,
|
||||
soc, mpdu_ind, HTT_INVALID_PEER,
|
||||
WDI_NO_VAL, pdev->pdev_id);
|
||||
soc, mpdu_ind,
|
||||
HTT_INVALID_PEER,
|
||||
WDI_NO_VAL,
|
||||
pdev->pdev_id);
|
||||
}
|
||||
}
|
||||
user++;
|
||||
mpdu_q = &pdev->mpdu_q[user];
|
||||
@@ -560,22 +597,42 @@ dp_rx_mon_enh_capture_process(struct dp_pdev *pdev, uint32_t tlv_status,
|
||||
* Return: 0 for success. nonzero for failure.
|
||||
*/
|
||||
QDF_STATUS
|
||||
dp_config_enh_rx_capture(struct cdp_pdev *pdev_handle, uint8_t val)
|
||||
dp_config_enh_rx_capture(struct cdp_pdev *pdev_handle, uint32_t val)
|
||||
{
|
||||
struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle;
|
||||
uint8_t rx_cap_mode = (val & RX_ENH_CAPTURE_MODE_MASK);
|
||||
uint8_t rx_cap_mode = (val & CDP_RX_ENH_CAPTURE_MODE_MASK);
|
||||
uint32_t rx_enh_capture_peer;
|
||||
bool is_mpdu_hdr = false;
|
||||
uint8_t user_id;
|
||||
|
||||
rx_enh_capture_peer =
|
||||
(val & CDP_RX_ENH_CAPTURE_PEER_MASK)
|
||||
>> CDP_RX_ENH_CAPTURE_PEER_LSB;
|
||||
|
||||
if (pdev->mcopy_mode || (rx_cap_mode < CDP_RX_ENH_CAPTURE_DISABLED) ||
|
||||
(rx_cap_mode > CDP_RX_ENH_CAPTURE_MPDU_MSDU)) {
|
||||
dp_err("Invalid mode: %d", rx_cap_mode);
|
||||
return QDF_STATUS_E_INVAL;
|
||||
}
|
||||
|
||||
if (rx_enh_capture_peer > CDP_RX_ENH_CAPTURE_PEER_ENABLED) {
|
||||
dp_err("Invalid peer filter %d", rx_enh_capture_peer);
|
||||
return QDF_STATUS_E_INVAL;
|
||||
}
|
||||
|
||||
if (pdev->rx_enh_capture_mode == CDP_RX_ENH_CAPTURE_DISABLED &&
|
||||
rx_cap_mode != CDP_RX_ENH_CAPTURE_DISABLED) {
|
||||
pdev->rx_enh_monitor_vdev = pdev->monitor_vdev;
|
||||
}
|
||||
|
||||
dp_reset_monitor_mode(pdev_handle);
|
||||
|
||||
if (pdev->rx_enh_capture_mode != CDP_RX_ENH_CAPTURE_DISABLED &&
|
||||
rx_cap_mode == CDP_RX_ENH_CAPTURE_DISABLED) {
|
||||
pdev->monitor_vdev = pdev->rx_enh_monitor_vdev;
|
||||
}
|
||||
pdev->rx_enh_capture_mode = rx_cap_mode;
|
||||
pdev->rx_enh_capture_peer = rx_enh_capture_peer;
|
||||
|
||||
if (rx_cap_mode != CDP_RX_ENH_CAPTURE_DISABLED)
|
||||
is_mpdu_hdr = true;
|
||||
|
Reference in New Issue
Block a user