wlan: Add changes to trigger SAE in supplicant

propagation from qcacld-3.0 to prima

Add following changes as part of this
1. Add framework to trigger SAE using cfg80211
2. Add changes to send sae info from LIM to HDD layer.

Change-Id: Ia87088dc46ea3f75d05f42e20594dd79a97aff11
CRs-Fixed: 2531060
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index 4f7e7db..fd1fc1e 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -6449,4 +6449,20 @@
 	void *user_data;
 };
 
+/**
+ * struct sae_info - SAE info used for commit/confirm messages
+ * @msg_type: Message type
+ * @msg_len: length of message
+ * @vdev_id: vdev id
+ * @peer_mac_addr: peer MAC address
+ * @ssid: SSID
+ */
+struct sir_sae_info {
+    uint16_t msg_type;
+    uint16_t msg_len;
+    uint32_t vdev_id;
+    v_MACADDR_t peer_mac_addr;
+    tSirMacSSid ssid;
+};
+
 #endif /* __SIR_API_H */
diff --git a/CORE/MAC/inc/wniApi.h b/CORE/MAC/inc/wniApi.h
index 0ea1e5c..3314d7a 100644
--- a/CORE/MAC/inc/wniApi.h
+++ b/CORE/MAC/inc/wniApi.h
@@ -401,6 +401,7 @@
     eWNI_SME_ECSA_CHAN_CHANGE_REQ,
     eWNI_SME_ECSA_CHAN_CHANGE_RSP,
     eWNI_SME_STA_DEL_BA_REQ,
+    eWNI_SME_TRIGGER_SAE,
     eWNI_SME_MSG_TYPES_END
 };
 
diff --git a/CORE/MAC/src/pe/include/limGlobal.h b/CORE/MAC/src/pe/include/limGlobal.h
index 150184d..31ecfbb 100644
--- a/CORE/MAC/src/pe/include/limGlobal.h
+++ b/CORE/MAC/src/pe/include/limGlobal.h
@@ -184,6 +184,7 @@
     eLIM_MLM_WT_FT_REASSOC_RSP_STATE,
 #endif
     eLIM_MLM_P2P_LISTEN_STATE,
+    eLIM_MLM_WT_SAE_AUTH_STATE,
 } tLimMlmStates;
 
 // 11h channel quiet states
diff --git a/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c b/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c
index b55954a..a8a4fd9 100644
--- a/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c
+++ b/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c
@@ -2462,7 +2462,70 @@
     limPostSmeMessage(pMac, LIM_MLM_JOIN_CNF, (tANI_U32 *) &mlmJoinCnf);
 } /*** limProcessMlmJoinReq() ***/
 
