qcacmn: Add support for FT SAE and FT Suite-B

Previously host driver only supports initial SAE and Suite-B
authentication types and roaming to SAE AP is blocked. The
802.11 specification has introduced the Akm suite 00:0F:AC:9 for
FT-SAE and 00:0F:AC:13 for FT Suite-B akm type. Add support for
FT-SAE and FT-Suite-B.

Extend the enum wlan_auth_type to include WLAN_AUTH_TYPE_FT_SAE,
WLAN_AUTH_TYPE_FT_SUITEB_EAP_SHA384. This enum wlan_auth_type is
the new implementation for akm type in converged scan module
corresponding to the legacy eCsrAuthType enum.

Add changes in scan module filter to support FT-SAE and
FT-Suite-B authentication suites be added to filter->auth_type.
csr_scan_get_result() will translate the legacy eCsrAuthType
to wlan_auth_type and push it to the filter->auth_type.

Change-Id: I74d7b0be74d33ced5d3e528032aec6e057a75ff3
CRs-Fixed: 2400683
diff --git a/os_if/linux/qca_vendor.h b/os_if/linux/qca_vendor.h
index c4517b9..c98ccae 100644
--- a/os_if/linux/qca_vendor.h
+++ b/os_if/linux/qca_vendor.h
@@ -646,6 +646,8 @@
  * @QCA_WLAN_AUTH_TYPE_WAI_PSK wai psk key
  * @QCA_WLAN_AUTH_TYPE_CCKM_WPA: cckm wpa key
  * @QCA_WLAN_AUTH_TYPE_CCKM_RSN: cckm rsn key
+ * @QCA_WLAN_AUTH_TYPE_FT_SAE: FT sae akm
+ * @QCA_WLAN_AUTH_TYPE_FT_SUITEB_EAP_SHA384: FT suite B SHA384
  */
 enum qca_wlan_auth_type {
 	QCA_WLAN_AUTH_TYPE_INVALID,
@@ -665,6 +667,8 @@
 	QCA_WLAN_AUTH_TYPE_CCKM_WPA,
 	QCA_WLAN_AUTH_TYPE_CCKM_RSN,
 	QCA_WLAN_AUTH_TYPE_AUTOSWITCH,
+	QCA_WLAN_AUTH_TYPE_FT_SAE,
+	QCA_WLAN_AUTH_TYPE_FT_SUITEB_EAP_SHA384,
 };
 
 /**
diff --git a/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h b/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h
index 2cbd594..b2feb86 100644
--- a/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h
+++ b/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.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
@@ -417,8 +417,10 @@
 #define WLAN_AKM_SHA256_IEEE8021X 0x05
 #define WLAN_AKM_SHA256_PSK       0x06
 #define WLAN_AKM_SAE              0x08
+#define WLAN_AKM_FT_SAE           0x09
 #define WLAN_AKM_SUITEB_EAP_SHA256 0x0B
 #define WLAN_AKM_SUITEB_EAP_SHA384 0x0C
+#define WLAN_AKM_FT_SUITEB_EAP_SHA384 0x0D
 #define WLAN_AKM_FILS_SHA256      0x0E
 #define WLAN_AKM_FILS_SHA384      0x0F
 #define WLAN_AKM_FILS_FT_SHA256   0x10
diff --git a/umac/cmn_services/inc/wlan_cmn.h b/umac/cmn_services/inc/wlan_cmn.h
index f0a6d83..95b1701 100644
--- a/umac/cmn_services/inc/wlan_cmn.h
+++ b/umac/cmn_services/inc/wlan_cmn.h
@@ -523,6 +523,8 @@
  * @WLAN_AUTH_TYPE_OWE: OWE
  * @WLAN_AUTH_TYPE_SUITEB_EAP_SHA256: EAP SHA256
  * @WLAN_AUTH_TYPE_SUITEB_EAP_SHA384: EAP SHA384
+ * @WLAN_AUTH_TYPE_FT_SAE: FT SAE
+ * @WLAN_AUTH_TYPE_FT_SUITEB_EAP_SHA384: FT suiteb SHA384
  * @WLAN_AUTH_TYPE_ANY: To match any auth type
  * @WLAN_NUM_OF_SUPPORT_AUTH_TYPE: Max no of Auth type
  */
@@ -553,6 +555,8 @@
 	WLAN_AUTH_TYPE_SUITEB_EAP_SHA256,
 	WLAN_AUTH_TYPE_SUITEB_EAP_SHA384,
 	WLAN_AUTH_TYPE_OSEN,
+	WLAN_AUTH_TYPE_FT_SAE,
+	WLAN_AUTH_TYPE_FT_SUITEB_EAP_SHA384,
 	WLAN_AUTH_TYPE_ANY,
 	WLAN_NUM_OF_SUPPORT_AUTH_TYPE = WLAN_AUTH_TYPE_ANY,
 };
diff --git a/umac/scan/core/src/wlan_scan_filter.c b/umac/scan/core/src/wlan_scan_filter.c
index a32d2c2..a985382 100644
--- a/umac/scan/core/src/wlan_scan_filter.c
+++ b/umac/scan/core/src/wlan_scan_filter.c
@@ -618,6 +618,28 @@
 				break;
 			}
 		}
+
+		if (scm_is_cipher_match(rsn.akm_suites, rsn.akm_suite_count,
+					WLAN_RSN_SEL(WLAN_AKM_FT_SAE))) {
+			if (match_any_akm || (WLAN_AUTH_TYPE_FT_SAE ==
+					      filter->auth_type[i])) {
+				neg_auth = WLAN_AUTH_TYPE_FT_SAE;
+				match = true;
+				break;
+			}
+		}
+
+		if (scm_is_cipher_match(rsn.akm_suites, rsn.akm_suite_count,
+					WLAN_RSN_SEL(
+					WLAN_AKM_FT_SUITEB_EAP_SHA384))) {
+			if (match_any_akm ||
+			    (WLAN_AUTH_TYPE_FT_SUITEB_EAP_SHA384 ==
+			     filter->auth_type[i])) {
+				neg_auth = WLAN_AUTH_TYPE_FT_SUITEB_EAP_SHA384;
+				match = true;
+				break;
+			}
+		}
 	}
 
 	if (!match) {