Prechádzať zdrojové kódy

qcacld-3.0: Handle wmi_key_material_ext tlv of ROAM_SYNCH event

With current design, firmware sends the kck, kek and replay
counters as part of wmi_key_material tlv over the
WMI_ROAM_SYNCH_EVENTID event. But the maximum supported kck key
length in wmi_key_material was 16 bytes. But for FT Suite-B
(akm 00:0f:ac:13), the kck_bits is 24 bytes long and cannot be
sent over wmi_key_material. So firmware sends kck, kek and
replay counter values over the new tlv wmi_key_material_ext.

Host driver copies the kck key with fixed 16 byte length to the
upper layers. Introduce kck_length parameter in csr_roam_info
and roam_offload_synch_ind structures and copy kck based on this
length.

Also fix maximum number of AKM suites supported to 5, as some
certification test cases advertise 5 akms.

Change-Id: Iab050e3e3f7efead8070a02094998d15f7ffcbd0
CRs-Fixed: 2400770
Pragaspathi Thilagaraj 6 rokov pred
rodič
commit
957b7ecf57

+ 1 - 0
mlme/core/src/wlan_mlme_main.c

@@ -1690,6 +1690,7 @@ static void mlme_init_lfr_cfg(struct wlan_objmgr_psoc *psoc,
 		cfg_get(psoc, CFG_ROAM_INACTIVE_COUNT);
 	lfr->roam_scan_period_after_inactivity =
 		cfg_get(psoc, CFG_POST_INACTIVITY_ROAM_SCAN_PERIOD);
+	lfr->fw_akm_bitmap = 0;
 
 	mlme_init_roam_offload_cfg(psoc, lfr);
 	mlme_init_ese_cfg(psoc, lfr);

+ 10 - 0
mlme/dispatcher/inc/wlan_mlme_public_struct.h

@@ -1267,6 +1267,14 @@ struct bss_load_trigger {
 	int32_t rssi_threshold_24ghz;
 };
 
+/*
+ * AKM suites supported by firmware for
+ * roaming
+ */
+#define AKM_FT_SAE           0
+#define AKM_FT_SUITEB_SHA384 1
+#define AKM_FT_FILS          2
+
 /*
  * @mawc_roam_enabled:              Enable/Disable MAWC during roaming
  * @enable_fast_roam_in_concurrency:Enable LFR roaming on STA during concurrency
@@ -1362,6 +1370,7 @@ struct bss_load_trigger {
  * during roam_scan_inactivity_time.
  * @roam_scan_period_after_inactivity: Roam scan period after device was in
  * inactive state
+ * @fw_akm_bitmap:                  Supported Akm suites of firmware
  */
 struct wlan_mlme_lfr_cfg {
 	bool mawc_roam_enabled;
@@ -1459,6 +1468,7 @@ struct wlan_mlme_lfr_cfg {
 	uint32_t roam_scan_inactivity_time;
 	uint32_t roam_inactive_data_packet_count;
 	uint32_t roam_scan_period_after_inactivity;
+	uint32_t fw_akm_bitmap;
 };
 
 /**

+ 13 - 0
mlme/dispatcher/inc/wlan_mlme_ucfg_api.h

@@ -1079,6 +1079,7 @@ ucfg_mlme_set_roaming_offload(struct wlan_objmgr_psoc *psoc,
 	return QDF_STATUS_SUCCESS;
 }
 #endif
+
 /**
  * ucfg_mlme_get_first_scan_bucket_threshold() - Get first scan bucket thre
  * @psoc: pointer to psoc object
@@ -1090,6 +1091,18 @@ QDF_STATUS
 ucfg_mlme_get_first_scan_bucket_threshold(struct wlan_objmgr_psoc *psoc,
 					  uint8_t *val);
 
+/**
+ * ucfg_mlme_set_fw_supported_roaming_akm() - update the supported roaming
+ * akm suites advertised by the firmware via wmi service capability
+ * @psoc: pointer to psoc object
+ * @val:  bitmap value based on firmware capabilities
+ *
+ * Return: QDF Status
+ */
+QDF_STATUS
+ucfg_mlme_set_fw_supported_roaming_akm(struct wlan_objmgr_psoc *psoc,
+				       uint32_t val);
+
 /**
  * ucfg_mlme_is_mawc_enabled() - MAWC enabled or not
  * @psoc: pointer to psoc object

+ 14 - 0
mlme/dispatcher/src/wlan_mlme_ucfg_api.c

@@ -774,6 +774,20 @@ ucfg_mlme_get_first_scan_bucket_threshold(struct wlan_objmgr_psoc *psoc,
 	return QDF_STATUS_SUCCESS;
 }
 
+QDF_STATUS
+ucfg_mlme_set_fw_supported_roaming_akm(struct wlan_objmgr_psoc *psoc,
+				       uint32_t val)
+{
+	struct wlan_mlme_psoc_obj *mlme_obj;
+
+	mlme_obj = mlme_get_psoc_obj(psoc);
+	if (!mlme_obj)
+		return QDF_STATUS_E_INVAL;
+
+	mlme_obj->cfg.lfr.fw_akm_bitmap = val;
+	return QDF_STATUS_SUCCESS;
+}
+
 QDF_STATUS
 ucfg_mlme_is_mawc_enabled(struct wlan_objmgr_psoc *psoc, bool *val)
 {

+ 4 - 2
pmo/dispatcher/inc/wlan_pmo_gtk_public_struct.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -32,7 +32,7 @@
 #define PMO_GTK_OFFLOAD_DISABLE 1
 #define PMO_KEK_LEN_LEGACY 16
 #define PMO_KEK_LEN 64
-#define PMO_KCK_LEN 16
+#define PMO_KCK_LEN 32
 #define PMO_REPLAY_COUNTER_LEN 8
 #define PMO_MAC_MAX_KEY_LENGTH 32
 #define PMO_IGTK_PN_SIZE 6
@@ -41,6 +41,7 @@
  * struct pmo_gtk_req - pmo gtk request
  * @flags: optional flags
  * @kck: Key confirmation key
+ * @kck_len: Key confirmation key length
  * @kek: key encryption key
  * @kek_len: KEK Length
  * @replay_counter: replay_counter
@@ -50,6 +51,7 @@
 struct pmo_gtk_req {
 	uint32_t flags;
 	uint8_t kck[PMO_KCK_LEN];
+	uint8_t kck_len;
 	uint8_t kek[PMO_KEK_LEN];
 	uint32_t kek_len;
 	uint64_t replay_counter;

+ 3 - 3
pmo/dispatcher/src/wlan_pmo_tgt_gtk.c

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -63,9 +63,9 @@ QDF_STATUS pmo_tgt_send_gtk_offload_req(struct wlan_objmgr_vdev *vdev,
 	if (gtk_req->flags == PMO_GTK_OFFLOAD_ENABLE) {
 		qdf_atomic_set(&vdev_ctx->gtk_err_enable, true);
 		qdf_mem_copy(op_gtk_req->kck, gtk_req->kck,
-			PMO_KCK_LEN);
+			     gtk_req->kck_len);
 		qdf_mem_copy(op_gtk_req->kek, gtk_req->kek,
-			PMO_KEK_LEN);
+			     PMO_KEK_LEN);
 		qdf_mem_copy(&op_gtk_req->replay_counter,
 			&gtk_req->replay_counter, PMO_REPLAY_COUNTER_LEN);
 	} else {