qcacld-3.0: Changes to support PMK caching for SAE

Add changes to support PMK caching for SAE authentication

Change-Id: Id8f48a184fe40d1327b65235156d3798cfda585f
CRs-Fixed: 2029357
This commit is contained in:
Padma, Santhosh Kumar
2017-09-14 13:05:42 +05:30
committed by snandini
parent dd3f48598d
commit b8f65d96b6
8 changed files with 106 additions and 22 deletions

View File

@@ -1258,6 +1258,7 @@ typedef struct sSirSmeJoinReq {
#ifdef WLAN_FEATURE_FILS_SK
struct cds_fils_connection_info fils_con_info;
#endif
bool sae_pmk_cached;
/* Pls make this as last variable in struct */
bool force_24ghz_in_ht20;
bool force_rsne_override;

View File

@@ -551,6 +551,7 @@ typedef struct sPESession /* Added to Support BT-AMP */
struct obss_detection_cfg obss_offload_cfg;
bool is_session_obss_offload_enabled;
bool is_obss_reset_timer_initialized;
bool sae_pmk_cached;
} tPESession, *tpPESession;
/*-------------------------------------------------------------------------

View File

@@ -634,16 +634,27 @@ static void lim_process_auth_frame_type2(tpAniSirGlobal mac_ctx,
if (rx_auth_frm_body->authAlgoNumber !=
mac_ctx->lim.gpLimMlmAuthReq->authType) {
/*
* Received Authentication frame with an auth
* algorithm other than one requested.
* Wait until Authentication Failure Timeout.
* Auth algo is open in rx auth frame when auth type is SAE and
* PMK is cached as driver sent auth algo as open in tx frame
* as well.
*/
if ((mac_ctx->lim.gpLimMlmAuthReq->authType ==
eSIR_AUTH_TYPE_SAE) && pe_session->sae_pmk_cached) {
pe_debug("rx Auth frame2 auth algo %d in SAE PMK case",
rx_auth_frm_body->authAlgoNumber);
} else {
/*
* Received Authentication frame with an auth
* algorithm other than one requested.
* Wait until Authentication Failure Timeout.
*/
pe_warn("rx Auth frame2 for unexpected auth algo number %d "
MAC_ADDRESS_STR,
rx_auth_frm_body->authAlgoNumber,
MAC_ADDR_ARRAY(mac_hdr->sa));
return;
pe_warn("rx Auth frame2 for unexpected auth algo %d"
MAC_ADDRESS_STR,
rx_auth_frm_body->authAlgoNumber,
MAC_ADDR_ARRAY(mac_hdr->sa));
return;
}
}
if (rx_auth_frm_body->authStatusCode != eSIR_MAC_SUCCESS_STATUS) {

View File

@@ -1228,7 +1228,8 @@ static void lim_process_mlm_auth_req(tpAniSirGlobal mac_ctx, uint32_t *msg)
session->limPrevMlmState = session->limMlmState;
if (mac_ctx->lim.gpLimMlmAuthReq->authType == eSIR_AUTH_TYPE_SAE) {
if ((mac_ctx->lim.gpLimMlmAuthReq->authType == eSIR_AUTH_TYPE_SAE) &&
!session->sae_pmk_cached) {
if (lim_process_mlm_auth_req_sae(mac_ctx, session) !=
QDF_STATUS_SUCCESS) {
mlm_auth_cnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
@@ -1243,9 +1244,16 @@ static void lim_process_mlm_auth_req(tpAniSirGlobal mac_ctx, uint32_t *msg)
MTRACE(mac_trace(mac_ctx, TRACE_CODE_MLM_STATE, session->peSessionId,
session->limMlmState));
/* Prepare & send Authentication frame */
auth_frame_body.authAlgoNumber =
/* Mark auth algo as open when auth type is SAE and PMK is cached */
if ((mac_ctx->lim.gpLimMlmAuthReq->authType == eSIR_AUTH_TYPE_SAE) &&
session->sae_pmk_cached) {
auth_frame_body.authAlgoNumber = eSIR_OPEN_SYSTEM;
} else {
auth_frame_body.authAlgoNumber =
(uint8_t) mac_ctx->lim.gpLimMlmAuthReq->authType;
}
/* Prepare & send Authentication frame */
auth_frame_body.authTransactionSeqNumber = SIR_MAC_AUTH_FRAME_1;
auth_frame_body.authStatusCode = 0;
#ifdef FEATURE_WLAN_DIAG_SUPPORT

View File

@@ -1479,6 +1479,32 @@ static void __lim_process_clear_dfs_channel_list(tpAniSirGlobal pMac,
qdf_mem_set(&pMac->lim.dfschannelList, sizeof(tSirDFSChannelList), 0);
}
#ifdef WLAN_FEATURE_SAE
/**
* lim_update_sae_config()- This API update SAE session info to csr config
* from join request.
* @session: PE session
* @sme_join_req: pointer to join request
*
* Return: None
*/
static void lim_update_sae_config(tpPESession session,
tpSirSmeJoinReq sme_join_req)
{
session->sae_pmk_cached = sme_join_req->sae_pmk_cached;
pe_debug("pmk_cached %d for BSSID=" MAC_ADDRESS_STR,
session->sae_pmk_cached,
MAC_ADDR_ARRAY(sme_join_req->bssDescription.bssId));
}
#else
static inline void lim_update_sae_config(tpPESession session,
tpSirSmeJoinReq sme_join_req)
{}
#endif
/**
* __lim_process_sme_join_req() - process SME_JOIN_REQ message
* @mac_ctx: Pointer to Global MAC structure
@@ -1802,6 +1828,7 @@ __lim_process_sme_join_req(tpAniSirGlobal mac_ctx, uint32_t *msg_buf)
sme_join_req->txLdpcIniFeatureEnabled;
lim_update_fils_config(session, sme_join_req);
lim_update_sae_config(session, sme_join_req);
if (session->bssType == eSIR_INFRASTRUCTURE_MODE) {
session->limSystemRole = eLIM_STA_ROLE;
} else {

View File

@@ -14886,6 +14886,36 @@ static void csr_update_fils_connection_info(tCsrRoamProfile *profile,
{ }
#endif
#ifdef WLAN_FEATURE_SAE
/*
* csr_update_sae_config: Copy SAE info to join request
* @profile: pointer to profile
* @csr_join_req: csr join request
*
* Return: None
*/
static void csr_update_sae_config(tSirSmeJoinReq *csr_join_req,
tpAniSirGlobal mac, struct csr_roam_session *session)
{
tPmkidCacheInfo pmkid_cache;
uint32_t index;
qdf_mem_copy(pmkid_cache.BSSID.bytes,
csr_join_req->bssDescription.bssId, QDF_MAC_ADDR_SIZE);
csr_join_req->sae_pmk_cached =
csr_lookup_pmkid_using_bssid(mac, session, &pmkid_cache, &index);
sme_debug("pmk_cached %d for BSSID=" MAC_ADDRESS_STR,
csr_join_req->sae_pmk_cached,
MAC_ADDR_ARRAY(csr_join_req->bssDescription.bssId));
}
#else
static void csr_update_sae_config(tSirSmeJoinReq *csr_join_req,
tpAniSirGlobal mac, struct csr_roam_session *session)
{ }
#endif
/**
* The communication between HDD and LIM is thru mailbox (MB).
* Both sides will access the data structure "tSirSmeJoinReq".
@@ -15571,6 +15601,7 @@ QDF_STATUS csr_send_join_req_msg(tpAniSirGlobal pMac, uint32_t sessionId,
pBssDescription->length +
sizeof(pBssDescription->length));
csr_update_fils_connection_info(pProfile, csr_join_req);
csr_update_sae_config(csr_join_req, pMac, pSession);
/*
* conc_custom_rule1:
* If SAP comes up first and STA comes up later then SAP

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2011-2017 The Linux Foundation. All rights reserved.
* Copyright (c) 2011-2018 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -1164,4 +1164,18 @@ static inline bool csr_is_mfpc_capable(struct sDot11fIERSN *rsn)
*/
enum band_info csr_get_rf_band(uint8_t channel);
/**
* csr_lookup_pmkid_using_bssid() - lookup pmkid using bssid
* @mac: pointer to mac
* @session: sme session pointer
* @pmk_cache: pointer to pmk cache
* @index: index value needs to be seached
*
* Return: true if pmkid is found else false
*/
bool csr_lookup_pmkid_using_bssid(tpAniSirGlobal mac,
struct csr_roam_session *session,
tPmkidCacheInfo *pmk_cache,
uint32_t *index);
#endif /* CSR_INSIDE_API_H__ */

View File

@@ -3919,16 +3919,7 @@ static bool csr_lookup_pmkid_using_ssid(tpAniSirGlobal mac,
return false;
}
/**
* csr_lookup_pmkid_using_bssid() - lookup pmkid using bssid
* @mac: pointer to mac
* @session: sme session pointer
* @pmk_cache: pointer to pmk cache
* @index: index value needs to be seached
*
* Return: true if pmkid is found else false
*/
static bool csr_lookup_pmkid_using_bssid(tpAniSirGlobal mac,
bool csr_lookup_pmkid_using_bssid(tpAniSirGlobal mac,
struct csr_roam_session *session,
tPmkidCacheInfo *pmk_cache,
uint32_t *index)