Quellcode durchsuchen

qcacld-3.0: enhancement the beacon filter table

Enhancement the beacon filter table to add more
elements and extension elements.

Change-Id: Iee3bc9d768227102a971bafdb41db445c0f03d31
CRs-Fixed: 3296203
Paul Zhang vor 2 Jahren
Ursprung
Commit
b5080fb430

+ 20 - 2
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);

+ 2 - 1
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

+ 1 - 1
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;

+ 20 - 1
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) {