+#ifdef WLAN_FEATURE_SAE
+/**
+ * lim_process_mlm_auth_req_sae() - Handle SAE authentication
+ * @mac_ctx: global MAC context
+ * @session: PE session entry
+ *
+ * This function is called by lim_process_mlm_auth_req to handle SAE
+ * authentication.
+ *
+ * Return: tSirRetStatus
+ */
+static VOS_STATUS lim_process_mlm_auth_req_sae(tpAniSirGlobal mac_ctx,
+                                               tpPESession session)
+{
+        VOS_STATUS status = VOS_STATUS_SUCCESS;
+        struct sir_sae_info *sae_info;
+        vos_msg_t  msg;
 
+        sae_info = vos_mem_malloc(sizeof(*sae_info));
+        if (sae_info == NULL) {
+                limLog(mac_ctx, LOGP, FL("Memory allocation failed"));
+                return VOS_STATUS_E_FAILURE;
+        }
+
+        sae_info->msg_type = eWNI_SME_TRIGGER_SAE;
+        sae_info->msg_len = sizeof(*sae_info);
+        sae_info->vdev_id = session->smeSessionId;
+
+        vos_mem_copy(sae_info->peer_mac_addr.bytes, session->bssId,
+                     VOS_MAC_ADDR_SIZE);
+
+        sae_info->ssid.length = session->ssId.length;
+        vos_mem_copy(sae_info->ssid.ssId, session->ssId.ssId,
+                     session->ssId.length);
+        limLog(mac_ctx, LOG1, FL("vdev_id %d ssid %.*s "MAC_ADDRESS_STR""),
+               sae_info->vdev_id, sae_info->ssid.length,sae_info->ssid.ssId,
+               MAC_ADDR_ARRAY(sae_info->peer_mac_addr.bytes));
+
+        msg.type = eWNI_SME_TRIGGER_SAE;
+        msg.bodyptr = sae_info;
+        msg.bodyval = 0;
+
+        if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, &msg))
+        {
+                limLog(mac_ctx, LOGE, "%s failed to post msg to self ",
+                       __func__);
+                vos_mem_free((void *)sae_info);
+                status = VOS_STATUS_E_FAILURE;
+        }
+
+        session->limMlmState = eLIM_MLM_WT_SAE_AUTH_STATE;
+
+        MTRACE(macTrace(mac_ctx, TRACE_CODE_MLM_STATE, session->peSessionId,
+                        session->limMlmState));
+
+        return status;
+}
+#else
+static VOS_STATUS lim_process_mlm_auth_req_sae(tpAniSirGlobal mac_ctx,
+                                               tpPESession session)
+{
+        return VOS_STATUS_E_NOSUPPORT;
+}
+#endif
 
 /**
  * limProcessMlmAuthReq()
@@ -2610,7 +2673,20 @@
                                  pMac->lim.gpLimMlmAuthReq->peerMacAddr);
 
         psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
-        psessionEntry->limMlmState = eLIM_MLM_WT_AUTH_FRAME2_STATE;
+        if (pMac->lim.gpLimMlmAuthReq->authType == eSIR_AUTH_TYPE_SAE) {
+            if (lim_process_mlm_auth_req_sae(pMac, psessionEntry) !=
+                VOS_STATUS_SUCCESS) {
+                mlmAuthCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
+                goto end;
+            } else {
+                limLog(pMac, LOG1,
+                       FL("lim_process_mlm_auth_req_sae is successful"));
+                return;
+            }
+        } else {
+            psessionEntry->limMlmState = eLIM_MLM_WT_AUTH_FRAME2_STATE;
+        }
+
         MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
 
         //assign appropriate sessionId to the timer object
diff --git a/CORE/SME/inc/csrApi.h b/CORE/SME/inc/csrApi.h
index 3bb42d4..6ca0a4a 100644
--- a/CORE/SME/inc/csrApi.h
+++ b/CORE/SME/inc/csrApi.h
@@ -527,6 +527,7 @@
     eCSR_ROAM_ECSA_BCN_TX_IND,
     eCSR_ROAM_ECSA_CHAN_CHANGE_RSP,
     eCSR_ROAM_STA_CHANNEL_SWITCH,
+    eCSR_ROAM_SAE_COMPUTE,
 }eRoamCmdStatus;
 
 
@@ -1358,6 +1359,9 @@
     struct sir_channel_chanege_rsp *ap_chan_change_rsp;
     tSirSmeChanInfo chan_info;
     tSirMacHTChannelWidth ch_width;
+#ifdef WLAN_FEATURE_SAE
+    struct sir_sae_info *sae_info;
+#endif
 }tCsrRoamInfo;
 
 typedef struct tagCsrFreqScanInfo
diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c
index f53ba36..a9d9b63 100644
--- a/CORE/SME/src/csr/csrApiRoam.c
+++ b/CORE/SME/src/csr/csrApiRoam.c
@@ -121,6 +121,51 @@
 /*-------------------------------------------------------------------------- 
   Type declarations
   ------------------------------------------------------------------------*/
