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;