diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index ba1d79515d09..057ba1c6bd82 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -749,14 +749,15 @@ csr_roam_chk_lnk_ibss_new_peer_ind(struct mac_context *mac_ctx, session->pConnectBssDesc->length); } } - if ((eCSR_ENCRYPT_TYPE_NONE == - session->connectedProfile.EncryptionType)) { + if (eCSR_ENCRYPT_TYPE_NONE == + session->connectedProfile.EncryptionType) { /* NO keys. these key parameters don't matter */ - csr_roam_issue_set_context_req_helper(mac_ctx, sessionId, - session->connectedProfile.EncryptionType, - session->pConnectBssDesc, - &pIbssPeerInd->peer_addr.bytes, - false, true, eSIR_TX_RX, 0, 0, NULL, 0); + csr_issue_set_context_req_helper(mac_ctx, + session->pCurRoamProfile, + sessionId, + &pIbssPeerInd->peer_addr.bytes, + false, true, eSIR_TX_RX, + 0, 0, NULL); } callback_and_free: @@ -7449,11 +7450,11 @@ static void csr_roam_process_start_bss_success(struct mac_context *mac_ctx, */ if (!CSR_IS_IBSS(session->pCurRoamProfile)) { /* NO keys. these key parameters don't matter */ - csr_roam_issue_set_context_req_helper(mac_ctx, - session_id, - profile->negotiatedMCEncryptionType, - bss_desc, &bcast_mac, false, - false, eSIR_TX_RX, 0, 0, NULL, 0); + csr_issue_set_context_req_helper(mac_ctx, + profile, session_id, + &bcast_mac, false, + false, eSIR_TX_RX, + 0, 0, NULL); } } if (CSR_IS_IBSS(session->pCurRoamProfile) && @@ -7620,7 +7621,6 @@ static void csr_process_fils_join_rsp(struct mac_context *mac_ctx, struct bss_description *bss_desc, struct join_rsp *join_rsp) { - tSirMacAddr bcast_mac = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; QDF_STATUS status; if (!join_rsp || !join_rsp->fils_join_rsp) { @@ -7635,24 +7635,21 @@ static void csr_process_fils_join_rsp(struct mac_context *mac_ctx, goto process_fils_join_rsp_fail; } - status = csr_roam_issue_set_context_req_helper(mac_ctx, session_id, - profile->negotiatedMCEncryptionType, - bss_desc, &bcast_mac, true, false, - eSIR_RX_ONLY, 2, - roam_info->fils_join_rsp->gtk_len, - roam_info->fils_join_rsp->gtk, 0); - if (!QDF_IS_STATUS_SUCCESS(status)) { + status = csr_issue_set_context_req_helper(mac_ctx, profile, + session_id, &bss_desc->bssId, true, false, + eSIR_RX_ONLY, 2, roam_info->fils_join_rsp->gtk_len, + roam_info->fils_join_rsp->gtk); + if (QDF_IS_STATUS_ERROR(status)) { sme_err("Set context for bcast fail"); goto process_fils_join_rsp_fail; } - status = csr_roam_issue_set_context_req_helper(mac_ctx, session_id, - profile->negotiatedUCEncryptionType, - bss_desc, &(bss_desc->bssId), true, - true, eSIR_TX_RX, 0, - roam_info->fils_join_rsp->tk_len, - roam_info->fils_join_rsp->tk, 0); - if (!QDF_IS_STATUS_SUCCESS(status)) { + status = csr_issue_set_context_req_helper(mac_ctx, profile, + session_id, &bss_desc->bssId, true, + true, eSIR_TX_RX, 0, + roam_info->fils_join_rsp->tk_len, + roam_info->fils_join_rsp->tk); + if (QDF_IS_STATUS_ERROR(status)) { sme_err("Set context for unicast fail"); goto process_fils_join_rsp_fail; } @@ -7827,13 +7824,10 @@ static void csr_roam_process_join_res(struct mac_context *mac_ctx, * Issue the set Context request to LIM to establish * the Unicast STA context */ - if (!QDF_IS_STATUS_SUCCESS( - csr_roam_issue_set_context_req_helper(mac_ctx, - session_id, - profile->negotiatedUCEncryptionType, - bss_desc, &(bss_desc->bssId), - false, true, - eSIR_TX_RX, 0, 0, NULL, 0))) { + if (QDF_IS_STATUS_ERROR( + csr_issue_set_context_req_helper(mac_ctx, + profile, session_id, &bss_desc->bssId, + false, true, eSIR_TX_RX, 0, 0, NULL))) { /* NO keys. these key parameters don't matter */ sme_debug("Set context for unicast fail"); csr_roam_substate_change(mac_ctx, @@ -7844,11 +7838,11 @@ static void csr_roam_process_join_res(struct mac_context *mac_ctx, * to establish the Broadcast STA context * NO keys. these key parameters don't matter */ - csr_roam_issue_set_context_req_helper(mac_ctx, - session_id, - profile->negotiatedMCEncryptionType, - bss_desc, &bcast_mac, false, false, - eSIR_TX_RX, 0, 0, NULL, 0); + csr_issue_set_context_req_helper(mac_ctx, profile, + session_id, &bcast_mac, + false, false, + eSIR_TX_RX, 0, 0, + NULL); } else if (CSR_IS_AUTH_TYPE_FILS(profile->negotiatedAuthType) && join_rsp->is_fils_connection) { roam_info->is_fils_connection = true; @@ -10893,7 +10887,7 @@ static QDF_STATUS csr_roam_issue_set_context_req(struct mac_context *mac_ctx, sme_debug("session:%d, cipher:%d, ucast:%d, idx:%d, wep:%d, add:%d", session_id, cipher, unicast, key_idx, wep_key_idx, add_key); - if (!IS_WEP_CIPHER(cipher)) + if (!IS_WEP_CIPHER(cipher) && !add_key) return QDF_STATUS_E_INVAL; return ucfg_crypto_set_key_req(vdev, crypto_key, (unicast ? @@ -10901,25 +10895,61 @@ static QDF_STATUS csr_roam_issue_set_context_req(struct mac_context *mac_ctx, WLAN_CRYPTO_KEY_TYPE_GROUP)); } -static QDF_STATUS csr_roam_store_fils_key(struct wlan_objmgr_vdev *vdev, - bool unicast, uint8_t key_id, - uint16_t key_length, uint8_t *key, - tSirMacAddr *bssid) +static enum wlan_crypto_cipher_type +csr_encr_to_cipher_type(eCsrEncryptionType encr_type) +{ + switch (encr_type) { + case eCSR_ENCRYPT_TYPE_WEP40: + return WLAN_CRYPTO_CIPHER_WEP_40; + case eCSR_ENCRYPT_TYPE_WEP104: + return WLAN_CRYPTO_CIPHER_WEP_104; + case eCSR_ENCRYPT_TYPE_TKIP: + return WLAN_CRYPTO_CIPHER_TKIP; + case eCSR_ENCRYPT_TYPE_AES: + return WLAN_CRYPTO_CIPHER_AES_CCM; + case eCSR_ENCRYPT_TYPE_AES_CMAC: + return WLAN_CRYPTO_CIPHER_AES_CMAC; + case eCSR_ENCRYPT_TYPE_AES_GMAC_128: + return WLAN_CRYPTO_CIPHER_AES_GMAC; + case eCSR_ENCRYPT_TYPE_AES_GMAC_256: + return WLAN_CRYPTO_CIPHER_AES_GMAC_256; + case eCSR_ENCRYPT_TYPE_AES_GCMP: + return WLAN_CRYPTO_CIPHER_AES_GCM; + case eCSR_ENCRYPT_TYPE_AES_GCMP_256: + return WLAN_CRYPTO_CIPHER_AES_GCM_256; + default: + return WLAN_CRYPTO_CIPHER_NONE; + } +} + +#ifdef WLAN_FEATURE_FILS_SK +static QDF_STATUS +csr_roam_store_fils_key(struct wlan_objmgr_vdev *vdev, + bool unicast, uint8_t key_id, + uint16_t key_length, uint8_t *key, + tSirMacAddr *bssid, + eCsrEncryptionType encr_type) { struct wlan_crypto_key *crypto_key = NULL; - uint8_t key_index = 0; QDF_STATUS status; + /* + * key index is the FW key index. + * Key_id is for host crypto component key storage index + */ + uint8_t key_index = 0; if (unicast) key_index = 0; else - key_index = 1; - crypto_key = wlan_crypto_get_key(vdev, key_index); + key_index = 2; + + crypto_key = wlan_crypto_get_key(vdev, key_id); if (!crypto_key) { crypto_key = qdf_mem_malloc(sizeof(*crypto_key)); if (!crypto_key) return QDF_STATUS_E_INVAL; - status = wlan_crypto_save_key(vdev, key_index, crypto_key); + + status = wlan_crypto_save_key(vdev, key_id, crypto_key); if (QDF_IS_STATUS_ERROR(status)) { sme_err("Failed to save key"); qdf_mem_free(crypto_key); @@ -10927,6 +10957,8 @@ static QDF_STATUS csr_roam_store_fils_key(struct wlan_objmgr_vdev *vdev, } } qdf_mem_zero(crypto_key, sizeof(*crypto_key)); + /* TODO add support for FILS cipher translation in OSIF */ + crypto_key->cipher_type = csr_encr_to_cipher_type(encr_type); crypto_key->keylen = key_length; crypto_key->keyix = key_index; sme_debug("key_len %d, unicast %d", key_length, unicast); @@ -10935,17 +10967,25 @@ static QDF_STATUS csr_roam_store_fils_key(struct wlan_objmgr_vdev *vdev, return QDF_STATUS_SUCCESS; } +#else +static inline +QDF_STATUS csr_roam_store_fils_key(struct wlan_objmgr_vdev *vdev, + bool unicast, uint8_t key_id, + uint16_t key_length, uint8_t *key, + tSirMacAddr *bssid, + eCsrEncryptionType encr_type) +{ + return QDF_STATUS_E_NOSUPPORT; +} +#endif -QDF_STATUS csr_roam_issue_set_context_req_helper( - struct mac_context *mac_ctx, - uint32_t session_id, - eCsrEncryptionType encr_type, - struct bss_description *bss_descr, - tSirMacAddr *bssid, bool addkey, - bool unicast, - tAniKeyDirection key_direction, - uint8_t key_id, uint16_t key_length, - uint8_t *key, uint8_t pae_role) +QDF_STATUS +csr_issue_set_context_req_helper(struct mac_context *mac_ctx, + struct csr_roam_profile *profile, + uint32_t session_id, tSirMacAddr *bssid, + bool addkey, bool unicast, + tAniKeyDirection key_direction, uint8_t key_id, + uint16_t key_length, uint8_t *key) { enum wlan_crypto_cipher_type cipher; struct wlan_objmgr_vdev *vdev; @@ -10956,10 +10996,13 @@ QDF_STATUS csr_roam_issue_set_context_req_helper( sme_err("VDEV object not found for session_id %d", session_id); return QDF_STATUS_E_INVAL; } + cipher = wlan_crypto_get_cipher(vdev, unicast, key_id); - if (cipher == WLAN_CRYPTO_CIPHER_FILS_AEAD) + if (addkey && !IS_WEP_CIPHER(cipher) && + (profile && csr_is_fils_connection(profile))) csr_roam_store_fils_key(vdev, unicast, key_id, key_length, - key, bssid); + key, bssid, + profile->negotiatedMCEncryptionType); wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID); @@ -11871,13 +11914,10 @@ csr_roam_chk_lnk_assoc_ind(struct mac_context *mac_ctx, tSirSmeRsp *msg_ptr) CSR_IS_ENC_TYPE_STATIC( session->pCurRoamProfile->negotiatedUCEncryptionType)) { /* NO keys... these key parameters don't matter. */ - csr_roam_issue_set_context_req_helper(mac_ctx, - sessionId, - session->pCurRoamProfile-> - negotiatedUCEncryptionType, - session->pConnectBssDesc, - &roam_info->peerMac.bytes, - false, true, eSIR_TX_RX, 0, 0, NULL, 0); + csr_issue_set_context_req_helper(mac_ctx, + session->pCurRoamProfile, sessionId, + &roam_info->peerMac.bytes, false, true, + eSIR_TX_RX, 0, 0, NULL); roam_info->fAuthRequired = false; } else { roam_info->fAuthRequired = true; @@ -12468,12 +12508,10 @@ csr_roam_chk_lnk_wm_status_change_ntf(struct mac_context *mac_ctx, if ((eCSR_ENCRYPT_TYPE_NONE == session->connectedProfile.EncryptionType)) { - csr_roam_issue_set_context_req_helper(mac_ctx, - sessionId, - session->connectedProfile.EncryptionType, - session->pConnectBssDesc, - &Broadcastaddr, false, false, - eSIR_TX_RX, 0, 0, NULL, 0); + csr_issue_set_context_req_helper(mac_ctx, + session->pCurRoamProfile, sessionId, + &Broadcastaddr, false, false, + eSIR_TX_RX, 0, 0, NULL); } result = eCSR_ROAM_RESULT_IBSS_COALESCED; roamStatus = eCSR_ROAM_IBSS_IND; diff --git a/core/sme/src/csr/csr_inside_api.h b/core/sme/src/csr/csr_inside_api.h index 00cf03f0addb..bca8b44156bf 100644 --- a/core/sme/src/csr/csr_inside_api.h +++ b/core/sme/src/csr/csr_inside_api.h @@ -214,16 +214,31 @@ QDF_STATUS csr_roam_issue_reassoc(struct mac_context *mac, uint32_t sessionId, bool fImediate); void csr_roam_complete(struct mac_context *mac, enum csr_roamcomplete_result Result, void *Context, uint8_t session_id); + +/** + * csr_issue_set_context_req_helper - Function to fill unicast/broadcast keys + * request to set the keys to fw + * @mac: Poiner to mac context + * @profile: Pointer to connected profile + * @vdev_id: vdev id + * @bssid: Connected BSSID + * @addkey: Is add key request to crypto + * @unicast: Unicast(1) or broadcast key(0) + * @key_direction: Key used in TX or RX or both Tx and RX path + * @key_id: Key index + * @key_length: Key length + * @key: Pointer to the key + * + * Return: QDF_STATUS + */ QDF_STATUS -csr_roam_issue_set_context_req_helper(struct mac_context *mac, - uint32_t session_id, - eCsrEncryptionType encr_type, - struct bss_description *bss_descr, - tSirMacAddr *bssid, bool addkey, - bool unicast, - tAniKeyDirection key_direction, - uint8_t key_id, uint16_t key_length, - uint8_t *key, uint8_t pae_role); +csr_issue_set_context_req_helper(struct mac_context *mac, + struct csr_roam_profile *profile, + uint32_t session_id, + tSirMacAddr *bssid, bool addkey, + bool unicast, tAniKeyDirection key_direction, + uint8_t key_id, uint16_t key_length, + uint8_t *key); QDF_STATUS csr_roam_process_disassoc_deauth(struct mac_context *mac, tSmeCmd *pCommand,