Procházet zdrojové kódy

qcacld-3.0: Pack FT-IE into association request for FT-FILS connection

With FT-FILS akm, initial mobility domain fils connection
requires FTIE in the assoc request frame. FTIE is copied from
auth response frame received from the AP and stored in fils_info.
Add frame parser changes to populate the FT-IE into the
association request frame.

Send this FTIE in the association request appended after MDIE.

Change-Id: I9087ff9f36b52f3ef08b03cba826bdc42834a9f8
CRs-Fixed: 2414678
Pragaspathi Thilagaraj před 6 roky
rodič
revize
03839b9e2f

+ 1 - 0
core/mac/src/cfg/cfgUtil/dot11f.frms

@@ -3660,6 +3660,7 @@ FRAME AssocRequest                        // 7.2.3.4
     OPTIE  RSNOpaque;
     OPTIE  ExtSuppRates;
     OPTIE  MobilityDomain;
+    OPTIE  FTInfo;
     OPTIE  SuppOperatingClasses;
     OPTIE  WAPIOpaque;
     OPTIE  WAPI;

+ 1 - 0
core/mac/src/include/dot11f.h

@@ -9481,6 +9481,7 @@ typedef struct sDot11fAssocRequest{
 	tDot11fIERSNOpaque                     RSNOpaque;
 	tDot11fIEExtSuppRates                  ExtSuppRates;
 	tDot11fIEMobilityDomain                MobilityDomain;
+	tDot11fIEFTInfo                        FTInfo;
 	tDot11fIESuppOperatingClasses          SuppOperatingClasses;
 	tDot11fIEWAPIOpaque                    WAPIOpaque;
 	tDot11fIEWAPI                          WAPI;

+ 20 - 3
core/mac/src/include/parser_api.h

@@ -991,9 +991,26 @@ QDF_STATUS populate_dot11f_rrm_ie(struct mac_context *mac,
 				tDot11fIERRMEnabledCap *pDot11f,
 				struct pe_session *pe_session);
 
-void populate_mdie(struct mac_context *mac,
-		tDot11fIEMobilityDomain * pDot11f, uint8_t mdie[]);
-void populate_ft_info(struct mac_context *mac, tDot11fIEFTInfo *pDot11f);
+void populate_mdie(struct mac_context *mac, tDot11fIEMobilityDomain *pDot11f,
+		   uint8_t mdie[]);
+
+#ifdef WLAN_FEATURE_FILS_SK
+/**
+ * populate_fils_ft_info() - Populate FTIE into assoc request frame
+ * @mac: Global mac context
+ * @ft_info: pointer to assoc request frame FT IE buffer
+ * @pe_session: pointer to PE session
+ *
+ * Return: None
+ */
+void populate_fils_ft_info(struct mac_context *mac, tDot11fIEFTInfo *ft_info,
+			   struct pe_session *pe_session);
+#else
+static inline
+void populate_fils_ft_info(struct mac_context *mac, tDot11fIEFTInfo *ft_info,
+			   struct pe_session *pe_session)
+{}
+#endif
 
 void populate_dot11f_assoc_rsp_rates(struct mac_context *mac,
 				tDot11fIESuppRates *pSupp,

+ 11 - 3
core/mac/src/pe/lim/lim_send_management_frames.c

@@ -1835,9 +1835,17 @@ lim_send_assoc_req_mgmt_frame(struct mac_context *mac_ctx,
 			(unsigned int) bssdescr->mdie[2]);
 		populate_mdie(mac_ctx, &frm->MobilityDomain,
 			pe_session->pLimJoinReq->bssDescription.mdie);
-	} else {
-		/* No 11r IEs dont send any MDIE */
-		pe_debug("MDIE not present");
+
+		/*
+		 * IEEE80211-ai [13.2.4 FT initial mobility domain association
+		 * over FILS in an RSN]
+		 * Populate FT IE in association request. This FT IE should be
+		 * same as the FT IE received in auth response frame during the
+		 * FT-FILS authentication.
+		 */
+		if (lim_is_fils_connection(pe_session))
+			populate_fils_ft_info(mac_ctx, &frm->FTInfo,
+					      pe_session);
 	}
 
 #ifdef FEATURE_WLAN_ESE

+ 3 - 0
core/mac/src/sys/legacy/src/utils/src/dot11f.c

@@ -9581,6 +9581,9 @@ static const tIEDefn IES_AssocRequest[] = {
 	offsetof(tDot11fIEMobilityDomain, present), 0, "MobilityDomain",
 	0, 5, 5, SigIeMobilityDomain, {0, 0, 0, 0, 0},
 	0, DOT11F_EID_MOBILITYDOMAIN, 0, 0, },
+	{ offsetof(tDot11fAssocRequest, FTInfo), offsetof(tDot11fIEFTInfo,
+	present), 0, "FTInfo", 0, 84, 222, SigIeFTInfo, {0, 0, 0, 0, 0},
+	0, DOT11F_EID_FTINFO, 0, 0, },
 	{ offsetof(tDot11fAssocRequest, SuppOperatingClasses),
 	offsetof(tDot11fIESuppOperatingClasses, present), 0,
 	"SuppOperatingClasses", 0, 3, 34, SigIeSuppOperatingClasses,

+ 45 - 4
core/mac/src/sys/legacy/src/utils/src/parser_api.c

@@ -5584,13 +5584,54 @@ void populate_mdie(struct mac_context *mac,
 
 }
 
-void populate_ft_info(struct mac_context *mac, tDot11fIEFTInfo *pDot11f)
+#ifdef WLAN_FEATURE_FILS_SK
+void populate_fils_ft_info(struct mac_context *mac, tDot11fIEFTInfo *ft_info,
+			   struct pe_session *pe_session)
 {
-	pDot11f->present = 1;
-	pDot11f->IECount = 0;   /* TODO: put valid data during reassoc. */
-	/* All other info is zero. */
+	struct pe_fils_session *ft_fils_info = pe_session->fils_info;
+
+	if (!ft_fils_info)
+		return;
+
+	if (!ft_fils_info->ft_ie.present) {
+		ft_info->present = 0;
+		pe_err("FT IE doesn't exist");
+		return;
+	}
+
+	ft_info->IECount = ft_fils_info->ft_ie.element_count;
 
+	qdf_mem_copy(ft_info->MIC, ft_fils_info->ft_ie.mic,
+		     FT_MIC_LEN);
+
+	qdf_mem_copy(ft_info->Anonce, ft_fils_info->ft_ie.anonce,
+		     FT_NONCE_LEN);
+
+	qdf_mem_copy(ft_info->Snonce, ft_fils_info->ft_ie.snonce,
+		     FT_NONCE_LEN);
+
+	if (ft_fils_info->ft_ie.r0kh_id_len > 0) {
+		ft_info->R0KH_ID.present = 1;
+		qdf_mem_copy(ft_info->R0KH_ID.PMK_R0_ID,
+			     ft_fils_info->ft_ie.r0kh_id,
+			     ft_fils_info->ft_ie.r0kh_id_len);
+		ft_info->R0KH_ID.num_PMK_R0_ID =
+				ft_fils_info->ft_ie.r0kh_id_len;
+	}
+
+	ft_info->R1KH_ID.present = 1;
+	qdf_mem_copy(ft_info->R1KH_ID.PMK_R1_ID,
+		     ft_fils_info->ft_ie.r1kh_id,
+		     FT_R1KH_ID_LEN);
+
+	qdf_mem_copy(&ft_info->GTK, &ft_fils_info->ft_ie.gtk_ie,
+		     sizeof(struct mac_ft_gtk_ie));
+	qdf_mem_copy(&ft_info->IGTK, &ft_fils_info->ft_ie.igtk_ie,
+		     sizeof(struct mac_ft_igtk_ie));
+
+	ft_info->present = 1;
 }
+#endif
 
 void populate_dot11f_assoc_rsp_rates(struct mac_context *mac,
 				     tDot11fIESuppRates *pSupp,