+
+#ifdef WLAN_FEATURE_SAE
+/**
+ * csr_sae_callback - Update SAE info to CSR roam session
+ * @mac_ctx: MAC context
+ * @msg_ptr: pointer to SAE message
+ *
+ * API to update SAE info to roam csr session
+ *
+ * Return: QDF_STATUS
+ */
+static VOS_STATUS csr_sae_callback(tpAniSirGlobal mac_ctx, tSirSmeRsp *msg_ptr)
+{
+        tCsrRoamInfo roam_info;
+        uint32_t session_id;
+        struct sir_sae_info *sae_info;
+
+        sae_info = (struct sir_sae_info *) msg_ptr;
+        if (!sae_info) {
+                smsLog(mac_ctx, LOGE, "SAE info is NULL");
+                return VOS_STATUS_E_FAILURE;
+        }
+
+        smsLog(mac_ctx, LOG1, FL("vdev_id %d "MAC_ADDRESS_STR""),
+               sae_info->vdev_id,
+               MAC_ADDR_ARRAY(sae_info->peer_mac_addr.bytes));
+
+        session_id = sae_info->vdev_id;
+        if (session_id == CSR_SESSION_ID_INVALID)
+               return VOS_STATUS_E_FAILURE;
+
+        roam_info.sae_info = sae_info;
+        csrRoamCallCallback(mac_ctx, session_id, &roam_info, 0,
+                            eCSR_ROAM_SAE_COMPUTE, eCSR_ROAM_RESULT_NONE);
+
+        return VOS_STATUS_SUCCESS;
+}
+#else
+static inline VOS_STATUS csr_sae_callback(tpAniSirGlobal mac_ctx,
+                                          tSirSmeRsp *msg_ptr)
+{
+        return VOS_STATUS_SUCCESS;
+}
+#endif
+
 #ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
 int diagAuthTypeFromCSRType(eCsrAuthType authType)
 {
@@ -9020,6 +9065,11 @@
                                pRoamInfo, 0, eCSR_ROAM_LOST_LINK_PARAMS_IND, result);
                 break;
             }
+        case eWNI_SME_TRIGGER_SAE:
+             smsLog(pMac, LOG1, FL("Invoke SAE callback"));
+             csr_sae_callback(pMac, pSmeRsp);
+             break;
+
         default:
             smsLog(pMac, LOG1,
                    FL("Unexpected message type = %d[0x%X] received in substate %s"),
diff --git a/CORE/SME/src/csr/csrUtil.c b/CORE/SME/src/csr/csrUtil.c
index d0647dd..63b0119 100644
--- a/CORE/SME/src/csr/csrUtil.c
+++ b/CORE/SME/src/csr/csrUtil.c
@@ -1318,6 +1318,7 @@
         CASE_RETURN_STR(eCSR_ROAM_LOST_LINK_PARAMS_IND);
         CASE_RETURN_STR(eCSR_ROAM_ECSA_BCN_TX_IND);
         CASE_RETURN_STR(eCSR_ROAM_ECSA_CHAN_CHANGE_RSP);
+        CASE_RETURN_STR(eCSR_ROAM_SAE_COMPUTE);
     default:
         return "unknown";
     }
diff --git a/CORE/SYS/legacy/src/utils/src/macTrace.c b/CORE/SYS/legacy/src/utils/src/macTrace.c
index c90dbaf..ba58a58 100644
--- a/CORE/SYS/legacy/src/utils/src/macTrace.c
+++ b/CORE/SYS/legacy/src/utils/src/macTrace.c
@@ -586,6 +586,7 @@
         CASE_RETURN_STRING(eWNI_SME_ECSA_IE_BEACON_COMP_IND);
         CASE_RETURN_STRING(eWNI_SME_ECSA_CHAN_CHANGE_REQ);
         CASE_RETURN_STRING(eWNI_SME_ECSA_CHAN_CHANGE_RSP);
+        CASE_RETURN_STRING(eWNI_SME_TRIGGER_SAE);
         default:
             return( (tANI_U8*)"UNKNOWN" );
             break;