diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index 6a66ec439073..53cc5bd084d3 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -10535,6 +10535,158 @@ csr_update_wep_key_peer_macaddr(struct wlan_objmgr_vdev *vdev, } } +#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR +static void +csr_roam_diag_set_ctx_rsp(struct mac_context *mac_ctx, + struct csr_roam_session *session, + struct set_context_rsp *pRsp) +{ + WLAN_HOST_DIAG_EVENT_DEF(setKeyEvent, + host_event_wlan_security_payload_type); + if (eCSR_ENCRYPT_TYPE_NONE == + session->connectedProfile.EncryptionType) + return; + qdf_mem_zero(&setKeyEvent, + sizeof(host_event_wlan_security_payload_type)); + if (qdf_is_macaddr_group(&pRsp->peer_macaddr)) + setKeyEvent.eventId = + WLAN_SECURITY_EVENT_SET_BCAST_RSP; + else + setKeyEvent.eventId = + WLAN_SECURITY_EVENT_SET_UNICAST_RSP; + setKeyEvent.encryptionModeMulticast = + (uint8_t) diag_enc_type_from_csr_type( + session->connectedProfile.mcEncryptionType); + setKeyEvent.encryptionModeUnicast = + (uint8_t) diag_enc_type_from_csr_type( + session->connectedProfile.EncryptionType); + qdf_mem_copy(setKeyEvent.bssid, session->connectedProfile.bssid.bytes, + QDF_MAC_ADDR_SIZE); + setKeyEvent.authMode = + (uint8_t) diag_auth_type_from_csr_type( + session->connectedProfile.AuthType); + if (eSIR_SME_SUCCESS != pRsp->status_code) + setKeyEvent.status = WLAN_SECURITY_STATUS_FAILURE; + WLAN_HOST_DIAG_EVENT_REPORT(&setKeyEvent, EVENT_WLAN_SECURITY); +} +#else /* FEATURE_WLAN_DIAG_SUPPORT_CSR */ +static void +csr_roam_diag_set_ctx_rsp(struct mac_context *mac_ctx, + struct csr_roam_session *session, + struct set_context_rsp *pRsp) +{ +} +#endif /* FEATURE_WLAN_DIAG_SUPPORT_CSR */ + +static void +csr_roam_chk_lnk_set_ctx_rsp(struct mac_context *mac_ctx, tSirSmeRsp *msg_ptr) +{ + struct csr_roam_session *session; + uint32_t sessionId = WLAN_UMAC_VDEV_ID_MAX; + QDF_STATUS status; + struct csr_roam_info *roam_info; + eCsrRoamResult result = eCSR_ROAM_RESULT_NONE; + struct set_context_rsp *pRsp = (struct set_context_rsp *)msg_ptr; + + if (!pRsp) { + sme_err("set key response is NULL"); + return; + } + + roam_info = qdf_mem_malloc(sizeof(*roam_info)); + if (!roam_info) + return; + sessionId = pRsp->sessionId; + session = CSR_GET_SESSION(mac_ctx, sessionId); + if (!session) { + sme_err("session %d not found", sessionId); + qdf_mem_free(roam_info); + return; + } + + csr_roam_diag_set_ctx_rsp(mac_ctx, session, pRsp); + + if (CSR_IS_WAIT_FOR_KEY(mac_ctx, sessionId)) { + csr_roam_stop_wait_for_key_timer(mac_ctx); + /* We are done with authentication, whethere succeed or not */ + csr_roam_substate_change(mac_ctx, eCSR_ROAM_SUBSTATE_NONE, + sessionId); + /* We do it here because this linkup function is not called + * after association when a key needs to be set. + */ + if (csr_is_conn_state_connected_infra(mac_ctx, sessionId)) + csr_roam_link_up(mac_ctx, + session->connectedProfile.bssid); + } + if (eSIR_SME_SUCCESS == pRsp->status_code) { + qdf_copy_macaddr(&roam_info->peerMac, &pRsp->peer_macaddr); + /* Make sure we install the GTK before indicating to HDD as + * authenticated. This is to prevent broadcast packets go out + * after PTK and before GTK. + */ + if (qdf_is_macaddr_broadcast(&pRsp->peer_macaddr)) { + /* + * OBSS SCAN Indication will be sent to Firmware + * to start OBSS Scan + */ + if (mac_ctx->obss_scan_offload && + wlan_reg_is_24ghz_ch_freq( + session->connectedProfile.op_freq) && + (session->connectState == + eCSR_ASSOC_STATE_TYPE_INFRA_ASSOCIATED) && + session->pCurRoamProfile && + (QDF_P2P_CLIENT_MODE == + session->pCurRoamProfile->csrPersona || + (QDF_STA_MODE == + session->pCurRoamProfile->csrPersona))) { + struct sme_obss_ht40_scanind_msg *msg; + + msg = qdf_mem_malloc(sizeof( + struct sme_obss_ht40_scanind_msg)); + if (!msg) { + qdf_mem_free(roam_info); + return; + } + + msg->msg_type = eWNI_SME_HT40_OBSS_SCAN_IND; + msg->length = + sizeof(struct sme_obss_ht40_scanind_msg); + qdf_copy_macaddr(&msg->mac_addr, + &session->connectedProfile.bssid); + status = umac_send_mb_message_to_mac(msg); + } + result = eCSR_ROAM_RESULT_AUTHENTICATED; + } else { + result = eCSR_ROAM_RESULT_NONE; + } + } else { + result = eCSR_ROAM_RESULT_FAILURE; + sme_err( + "CSR: setkey command failed(err=%d) PeerMac " + QDF_MAC_ADDR_FMT, + pRsp->status_code, + QDF_MAC_ADDR_REF(pRsp->peer_macaddr.bytes)); + } + /* keeping roam_id = 0 as nobody is using roam_id for set_key */ + csr_roam_call_callback(mac_ctx, sessionId, roam_info, + 0, eCSR_ROAM_SET_KEY_COMPLETE, result); + /* Indicate SME_QOS that the SET_KEY is completed, so that SME_QOS + * can go ahead and initiate the TSPEC if any are pending + */ + sme_qos_csr_event_ind(mac_ctx, (uint8_t)sessionId, + SME_QOS_CSR_SET_KEY_SUCCESS_IND, NULL); +#ifdef FEATURE_WLAN_ESE + /* Send Adjacent AP repot to new AP. */ + if (result == eCSR_ROAM_RESULT_AUTHENTICATED && + session->isPrevApInfoValid && + session->connectedProfile.isESEAssoc) { + csr_send_ese_adjacent_ap_rep_ind(mac_ctx, session); + session->isPrevApInfoValid = false; + } +#endif + qdf_mem_free(roam_info); +} + static QDF_STATUS csr_roam_issue_set_context_req(struct mac_context *mac_ctx, uint32_t session_id, bool add_key, bool unicast, @@ -10668,6 +10820,7 @@ csr_issue_set_context_req_helper(struct mac_context *mac_ctx, { enum wlan_crypto_cipher_type cipher; struct wlan_objmgr_vdev *vdev; + struct set_context_rsp install_key_rsp; vdev = wlan_objmgr_get_vdev_by_id_from_psoc(mac_ctx->psoc, session_id, WLAN_LEGACY_MAC_ID); @@ -10685,6 +10838,26 @@ csr_issue_set_context_req_helper(struct mac_context *mac_ctx, wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID); + /* + * For open mode authentication, send dummy install key response to + * send OBSS scan and QOS event. + */ + if (profile->negotiatedUCEncryptionType == eCSR_ENCRYPT_TYPE_NONE) { + if (unicast) + return QDF_STATUS_SUCCESS; + + install_key_rsp.length = sizeof(install_key_rsp); + install_key_rsp.status_code = eSIR_SME_SUCCESS; + install_key_rsp.sessionId = session_id; + qdf_mem_copy(install_key_rsp.peer_macaddr.bytes, bssid, + QDF_MAC_ADDR_SIZE); + + csr_roam_chk_lnk_set_ctx_rsp(mac_ctx, + (tSirSmeRsp *)&install_key_rsp); + + return QDF_STATUS_SUCCESS; + } + return csr_roam_issue_set_context_req(mac_ctx, session_id, addkey, unicast, key_id, (struct qdf_mac_addr *)bssid); @@ -12064,161 +12237,6 @@ csr_roam_chk_lnk_wm_status_change_ntf(struct mac_context *mac_ctx, qdf_mem_free(roam_info); } -#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR -static void -csr_roam_diag_set_ctx_rsp(struct mac_context *mac_ctx, - struct csr_roam_session *session, - struct set_context_rsp *pRsp) -{ - WLAN_HOST_DIAG_EVENT_DEF(setKeyEvent, - host_event_wlan_security_payload_type); - if (eCSR_ENCRYPT_TYPE_NONE == - session->connectedProfile.EncryptionType) - return; - qdf_mem_zero(&setKeyEvent, - sizeof(host_event_wlan_security_payload_type)); - if (qdf_is_macaddr_group(&pRsp->peer_macaddr)) - setKeyEvent.eventId = - WLAN_SECURITY_EVENT_SET_BCAST_RSP; - else - setKeyEvent.eventId = - WLAN_SECURITY_EVENT_SET_UNICAST_RSP; - setKeyEvent.encryptionModeMulticast = - (uint8_t) diag_enc_type_from_csr_type( - session->connectedProfile.mcEncryptionType); - setKeyEvent.encryptionModeUnicast = - (uint8_t) diag_enc_type_from_csr_type( - session->connectedProfile.EncryptionType); - qdf_mem_copy(setKeyEvent.bssid, session->connectedProfile.bssid.bytes, - QDF_MAC_ADDR_SIZE); - setKeyEvent.authMode = - (uint8_t) diag_auth_type_from_csr_type( - session->connectedProfile.AuthType); - if (eSIR_SME_SUCCESS != pRsp->status_code) - setKeyEvent.status = WLAN_SECURITY_STATUS_FAILURE; - WLAN_HOST_DIAG_EVENT_REPORT(&setKeyEvent, EVENT_WLAN_SECURITY); -} -#else /* FEATURE_WLAN_DIAG_SUPPORT_CSR */ -static void -csr_roam_diag_set_ctx_rsp(struct mac_context *mac_ctx, - struct csr_roam_session *session, - struct set_context_rsp *pRsp) -{ -} -#endif /* FEATURE_WLAN_DIAG_SUPPORT_CSR */ - -static void -csr_roam_chk_lnk_set_ctx_rsp(struct mac_context *mac_ctx, tSirSmeRsp *msg_ptr) -{ - struct csr_roam_session *session; - uint32_t sessionId = WLAN_UMAC_VDEV_ID_MAX; - QDF_STATUS status; - struct csr_roam_info *roam_info; - eCsrRoamResult result = eCSR_ROAM_RESULT_NONE; - struct set_context_rsp *pRsp = (struct set_context_rsp *)msg_ptr; - - - if (!pRsp) { - sme_err("set key response is NULL"); - return; - } - - roam_info = qdf_mem_malloc(sizeof(*roam_info)); - if (!roam_info) - return; - sessionId = pRsp->sessionId; - session = CSR_GET_SESSION(mac_ctx, sessionId); - if (!session) { - sme_err("session %d not found", sessionId); - qdf_mem_free(roam_info); - return; - } - - csr_roam_diag_set_ctx_rsp(mac_ctx, session, pRsp); - - if (CSR_IS_WAIT_FOR_KEY(mac_ctx, sessionId)) { - csr_roam_stop_wait_for_key_timer(mac_ctx); - /* We are done with authentication, whethere succeed or not */ - csr_roam_substate_change(mac_ctx, eCSR_ROAM_SUBSTATE_NONE, - sessionId); - /* We do it here because this linkup function is not called - * after association when a key needs to be set. - */ - if (csr_is_conn_state_connected_infra(mac_ctx, sessionId)) - csr_roam_link_up(mac_ctx, - session->connectedProfile.bssid); - } - if (eSIR_SME_SUCCESS == pRsp->status_code) { - qdf_copy_macaddr(&roam_info->peerMac, &pRsp->peer_macaddr); - /* Make sure we install the GTK before indicating to HDD as - * authenticated. This is to prevent broadcast packets go out - * after PTK and before GTK. - */ - if (qdf_is_macaddr_broadcast(&pRsp->peer_macaddr)) { - /* - * OBSS SCAN Indication will be sent to Firmware - * to start OBSS Scan - */ - if (mac_ctx->obss_scan_offload && - wlan_reg_is_24ghz_ch_freq( - session->connectedProfile.op_freq) - && (session->connectState == - eCSR_ASSOC_STATE_TYPE_INFRA_ASSOCIATED) - && session->pCurRoamProfile - && ((QDF_P2P_CLIENT_MODE == - session->pCurRoamProfile->csrPersona) - || (QDF_STA_MODE == - session->pCurRoamProfile->csrPersona))) { - struct sme_obss_ht40_scanind_msg *msg; - - msg = qdf_mem_malloc(sizeof( - struct sme_obss_ht40_scanind_msg)); - if (!msg) { - qdf_mem_free(roam_info); - return; - } - - msg->msg_type = eWNI_SME_HT40_OBSS_SCAN_IND; - msg->length = - sizeof(struct sme_obss_ht40_scanind_msg); - qdf_copy_macaddr(&msg->mac_addr, - &session->connectedProfile.bssid); - status = umac_send_mb_message_to_mac(msg); - } - result = eCSR_ROAM_RESULT_AUTHENTICATED; - } else { - result = eCSR_ROAM_RESULT_NONE; - } - } else { - result = eCSR_ROAM_RESULT_FAILURE; - sme_err( - "CSR: setkey command failed(err=%d) PeerMac " - QDF_MAC_ADDR_FMT, - pRsp->status_code, - QDF_MAC_ADDR_REF(pRsp->peer_macaddr.bytes)); - } - /* keeping roam_id = 0 as nobody is using roam_id for set_key */ - csr_roam_call_callback(mac_ctx, sessionId, roam_info, - 0, eCSR_ROAM_SET_KEY_COMPLETE, result); - /* Indicate SME_QOS that the SET_KEY is completed, so that SME_QOS - * can go ahead and initiate the TSPEC if any are pending - */ - sme_qos_csr_event_ind(mac_ctx, (uint8_t) sessionId, - SME_QOS_CSR_SET_KEY_SUCCESS_IND, NULL); -#ifdef FEATURE_WLAN_ESE - /* Send Adjacent AP repot to new AP. */ - if (result == eCSR_ROAM_RESULT_AUTHENTICATED - && session->isPrevApInfoValid - && session->connectedProfile.isESEAssoc) { - csr_send_ese_adjacent_ap_rep_ind(mac_ctx, session); - session->isPrevApInfoValid = false; - } -#endif - qdf_mem_free(roam_info); - return; -} - - static void csr_roam_chk_lnk_max_assoc_exceeded(struct mac_context *mac_ctx, tSirSmeRsp *msg_ptr) {