Browse Source

qcacmn: ML probe resp for MBSSID

Implement ML probe response based on draft 2.1 for MBSSID MLO

Case1:  Requesnt for Non-Tx Vap in MBSSID case
If either the Address 1 field or the Address 3 field of the Multi-Link
probe request is set to the MAC address of the AP affiliated with an AP
MLD that corresponds to the nontransmitted BSSID, then the MLD ID
subfield shall not be present in the Probe Request Multi-Link element
of the Multi-Link probe request and the AP MLD is the targeted AP MLD.

The Non-AP MLD will send either a per-STA profile for link specific
request or it can send the ML probe request without link-info in which
case we will respond witll per-STA profile of all the links affilated
with the AP-MLD

Case 2: Request for Tx and Non-TX vap identified by MLDID
If either the Address 1 field or the Address 3 field of the Multi-Link
probe request is set to the MAC address of the responding AP that
operates on the same link where the Multi-Link probe request is sent,
then the AP MLD ID subfield shall be present in the Probe Request
Multi-Link element of the Multi-Link probe request and the targeted AP
MLD is identified by the AP MLD ID subfield.

In this case Non-AP MLD can request of a specific MLD which can be an
MLD of the Tx-vap or it could be MLD of the Non-Tx vap.

Case 3:An AP corresponding to the transmitted BSSID in a multiple BSSID
set shall transmit a Multi-Link probe response in response to a
Multi-Link probe request that is soliciting information of an MLD with
which an AP corresponding to the nontransmitted BSSID in the same
multiple BSSID set is affiliated. Such a Multi-Link probe response
shall carry a Basic Multi-Link element containing information of the
solicited AP MLD and one or more APs affiliated with it. The Basic
Multi-Link element shall be carried in the frame body of the Multi-Link
probe response, whose location is outside of the Multiple BSSID element
carried in the frame. The MLD ID Present subfield of the Presence
Bitmap subfield of the Basic Multi-Link element shall be set to 1.
The MLD ID subfield of the Common Info field of the Basic Multi-Link
element shall be present, and shall be set to the same value as the
BSSID Index subfield of the Multiple-BSSID Index element carried in
the Nontransmitted BSSID Profile subelement of the Multiple BSSID
element, which carries the information of the AP corresponding to the
nontransmitted BSSID

CRs-Fixed: 3306961
Change-Id: I24b2b6a50f57fcc07b060d3e3561246aa44b1b29
Uraj Sasan 2 years ago
parent
commit
363968251f
2 changed files with 14 additions and 6 deletions
  1. 5 0
      umac/mlo_mgr/inc/wlan_mlo_mgr_public_structs.h
  2. 9 6
      umac/mlo_mgr/src/utils_mlo.c

+ 5 - 0
umac/mlo_mgr/inc/wlan_mlo_mgr_public_structs.h

@@ -691,13 +691,18 @@ struct mlo_partner_info {
 
 
 /*
 /*
  * struct mlo_probereq_info – mlo probe req link info
  * struct mlo_probereq_info – mlo probe req link info
+ * mlid: MLID requested in the probe req
  * @num_links: no. of link info in probe req
  * @num_links: no. of link info in probe req
  * @link_id: target link id of APs
  * @link_id: target link id of APs
+ * @is_mld_id_valid: Indicates if mld_id is valid for a given request
+ * @skip_mbssid: Skip mbssid IE
  */
  */
 struct mlo_probereq_info {
 struct mlo_probereq_info {
 	uint8_t mlid;
 	uint8_t mlid;
 	uint8_t num_links;
 	uint8_t num_links;
 	uint8_t link_id[WLAN_UMAC_MLO_MAX_VDEVS];
 	uint8_t link_id[WLAN_UMAC_MLO_MAX_VDEVS];
+	bool is_mld_id_valid;
+	bool skip_mbssid;
 };
 };
 
 
 /*
 /*

+ 9 - 6
umac/mlo_mgr/src/utils_mlo.c

@@ -1057,6 +1057,7 @@ util_parse_probereq_info_from_linkinfo(uint8_t *linkinfo,
 			probereq_info->link_id[probereq_info->num_links] = linkid;
 			probereq_info->link_id[probereq_info->num_links] = linkid;
 
 
 			probereq_info->num_links++;
 			probereq_info->num_links++;
+			mlo_debug("LINK ID requested is = %u", linkid);
 		}
 		}
 
 
 		linkinfo_remlen -= (sizeof(struct subelem_header) +
 		linkinfo_remlen -= (sizeof(struct subelem_header) +
@@ -3558,8 +3559,12 @@ util_get_bvmlie_persta_partner_info(uint8_t *mlieseq,
 		return ret;
 		return ret;
 	}
 	}
 
 
-	/* In case Link Info is absent, the number of partner links will remain
-	 * zero.
+	/*
+	 * If Probe Request variant Multi-Link element in the Multi-Link probe
+	 * request does not include any per-STA profile, then all APs affiliated
+	 * with the same AP MLD as the AP identified in the Addr 1 or Addr 3
+	 * field or AP MLD ID of the Multi-Link probe request are requested
+	 * APs return success here
 	 */
 	 */
 	if (!linkinfo) {
 	if (!linkinfo) {
 		qdf_mem_free(mlieseqpayload_copy);
 		qdf_mem_free(mlieseqpayload_copy);
@@ -3592,7 +3597,6 @@ util_get_prvmlie_persta_link_id(uint8_t *mlieseq,
 	enum wlan_ml_variant variant;
 	enum wlan_ml_variant variant;
 	uint8_t *linkinfo;
 	uint8_t *linkinfo;
 	qdf_size_t linkinfo_len;
 	qdf_size_t linkinfo_len;
-	struct mlo_probereq_info pinfo = {0};
 	qdf_size_t mlieseqpayloadlen;
 	qdf_size_t mlieseqpayloadlen;
 	uint8_t *mlieseqpayload_copy;
 	uint8_t *mlieseqpayload_copy;
 	bool is_elemfragseq;
 	bool is_elemfragseq;
@@ -3726,21 +3730,20 @@ util_get_prvmlie_persta_link_id(uint8_t *mlieseq,
 	 * zero.
 	 * zero.
 	 */
 	 */
 	if (!linkinfo) {
 	if (!linkinfo) {
+		mlo_debug("No link info present");
 		qdf_mem_free(mlieseqpayload_copy);
 		qdf_mem_free(mlieseqpayload_copy);
 		return QDF_STATUS_SUCCESS;
 		return QDF_STATUS_SUCCESS;
 	}
 	}
 
 
 	ret = util_parse_probereq_info_from_linkinfo(linkinfo,
 	ret = util_parse_probereq_info_from_linkinfo(linkinfo,
 						     linkinfo_len,
 						     linkinfo_len,
-						     &pinfo);
+						     probereq_info);
 
 
 	if (QDF_IS_STATUS_ERROR(ret)) {
 	if (QDF_IS_STATUS_ERROR(ret)) {
 		qdf_mem_free(mlieseqpayload_copy);
 		qdf_mem_free(mlieseqpayload_copy);
 		return ret;
 		return ret;
 	}
 	}
 
 
-	qdf_mem_copy(probereq_info, &pinfo, sizeof(*probereq_info));
-
 	qdf_mem_free(mlieseqpayload_copy);
 	qdf_mem_free(mlieseqpayload_copy);
 
 
 	return QDF_STATUS_SUCCESS;
 	return QDF_STATUS_SUCCESS;