diff --git a/core/hdd/src/wlan_hdd_assoc.c b/core/hdd/src/wlan_hdd_assoc.c index a94564f9b4..0bbad6ff76 100644 --- a/core/hdd/src/wlan_hdd_assoc.c +++ b/core/hdd/src/wlan_hdd_assoc.c @@ -187,6 +187,8 @@ static const int beacon_filter_table[] = { WLAN_ELEMID_HTINFO_ANA, WLAN_ELEMID_OP_MODE_NOTIFY, WLAN_ELEMID_VHTOP, + WLAN_ELEMID_QUIET_CHANNEL, + WLAN_ELEMID_TWT, #ifdef WLAN_FEATURE_11AX_BSS_COLOR /* * EID: 221 vendor IE is being used temporarily by 11AX @@ -198,6 +200,18 @@ static const int beacon_filter_table[] = { #endif }; +/** + * beacon_filter_extn_table - table of extn IEs used for beacon filtering + */ +static const int beacon_filter_extn_table[] = { + WLAN_EXTN_ELEMID_HEOP, + WLAN_EXTN_ELEMID_UORA, + WLAN_EXTN_ELEMID_MUEDCA, +#ifdef WLAN_FEATURE_11BE + WLAN_EXTN_ELEMID_EHTOP, +#endif +}; + /* HE operation BIT positins */ #if defined(WLAN_FEATURE_11AX) #define HE_OPERATION_DFLT_PE_DURATION_POS 0 @@ -525,8 +539,12 @@ int hdd_add_beacon_filter(struct hdd_adapter *adapter) struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter); for (i = 0; i < ARRAY_SIZE(beacon_filter_table); i++) - qdf_set_bit((beacon_filter_table[i]), - (unsigned long int *)ie_map); + qdf_set_bit(beacon_filter_table[i], + (unsigned long *)ie_map); + + for (i = 0; i < ARRAY_SIZE(beacon_filter_extn_table); i++) + qdf_set_bit(beacon_filter_extn_table[i] + WLAN_ELEMID_EXTN_ELEM, + (unsigned long *)ie_map); status = sme_add_beacon_filter(hdd_ctx->mac_handle, adapter->vdev_id, ie_map); diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h index 13616092be..1f684a4e31 100644 --- a/core/mac/inc/sir_api.h +++ b/core/mac/inc/sir_api.h @@ -3916,7 +3916,8 @@ struct stsf { uint32_t tsf_id_valid; }; -#define SIR_BCN_FLT_MAX_ELEMS_IE_LIST 8 +/* ie + extn ie */ +#define SIR_BCN_FLT_MAX_ELEMS_IE_LIST (8 + 8) /** * struct beacon_filter_param - parameters for beacon filtering * @vdev_id: vdev id diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index 7321a2603d..bb6b59824c 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -12275,7 +12275,7 @@ QDF_STATUS sme_add_beacon_filter(mac_handle_t mac_handle, filter_param->vdev_id = session_id; qdf_mem_copy(filter_param->ie_map, ie_map, - BCN_FLT_MAX_ELEMS_IE_LIST * sizeof(uint32_t)); + SIR_BCN_FLT_MAX_ELEMS_IE_LIST * sizeof(uint32_t)); message.type = WMA_ADD_BCN_FILTER_CMDID; message.bodyptr = filter_param; diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c index 7ec6ab5fd2..f358b96fb1 100644 --- a/core/wma/src/wma_features.c +++ b/core/wma/src/wma_features.c @@ -1060,7 +1060,11 @@ QDF_STATUS wma_add_beacon_filter(WMA_HANDLE handle, int len = sizeof(wmi_add_bcn_filter_cmd_fixed_param); len += WMI_TLV_HDR_SIZE; - len += BCN_FLT_MAX_ELEMS_IE_LIST*sizeof(A_UINT32); + len += BCN_FLT_MAX_ELEMS_IE_LIST * sizeof(A_UINT32); + + /* for ext ie map */ + len += WMI_TLV_HDR_SIZE; + len += BCN_FLT_MAX_ELEMS_IE_LIST * sizeof(A_UINT32); if (wma_validate_handle(wma)) return QDF_STATUS_E_INVAL; @@ -1102,6 +1106,21 @@ QDF_STATUS wma_add_beacon_filter(WMA_HANDLE handle, (uint8_t *)ie_map, BCN_FLT_MAX_ELEMS_IE_LIST * sizeof(u_int32_t)); + buf += WMI_TLV_HDR_SIZE; + buf += BCN_FLT_MAX_ELEMS_IE_LIST * sizeof(A_UINT32); + + WMITLV_SET_HDR(buf, WMITLV_TAG_ARRAY_UINT32, + (BCN_FLT_MAX_ELEMS_IE_LIST * sizeof(u_int32_t))); + + ie_map = (A_UINT32 *)(buf + WMI_TLV_HDR_SIZE); + for (i = 0; i < BCN_FLT_MAX_ELEMS_IE_LIST; i++) + ie_map[i] = filter_params->ie_map[i + 8]; + + wma_debug("Beacon filter ext ie map Hex dump:"); + QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG, + (uint8_t *)ie_map, + BCN_FLT_MAX_ELEMS_IE_LIST * sizeof(u_int32_t)); + ret = wmi_unified_cmd_send(wmi_handle, wmi_buf, len, WMI_ADD_BCN_FILTER_CMDID); if (ret) {