From b3134da83d4be0ca7afe63d9fb8565badff3054e Mon Sep 17 00:00:00 2001 From: Dundi Raviteja Date: Mon, 2 Mar 2020 12:00:16 +0530 Subject: [PATCH] qcacld-3.0: Check pmf status while processing mgmt packets Add pmf status checks while processing management packets in packet capture component. Change-Id: I04e1f7eb33573a3f77f53f9ffbdf0781041be100 CRs-Fixed: 2633851 --- .../core/inc/wlan_pkt_capture_priv.h | 2 ++ .../core/src/wlan_pkt_capture_mgmt_txrx.c | 33 +++++++++++++++++-- .../inc/wlan_pkt_capture_public_structs.h | 8 +++++ .../inc/wlan_pkt_capture_ucfg_api.h | 11 +++++++ .../src/wlan_pkt_capture_ucfg_api.c | 16 +++++++++ core/wma/inc/wma_api.h | 4 +++ core/wma/src/wma_data.c | 9 +++-- core/wma/src/wma_main.c | 22 +++++++++++++ core/wma/src/wma_mgmt.c | 8 ++--- core/wma/src/wma_utils.c | 15 +++++++++ 10 files changed, 118 insertions(+), 10 deletions(-) diff --git a/components/pkt_capture/core/inc/wlan_pkt_capture_priv.h b/components/pkt_capture/core/inc/wlan_pkt_capture_priv.h index af851d0a154e..bfac4b4f6ed9 100644 --- a/components/pkt_capture/core/inc/wlan_pkt_capture_priv.h +++ b/components/pkt_capture/core/inc/wlan_pkt_capture_priv.h @@ -95,9 +95,11 @@ struct pkt_capture_vdev_priv { * struct pkt_psoc_priv - Private object to be stored in psoc * @psoc: pointer to psoc object * @cfg_param: INI config params for packet capture + * @cb_obj: struct contaning callback pointers */ struct pkt_psoc_priv { struct wlan_objmgr_psoc *psoc; struct pkt_capture_cfg cfg_param; + struct pkt_capture_callbacks cb_obj; }; #endif /* End of _WLAN_PKT_CAPTURE_PRIV_STRUCT_H_ */ diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c b/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c index 9da0130b4cbe..393b6fdf068d 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c @@ -177,20 +177,47 @@ pkt_capture_process_mgmt_tx_data(struct wlan_objmgr_pdev *pdev, uint8_t status) { struct mon_rx_status txrx_status = {0}; + struct pkt_psoc_priv *psoc_priv; + struct wlan_objmgr_vdev *vdev; struct wlan_objmgr_psoc *psoc; uint16_t channel_flags = 0; tpSirMacFrameCtl pfc = (tpSirMacFrameCtl) (qdf_nbuf_data(nbuf)); struct ieee80211_frame *wh; - uint8_t mgt_type; + uint8_t mgt_type, vdev_id; + int rmf_enabled; psoc = wlan_pdev_get_psoc(pdev); if (!psoc) return QDF_STATUS_E_FAILURE; + psoc_priv = pkt_capture_psoc_get_priv(psoc); + if (!psoc_priv) { + pkt_capture_err("psoc priv is NULL"); + return QDF_STATUS_E_FAILURE; + } + wh = (struct ieee80211_frame *)qdf_nbuf_data(nbuf); + + vdev = wlan_objmgr_get_vdev_by_macaddr_from_pdev(pdev, + wh->i_addr2, + WLAN_PKT_CAPTURE_ID); + if (!vdev) { + pkt_capture_err("vdev is NULL"); + return QDF_STATUS_E_FAILURE; + } + vdev_id = wlan_vdev_get_id(vdev); + wlan_objmgr_vdev_release_ref(vdev, WLAN_PKT_CAPTURE_ID); + + rmf_enabled = psoc_priv->cb_obj.get_rmf_status(vdev_id); + if (rmf_enabled < 0) { + pkt_capture_err("unable to get rmf status"); + return QDF_STATUS_E_FAILURE; + } + mgt_type = (wh)->i_fc[0] & IEEE80211_FC0_TYPE_MASK; - if (mgt_type == IEEE80211_FC0_TYPE_MGT && + if (rmf_enabled && + (mgt_type == IEEE80211_FC0_TYPE_MGT) && (pfc->subType == SIR_MAC_MGMT_DISASSOC || pfc->subType == SIR_MAC_MGMT_DEAUTH || pfc->subType == SIR_MAC_MGMT_ACTION)) { @@ -203,7 +230,7 @@ pkt_capture_process_mgmt_tx_data(struct wlan_objmgr_pdev *pdev, orig_hdr = (uint8_t *)qdf_nbuf_data(nbuf); pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev); status = mlme_get_peer_mic_len(psoc, pdev_id, - wh->i_addr2, + wh->i_addr1, &mic_len, &hdr_len); if (QDF_IS_STATUS_ERROR(status)) { diff --git a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h index a032b5da5c74..e864a6853974 100644 --- a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h +++ b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h @@ -58,4 +58,12 @@ struct mgmt_offload_event_params { uint8_t *buf; uint8_t tx_retry_cnt; }; + +/** + * struct pkt_capture_callbacks - callbacks to non-converged driver + * @get_rmf_status: callback to get rmf status + */ +struct pkt_capture_callbacks { + int (*get_rmf_status)(uint8_t vdev_id); +}; #endif /* _WLAN_PKT_CAPTURE_PUBLIC_STRUCTS_H_ */ diff --git a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_ucfg_api.h b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_ucfg_api.h index b1d018591211..21bbc1759ef9 100644 --- a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_ucfg_api.h +++ b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_ucfg_api.h @@ -263,6 +263,17 @@ void ucfg_pkt_capture_tx_completion_process( * Return: None */ void ucfg_pkt_capture_record_channel(struct wlan_objmgr_vdev *vdev); + +/** + * ucfg_pkt_capture_register_callbacks - ucfg API to register WMA callbacks + * @psoc - pointer to psoc object + * @cb_obj - Pointer to packet capture callback structure + * + * Return: status of operation + */ +int +ucfg_pkt_capture_register_wma_callbacks(struct wlan_objmgr_psoc *psoc, + struct pkt_capture_callbacks *cb_obj); #else static inline QDF_STATUS ucfg_pkt_capture_init(void) diff --git a/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c b/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c index 569941ac8969..b688e6baf113 100644 --- a/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c +++ b/components/pkt_capture/dispatcher/src/wlan_pkt_capture_ucfg_api.c @@ -339,3 +339,19 @@ void ucfg_pkt_capture_record_channel(struct wlan_objmgr_vdev *vdev) { pkt_capture_record_channel(vdev); } + +int +ucfg_pkt_capture_register_wma_callbacks(struct wlan_objmgr_psoc *psoc, + struct pkt_capture_callbacks *cb_obj) +{ + struct pkt_psoc_priv *psoc_priv = pkt_capture_psoc_get_priv(psoc); + + if (!psoc_priv) { + pkt_capture_err("psoc priv is NULL"); + return -EINVAL; + } + + psoc_priv->cb_obj.get_rmf_status = cb_obj->get_rmf_status; + + return 0; +} diff --git a/core/wma/inc/wma_api.h b/core/wma/inc/wma_api.h index 4df5bdf840ba..e60c7359671d 100644 --- a/core/wma/inc/wma_api.h +++ b/core/wma/inc/wma_api.h @@ -178,6 +178,10 @@ QDF_STATUS wma_get_connection_info(uint8_t vdev_id, QDF_STATUS wma_ndi_update_connection_info(uint8_t vdev_id, struct nan_datapath_channel_info *ndp_chan_info); +#ifdef WLAN_FEATURE_PKT_CAPTURE +int wma_get_rmf_status(uint8_t vdev_id); +#endif + bool wma_is_vdev_up(uint8_t vdev_id); void *wma_get_beacon_buffer_by_vdev_id(uint8_t vdev_id, uint32_t *buffer_size); diff --git a/core/wma/src/wma_data.c b/core/wma/src/wma_data.c index 13c7259b6e37..e218b8358c89 100644 --- a/core/wma/src/wma_data.c +++ b/core/wma/src/wma_data.c @@ -2792,9 +2792,12 @@ QDF_STATUS wma_tx_packet(void *wma_context, void *tx_frame, uint16_t frmLen, WLAN_MGMT_NB_ID); } - ucfg_pkt_capture_mgmt_tx(wma_handle->pdev, - tx_frame, wma_handle->interfaces[vdev_id].mhz, - mgmt_param.tx_param.preamble_type); + if (ucfg_pkt_capture_get_pktcap_mode(psoc)) { + ucfg_pkt_capture_mgmt_tx(wma_handle->pdev, + tx_frame, + wma_handle->interfaces[vdev_id].mhz, + mgmt_param.tx_param.preamble_type); + } status = wlan_mgmt_txrx_mgmt_frame_tx(peer, wma_handle->mac_context, (qdf_nbuf_t)tx_frame, NULL, diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c index bf613f08783e..ab8cc366435c 100644 --- a/core/wma/src/wma_main.c +++ b/core/wma/src/wma_main.c @@ -106,6 +106,10 @@ #include #endif +#ifdef WLAN_FEATURE_PKT_CAPTURE +#include "wlan_pkt_capture_ucfg_api.h" +#endif + #define WMA_LOG_COMPLETION_TIMER 3000 /* 3 seconds */ #define WMI_TLV_HEADROOM 128 @@ -2844,6 +2848,23 @@ static void wma_register_nan_callbacks(tp_wma_handle wma_handle) } #endif +#ifdef WLAN_FEATURE_PKT_CAPTURE +static void +wma_register_pkt_capture_callbacks(tp_wma_handle wma_handle) +{ + struct pkt_capture_callbacks cb_obj = {0}; + + cb_obj.get_rmf_status = wma_get_rmf_status; + + ucfg_pkt_capture_register_wma_callbacks(wma_handle->psoc, &cb_obj); +} +#else +static inline void +wma_register_pkt_capture_callbacks(tp_wma_handle wma_handle) +{ +} +#endif + /** * wma_open() - Allocate wma context and initialize it. * @cds_context: cds context @@ -3373,6 +3394,7 @@ QDF_STATUS wma_open(struct wlan_objmgr_psoc *psoc, wma_vdev_get_beacon_interval); wma_cbacks.wma_get_connection_info = wma_get_connection_info; wma_register_nan_callbacks(wma_handle); + wma_register_pkt_capture_callbacks(wma_handle); qdf_status = policy_mgr_register_wma_cb(wma_handle->psoc, &wma_cbacks); if (!QDF_IS_STATUS_SUCCESS(qdf_status)) { WMA_LOGE("Failed to register wma cb with Policy Manager"); diff --git a/core/wma/src/wma_mgmt.c b/core/wma/src/wma_mgmt.c index 6ff5b70aa97e..386b79a6338a 100644 --- a/core/wma/src/wma_mgmt.c +++ b/core/wma/src/wma_mgmt.c @@ -2683,8 +2683,8 @@ int wma_mgmt_tx_completion_handler(void *handle, uint8_t *cmpl_event_params, } cmpl_params = param_buf->fixed_param; - if (ucfg_pkt_capture_get_pktcap_mode(wma_handle->psoc) & - PKT_CAPTURE_MODE_MGMT_ONLY) { + if ((ucfg_pkt_capture_get_pktcap_mode(wma_handle->psoc) & + PKT_CAPTURE_MODE_MGMT_ONLY) && param_buf->mgmt_hdr) { struct mgmt_offload_event_params params = {0}; wma_extract_mgmt_offload_event_params( @@ -2758,8 +2758,8 @@ int wma_mgmt_tx_bundle_completion_handler(void *handle, uint8_t *buf, } for (i = 0; i < num_reports; i++) { - if (ucfg_pkt_capture_get_pktcap_mode(wma_handle->psoc) & - PKT_CAPTURE_MODE_MGMT_ONLY) { + if ((ucfg_pkt_capture_get_pktcap_mode(wma_handle->psoc) & + PKT_CAPTURE_MODE_MGMT_ONLY) && param_buf->mgmt_hdr) { struct mgmt_offload_event_params params = {0}; wma_extract_mgmt_offload_event_params( diff --git a/core/wma/src/wma_utils.c b/core/wma/src/wma_utils.c index bde98d58cece..37b03eb4e7c8 100644 --- a/core/wma/src/wma_utils.c +++ b/core/wma/src/wma_utils.c @@ -3601,6 +3601,21 @@ struct wma_txrx_node *wma_get_interface_by_vdev_id(uint8_t vdev_id) return &wma->interfaces[vdev_id]; } +#ifdef WLAN_FEATURE_PKT_CAPTURE +int wma_get_rmf_status(uint8_t vdev_id) +{ + struct wma_txrx_node *iface; + + iface = wma_get_interface_by_vdev_id(vdev_id); + if (!iface) { + WMA_LOGE("Unable to get wma interface"); + return -EINVAL; + } + + return iface->rmfEnabled; +} +#endif + /** * wma_update_intf_hw_mode_params() - Update WMA params * @vdev_id: VDEV id whose params needs to be updated