Browse Source

qcacmn: MLO D1.5 - Process BSS param change count presence in STA Info

As part of a transition of basic MLO functionality to IEEE802.11be
D1.5, add definitions and receive processing for the signaling of the
presence of BSS Parameters Change Count subfield in STA Info field in
Per-STA Profile subelement in Basic Multi-Link element Link Info
field. This presence is signaled by a new bit in the STA Control
field of the corresponding Per-STA Profile subelement. Rename the
definition for BSS Parameters Change Count (sub)field size to make it
generic since it may occur in various protocol signaling areas
related to MLO.

Change-Id: Ieb17f65547b7106442369b51cd6bc303046a224a
CRs-Fixed: 3197012
Krishna Rao 3 years ago
parent
commit
4ce7d8f466

+ 17 - 12
umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h

@@ -1806,6 +1806,9 @@ struct wlan_ie_ehtops {
 #ifdef WLAN_FEATURE_11BE_MLO
 #define WLAN_MLO_MAX_VDEVS 2
 
+/* Size in octets of the BSS Parameters Change Count (sub)field */
+#define WLAN_ML_BSSPARAMCHNGCNT_SIZE                    1
+
 /**
  * struct wlan_ie_multilink - Fixed fields in Multi-Link IE
  * @elem_id: Element ID
@@ -1858,11 +1861,14 @@ struct wlan_ml_probe_req {
  * variants.
  */
 
-/* Below fields and subfields have been transitioned to D1.4, and rest will
- * be checked and transitioned to D1.4 separately.
- * 1. Presence bitmap subfield.
- * 2. Common info length subfield of common info field.
- * 3. STA info length subfield in STA Info field.
+/* The below fields and subfields have been transitioned to D1.5, and the rest
+ * will be checked and transitioned to D1.5 separately:
+ * 1. Presence bitmap subfield in the Multi-Link Control field.
+ * 2. Common Info Length subfield of Common Info field.
+ * 3. STA Control field in Per-STA Profile subelement in Basic variant
+ *    Multi-Link element Link Info field.
+ * 4. STA Info Length subfield in STA Info field in Per-STA Profile subelement
+ *    in Basic variant Multi-Link element Link Info field.
  */
 
 /* Size in octets of Multi-Link element Control field */
@@ -1933,11 +1939,6 @@ enum wlan_ml_variant {
 #define WLAN_ML_BV_CINFO_LINKIDINFO_LINKID_IDX                      0
 #define WLAN_ML_BV_CINFO_LINKIDINFO_LINKID_BITS                     4
 
-/* Size in octets of BSS Parameters Change Count subfield in Basic variant
- * Multi-Link element Common Info field.
- */
-#define WLAN_ML_BV_CINFO_BSSPARAMCHNGCNT_SIZE                       1
-
 /* Size in octets of Medium Synchronization Delay Information subfield in Basic
  * variant Multi-Link element Common Info field.
  */
@@ -2124,7 +2125,7 @@ enum wlan_ml_bv_cinfo_emlcap_transtimeout {
 	(WLAN_ML_BV_CINFO_LENGTH_SIZE + \
 	 QDF_MAC_ADDR_SIZE + \
 	 WLAN_ML_BV_CINFO_LINKIDINFO_SIZE + \
-	 WLAN_ML_BV_CINFO_BSSPARAMCHNGCNT_SIZE + \
+	 WLAN_ML_BSSPARAMCHNGCNT_SIZE + \
 	 WLAN_ML_BV_CINFO_MEDMSYNCDELAYINFO_SIZE + \
 	 WLAN_ML_BV_CINFO_EMLCAP_SIZE + \
 	 WLAN_ML_BV_CINFO_MLDCAP_SIZE)
@@ -2200,6 +2201,9 @@ struct wlan_ml_bv_linfo_perstaprof {
 /* NSTR Bitmap Size */
 #define WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_NSTRBMSZ_IDX            9
 #define WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_NSTRBMSZ_BITS           1
+/* BSS Parameters Change Count Present */
+#define WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_BSSPARAMCHNGCNTP_IDX    10
+#define WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_BSSPARAMCHNGCNTP_BITS   1
 
 /* Definitions for subfields in STA Info field of Per-STA Profile subelement
  * in Basic variant Multi-Link element Link Info field.
@@ -2251,7 +2255,8 @@ struct wlan_ml_bv_linfo_perstaprof_stainfo_dtiminfo {
 	 QDF_MAC_ADDR_SIZE + \
 	 WLAN_BEACONINTERVAL_LEN + \
 	 sizeof(struct wlan_ml_bv_linfo_perstaprof_stainfo_dtiminfo) + \
-	 WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_NSTRBMSZ_MAX)
+	 WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_NSTRBMSZ_MAX + \
+	 WLAN_ML_BSSPARAMCHNGCNT_SIZE)
 
 /* End of definitions related to Basic variant Multi-Link element Link Info
  * field.

+ 22 - 5
umac/mlo_mgr/src/utils_mlo.c

@@ -157,15 +157,15 @@ util_parse_multi_link_ctrl(uint8_t *mlieseqpayload,
 	if (presence_bm & WLAN_ML_BV_CTRL_PBM_BSSPARAMCHANGECNT_P) {
 		if (mlieseqpayloadlen <
 				(parsed_payload_len +
-				 WLAN_ML_BV_CINFO_BSSPARAMCHNGCNT_SIZE)) {
+				 WLAN_ML_BSSPARAMCHNGCNT_SIZE)) {
 			mlo_err_rl("ML seq payload len %zu insufficient for BSS parameter change count size %u after parsed payload len %zu.",
 				   mlieseqpayloadlen,
-				   WLAN_ML_BV_CINFO_BSSPARAMCHNGCNT_SIZE,
+				   WLAN_ML_BSSPARAMCHNGCNT_SIZE,
 				   parsed_payload_len);
 			return QDF_STATUS_E_PROTO;
 		}
 
-		parsed_payload_len += WLAN_ML_BV_CINFO_BSSPARAMCHNGCNT_SIZE;
+		parsed_payload_len += WLAN_ML_BSSPARAMCHNGCNT_SIZE;
 	}
 
 	/* Check if Medium Sync Delay Info is present */
@@ -425,6 +425,23 @@ util_parse_bvmlie_perstaprofile_stactrl(uint8_t *subelempayload,
 		}
 	}
 
+	/* Check BSS Parameters Change Count Present bit */
+	if (QDF_GET_BITS(stacontrol,
+			 WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_BSSPARAMCHNGCNTP_IDX,
+			 WLAN_ML_BV_LINFO_PERSTAPROF_STACTRL_BSSPARAMCHNGCNTP_BITS)) {
+		if (subelempayloadlen <
+				(parsed_payload_len +
+				 WLAN_ML_BSSPARAMCHNGCNT_SIZE)) {
+			mlo_err_rl("Length of subelement payload %zu octets not sufficient to contain BSS Parameters Change Count of size %u octets after parsed payload length of %zu octets.",
+				   subelempayloadlen,
+				   WLAN_ML_BSSPARAMCHNGCNT_SIZE,
+				   parsed_payload_len);
+			return QDF_STATUS_E_PROTO;
+		}
+
+		parsed_payload_len += WLAN_ML_BSSPARAMCHNGCNT_SIZE;
+	}
+
 	/* Note: Some implementation versions of hostapd/wpa_supplicant may
 	 * provide a per-STA profile without STA profile. Let the caller
 	 * indicate whether a STA profile is required to be found. This may be
@@ -2358,7 +2375,7 @@ util_get_bvmlie_eml_cap(uint8_t *mlieseq, qdf_size_t mlieseqlen,
 	if (presencebitmap & WLAN_ML_BV_CTRL_PBM_LINKIDINFO_P)
 		eml_cap_offset += WLAN_ML_BV_CINFO_LINKIDINFO_SIZE;
 	if (presencebitmap & WLAN_ML_BV_CTRL_PBM_BSSPARAMCHANGECNT_P)
-		eml_cap_offset += WLAN_ML_BV_CINFO_BSSPARAMCHNGCNT_SIZE;
+		eml_cap_offset += WLAN_ML_BSSPARAMCHNGCNT_SIZE;
 	if (presencebitmap & WLAN_ML_BV_CTRL_PBM_MEDIUMSYNCDELAYINFO_P)
 		eml_cap_offset += WLAN_ML_BV_CINFO_MEDMSYNCDELAYINFO_SIZE;
 
@@ -2569,7 +2586,7 @@ util_get_bvmlie_mldcap(uint8_t *mlieseq, qdf_size_t mlieseqlen,
 	}
 
 	if (presencebitmap & WLAN_ML_BV_CTRL_PBM_BSSPARAMCHANGECNT_P) {
-		commoninfolen += WLAN_ML_BV_CINFO_BSSPARAMCHNGCNT_SIZE;
+		commoninfolen += WLAN_ML_BSSPARAMCHNGCNT_SIZE;
 
 		if ((sizeof(struct wlan_ie_multilink) + commoninfolen) >
 				mlieseqlen)

+ 1 - 1
umac/scan/dispatcher/src/wlan_scan_utils_api.c

@@ -1869,7 +1869,7 @@ static uint8_t util_get_link_info_offset(uint8_t *ml_ie)
 
 	/* Check if BSS parameter change count is present */
 	if (presencebm & WLAN_ML_BV_CTRL_PBM_BSSPARAMCHANGECNT_P)
-		parsed_ie_len += WLAN_ML_BV_CINFO_BSSPARAMCHNGCNT_SIZE;
+		parsed_ie_len += WLAN_ML_BSSPARAMCHNGCNT_SIZE;
 
 	/* Check if Medium Sync Delay Info is present */
 	if (presencebm & WLAN_ML_BV_CTRL_PBM_MEDIUMSYNCDELAYINFO_P)