From 938ddb0956108bb65a233424e994057a186f3478 Mon Sep 17 00:00:00 2001 From: Santosh Anbu Date: Mon, 24 Oct 2022 11:43:33 +0530 Subject: [PATCH] qcacmn: Add mon dp ops to set monitor filter As part of mac address filtering feature for scan radio in special vap mode, on addition of first NAC entry or deletion of last NAC entry the corresponding monitor filter needs to be set or reset Add change to support ops callback function required to set or reset monitor filter settings are runtime. Change-Id: I916c0b246bb180363f1a181ef49618af763b261d CRs-Fixed: 3317409 --- dp/inc/cdp_txrx_ctrl.h | 29 ++++++++++ dp/inc/cdp_txrx_ops.h | 3 ++ dp/wifi3.0/dp_htt.h | 2 + dp/wifi3.0/monitor/1.0/dp_mon_1.0.c | 2 + dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.c | 61 ++++++++++++++++++++++ dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.h | 7 +++ dp/wifi3.0/monitor/dp_mon.c | 55 +++++++++++++++++++ dp/wifi3.0/monitor/dp_mon.h | 2 + dp/wifi3.0/monitor/dp_mon_filter.c | 9 ++++ dp/wifi3.0/monitor/dp_mon_filter.h | 7 +++ 10 files changed, 177 insertions(+) diff --git a/dp/inc/cdp_txrx_ctrl.h b/dp/inc/cdp_txrx_ctrl.h index ff1960d3c6..c6f0a3faf5 100644 --- a/dp/inc/cdp_txrx_ctrl.h +++ b/dp/inc/cdp_txrx_ctrl.h @@ -97,6 +97,35 @@ cdp_update_filter_neighbour_peers(ol_txrx_soc_handle soc, } #endif /* ATH_SUPPORT_NAC || ATH_SUPPORT_NAC_RSSI*/ +/** + * @brief update the monitor buffer and status filter + * @details + * This defines interface function to set/reset monitor filter + * in case of special vap (scan radio) + * + * @param soc - the pointer to soc object + * @param vdev_id - id of the pointer to vdev + * @param cmd - add/del entry into peer table + * @return - QDF_STATUS + */ +static inline QDF_STATUS +cdp_update_mon_mac_filter(ol_txrx_soc_handle soc, + uint8_t vdev_id, uint32_t cmd) +{ + if (!soc || !soc->ops) { + dp_cdp_debug("Invalid Instance:"); + QDF_BUG(0); + return QDF_STATUS_E_FAILURE; + } + + if (!soc->ops->ctrl_ops || + !soc->ops->ctrl_ops->txrx_update_mon_mac_filter) + return QDF_STATUS_E_FAILURE; + + return soc->ops->ctrl_ops->txrx_update_mon_mac_filter + (soc, vdev_id, cmd); +} + #ifdef WLAN_SUPPORT_MSCS /** * @brief record the MSCS data and send it to the Data path diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index 10203297f4..ae66ff60fe 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/dp/inc/cdp_txrx_ops.h @@ -932,6 +932,9 @@ struct cdp_ctrl_ops { uint32_t *mask, uint32_t *mask_cont); #endif + QDF_STATUS (*txrx_update_mon_mac_filter)(struct cdp_soc_t *soc, + uint8_t vdev_id, + uint32_t cmd); }; struct cdp_me_ops { diff --git a/dp/wifi3.0/dp_htt.h b/dp/wifi3.0/dp_htt.h index e38c8f0acd..bebef93c30 100644 --- a/dp/wifi3.0/dp_htt.h +++ b/dp/wifi3.0/dp_htt.h @@ -629,6 +629,7 @@ struct htt_tx_ring_tlv_filter { * @fpmo_data_filter: FPMO mode data filter * @fpmo_mgmt_filter: FPMO mode mgmt filter * @fpmo_ctrl_filter: FPMO mode ctrl filter + * @enable_mon_mac_filter: enable/disable mac based filter on scan radio * * NOTE: Do not change the layout of this structure */ @@ -693,6 +694,7 @@ struct htt_rx_ring_tlv_filter { u_int16_t fpmo_mgmt_filter; u_int16_t fpmo_ctrl_filter; #endif + bool enable_mon_mac_filter; }; /** diff --git a/dp/wifi3.0/monitor/1.0/dp_mon_1.0.c b/dp/wifi3.0/monitor/1.0/dp_mon_1.0.c index 766782098d..66c87eb293 100644 --- a/dp/wifi3.0/monitor/1.0/dp_mon_1.0.c +++ b/dp/wifi3.0/monitor/1.0/dp_mon_1.0.c @@ -1170,6 +1170,8 @@ dp_mon_register_feature_ops_1_0(struct dp_soc *soc) mon_ops->mon_filter_reset_smart_monitor = dp_mon_filter_reset_smart_monitor_1_0; #endif + mon_ops->mon_filter_set_reset_mon_mac_filter = + dp_mon_set_reset_mon_mac_filter_1_0; #ifdef WLAN_RX_PKT_CAPTURE_ENH mon_ops->mon_filter_setup_rx_enh_capture = dp_mon_filter_setup_rx_enh_capture_1_0; diff --git a/dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.c b/dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.c index b3fa0ad24c..2e7eeacb2b 100644 --- a/dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.c +++ b/dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.c @@ -661,6 +661,67 @@ void dp_mon_filter_reset_mon_mode_1_0(struct dp_pdev *pdev) mon_pdev->filter[mode][srng_type] = filter; } +static void dp_mon_set_reset_mon_filter(struct dp_mon_filter *filter, bool val) +{ + if (val) { + dp_mon_filter_debug("Set monitor filter settings"); + filter->tlv_filter.enable_mon_mac_filter = 1; + filter->tlv_filter.enable_md = 1; + filter->tlv_filter.md_mgmt_filter = FILTER_MGMT_ALL; + filter->tlv_filter.md_ctrl_filter = FILTER_CTRL_ALL; + filter->tlv_filter.md_data_filter = 0; + } else { + dp_mon_filter_debug("Reset monitor filter settings"); + filter->tlv_filter.enable_mon_mac_filter = 0; + filter->tlv_filter.enable_md = 0; + filter->tlv_filter.md_mgmt_filter = 0; + filter->tlv_filter.md_ctrl_filter = 0; + filter->tlv_filter.md_data_filter = 0; + } +} + +/** + * dp_mon_set_reset_mon_mac_filter_1_0() - Set/Reset monitor buffer and status + * filter + * @pdev: DP pdev handle + * @val: Set or reset the filter + * + * Return: void + */ +void dp_mon_set_reset_mon_mac_filter_1_0(struct dp_pdev *pdev, bool val) +{ + struct dp_mon_filter filter = {0}; + enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE; + enum dp_mon_filter_srng_type srng_type = + DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS; + struct dp_mon_pdev *mon_pdev; + + if (!pdev) { + dp_mon_filter_err("pdev Context is null"); + return; + } + + mon_pdev = pdev->monitor_pdev; + + /* Set monitor buffer filter */ + dp_mon_filter_debug("Updating monitor buffer filter"); + filter.valid = true; + dp_mon_set_reset_mon_filter(&filter, val); + dp_mon_filter_set_reset_mon_dest(pdev, &filter); + + /* Set status cmn filter */ + dp_mon_filter_debug("Updating monitor status cmn filter"); + qdf_mem_zero(&(filter), sizeof(struct dp_mon_filter)); + filter.valid = true; + dp_mon_filter_set_status_cmn(mon_pdev, &filter); + dp_mon_set_reset_mon_filter(&filter, val); + dp_mon_filter_show_filter(mon_pdev, mode, &filter); + + /* Store the above filter */ + srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS; + mon_pdev->filter[mode][srng_type] = filter; +} + #ifdef WDI_EVENT_ENABLE void dp_mon_filter_setup_rx_pkt_log_full_1_0(struct dp_pdev *pdev) { diff --git a/dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.h b/dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.h index 2b03ebaa23..f39ecf09e3 100644 --- a/dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.h +++ b/dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.h @@ -109,6 +109,13 @@ static inline void dp_mon_filter_reset_smart_monitor_1_0(struct dp_pdev *pdev) } #endif +/** + * dp_mon_set_reset_mon_mac_filter_1_0() - Set/Reset the monitor mode filter + * @pdev: DP pdev handle + * @val: Indicate set/reset filter + */ +void dp_mon_set_reset_mon_mac_filter_1_0(struct dp_pdev *pdev, bool val); + #ifdef WLAN_RX_PKT_CAPTURE_ENH /** * dp_mon_filter_setup_rx_enh_capture() - Setup the Rx capture mode filters diff --git a/dp/wifi3.0/monitor/dp_mon.c b/dp/wifi3.0/monitor/dp_mon.c index 8e47c4e4e2..230ab4dc39 100644 --- a/dp/wifi3.0/monitor/dp_mon.c +++ b/dp/wifi3.0/monitor/dp_mon.c @@ -1479,6 +1479,54 @@ fail0: } #endif /* ATH_SUPPORT_NAC_RSSI || ATH_SUPPORT_NAC */ +/* + * dp_update_mon_mac_filter() - Set/reset monitor mac filter + * @soc_hdl: cdp soc handle + * @vdev_id: id of virtual device object + * @cmd: Add/Del command + * + * Return: 0 for success. nonzero for failure. + */ +static QDF_STATUS dp_update_mon_mac_filter(struct cdp_soc_t *soc_hdl, + uint8_t vdev_id, uint32_t cmd) +{ + struct dp_soc *soc = (struct dp_soc *)soc_hdl; + struct dp_pdev *pdev; + struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, + DP_MOD_ID_CDP); + struct dp_mon_pdev *mon_pdev; + QDF_STATUS status = QDF_STATUS_E_FAILURE; + + if (!vdev) + return status; + + pdev = vdev->pdev; + if (!pdev) { + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); + return status; + } + + mon_pdev = pdev->monitor_pdev; + if (cmd == DP_NAC_PARAM_ADD) { + /* first neighbour added */ + dp_mon_filter_set_reset_mon_mac_filter(pdev, true); + status = dp_mon_filter_update(pdev); + if (status != QDF_STATUS_SUCCESS) { + dp_cdp_err("%pK: Mon mac filter set failed", soc); + dp_mon_filter_set_reset_mon_mac_filter(pdev, false); + } + } else if (cmd == DP_NAC_PARAM_DEL) { + /* last neighbour deleted */ + dp_mon_filter_set_reset_mon_mac_filter(pdev, false); + status = dp_mon_filter_update(pdev); + if (status != QDF_STATUS_SUCCESS) + dp_cdp_err("%pK: Mon mac filter reset failed", soc); + } + + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); + return status; +} + #ifdef ATH_SUPPORT_NAC_RSSI /** * dp_vdev_get_neighbour_rssi(): Store RSSI for configured NAC @@ -5798,6 +5846,11 @@ void dp_mon_cdp_ops_register(struct dp_soc *soc) #if defined(WLAN_CFR_ENABLE) && defined(WLAN_ENH_CFR_ENABLE) dp_cfr_filter_register_1_0(ops); #endif + if (target_type == TARGET_TYPE_QCN9000) + ops->ctrl_ops->txrx_update_mon_mac_filter = + dp_update_mon_mac_filter; + else + ops->ctrl_ops->txrx_update_mon_mac_filter = NULL; break; case TARGET_TYPE_QCN9224: case TARGET_TYPE_QCA5332: @@ -5817,6 +5870,7 @@ void dp_mon_cdp_ops_register(struct dp_soc *soc) dp_cfr_filter_register_2_0(ops); #endif #endif /* QCA_MONITOR_2_0_SUPPORT */ + ops->ctrl_ops->txrx_update_mon_mac_filter = NULL; break; default: dp_mon_err("%s: Unknown tgt type %d", __func__, target_type); @@ -6129,6 +6183,7 @@ void dp_mon_feature_ops_deregister(struct dp_soc *soc) #if defined(ATH_SUPPORT_NAC_RSSI) || defined(ATH_SUPPORT_NAC) mon_ops->mon_filter_setup_smart_monitor = NULL; #endif + mon_ops->mon_filter_set_reset_mon_mac_filter = NULL; #ifdef WLAN_RX_PKT_CAPTURE_ENH mon_ops->mon_filter_setup_rx_enh_capture = NULL; #endif diff --git a/dp/wifi3.0/monitor/dp_mon.h b/dp/wifi3.0/monitor/dp_mon.h index 4fd55580b0..91753d65d0 100644 --- a/dp/wifi3.0/monitor/dp_mon.h +++ b/dp/wifi3.0/monitor/dp_mon.h @@ -738,6 +738,8 @@ struct dp_mon_ops { void (*mon_filter_setup_smart_monitor)(struct dp_pdev *pdev); void (*mon_filter_reset_smart_monitor)(struct dp_pdev *pdev); #endif + void (*mon_filter_set_reset_mon_mac_filter)(struct dp_pdev *pdev, + bool val); #ifdef WLAN_RX_PKT_CAPTURE_ENH void (*mon_filter_setup_rx_enh_capture)(struct dp_pdev *pdev); void (*mon_filter_reset_rx_enh_capture)(struct dp_pdev *pdev); diff --git a/dp/wifi3.0/monitor/dp_mon_filter.c b/dp/wifi3.0/monitor/dp_mon_filter.c index 93a6de5694..2f7ca1b0d2 100644 --- a/dp/wifi3.0/monitor/dp_mon_filter.c +++ b/dp/wifi3.0/monitor/dp_mon_filter.c @@ -434,6 +434,15 @@ void dp_mon_filter_reset_smart_monitor(struct dp_pdev *pdev) } #endif /* ATH_SUPPORT_NAC_RSSI || ATH_SUPPORT_NAC */ +void dp_mon_filter_set_reset_mon_mac_filter(struct dp_pdev *pdev, bool val) +{ + struct dp_mon_ops *mon_ops = NULL; + + mon_ops = dp_mon_ops_get(pdev->soc); + if (mon_ops && mon_ops->mon_filter_set_reset_mon_mac_filter) + mon_ops->mon_filter_set_reset_mon_mac_filter(pdev, val); +} + #ifdef WLAN_RX_PKT_CAPTURE_ENH void dp_mon_filter_setup_rx_enh_capture(struct dp_pdev *pdev) { diff --git a/dp/wifi3.0/monitor/dp_mon_filter.h b/dp/wifi3.0/monitor/dp_mon_filter.h index d5052457ef..967f654efd 100644 --- a/dp/wifi3.0/monitor/dp_mon_filter.h +++ b/dp/wifi3.0/monitor/dp_mon_filter.h @@ -267,6 +267,13 @@ void dp_mon_filter_setup_smart_monitor(struct dp_pdev *pdev); void dp_mon_filter_reset_smart_monitor(struct dp_pdev *pdev); #endif /* ATH_SUPPORT_NAC_RSSI || ATH_SUPPORT_NAC */ +/** + * dp_mon_filter_set_reset_mon_mac_filter() - Setup the monitor mac filter + * @pdev: DP pdev handle + * @val: indicating set/reset + */ +void dp_mon_filter_set_reset_mon_mac_filter(struct dp_pdev *pdev, bool val); + #ifdef WLAN_RX_PKT_CAPTURE_ENH /** * dp_mon_filter_setup_rx_enh_capture() - Setup the Rx capture mode filters