mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-09 21:59:12 -04:00
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:
commit
33ec8eeb00
1 changed files with 173 additions and 155 deletions
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in a new issue