|
@@ -22,13 +22,14 @@
|
|
|
#include <csr_neighbor_roam.h>
|
|
|
#include <sir_api.h>
|
|
|
|
|
|
+#ifdef WLAN_FEATURE_HOST_ROAM
|
|
|
+
|
|
|
+#ifndef FEATURE_CM_ENABLE
|
|
|
/* Initialize the FT context. */
|
|
|
-void sme_ft_open(mac_handle_t mac_handle, uint32_t sessionId)
|
|
|
+void sme_ft_open(mac_handle_t mac_handle, uint8_t sessionId)
|
|
|
{
|
|
|
struct mac_context *mac = MAC_CONTEXT(mac_handle);
|
|
|
-#ifndef FEATURE_CM_ENABLE
|
|
|
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
|
|
-#endif
|
|
|
struct csr_roam_session *pSession = CSR_GET_SESSION(mac, sessionId);
|
|
|
|
|
|
if (pSession) {
|
|
@@ -40,7 +41,6 @@ void sme_ft_open(mac_handle_t mac_handle, uint32_t sessionId)
|
|
|
if (!pSession->ftSmeContext.pUsrCtx)
|
|
|
return;
|
|
|
|
|
|
-#ifndef FEATURE_CM_ENABLE
|
|
|
pSession->ftSmeContext.pUsrCtx->mac = mac;
|
|
|
pSession->ftSmeContext.pUsrCtx->sessionId = sessionId;
|
|
|
|
|
@@ -56,22 +56,23 @@ void sme_ft_open(mac_handle_t mac_handle, uint32_t sessionId)
|
|
|
pSession->ftSmeContext.pUsrCtx = NULL;
|
|
|
return;
|
|
|
}
|
|
|
-#endif
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* Cleanup the SME FT Global context. */
|
|
|
-void sme_ft_close(mac_handle_t mac_handle, uint32_t sessionId)
|
|
|
+void sme_ft_close(mac_handle_t mac_handle, uint8_t sessionId)
|
|
|
{
|
|
|
struct mac_context *mac = MAC_CONTEXT(mac_handle);
|
|
|
struct csr_roam_session *pSession = NULL;
|
|
|
|
|
|
- /* Clear the FT Context */
|
|
|
- sme_ft_reset(mac_handle, sessionId);
|
|
|
-
|
|
|
pSession = CSR_GET_SESSION(mac, sessionId);
|
|
|
if (pSession) {
|
|
|
-#ifndef FEATURE_CM_ENABLE
|
|
|
+ if (pSession->ftSmeContext.psavedFTPreAuthRsp) {
|
|
|
+ qdf_mem_free(pSession->ftSmeContext.psavedFTPreAuthRsp);
|
|
|
+ pSession->ftSmeContext.psavedFTPreAuthRsp = NULL;
|
|
|
+ }
|
|
|
+ qdf_mem_zero(pSession->ftSmeContext.preAuthbssId,
|
|
|
+ QDF_MAC_ADDR_SIZE);
|
|
|
/* check if the timer is running */
|
|
|
if (QDF_TIMER_STATE_RUNNING ==
|
|
|
qdf_mc_timer_get_current_state(&pSession->ftSmeContext.
|
|
@@ -82,7 +83,6 @@ void sme_ft_close(mac_handle_t mac_handle, uint32_t sessionId)
|
|
|
|
|
|
qdf_mc_timer_destroy(&pSession->ftSmeContext.
|
|
|
preAuthReassocIntvlTimer);
|
|
|
-#endif
|
|
|
if (pSession->ftSmeContext.pUsrCtx) {
|
|
|
qdf_mem_free(pSession->ftSmeContext.pUsrCtx);
|
|
|
pSession->ftSmeContext.pUsrCtx = NULL;
|
|
@@ -90,100 +90,210 @@ void sme_ft_close(mac_handle_t mac_handle, uint32_t sessionId)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void sme_set_ft_pre_auth_state(mac_handle_t mac_handle, uint32_t sessionId,
|
|
|
- bool state)
|
|
|
+/*
|
|
|
+ * HDD Interface to SME. SME now sends the Auth 2 and RIC IEs up to the
|
|
|
+ * supplicant. The supplicant will then proceed to send down the
|
|
|
+ * Reassoc Req.
|
|
|
+ */
|
|
|
+void sme_get_ft_pre_auth_response(mac_handle_t mac_handle, uint8_t sessionId,
|
|
|
+ uint8_t *ft_ies, uint32_t ft_ies_ip_len,
|
|
|
+ uint16_t *ft_ies_length)
|
|
|
{
|
|
|
struct mac_context *mac = MAC_CONTEXT(mac_handle);
|
|
|
struct csr_roam_session *pSession = CSR_GET_SESSION(mac, sessionId);
|
|
|
+ QDF_STATUS status = QDF_STATUS_E_FAILURE;
|
|
|
+ struct wlan_objmgr_vdev *vdev;
|
|
|
+ struct mlme_legacy_priv *mlme_priv;
|
|
|
+
|
|
|
+ *ft_ies_length = 0;
|
|
|
+
|
|
|
+ if (!pSession) {
|
|
|
+ sme_err("pSession is NULL");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ vdev = wlan_objmgr_get_vdev_by_id_from_pdev(mac->pdev, sessionId,
|
|
|
+ WLAN_LEGACY_SME_ID);
|
|
|
+ if (!vdev)
|
|
|
+ return;
|
|
|
+
|
|
|
+ mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
|
|
|
+ if (!mlme_priv)
|
|
|
+ goto end;
|
|
|
+
|
|
|
+ status = sme_acquire_global_lock(&mac->sme);
|
|
|
+ if (QDF_IS_STATUS_ERROR(status))
|
|
|
+ goto end;
|
|
|
+
|
|
|
+ /* All or nothing - proceed only if both BSSID and FT IE fit */
|
|
|
+ if ((QDF_MAC_ADDR_SIZE +
|
|
|
+ pSession->ftSmeContext.psavedFTPreAuthRsp->ft_ies_length) >
|
|
|
+ ft_ies_ip_len) {
|
|
|
+ sme_release_global_lock(&mac->sme);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ /* hdd needs to pack the bssid also along with the */
|
|
|
+ /* auth response to supplicant */
|
|
|
+ qdf_mem_copy(ft_ies, pSession->ftSmeContext.preAuthbssId,
|
|
|
+ QDF_MAC_ADDR_SIZE);
|
|
|
+
|
|
|
+ /* Copy the auth resp FTIEs */
|
|
|
+ qdf_mem_copy(&(ft_ies[QDF_MAC_ADDR_SIZE]),
|
|
|
+ pSession->ftSmeContext.psavedFTPreAuthRsp->ft_ies,
|
|
|
+ pSession->ftSmeContext.psavedFTPreAuthRsp->ft_ies_length);
|
|
|
+
|
|
|
+ *ft_ies_length = QDF_MAC_ADDR_SIZE +
|
|
|
+ pSession->ftSmeContext.psavedFTPreAuthRsp->ft_ies_length;
|
|
|
+
|
|
|
+ sme_debug("Filled auth resp: %d", *ft_ies_length);
|
|
|
+ sme_release_global_lock(&mac->sme);
|
|
|
+end:
|
|
|
+ wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
|
|
|
|
|
|
- if (pSession)
|
|
|
- pSession->ftSmeContext.setFTPreAuthState = state;
|
|
|
}
|
|
|
|
|
|
-bool sme_get_ft_pre_auth_state(mac_handle_t mac_handle, uint32_t sessionId)
|
|
|
+/*
|
|
|
+ * SME now sends the RIC IEs up to the supplicant.
|
|
|
+ * The supplicant will then proceed to send down the
|
|
|
+ * Reassoc Req.
|
|
|
+ */
|
|
|
+void sme_get_rici_es(mac_handle_t mac_handle, uint8_t sessionId,
|
|
|
+ uint8_t *ric_ies,
|
|
|
+ uint32_t ric_ies_ip_len, uint32_t *ric_ies_length)
|
|
|
{
|
|
|
struct mac_context *mac = MAC_CONTEXT(mac_handle);
|
|
|
- struct csr_roam_session *pSession = CSR_GET_SESSION(mac, sessionId);
|
|
|
+ struct wlan_objmgr_vdev *vdev;
|
|
|
+ struct mlme_legacy_priv *mlme_priv;
|
|
|
+
|
|
|
+ *ric_ies_length = 0;
|
|
|
+ vdev = wlan_objmgr_get_vdev_by_id_from_pdev(mac->pdev, sessionId,
|
|
|
+ WLAN_LEGACY_SME_ID);
|
|
|
+ if (!vdev)
|
|
|
+ return;
|
|
|
+ mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
|
|
|
+ if (!mlme_priv) {
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* All or nothing */
|
|
|
+ if (mlme_priv->connect_info.ft_info.ric_ies_length > ric_ies_ip_len)
|
|
|
+ goto end;
|
|
|
+
|
|
|
+ qdf_mem_copy(ric_ies,
|
|
|
+ mlme_priv->connect_info.ft_info.ric_ies,
|
|
|
+ mlme_priv->connect_info.ft_info.ric_ies_length);
|
|
|
+
|
|
|
+ *ric_ies_length = mlme_priv->connect_info.ft_info.ric_ies_length;
|
|
|
|
|
|
- if (pSession)
|
|
|
- return pSession->ftSmeContext.setFTPreAuthState;
|
|
|
+ sme_debug("Filled ric ies: %d", *ric_ies_length);
|
|
|
+end:
|
|
|
|
|
|
- return false;
|
|
|
+ wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * sme_set_ft_ies() - to set FT IEs
|
|
|
- * @mac_handle: opaque handle to the global MAC context
|
|
|
- * @session_id: sme session id
|
|
|
- * @ft_ies: pointer to FT IEs
|
|
|
- * @ft_ies_length: length of FT IEs
|
|
|
- *
|
|
|
- * Each time the supplicant sends down the FT IEs to the driver. This function
|
|
|
- * is called in SME. This function packages and sends the FT IEs to PE.
|
|
|
- *
|
|
|
- * Return: none
|
|
|
+/*
|
|
|
+ * Timer callback for the timer that is started between the preauth completion
|
|
|
+ * and reassoc request to the PE. In this interval, it is expected that the
|
|
|
+ * pre-auth response and RIC IEs are passed up to the WPA supplicant and
|
|
|
+ * received back the necessary FTIEs required to be sent in the reassoc request
|
|
|
*/
|
|
|
-void sme_set_ft_ies(mac_handle_t mac_handle, uint32_t session_id,
|
|
|
+void sme_preauth_reassoc_intvl_timer_callback(void *context)
|
|
|
+{
|
|
|
+ tFTRoamCallbackUsrCtx *pUsrCtx = (tFTRoamCallbackUsrCtx *) context;
|
|
|
+
|
|
|
+ if (pUsrCtx)
|
|
|
+ csr_neighbor_roam_request_handoff(pUsrCtx->mac,
|
|
|
+ pUsrCtx->sessionId);
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+void sme_set_ft_pre_auth_state(mac_handle_t mac_handle, uint8_t sessionId,
|
|
|
+ bool state)
|
|
|
+{
|
|
|
+ struct mac_context *mac = MAC_CONTEXT(mac_handle);
|
|
|
+ struct wlan_objmgr_vdev *vdev;
|
|
|
+ struct mlme_legacy_priv *mlme_priv;
|
|
|
+
|
|
|
+ vdev = wlan_objmgr_get_vdev_by_id_from_pdev(mac->pdev, sessionId,
|
|
|
+ WLAN_LEGACY_SME_ID);
|
|
|
+ if (!vdev)
|
|
|
+ return;
|
|
|
+
|
|
|
+ mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
|
|
|
+ if (!mlme_priv)
|
|
|
+ goto end;
|
|
|
+
|
|
|
+ mlme_priv->connect_info.ft_info.set_ft_preauth_state = state;
|
|
|
+end:
|
|
|
+ wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
|
|
|
+}
|
|
|
+
|
|
|
+bool sme_get_ft_pre_auth_state(mac_handle_t mac_handle, uint8_t sessionId)
|
|
|
+{
|
|
|
+ struct mac_context *mac = MAC_CONTEXT(mac_handle);
|
|
|
+ struct wlan_objmgr_vdev *vdev;
|
|
|
+ struct mlme_legacy_priv *mlme_priv;
|
|
|
+ bool val = false;
|
|
|
+
|
|
|
+ vdev = wlan_objmgr_get_vdev_by_id_from_pdev(mac->pdev, sessionId,
|
|
|
+ WLAN_LEGACY_SME_ID);
|
|
|
+ if (!vdev)
|
|
|
+ return val;
|
|
|
+
|
|
|
+ mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
|
|
|
+ if (!mlme_priv)
|
|
|
+ goto end;
|
|
|
+
|
|
|
+ val = mlme_priv->connect_info.ft_info.set_ft_preauth_state;
|
|
|
+end:
|
|
|
+ wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
|
|
|
+
|
|
|
+ return val;
|
|
|
+}
|
|
|
+
|
|
|
+void sme_set_ft_ies(mac_handle_t mac_handle, uint8_t session_id,
|
|
|
const uint8_t *ft_ies, uint16_t ft_ies_length)
|
|
|
{
|
|
|
struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
|
|
|
- struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
|
|
|
QDF_STATUS status = QDF_STATUS_E_FAILURE;
|
|
|
+ struct wlan_objmgr_vdev *vdev;
|
|
|
+ struct mlme_legacy_priv *mlme_priv;
|
|
|
|
|
|
- if (!session || !ft_ies) {
|
|
|
- sme_err("ft ies or session is NULL");
|
|
|
+ if (!ft_ies) {
|
|
|
+ sme_err("ft ies is NULL");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- status = sme_acquire_global_lock(&mac_ctx->sme);
|
|
|
- if (!(QDF_IS_STATUS_SUCCESS(status)))
|
|
|
+ vdev = wlan_objmgr_get_vdev_by_id_from_pdev(mac_ctx->pdev, session_id,
|
|
|
+ WLAN_LEGACY_SME_ID);
|
|
|
+ if (!vdev)
|
|
|
return;
|
|
|
|
|
|
+ mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
|
|
|
+ if (!mlme_priv)
|
|
|
+ goto end;
|
|
|
+
|
|
|
+ status = sme_acquire_global_lock(&mac_ctx->sme);
|
|
|
+ if (QDF_IS_STATUS_ERROR(status))
|
|
|
+ goto end;
|
|
|
+
|
|
|
sme_debug("FT IEs Req is received in state %d",
|
|
|
- session->ftSmeContext.FTState);
|
|
|
+ mlme_priv->connect_info.ft_info.ft_state);
|
|
|
|
|
|
/* Global Station FT State */
|
|
|
- switch (session->ftSmeContext.FTState) {
|
|
|
- case eFT_START_READY:
|
|
|
- case eFT_AUTH_REQ_READY:
|
|
|
+ switch (mlme_priv->connect_info.ft_info.ft_state) {
|
|
|
+ case FT_START_READY:
|
|
|
+ case FT_AUTH_REQ_READY:
|
|
|
sme_debug("ft_ies_length: %d", ft_ies_length);
|
|
|
- if ((session->ftSmeContext.auth_ft_ies) &&
|
|
|
- (session->ftSmeContext.auth_ft_ies_length)) {
|
|
|
- /* Free the one we recvd last from supplicant */
|
|
|
- qdf_mem_free(session->ftSmeContext.auth_ft_ies);
|
|
|
- session->ftSmeContext.auth_ft_ies_length = 0;
|
|
|
- session->ftSmeContext.auth_ft_ies = NULL;
|
|
|
- }
|
|
|
ft_ies_length = QDF_MIN(ft_ies_length, MAX_FTIE_SIZE);
|
|
|
- /* Save the FT IEs */
|
|
|
- session->ftSmeContext.auth_ft_ies =
|
|
|
- qdf_mem_malloc(ft_ies_length);
|
|
|
- if (!session->ftSmeContext.auth_ft_ies) {
|
|
|
- sme_release_global_lock(&mac_ctx->sme);
|
|
|
- return;
|
|
|
- }
|
|
|
- session->ftSmeContext.auth_ft_ies_length = ft_ies_length;
|
|
|
- qdf_mem_copy((uint8_t *)session->ftSmeContext.auth_ft_ies,
|
|
|
- ft_ies, ft_ies_length);
|
|
|
- session->ftSmeContext.FTState = eFT_AUTH_REQ_READY;
|
|
|
- break;
|
|
|
-
|
|
|
- case eFT_AUTH_COMPLETE:
|
|
|
- /*
|
|
|
- * We will need to re-start preauth. If we received FT
|
|
|
- * IEs in eFT_PRE_AUTH_DONE state, it implies there was
|
|
|
- * a rekey in our pre-auth state. Hence this implies we
|
|
|
- * need Pre-auth again. OK now inform SME we have no
|
|
|
- * pre-auth list. Delete the pre-auth node locally. Set
|
|
|
- * your self back to restart pre-auth
|
|
|
- */
|
|
|
- sme_debug("Preauth done & rcving AUTHREQ in state %d",
|
|
|
- session->ftSmeContext.FTState);
|
|
|
- sme_debug("Unhandled reception of FT IES in state %d",
|
|
|
- session->ftSmeContext.FTState);
|
|
|
+ mlme_priv->connect_info.ft_info.auth_ie_len = ft_ies_length;
|
|
|
+ qdf_mem_copy(mlme_priv->connect_info.ft_info.auth_ft_ie,
|
|
|
+ ft_ies, ft_ies_length);
|
|
|
+ mlme_priv->connect_info.ft_info.ft_state = FT_AUTH_REQ_READY;
|
|
|
break;
|
|
|
|
|
|
- case eFT_REASSOC_REQ_WAIT:
|
|
|
+ case FT_REASSOC_REQ_WAIT:
|
|
|
/*
|
|
|
* We are done with pre-auth, hence now waiting for
|
|
|
* reassoc req. This is the new FT Roaming in place At
|
|
@@ -193,208 +303,136 @@ void sme_set_ft_ies(mac_handle_t mac_handle, uint32_t session_id,
|
|
|
ft_ies_length = QDF_MIN(ft_ies_length, MAX_FTIE_SIZE);
|
|
|
|
|
|
sme_debug("New Reassoc Req: %pK in state %d",
|
|
|
- ft_ies, session->ftSmeContext.FTState);
|
|
|
- if ((session->ftSmeContext.reassoc_ft_ies) &&
|
|
|
- (session->ftSmeContext.reassoc_ft_ies_length)) {
|
|
|
- /* Free the one we recvd last from supplicant */
|
|
|
- qdf_mem_free(session->ftSmeContext.reassoc_ft_ies);
|
|
|
- session->ftSmeContext.reassoc_ft_ies_length = 0;
|
|
|
- }
|
|
|
- /* Save the FT IEs */
|
|
|
- session->ftSmeContext.reassoc_ft_ies =
|
|
|
- qdf_mem_malloc(ft_ies_length);
|
|
|
- if (!session->ftSmeContext.reassoc_ft_ies) {
|
|
|
- sme_release_global_lock(&mac_ctx->sme);
|
|
|
- return;
|
|
|
- }
|
|
|
- session->ftSmeContext.reassoc_ft_ies_length =
|
|
|
+ ft_ies, mlme_priv->connect_info.ft_info.ft_state);
|
|
|
+ mlme_priv->connect_info.ft_info.reassoc_ie_len =
|
|
|
ft_ies_length;
|
|
|
- qdf_mem_copy((uint8_t *)session->ftSmeContext.reassoc_ft_ies,
|
|
|
+ qdf_mem_copy(mlme_priv->connect_info.ft_info.reassoc_ft_ie,
|
|
|
ft_ies, ft_ies_length);
|
|
|
|
|
|
- session->ftSmeContext.FTState = eFT_SET_KEY_WAIT;
|
|
|
+ mlme_priv->connect_info.ft_info.ft_state = FT_SET_KEY_WAIT;
|
|
|
sme_debug("ft_ies_length: %d state: %d", ft_ies_length,
|
|
|
- session->ftSmeContext.FTState);
|
|
|
-
|
|
|
+ mlme_priv->connect_info.ft_info.ft_state);
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
- sme_warn("Unhandled state: %d", session->ftSmeContext.FTState);
|
|
|
+ sme_warn("Unhandled state: %d",
|
|
|
+ mlme_priv->connect_info.ft_info.ft_state);
|
|
|
break;
|
|
|
}
|
|
|
sme_release_global_lock(&mac_ctx->sme);
|
|
|
+end:
|
|
|
+ wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
|
|
|
}
|
|
|
|
|
|
-QDF_STATUS sme_check_ft_status(mac_handle_t mac_handle, uint32_t session_id)
|
|
|
+QDF_STATUS sme_check_ft_status(mac_handle_t mac_handle, uint8_t session_id)
|
|
|
{
|
|
|
struct mac_context *mac = MAC_CONTEXT(mac_handle);
|
|
|
- struct csr_roam_session *session = CSR_GET_SESSION(mac, session_id);
|
|
|
QDF_STATUS status = QDF_STATUS_E_FAILURE;
|
|
|
+ struct wlan_objmgr_vdev *vdev;
|
|
|
+ struct mlme_legacy_priv *mlme_priv;
|
|
|
|
|
|
- if (!session) {
|
|
|
- sme_err("pSession is NULL");
|
|
|
- return QDF_STATUS_E_FAILURE;
|
|
|
- }
|
|
|
+ vdev = wlan_objmgr_get_vdev_by_id_from_pdev(mac->pdev, session_id,
|
|
|
+ WLAN_LEGACY_SME_ID);
|
|
|
+ if (!vdev)
|
|
|
+ return status;
|
|
|
+
|
|
|
+ mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
|
|
|
+ if (!mlme_priv)
|
|
|
+ goto end;
|
|
|
|
|
|
status = sme_acquire_global_lock(&mac->sme);
|
|
|
- if (!(QDF_IS_STATUS_SUCCESS(status)))
|
|
|
- return QDF_STATUS_E_FAILURE;
|
|
|
+ if (QDF_IS_STATUS_ERROR(status))
|
|
|
+ goto end;
|
|
|
|
|
|
sme_debug("FT update key is received in state %d",
|
|
|
- session->ftSmeContext.FTState);
|
|
|
+ mlme_priv->connect_info.ft_info.ft_state);
|
|
|
|
|
|
/* Global Station FT State */
|
|
|
- switch (session->ftSmeContext.FTState) {
|
|
|
- case eFT_SET_KEY_WAIT:
|
|
|
- if (sme_get_ft_pre_auth_state(mac_handle, session_id) == true) {
|
|
|
- session->ftSmeContext.FTState = eFT_START_READY;
|
|
|
- sme_debug("state changed to %d status %d",
|
|
|
- session->ftSmeContext.FTState, status);
|
|
|
- sme_release_global_lock(&mac->sme);
|
|
|
- return QDF_STATUS_SUCCESS;
|
|
|
+ switch (mlme_priv->connect_info.ft_info.ft_state) {
|
|
|
+ case FT_SET_KEY_WAIT:
|
|
|
+ if (sme_get_ft_pre_auth_state(mac_handle, session_id)) {
|
|
|
+ mlme_priv->connect_info.ft_info.ft_state = FT_START_READY;
|
|
|
+ sme_debug("state changed to %d",
|
|
|
+ mlme_priv->connect_info.ft_info.ft_state);
|
|
|
+ break;
|
|
|
}
|
|
|
/* fallthrough */
|
|
|
default:
|
|
|
- sme_debug("Unhandled state:%d", session->ftSmeContext.FTState);
|
|
|
+ sme_debug("Unhandled state:%d",
|
|
|
+ mlme_priv->connect_info.ft_info.ft_state);
|
|
|
status = QDF_STATUS_E_FAILURE;
|
|
|
break;
|
|
|
}
|
|
|
sme_release_global_lock(&mac->sme);
|
|
|
+end:
|
|
|
+ wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
|
|
|
|
|
|
return status;
|
|
|
}
|
|
|
|
|
|
-#ifdef WLAN_FEATURE_HOST_ROAM
|
|
|
-bool sme_ft_key_ready_for_install(mac_handle_t mac_handle, uint32_t session_id)
|
|
|
+bool sme_ft_key_ready_for_install(mac_handle_t mac_handle, uint8_t session_id)
|
|
|
{
|
|
|
bool ret = false;
|
|
|
struct mac_context *mac = MAC_CONTEXT(mac_handle);
|
|
|
- struct csr_roam_session *session = CSR_GET_SESSION(mac, session_id);
|
|
|
+ struct wlan_objmgr_vdev *vdev;
|
|
|
+ struct mlme_legacy_priv *mlme_priv;
|
|
|
|
|
|
- if (!session) {
|
|
|
- sme_err("csr session is NULL");
|
|
|
- return false;
|
|
|
- }
|
|
|
+ vdev = wlan_objmgr_get_vdev_by_id_from_pdev(mac->pdev, session_id,
|
|
|
+ WLAN_LEGACY_SME_ID);
|
|
|
+ if (!vdev)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
|
|
|
+ if (!mlme_priv)
|
|
|
+ goto end;
|
|
|
|
|
|
if (sme_get_ft_pre_auth_state(mac_handle, session_id) &&
|
|
|
- session->ftSmeContext.FTState == eFT_START_READY) {
|
|
|
+ mlme_priv->connect_info.ft_info.ft_state == FT_START_READY) {
|
|
|
ret = true;
|
|
|
sme_set_ft_pre_auth_state(mac_handle, session_id, false);
|
|
|
}
|
|
|
+end:
|
|
|
+ wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
|
-#endif
|
|
|
|
|
|
-#ifndef FEATURE_CM_ENABLE
|
|
|
-/*
|
|
|
- * HDD Interface to SME. SME now sends the Auth 2 and RIC IEs up to the
|
|
|
- * supplicant. The supplicant will then proceed to send down the
|
|
|
- * Reassoc Req.
|
|
|
- */
|
|
|
-void sme_get_ft_pre_auth_response(mac_handle_t mac_handle, uint32_t sessionId,
|
|
|
- uint8_t *ft_ies, uint32_t ft_ies_ip_len,
|
|
|
- uint16_t *ft_ies_length)
|
|
|
+/* Reset the FT context. */
|
|
|
+void sme_ft_reset(mac_handle_t mac_handle, uint8_t sessionId)
|
|
|
{
|
|
|
struct mac_context *mac = MAC_CONTEXT(mac_handle);
|
|
|
- struct csr_roam_session *pSession = CSR_GET_SESSION(mac, sessionId);
|
|
|
- QDF_STATUS status = QDF_STATUS_E_FAILURE;
|
|
|
-
|
|
|
- if (!pSession) {
|
|
|
- sme_err("pSession is NULL");
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- *ft_ies_length = 0;
|
|
|
-
|
|
|
- status = sme_acquire_global_lock(&mac->sme);
|
|
|
- if (!(QDF_IS_STATUS_SUCCESS(status)))
|
|
|
- return;
|
|
|
+ struct csr_roam_session *pSession = NULL;
|
|
|
+ struct wlan_objmgr_vdev *vdev;
|
|
|
+ struct mlme_legacy_priv *mlme_priv;
|
|
|
|
|
|
- /* All or nothing - proceed only if both BSSID and FT IE fit */
|
|
|
- if ((QDF_MAC_ADDR_SIZE +
|
|
|
- pSession->ftSmeContext.psavedFTPreAuthRsp->ft_ies_length) >
|
|
|
- ft_ies_ip_len) {
|
|
|
- sme_release_global_lock(&mac->sme);
|
|
|
+ pSession = CSR_GET_SESSION(mac, sessionId);
|
|
|
+ if (!pSession)
|
|
|
return;
|
|
|
- }
|
|
|
- /* hdd needs to pack the bssid also along with the */
|
|
|
- /* auth response to supplicant */
|
|
|
- qdf_mem_copy(ft_ies, pSession->ftSmeContext.preAuthbssId,
|
|
|
- QDF_MAC_ADDR_SIZE);
|
|
|
-
|
|
|
- /* Copy the auth resp FTIEs */
|
|
|
- qdf_mem_copy(&(ft_ies[QDF_MAC_ADDR_SIZE]),
|
|
|
- pSession->ftSmeContext.psavedFTPreAuthRsp->ft_ies,
|
|
|
- pSession->ftSmeContext.psavedFTPreAuthRsp->ft_ies_length);
|
|
|
-
|
|
|
- *ft_ies_length = QDF_MAC_ADDR_SIZE +
|
|
|
- pSession->ftSmeContext.psavedFTPreAuthRsp->ft_ies_length;
|
|
|
-
|
|
|
- pSession->ftSmeContext.FTState = eFT_REASSOC_REQ_WAIT;
|
|
|
-
|
|
|
- sme_debug("Filled auth resp: %d", *ft_ies_length);
|
|
|
- sme_release_global_lock(&mac->sme);
|
|
|
-}
|
|
|
-
|
|
|
-/*
|
|
|
- * SME now sends the RIC IEs up to the supplicant.
|
|
|
- * The supplicant will then proceed to send down the
|
|
|
- * Reassoc Req.
|
|
|
- */
|
|
|
-void sme_get_rici_es(mac_handle_t mac_handle, uint32_t sessionId,
|
|
|
- uint8_t *ric_ies,
|
|
|
- uint32_t ric_ies_ip_len, uint32_t *ric_ies_length)
|
|
|
-{
|
|
|
- struct mac_context *mac = MAC_CONTEXT(mac_handle);
|
|
|
- struct csr_roam_session *pSession = CSR_GET_SESSION(mac, sessionId);
|
|
|
- QDF_STATUS status = QDF_STATUS_E_FAILURE;
|
|
|
-
|
|
|
- if (!pSession) {
|
|
|
- sme_err("pSession is NULL");
|
|
|
+ vdev = wlan_objmgr_get_vdev_by_id_from_pdev(mac->pdev, sessionId,
|
|
|
+ WLAN_LEGACY_SME_ID);
|
|
|
+ if (!vdev)
|
|
|
return;
|
|
|
- }
|
|
|
-
|
|
|
- *ric_ies_length = 0;
|
|
|
|
|
|
- status = sme_acquire_global_lock(&mac->sme);
|
|
|
- if (!(QDF_IS_STATUS_SUCCESS(status)))
|
|
|
- return;
|
|
|
+ mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
|
|
|
+ if (!mlme_priv)
|
|
|
+ goto end;
|
|
|
|
|
|
- /* All or nothing */
|
|
|
- if (pSession->ftSmeContext.psavedFTPreAuthRsp->ric_ies_length >
|
|
|
- ric_ies_ip_len) {
|
|
|
- sme_release_global_lock(&mac->sme);
|
|
|
- return;
|
|
|
+ qdf_mem_zero(&mlme_priv->connect_info.ft_info,
|
|
|
+ sizeof(struct ft_context));
|
|
|
+#ifndef FEATURE_CM_ENABLE
|
|
|
+ if (pSession->ftSmeContext.psavedFTPreAuthRsp) {
|
|
|
+ qdf_mem_free(pSession->ftSmeContext.psavedFTPreAuthRsp);
|
|
|
+ pSession->ftSmeContext.psavedFTPreAuthRsp = NULL;
|
|
|
}
|
|
|
-
|
|
|
- qdf_mem_copy(ric_ies,
|
|
|
- pSession->ftSmeContext.psavedFTPreAuthRsp->ric_ies,
|
|
|
- pSession->ftSmeContext.psavedFTPreAuthRsp->ric_ies_length);
|
|
|
-
|
|
|
- *ric_ies_length =
|
|
|
- pSession->ftSmeContext.psavedFTPreAuthRsp->ric_ies_length;
|
|
|
-
|
|
|
- sme_debug("Filled ric ies: %d", *ric_ies_length);
|
|
|
-
|
|
|
- sme_release_global_lock(&mac->sme);
|
|
|
+ qdf_mem_zero(pSession->ftSmeContext.preAuthbssId,
|
|
|
+ QDF_MAC_ADDR_SIZE);
|
|
|
+#endif
|
|
|
+ mlme_priv->connect_info.ft_info.ft_state = FT_START_READY;
|
|
|
+end:
|
|
|
+ wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * Timer callback for the timer that is started between the preauth completion
|
|
|
- * and reassoc request to the PE. In this interval, it is expected that the
|
|
|
- * pre-auth response and RIC IEs are passed up to the WPA supplicant and
|
|
|
- * received back the necessary FTIEs required to be sent in the reassoc request
|
|
|
- */
|
|
|
-void sme_preauth_reassoc_intvl_timer_callback(void *context)
|
|
|
-{
|
|
|
- tFTRoamCallbackUsrCtx *pUsrCtx = (tFTRoamCallbackUsrCtx *) context;
|
|
|
-
|
|
|
- if (pUsrCtx)
|
|
|
- csr_neighbor_roam_request_handoff(pUsrCtx->mac,
|
|
|
- pUsrCtx->sessionId);
|
|
|
-}
|
|
|
-#endif
|
|
|
+#endif /* WLAN_FEATURE_HOST_ROAM */
|
|
|
|
|
|
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
|
|
#ifdef FEATURE_WLAN_ESE
|
|
@@ -426,7 +464,8 @@ static void sme_reset_esecckm_info(struct mac_context *mac, uint8_t vdev_id)
|
|
|
{
|
|
|
}
|
|
|
#endif
|
|
|
-void sme_reset_key(mac_handle_t mac_handle, uint32_t vdev_id)
|
|
|
+
|
|
|
+void sme_reset_key(mac_handle_t mac_handle, uint8_t vdev_id)
|
|
|
{
|
|
|
struct mac_context *mac = MAC_CONTEXT(mac_handle);
|
|
|
|
|
@@ -438,43 +477,4 @@ void sme_reset_key(mac_handle_t mac_handle, uint32_t vdev_id)
|
|
|
wlan_cm_set_psk_pmk(mac->pdev, vdev_id, NULL, 0);
|
|
|
sme_reset_esecckm_info(mac, vdev_id);
|
|
|
}
|
|
|
-#endif
|
|
|
-/* Reset the FT context. */
|
|
|
-void sme_ft_reset(mac_handle_t mac_handle, uint32_t sessionId)
|
|
|
-{
|
|
|
- struct mac_context *mac = MAC_CONTEXT(mac_handle);
|
|
|
- struct csr_roam_session *pSession = NULL;
|
|
|
-
|
|
|
- if (!mac) {
|
|
|
- QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
|
|
|
- FL("mac is NULL"));
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- pSession = CSR_GET_SESSION(mac, sessionId);
|
|
|
- if (pSession) {
|
|
|
- if (pSession->ftSmeContext.auth_ft_ies) {
|
|
|
- qdf_mem_free(pSession->ftSmeContext.auth_ft_ies);
|
|
|
- pSession->ftSmeContext.auth_ft_ies = NULL;
|
|
|
- }
|
|
|
- pSession->ftSmeContext.auth_ft_ies_length = 0;
|
|
|
-
|
|
|
- if (pSession->ftSmeContext.reassoc_ft_ies) {
|
|
|
- qdf_mem_free(pSession->ftSmeContext.reassoc_ft_ies);
|
|
|
- pSession->ftSmeContext.reassoc_ft_ies = NULL;
|
|
|
- }
|
|
|
- pSession->ftSmeContext.reassoc_ft_ies_length = 0;
|
|
|
-
|
|
|
- if (pSession->ftSmeContext.psavedFTPreAuthRsp) {
|
|
|
- qdf_mem_free(pSession->ftSmeContext.psavedFTPreAuthRsp);
|
|
|
- pSession->ftSmeContext.psavedFTPreAuthRsp = NULL;
|
|
|
- }
|
|
|
- pSession->ftSmeContext.setFTPreAuthState = false;
|
|
|
-
|
|
|
- qdf_mem_zero(pSession->ftSmeContext.preAuthbssId,
|
|
|
- QDF_MAC_ADDR_SIZE);
|
|
|
- pSession->ftSmeContext.FTState = eFT_START_READY;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-/* End of File */
|
|
|
+#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
|