Merge "qcacld-3.0: Send install key command response for open mode connection" into wlan-cld3.driver.lnx.2.0

This commit is contained in:
CNSS_WLAN Service 2020-09-09 23:45:20 -07:00 • committed by Gerrit - the friendly Code Review server
commit 33ec8eeb00

View file

@ -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)
{