Sfoglia il codice sorgente

qcacld-3.0: Add FILS HLP parsing support in Assoc Resp

Parse and update HLP IE info if present in Assoc resp.

Change-Id: If166d71459b622e44511370e49c2ef8d983f8b76
CRs-Fixed: 2034452
Vignesh Viswanathan 7 anni fa
parent
commit
34cf475c6b

+ 24 - 0
core/cds/inc/cds_utils.h

@@ -153,4 +153,28 @@ static inline void cds_host_diag_log_work(qdf_wake_lock_t *lock, uint32_t msec,
 				    msec, WIFI_POWER_EVENT_WAKELOCK_TAKEN);
 	}
 }
+
+/**
+ * cds_copy_hlp_info() - Copy HLP info
+ * @input_dst_mac: input HLP destination MAC address
+ * @input_src_mac: input HLP source MAC address
+ * @input_hlp_data_len: input HLP data length
+ * @input_hlp_data: Pointer to input HLP data
+ * @output_dst_mac: output HLP destination MAC address
+ * @output_src_mac: output HLP source MAC address
+ * @output_hlp_data_len: Pointer to output HLP data length
+ * @output_hlp_data: output Pointer to HLP data
+ *
+ * Util API to copy HLP info from input to output
+ *
+ * Return: None
+ */
+void cds_copy_hlp_info(struct qdf_mac_addr *input_dst_mac,
+		       struct qdf_mac_addr *input_src_mac,
+		       uint16_t input_hlp_data_len,
+		       uint8_t *input_hlp_data,
+		       struct qdf_mac_addr *output_dst_mac,
+		       struct qdf_mac_addr *output_src_mac,
+		       uint16_t *output_hlp_data_len,
+		       uint8_t *output_hlp_data);
 #endif /* #if !defined __CDS_UTILS_H */

+ 21 - 0
core/cds/src/cds_utils.c

@@ -614,3 +614,24 @@ enum cds_band_type cds_chan_to_band(uint32_t chan)
 
 	return CDS_BAND_5GHZ;
 }
+
+void cds_copy_hlp_info(struct qdf_mac_addr *input_dst_mac,
+		       struct qdf_mac_addr *input_src_mac,
+		       uint16_t input_hlp_data_len,
+		       uint8_t *input_hlp_data,
+		       struct qdf_mac_addr *output_dst_mac,
+		       struct qdf_mac_addr *output_src_mac,
+		       uint16_t *output_hlp_data_len,
+		       uint8_t *output_hlp_data)
+{
+	if (!input_hlp_data_len) {
+		QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR,
+			  "Input HLP data len zero\n");
+		return;
+	}
+
+	qdf_copy_macaddr(output_dst_mac, input_dst_mac);
+	qdf_copy_macaddr(output_src_mac, input_src_mac);
+	*output_hlp_data_len = input_hlp_data_len;
+	qdf_mem_copy(output_hlp_data, input_hlp_data, input_hlp_data_len);
+}

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

@@ -3640,6 +3640,7 @@ FRAME AssocResponse                       // 7.2.3.5
     OPTIE  fils_public_key;
     OPTIE  fils_key_confirmation;
     OPTIE  fils_hlp_container;
+    OPTIE  fragment_ie;
     OPTIE  fils_kde;
     OPTIE  vendor_vht_ie;
     OPTIE  QCN_IE;

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

@@ -9364,6 +9364,7 @@ typedef struct sDot11fAssocResponse{
 	tDot11fIEfils_public_key              fils_public_key;
 	tDot11fIEfils_key_confirmation        fils_key_confirmation;
 	tDot11fIEfils_hlp_container           fils_hlp_container;
+	tDot11fIEfragment_ie                  fragment_ie;
 	tDot11fIEfils_kde                     fils_kde;
 	tDot11fIEvendor_vht_ie                vendor_vht_ie;
 	tDot11fIEQCN_IE                       QCN_IE;

+ 4 - 0
core/mac/src/include/parser_api.h

@@ -418,6 +418,10 @@ typedef struct sSirAssocRsp {
 	tDot11fIEfils_session fils_session;
 	tDot11fIEfils_key_confirmation fils_key_auth;
 	tDot11fIEfils_kde fils_kde;
+	struct qdf_mac_addr dst_mac;
+	struct qdf_mac_addr src_mac;
+	uint16_t hlp_data_len;
+	uint8_t hlp_data[FILS_MAX_HLP_DATA_LEN];
 #endif
 } tSirAssocRsp, *tpSirAssocRsp;
 

+ 1 - 0
core/mac/src/pe/include/lim_fils_defs.h

@@ -41,6 +41,7 @@
 #define IPN_LEN 6
 #define FILS_SESSION_LENGTH 8
 #define FILS_MAX_KDE_LIST_LEN 255
+#define FILS_MAX_HLP_DATA_LEN 2048
 
 /* 12.12.2.5.3 80211-ai draft */
 #define FILS_SHA384_KEK_LEN 64

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

@@ -7390,6 +7390,10 @@ static const tIEDefn IES_AssocResponse[] = {
 	offsetof(tDot11fIEfils_hlp_container, present), 0, "fils_hlp_container",
 	0, 14, 269, SigIefils_hlp_container, {0, 0, 0, 0, 0},
 	0, DOT11F_EID_FILS_HLP_CONTAINER, 5, 0, },
+	{ offsetof(tDot11fAssocResponse, fragment_ie),
+	offsetof(tDot11fIEfragment_ie, present), 0, "fragment_ie",
+	0, 2, 257, SigIefragment_ie, {0, 0, 0, 0, 0},
+	0, DOT11F_EID_FRAGMENT_IE, 0, 0, },
 	{ offsetof(tDot11fAssocResponse, fils_kde), offsetof(tDot11fIEfils_kde,
 	present), 0, "fils_kde", 0, 10, 265, SigIefils_kde, {0, 0, 0, 0, 0},
 	0, DOT11F_EID_FILS_KDE, 7, 0, },

+ 21 - 1
core/mac/src/sys/legacy/src/utils/src/parser_api.c

@@ -2822,7 +2822,6 @@ sir_convert_assoc_req_frame2_struct(tpAniSirGlobal pMac,
 			     sizeof(tDot11fIEvendor_he_cap));
 		pe_debug("Received Assoc Req with HE Capability IE");
 	}
-
 	qdf_mem_free(ar);
 	return eSIR_SUCCESS;
 
@@ -2898,6 +2897,27 @@ static void fils_convert_assoc_rsp_frame2_struct(tDot11fAssocResponse *ar,
 				&ar->fils_kde.kde_list,
 				pAssocRsp->fils_kde.num_kde_list);
 	}
+
+	if (ar->fils_hlp_container.present) {
+		pe_debug("FILS HLP container IE present");
+		sir_copy_mac_addr(pAssocRsp->dst_mac.bytes,
+				ar->fils_hlp_container.dest_mac);
+		sir_copy_mac_addr(pAssocRsp->src_mac.bytes,
+				ar->fils_hlp_container.src_mac);
+		pAssocRsp->hlp_data_len = ar->fils_hlp_container.num_hlp_packet;
+		qdf_mem_copy(pAssocRsp->hlp_data,
+				ar->fils_hlp_container.hlp_packet,
+				pAssocRsp->hlp_data_len);
+
+		if (ar->fragment_ie.present) {
+			pe_debug("FILS fragment ie present");
+			qdf_mem_copy(pAssocRsp->hlp_data +
+					pAssocRsp->hlp_data_len,
+					ar->fragment_ie.data,
+					ar->fragment_ie.num_data);
+			pAssocRsp->hlp_data_len += ar->fragment_ie.num_data;
+		}
+	}
 }
 #else
 static inline void fils_convert_assoc_rsp_frame2_struct(tDot11fAssocResponse