qcacld-3.0: Add fils code for connection manager
Add fils code for connection manager. Change-Id: Icabc91605077c483487d6070ccc3fc714ba2d315 CRs-Fixed: 2857915
This commit is contained in:

committed by
snandini

parent
ae0f754c4a
commit
0030dee8db
@@ -491,6 +491,7 @@ struct wlan_fils_connection_info *wlan_cm_get_fils_connection_info(
|
|||||||
struct wlan_objmgr_psoc *psoc,
|
struct wlan_objmgr_psoc *psoc,
|
||||||
uint8_t vdev_id);
|
uint8_t vdev_id);
|
||||||
|
|
||||||
|
#ifndef FEATURE_CM_ENABLE
|
||||||
/**
|
/**
|
||||||
* wlan_cm_update_mlme_fils_connection_info - Update FILS connection info
|
* wlan_cm_update_mlme_fils_connection_info - Update FILS connection info
|
||||||
* to mlme vdev private object
|
* to mlme vdev private object
|
||||||
@@ -504,7 +505,19 @@ QDF_STATUS wlan_cm_update_mlme_fils_connection_info(
|
|||||||
struct wlan_objmgr_psoc *psoc,
|
struct wlan_objmgr_psoc *psoc,
|
||||||
struct wlan_fils_connection_info *src_fils_info,
|
struct wlan_fils_connection_info *src_fils_info,
|
||||||
uint8_t vdev_id);
|
uint8_t vdev_id);
|
||||||
|
#else
|
||||||
|
/**
|
||||||
|
* wlan_cm_update_mlme_fils_info - Update FILS connection info
|
||||||
|
* to mlme vdev private object
|
||||||
|
* @vdev: Pointer to pdev object
|
||||||
|
* @src_fils_info: Current profile FILS connection information
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS
|
||||||
|
*/
|
||||||
|
QDF_STATUS
|
||||||
|
wlan_cm_update_mlme_fils_info(struct wlan_objmgr_vdev *vdev,
|
||||||
|
struct wlan_fils_con_info *src_fils_info);
|
||||||
|
#endif
|
||||||
/**
|
/**
|
||||||
* wlan_cm_update_fils_ft - Update the FILS FT derived to mlme
|
* wlan_cm_update_fils_ft - Update the FILS FT derived to mlme
|
||||||
* @psoc: Psoc pointer
|
* @psoc: Psoc pointer
|
||||||
|
@@ -27,6 +27,7 @@
|
|||||||
#include "wlan_blm_public_struct.h"
|
#include "wlan_blm_public_struct.h"
|
||||||
#include "wmi_unified_param.h"
|
#include "wmi_unified_param.h"
|
||||||
#include "wmi_unified_sta_param.h"
|
#include "wmi_unified_sta_param.h"
|
||||||
|
#include "wlan_cm_public_struct.h"
|
||||||
|
|
||||||
#define ROAM_SCAN_OFFLOAD_START 1
|
#define ROAM_SCAN_OFFLOAD_START 1
|
||||||
#define ROAM_SCAN_OFFLOAD_STOP 2
|
#define ROAM_SCAN_OFFLOAD_STOP 2
|
||||||
@@ -87,9 +88,16 @@
|
|||||||
#define REASON_ROAM_HANDOFF_DONE 52
|
#define REASON_ROAM_HANDOFF_DONE 52
|
||||||
#define REASON_ROAM_ABORT 53
|
#define REASON_ROAM_ABORT 53
|
||||||
|
|
||||||
|
#ifdef FEATURE_CM_ENABLE
|
||||||
|
#define FILS_MAX_KEYNAME_NAI_LENGTH WLAN_CM_FILS_MAX_KEYNAME_NAI_LENGTH
|
||||||
|
#define WLAN_FILS_MAX_REALM_LEN WLAN_CM_FILS_MAX_REALM_LEN
|
||||||
|
#define WLAN_FILS_MAX_RRK_LENGTH WLAN_CM_FILS_MAX_RRK_LENGTH
|
||||||
|
#else
|
||||||
#define FILS_MAX_KEYNAME_NAI_LENGTH 253
|
#define FILS_MAX_KEYNAME_NAI_LENGTH 253
|
||||||
#define WLAN_FILS_MAX_REALM_LEN 255
|
#define WLAN_FILS_MAX_REALM_LEN 255
|
||||||
#define WLAN_FILS_MAX_RRK_LENGTH 64
|
#define WLAN_FILS_MAX_RRK_LENGTH 64
|
||||||
|
#endif
|
||||||
|
|
||||||
#define WLAN_FILS_MAX_RIK_LENGTH WLAN_FILS_MAX_RRK_LENGTH
|
#define WLAN_FILS_MAX_RIK_LENGTH WLAN_FILS_MAX_RRK_LENGTH
|
||||||
#define WLAN_FILS_FT_MAX_LEN 48
|
#define WLAN_FILS_FT_MAX_LEN 48
|
||||||
|
|
||||||
|
@@ -1414,6 +1414,7 @@ rel_vdev_ref:
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WLAN_FEATURE_FILS_SK
|
#ifdef WLAN_FEATURE_FILS_SK
|
||||||
|
#ifndef FEATURE_CM_ENABLE
|
||||||
QDF_STATUS wlan_cm_update_mlme_fils_connection_info(
|
QDF_STATUS wlan_cm_update_mlme_fils_connection_info(
|
||||||
struct wlan_objmgr_psoc *psoc,
|
struct wlan_objmgr_psoc *psoc,
|
||||||
struct wlan_fils_connection_info *src_fils_info,
|
struct wlan_fils_connection_info *src_fils_info,
|
||||||
@@ -1462,7 +1463,58 @@ QDF_STATUS wlan_cm_update_mlme_fils_connection_info(
|
|||||||
|
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
QDF_STATUS
|
||||||
|
wlan_cm_update_mlme_fils_info(struct wlan_objmgr_vdev *vdev,
|
||||||
|
struct wlan_fils_con_info *src_fils_info)
|
||||||
|
{
|
||||||
|
struct mlme_legacy_priv *mlme_priv;
|
||||||
|
uint8_t vdev_id = wlan_vdev_get_id(vdev);
|
||||||
|
struct wlan_fils_connection_info *tgt_info;
|
||||||
|
|
||||||
|
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
|
||||||
|
if (!mlme_priv) {
|
||||||
|
mlme_err("vdev legacy private object is NULL fro vdev %d",
|
||||||
|
vdev_id);
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!src_fils_info) {
|
||||||
|
mlme_debug("FILS: vdev:%d Clear fils info", vdev_id);
|
||||||
|
qdf_mem_free(mlme_priv->fils_con_info);
|
||||||
|
mlme_priv->fils_con_info = NULL;
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mlme_priv->fils_con_info)
|
||||||
|
qdf_mem_free(mlme_priv->fils_con_info);
|
||||||
|
|
||||||
|
mlme_priv->fils_con_info =
|
||||||
|
qdf_mem_malloc(sizeof(struct wlan_fils_connection_info));
|
||||||
|
if (!mlme_priv->fils_con_info)
|
||||||
|
return QDF_STATUS_E_NOMEM;
|
||||||
|
|
||||||
|
tgt_info = mlme_priv->fils_con_info;
|
||||||
|
mlme_debug("FILS: vdev:%d update fils info", vdev_id);
|
||||||
|
tgt_info->is_fils_connection = src_fils_info->is_fils_connection;
|
||||||
|
tgt_info->key_nai_length = src_fils_info->username_len;
|
||||||
|
qdf_mem_copy(tgt_info->keyname_nai, src_fils_info->username,
|
||||||
|
tgt_info->key_nai_length);
|
||||||
|
|
||||||
|
tgt_info->realm_len = src_fils_info->realm_len;
|
||||||
|
qdf_mem_copy(tgt_info->realm, src_fils_info->realm,
|
||||||
|
tgt_info->realm_len);
|
||||||
|
|
||||||
|
tgt_info->r_rk_length = src_fils_info->rrk_len;
|
||||||
|
qdf_mem_copy(tgt_info->r_rk, src_fils_info->rrk,
|
||||||
|
tgt_info->r_rk_length);
|
||||||
|
tgt_info->erp_sequence_number = src_fils_info->next_seq_num;
|
||||||
|
tgt_info->auth_type = src_fils_info->auth_type;
|
||||||
|
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
struct wlan_fils_connection_info *wlan_cm_get_fils_connection_info(
|
struct wlan_fils_connection_info *wlan_cm_get_fils_connection_info(
|
||||||
struct wlan_objmgr_psoc *psoc,
|
struct wlan_objmgr_psoc *psoc,
|
||||||
uint8_t vdev_id)
|
uint8_t vdev_id)
|
||||||
|
@@ -200,11 +200,13 @@ struct hdd_context;
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* hdd_is_fils_connection: API to determine if connection is FILS
|
* hdd_is_fils_connection: API to determine if connection is FILS
|
||||||
|
* @hdd_ctx: hdd context
|
||||||
* @adapter: hdd adapter
|
* @adapter: hdd adapter
|
||||||
*
|
*
|
||||||
* Return: true if fils connection else false
|
* Return: true if fils connection else false
|
||||||
*/
|
*/
|
||||||
bool hdd_is_fils_connection(struct hdd_adapter *adapter);
|
bool hdd_is_fils_connection(struct hdd_context *hdd_ctx,
|
||||||
|
struct hdd_adapter *adapter);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* hdd_conn_set_connection_state() - set connection state
|
* hdd_conn_set_connection_state() - set connection state
|
||||||
|
@@ -4732,18 +4732,21 @@ hdd_translate_wpa_to_csr_encryption_type(uint8_t cipher_suite[4])
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WLAN_FEATURE_FILS_SK
|
#ifdef WLAN_FEATURE_FILS_SK
|
||||||
bool hdd_is_fils_connection(struct hdd_adapter *adapter)
|
bool hdd_is_fils_connection(struct hdd_context *hdd_ctx,
|
||||||
|
struct hdd_adapter *adapter)
|
||||||
{
|
{
|
||||||
struct csr_roam_profile *roam_profile;
|
struct wlan_fils_connection_info *fils_info;
|
||||||
|
|
||||||
roam_profile = hdd_roam_profile(adapter);
|
fils_info = wlan_cm_get_fils_connection_info(hdd_ctx->psoc,
|
||||||
if (roam_profile->fils_con_info)
|
adapter->vdev_id);
|
||||||
return roam_profile->fils_con_info->is_fils_connection;
|
if (fils_info)
|
||||||
|
return fils_info->is_fils_connection;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
bool hdd_is_fils_connection(struct hdd_adapter *adapter)
|
bool hdd_is_fils_connection(struct hdd_context *hdd_ctx,
|
||||||
|
struct hdd_adapter *adapter)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@@ -6526,6 +6526,7 @@ void wlan_hdd_save_gtk_offload_params(struct hdd_adapter *adapter,
|
|||||||
struct pmo_gtk_req *gtk_req = NULL;
|
struct pmo_gtk_req *gtk_req = NULL;
|
||||||
struct wlan_objmgr_vdev *vdev;
|
struct wlan_objmgr_vdev *vdev;
|
||||||
QDF_STATUS status = QDF_STATUS_E_FAILURE;
|
QDF_STATUS status = QDF_STATUS_E_FAILURE;
|
||||||
|
struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
|
||||||
|
|
||||||
gtk_req = qdf_mem_malloc(sizeof(*gtk_req));
|
gtk_req = qdf_mem_malloc(sizeof(*gtk_req));
|
||||||
if (!gtk_req)
|
if (!gtk_req)
|
||||||
@@ -6553,7 +6554,7 @@ void wlan_hdd_save_gtk_offload_params(struct hdd_adapter *adapter,
|
|||||||
qdf_copy_macaddr(>k_req->bssid, &hdd_sta_ctx->conn_info.bssid);
|
qdf_copy_macaddr(>k_req->bssid, &hdd_sta_ctx->conn_info.bssid);
|
||||||
|
|
||||||
gtk_req->kek_len = kek_len;
|
gtk_req->kek_len = kek_len;
|
||||||
gtk_req->is_fils_connection = hdd_is_fils_connection(adapter);
|
gtk_req->is_fils_connection = hdd_is_fils_connection(hdd_ctx, adapter);
|
||||||
|
|
||||||
/* convert big to little endian since driver work on little endian */
|
/* convert big to little endian since driver work on little endian */
|
||||||
buf = (uint8_t *)>k_req->replay_counter;
|
buf = (uint8_t *)>k_req->replay_counter;
|
||||||
@@ -22576,7 +22577,7 @@ int __wlan_hdd_cfg80211_set_rekey_data(struct wiphy *wiphy,
|
|||||||
qdf_mem_copy(gtk_req->kck, data->kck, NL80211_KCK_LEN);
|
qdf_mem_copy(gtk_req->kck, data->kck, NL80211_KCK_LEN);
|
||||||
gtk_req->kck_len = NL80211_KCK_LEN;
|
gtk_req->kck_len = NL80211_KCK_LEN;
|
||||||
}
|
}
|
||||||
gtk_req->is_fils_connection = hdd_is_fils_connection(adapter);
|
gtk_req->is_fils_connection = hdd_is_fils_connection(hdd_ctx, adapter);
|
||||||
vdev = hdd_objmgr_get_vdev_by_user(adapter, WLAN_OSIF_POWER_ID);
|
vdev = hdd_objmgr_get_vdev_by_user(adapter, WLAN_OSIF_POWER_ID);
|
||||||
if (!vdev) {
|
if (!vdev) {
|
||||||
result = -EINVAL;
|
result = -EINVAL;
|
||||||
|
@@ -80,6 +80,20 @@ bool lim_is_valid_fils_auth_frame(struct mac_context *mac_ctx,
|
|||||||
QDF_STATUS lim_create_fils_rik(uint8_t *rrk, uint8_t rrk_len,
|
QDF_STATUS lim_create_fils_rik(uint8_t *rrk, uint8_t rrk_len,
|
||||||
uint8_t *rik, uint32_t *rik_len);
|
uint8_t *rik, uint32_t *rik_len);
|
||||||
|
|
||||||
|
#ifdef FEATURE_CM_ENABLE
|
||||||
|
/**
|
||||||
|
* lim_update_fils_config()- This API updates fils session info to csr config
|
||||||
|
* from join request.
|
||||||
|
* @mac_ctx: pointer to mac context
|
||||||
|
* @session: PE session
|
||||||
|
* @join_req: pointer to join request
|
||||||
|
*
|
||||||
|
* Return: None
|
||||||
|
*/
|
||||||
|
void lim_update_fils_config(struct mac_context *mac_ctx,
|
||||||
|
struct pe_session *session,
|
||||||
|
struct cm_vdev_join_req *join_req);
|
||||||
|
#else
|
||||||
/**
|
/**
|
||||||
* lim_update_fils_config()- This API updates fils session info to csr config
|
* lim_update_fils_config()- This API updates fils session info to csr config
|
||||||
* from join request.
|
* from join request.
|
||||||
@@ -92,7 +106,7 @@ QDF_STATUS lim_create_fils_rik(uint8_t *rrk, uint8_t rrk_len,
|
|||||||
void lim_update_fils_config(struct mac_context *mac_ctx,
|
void lim_update_fils_config(struct mac_context *mac_ctx,
|
||||||
struct pe_session *session,
|
struct pe_session *session,
|
||||||
struct join_req *sme_join_req);
|
struct join_req *sme_join_req);
|
||||||
|
#endif
|
||||||
/**
|
/**
|
||||||
* lim_create_fils_auth_data()- This API creates the fils auth data
|
* lim_create_fils_auth_data()- This API creates the fils auth data
|
||||||
* which needs to be sent in auth req.
|
* which needs to be sent in auth req.
|
||||||
@@ -255,11 +269,18 @@ static inline bool lim_is_valid_fils_auth_frame(struct mac_context *mac_ctx,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef FEATURE_CM_ENABLE
|
||||||
|
static inline void lim_update_fils_config(struct mac_context *mac_ctx,
|
||||||
|
struct pe_session *session,
|
||||||
|
struct cm_vdev_join_req *join_req)
|
||||||
|
{}
|
||||||
|
#else
|
||||||
static inline
|
static inline
|
||||||
void lim_update_fils_config(struct mac_context *mac_ctx,
|
void lim_update_fils_config(struct mac_context *mac_ctx,
|
||||||
struct pe_session *session,
|
struct pe_session *session,
|
||||||
struct join_req *sme_join_req)
|
struct join_req *sme_join_req)
|
||||||
{ }
|
{ }
|
||||||
|
#endif
|
||||||
|
|
||||||
static inline
|
static inline
|
||||||
QDF_STATUS lim_create_fils_auth_data(struct mac_context *mac_ctx,
|
QDF_STATUS lim_create_fils_auth_data(struct mac_context *mac_ctx,
|
||||||
|
@@ -1408,6 +1408,153 @@ bool lim_process_fils_auth_frame2(struct mac_context *mac_ctx,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef FEATURE_CM_ENABLE
|
||||||
|
static enum eAniAuthType lim_get_auth_type(uint8_t auth_type)
|
||||||
|
{
|
||||||
|
switch (auth_type) {
|
||||||
|
case FILS_SK_WITHOUT_PFS:
|
||||||
|
return SIR_FILS_SK_WITHOUT_PFS;
|
||||||
|
case FILS_SK_WITH_PFS:
|
||||||
|
return SIR_FILS_SK_WITH_PFS;
|
||||||
|
case FILS_PK_AUTH:
|
||||||
|
return SIR_FILS_PK_AUTH;
|
||||||
|
default:
|
||||||
|
return eSIR_DONOT_USE_AUTH_TYPE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint8_t lim_get_akm_type(struct wlan_objmgr_vdev *vdev)
|
||||||
|
{
|
||||||
|
int32_t akm;
|
||||||
|
|
||||||
|
akm = wlan_crypto_get_param(vdev, WLAN_CRYPTO_PARAM_KEY_MGMT);
|
||||||
|
|
||||||
|
if (QDF_HAS_PARAM(akm, WLAN_CRYPTO_KEY_MGMT_FT_FILS_SHA384))
|
||||||
|
return eCSR_AUTH_TYPE_FT_FILS_SHA384;
|
||||||
|
else if (QDF_HAS_PARAM(akm, WLAN_CRYPTO_KEY_MGMT_FT_FILS_SHA256))
|
||||||
|
return eCSR_AUTH_TYPE_FT_FILS_SHA256;
|
||||||
|
else if (QDF_HAS_PARAM(akm, WLAN_CRYPTO_KEY_MGMT_FILS_SHA384))
|
||||||
|
return eCSR_AUTH_TYPE_FILS_SHA384;
|
||||||
|
else
|
||||||
|
return eCSR_AUTH_TYPE_FILS_SHA256;
|
||||||
|
}
|
||||||
|
|
||||||
|
void lim_update_fils_config(struct mac_context *mac_ctx,
|
||||||
|
struct pe_session *session,
|
||||||
|
struct cm_vdev_join_req *join_req)
|
||||||
|
{
|
||||||
|
struct pe_fils_session *pe_fils_info;
|
||||||
|
struct wlan_fils_connection_info *fils_info = NULL;
|
||||||
|
/*
|
||||||
|
tDot11fIERSN dot11f_ie_rsn = {0};
|
||||||
|
uint32_t ret;
|
||||||
|
*/
|
||||||
|
struct mlme_legacy_priv *mlme_priv;
|
||||||
|
|
||||||
|
mlme_priv = wlan_vdev_mlme_get_ext_hdl(session->vdev);
|
||||||
|
if (!mlme_priv)
|
||||||
|
return;
|
||||||
|
fils_info = mlme_priv->fils_con_info;
|
||||||
|
|
||||||
|
pe_fils_info = session->fils_info;
|
||||||
|
if (!pe_fils_info)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!fils_info->is_fils_connection)
|
||||||
|
return;
|
||||||
|
|
||||||
|
pe_fils_info->is_fils_connection = fils_info->is_fils_connection;
|
||||||
|
pe_fils_info->keyname_nai_length = fils_info->key_nai_length;
|
||||||
|
pe_fils_info->fils_rrk_len = fils_info->r_rk_length;
|
||||||
|
pe_fils_info->akm = lim_get_akm_type(session->vdev);
|
||||||
|
pe_fils_info->auth = lim_get_auth_type(fils_info->auth_type);
|
||||||
|
pe_fils_info->sequence_number = fils_info->erp_sequence_number;
|
||||||
|
|
||||||
|
if (fils_info->key_nai_length > FILS_MAX_KEYNAME_NAI_LENGTH) {
|
||||||
|
pe_err("Restricting the key_nai_length of %d to max %d",
|
||||||
|
fils_info->key_nai_length,
|
||||||
|
FILS_MAX_KEYNAME_NAI_LENGTH);
|
||||||
|
fils_info->key_nai_length = FILS_MAX_KEYNAME_NAI_LENGTH;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fils_info->key_nai_length) {
|
||||||
|
pe_fils_info->keyname_nai_data =
|
||||||
|
qdf_mem_malloc(fils_info->key_nai_length);
|
||||||
|
if (!pe_fils_info->keyname_nai_data)
|
||||||
|
return;
|
||||||
|
|
||||||
|
qdf_mem_copy(pe_fils_info->keyname_nai_data,
|
||||||
|
fils_info->keyname_nai,
|
||||||
|
fils_info->key_nai_length);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fils_info->r_rk_length) {
|
||||||
|
pe_fils_info->fils_rrk =
|
||||||
|
qdf_mem_malloc(fils_info->r_rk_length);
|
||||||
|
if (!pe_fils_info->fils_rrk) {
|
||||||
|
qdf_mem_free(pe_fils_info->keyname_nai_data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fils_info->r_rk_length <= WLAN_FILS_MAX_RRK_LENGTH)
|
||||||
|
qdf_mem_copy(pe_fils_info->fils_rrk,
|
||||||
|
fils_info->r_rk,
|
||||||
|
fils_info->r_rk_length);
|
||||||
|
}
|
||||||
|
|
||||||
|
qdf_mem_copy(pe_fils_info->fils_pmkid, fils_info->pmkid,
|
||||||
|
PMKID_LEN);
|
||||||
|
|
||||||
|
/*
|
||||||
|
pe_fils_info->rsn_ie_len = sme_join_req->rsnIE.length;
|
||||||
|
qdf_mem_copy(pe_fils_info->rsn_ie,
|
||||||
|
sme_join_req->rsnIE.rsnIEdata,
|
||||||
|
sme_join_req->rsnIE.length);
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* When AP is MFP capable and STA is also MFP capable,
|
||||||
|
* the supplicant fills the RSN IE with PMKID count as 0
|
||||||
|
* and PMKID as 0, then appends the group management cipher
|
||||||
|
* suite. This opaque RSN IE is copied into fils_info in pe
|
||||||
|
* session. For FT-FILS association, STA has to fill the
|
||||||
|
* PMKR0 derived after authentication response is received from
|
||||||
|
* the AP. So unpack the RSN IE to find if group management cipher
|
||||||
|
* suite is present and based on this RSN IE will be constructed in
|
||||||
|
* lim_generate_fils_pmkr1_name() for FT-FILS connection.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
ret = dot11f_unpack_ie_rsn(mac_ctx, pe_fils_info->rsn_ie + 2,
|
||||||
|
pe_fils_info->rsn_ie_len - 2,
|
||||||
|
&dot11f_ie_rsn, 0);
|
||||||
|
if (DOT11F_SUCCEEDED(ret))
|
||||||
|
pe_fils_info->group_mgmt_cipher_present =
|
||||||
|
dot11f_ie_rsn.gp_mgmt_cipher_suite_present;
|
||||||
|
else
|
||||||
|
pe_err("FT-FILS: Invalid RSN IE");
|
||||||
|
*/
|
||||||
|
pe_fils_info->fils_pmk_len = fils_info->pmk_len;
|
||||||
|
if (fils_info->pmk_len) {
|
||||||
|
pe_fils_info->fils_pmk =
|
||||||
|
qdf_mem_malloc(fils_info->pmk_len);
|
||||||
|
if (!pe_fils_info->fils_pmk) {
|
||||||
|
qdf_mem_free(pe_fils_info->keyname_nai_data);
|
||||||
|
qdf_mem_free(pe_fils_info->fils_rrk);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
qdf_mem_copy(pe_fils_info->fils_pmk, fils_info->pmk,
|
||||||
|
fils_info->pmk_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
pe_debug("FILS: fils=%d nai-len=%d rrk_len=%d akm=%d auth=%d pmk_len=%d",
|
||||||
|
fils_info->is_fils_connection,
|
||||||
|
fils_info->key_nai_length,
|
||||||
|
fils_info->r_rk_length,
|
||||||
|
fils_info->akm_type,
|
||||||
|
fils_info->auth_type,
|
||||||
|
fils_info->pmk_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
void lim_update_fils_config(struct mac_context *mac_ctx,
|
void lim_update_fils_config(struct mac_context *mac_ctx,
|
||||||
struct pe_session *session,
|
struct pe_session *session,
|
||||||
struct join_req *sme_join_req)
|
struct join_req *sme_join_req)
|
||||||
@@ -1518,6 +1665,7 @@ void lim_update_fils_config(struct mac_context *mac_ctx,
|
|||||||
fils_info->auth_type,
|
fils_info->auth_type,
|
||||||
fils_info->pmk_len);
|
fils_info->pmk_len);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#define EXTENDED_IE_HEADER_LEN 3
|
#define EXTENDED_IE_HEADER_LEN 3
|
||||||
/**
|
/**
|
||||||
|
@@ -1023,6 +1023,7 @@ void lim_get_random_bssid(struct mac_context *mac, uint8_t *data)
|
|||||||
qdf_mem_copy(data, random, sizeof(tSirMacAddr));
|
qdf_mem_copy(data, random, sizeof(tSirMacAddr));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef FEATURE_CM_ENABLE
|
||||||
#ifdef WLAN_FEATURE_SAE
|
#ifdef WLAN_FEATURE_SAE
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1047,6 +1048,7 @@ static inline void lim_update_sae_config(struct pe_session *session,
|
|||||||
struct join_req *sme_join_req)
|
struct join_req *sme_join_req)
|
||||||
{}
|
{}
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* lim_send_join_req() - send vdev start request for assoc
|
* lim_send_join_req() - send vdev start request for assoc
|
||||||
@@ -2862,6 +2864,7 @@ lim_fill_session_params(struct mac_context *mac_ctx,
|
|||||||
|
|
||||||
session->rateSet.numRates = op_rate_len;
|
session->rateSet.numRates = op_rate_len;
|
||||||
session->extRateSet.numRates = ext_rate_len;
|
session->extRateSet.numRates = ext_rate_len;
|
||||||
|
lim_update_fils_config(mac_ctx, session, req);
|
||||||
|
|
||||||
qdf_mem_copy(pe_join_req->addIEAssoc.addIEdata,
|
qdf_mem_copy(pe_join_req->addIEAssoc.addIEdata,
|
||||||
req->assoc_ie.ptr, req->assoc_ie.len);
|
req->assoc_ie.ptr, req->assoc_ie.len);
|
||||||
@@ -2897,6 +2900,20 @@ lim_cm_handle_join_req(struct cm_vdev_join_req *req)
|
|||||||
if (QDF_IS_STATUS_ERROR(status))
|
if (QDF_IS_STATUS_ERROR(status))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
pe_debug("Freq %d width %d freq0 %d freq1 %d, Smps %d: mode %d action %d, nss 1x1 %d vdev_nss %d nss %d cbMode %d dot11mode %d subfer %d subfee %d csn %d is_cisco %d",
|
||||||
|
pe_session->curr_op_freq, pe_session->ch_width,
|
||||||
|
pe_session->ch_center_freq_seg0,
|
||||||
|
pe_session->ch_center_freq_seg1,
|
||||||
|
pe_session->enableHtSmps, pe_session->htSmpsvalue,
|
||||||
|
pe_session->send_smps_action, pe_session->supported_nss_1x1,
|
||||||
|
pe_session->vdev_nss, pe_session->nss,
|
||||||
|
pe_session->htSupportedChannelWidthSet,
|
||||||
|
pe_session->dot11mode,
|
||||||
|
pe_session->vht_config.su_beam_former,
|
||||||
|
pe_session->vht_config.su_beam_formee,
|
||||||
|
pe_session->vht_config.csnof_beamformer_antSup,
|
||||||
|
pe_session->isCiscoVendorAP);
|
||||||
|
|
||||||
status = lim_send_connect_req_to_mlm(pe_session);
|
status = lim_send_connect_req_to_mlm(pe_session);
|
||||||
if (QDF_IS_STATUS_ERROR(status)) {
|
if (QDF_IS_STATUS_ERROR(status)) {
|
||||||
pe_err("Failed to send mlm req vdev id %d",
|
pe_err("Failed to send mlm req vdev id %d",
|
||||||
@@ -3112,7 +3129,7 @@ QDF_STATUS cm_process_peer_create(struct scheduler_msg *msg)
|
|||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
#endif
|
#else
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* __lim_process_sme_join_req() - process SME_JOIN_REQ message
|
* __lim_process_sme_join_req() - process SME_JOIN_REQ message
|
||||||
@@ -3360,6 +3377,7 @@ end:
|
|||||||
lim_send_sme_join_reassoc_rsp(mac_ctx, eWNI_SME_JOIN_RSP, ret_code,
|
lim_send_sme_join_reassoc_rsp(mac_ctx, eWNI_SME_JOIN_RSP, ret_code,
|
||||||
STATUS_UNSPECIFIED_FAILURE, session, vdev_id);
|
STATUS_UNSPECIFIED_FAILURE, session, vdev_id);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
uint8_t lim_get_max_tx_power(struct mac_context *mac,
|
uint8_t lim_get_max_tx_power(struct mac_context *mac,
|
||||||
struct lim_max_tx_pwr_attr *attr)
|
struct lim_max_tx_pwr_attr *attr)
|
||||||
@@ -6292,11 +6310,11 @@ bool lim_process_sme_req_messages(struct mac_context *mac,
|
|||||||
case eWNI_SME_START_BSS_REQ:
|
case eWNI_SME_START_BSS_REQ:
|
||||||
bufConsumed = __lim_process_sme_start_bss_req(mac, pMsg);
|
bufConsumed = __lim_process_sme_start_bss_req(mac, pMsg);
|
||||||
break;
|
break;
|
||||||
|
#ifndef FEATURE_CM_ENABLE
|
||||||
case eWNI_SME_JOIN_REQ:
|
case eWNI_SME_JOIN_REQ:
|
||||||
__lim_process_sme_join_req(mac, msg_buf);
|
__lim_process_sme_join_req(mac, msg_buf);
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
case eWNI_SME_REASSOC_REQ:
|
case eWNI_SME_REASSOC_REQ:
|
||||||
__lim_process_sme_reassoc_req(mac, msg_buf);
|
__lim_process_sme_reassoc_req(mac, msg_buf);
|
||||||
break;
|
break;
|
||||||
|
@@ -13705,6 +13705,50 @@ void csr_update_prev_ap_info(struct csr_roam_session *session,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef FEATURE_CM_ENABLE
|
#ifdef FEATURE_CM_ENABLE
|
||||||
|
#ifdef WLAN_FEATURE_FILS_SK
|
||||||
|
static QDF_STATUS csr_cm_update_fils_info(struct wlan_objmgr_vdev *vdev,
|
||||||
|
struct bss_description *bss_desc,
|
||||||
|
struct wlan_cm_vdev_connect_req *req)
|
||||||
|
{
|
||||||
|
uint8_t cache_id[CACHE_ID_LEN] = {0};
|
||||||
|
struct scan_cache_entry *entry;
|
||||||
|
struct wlan_crypto_pmksa *fils_ssid_pmksa, *bssid_lookup_pmksa;
|
||||||
|
|
||||||
|
if (!req->fils_info || !req->fils_info->is_fils_connection) {
|
||||||
|
wlan_cm_update_mlme_fils_info(vdev, NULL);
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bss_desc->fils_info_element.is_cache_id_present) {
|
||||||
|
qdf_mem_copy(cache_id, bss_desc->fils_info_element.cache_id,
|
||||||
|
CACHE_ID_LEN);
|
||||||
|
sme_debug("FILS_PMKSA: cache_id[0]:%d, cache_id[1]:%d",
|
||||||
|
cache_id[0], cache_id[1]);
|
||||||
|
}
|
||||||
|
entry = req->bss->entry;
|
||||||
|
bssid_lookup_pmksa = wlan_crypto_get_pmksa(vdev, &entry->bssid);
|
||||||
|
fils_ssid_pmksa =
|
||||||
|
wlan_crypto_get_fils_pmksa(vdev, cache_id,
|
||||||
|
entry->ssid.ssid,
|
||||||
|
entry->ssid.length);
|
||||||
|
|
||||||
|
if ((!req->fils_info->rrk_len ||
|
||||||
|
!req->fils_info->username_len) &&
|
||||||
|
!bss_desc->fils_info_element.is_cache_id_present &&
|
||||||
|
!bssid_lookup_pmksa && !fils_ssid_pmksa)
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
|
||||||
|
return wlan_cm_update_mlme_fils_info(vdev, req->fils_info);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline
|
||||||
|
QDF_STATUS csr_cm_update_fils_info(struct wlan_objmgr_vdev *vdev,
|
||||||
|
struct bss_description *bss_desc,
|
||||||
|
struct wlan_cm_vdev_connect_req *req)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
QDF_STATUS cm_csr_handle_connect_req(struct wlan_objmgr_vdev *vdev,
|
QDF_STATUS cm_csr_handle_connect_req(struct wlan_objmgr_vdev *vdev,
|
||||||
struct wlan_cm_vdev_connect_req *req,
|
struct wlan_cm_vdev_connect_req *req,
|
||||||
struct cm_vdev_join_req *join_req)
|
struct cm_vdev_join_req *join_req)
|
||||||
@@ -13746,7 +13790,13 @@ QDF_STATUS cm_csr_handle_connect_req(struct wlan_objmgr_vdev *vdev,
|
|||||||
status = wlan_get_parsed_bss_description_ies(mac_ctx, bss_desc,
|
status = wlan_get_parsed_bss_description_ies(mac_ctx, bss_desc,
|
||||||
&ie_struct);
|
&ie_struct);
|
||||||
if (QDF_IS_STATUS_ERROR(status)) {
|
if (QDF_IS_STATUS_ERROR(status)) {
|
||||||
sme_err("IE parsing failed vdev id %d", wlan_vdev_get_id(vdev));
|
sme_err("IE parsing failed vdev id %d", vdev_id);
|
||||||
|
qdf_mem_free(bss_desc);
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
}
|
||||||
|
status = csr_cm_update_fils_info(vdev, bss_desc, req);
|
||||||
|
if (QDF_IS_STATUS_ERROR(status)) {
|
||||||
|
sme_err("failed to update fils info vdev id %d", vdev_id);
|
||||||
qdf_mem_free(bss_desc);
|
qdf_mem_free(bss_desc);
|
||||||
return QDF_STATUS_E_FAILURE;
|
return QDF_STATUS_E_FAILURE;
|
||||||
}
|
}
|
||||||
@@ -13755,8 +13805,7 @@ QDF_STATUS cm_csr_handle_connect_req(struct wlan_objmgr_vdev *vdev,
|
|||||||
&ext_rate_set);
|
&ext_rate_set);
|
||||||
|
|
||||||
if (QDF_IS_STATUS_ERROR(status)) {
|
if (QDF_IS_STATUS_ERROR(status)) {
|
||||||
sme_err("Rates parsing failed vdev id %d",
|
sme_err("Rates parsing failed vdev id %d", vdev_id);
|
||||||
wlan_vdev_get_id(vdev));
|
|
||||||
qdf_mem_free(ie_struct);
|
qdf_mem_free(ie_struct);
|
||||||
qdf_mem_free(bss_desc);
|
qdf_mem_free(bss_desc);
|
||||||
return QDF_STATUS_E_FAILURE;
|
return QDF_STATUS_E_FAILURE;
|
||||||
@@ -19123,6 +19172,7 @@ csr_process_roam_sync_callback(struct mac_context *mac_ctx,
|
|||||||
roam_info->update_erp_next_seq_num =
|
roam_info->update_erp_next_seq_num =
|
||||||
roam_synch_data->update_erp_next_seq_num;
|
roam_synch_data->update_erp_next_seq_num;
|
||||||
roam_info->next_erp_seq_num = roam_synch_data->next_erp_seq_num;
|
roam_info->next_erp_seq_num = roam_synch_data->next_erp_seq_num;
|
||||||
|
/* for cm enable copy to reassoc/connect resp */
|
||||||
#ifndef FEATURE_CM_ENABLE
|
#ifndef FEATURE_CM_ENABLE
|
||||||
csr_update_fils_erp_seq_num(session->pCurRoamProfile,
|
csr_update_fils_erp_seq_num(session->pCurRoamProfile,
|
||||||
roam_info->next_erp_seq_num);
|
roam_info->next_erp_seq_num);
|
||||||
@@ -19143,6 +19193,7 @@ csr_process_roam_sync_callback(struct mac_context *mac_ctx,
|
|||||||
roam_info->roam_reason = roam_synch_data->roamReason &
|
roam_info->roam_reason = roam_synch_data->roamReason &
|
||||||
ROAM_REASON_MASK;
|
ROAM_REASON_MASK;
|
||||||
sme_debug("Update roam reason : %d", roam_info->roam_reason);
|
sme_debug("Update roam reason : %d", roam_info->roam_reason);
|
||||||
|
/* for cm enable copy to reassoc/connect resp */
|
||||||
#ifndef FEATURE_CM_ENABLE
|
#ifndef FEATURE_CM_ENABLE
|
||||||
csr_copy_fils_join_rsp_roam_info(roam_info, roam_synch_data);
|
csr_copy_fils_join_rsp_roam_info(roam_info, roam_synch_data);
|
||||||
#endif
|
#endif
|
||||||
|
@@ -1027,6 +1027,8 @@ bool csr_lookup_pmkid_using_bssid(struct mac_context *mac,
|
|||||||
struct csr_roam_session *session,
|
struct csr_roam_session *session,
|
||||||
tPmkidCacheInfo *pmk_cache);
|
tPmkidCacheInfo *pmk_cache);
|
||||||
|
|
||||||
|
#ifndef FEATURE_CM_ENABLE
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* csr_lookup_fils_pmkid - Lookup FILS PMKID using ssid and cache id
|
* csr_lookup_fils_pmkid - Lookup FILS PMKID using ssid and cache id
|
||||||
* @mac: Pointer to mac context
|
* @mac: Pointer to mac context
|
||||||
@@ -1041,6 +1043,8 @@ bool csr_lookup_pmkid_using_bssid(struct mac_context *mac,
|
|||||||
bool csr_lookup_fils_pmkid(struct mac_context *mac, uint8_t vdev_id,
|
bool csr_lookup_fils_pmkid(struct mac_context *mac, uint8_t vdev_id,
|
||||||
uint8_t *cache_id, uint8_t *ssid,
|
uint8_t *cache_id, uint8_t *ssid,
|
||||||
uint8_t ssid_len, struct qdf_mac_addr *bssid);
|
uint8_t ssid_len, struct qdf_mac_addr *bssid);
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* csr_is_pmkid_found_for_peer() - check if pmkid sent by peer is present
|
* csr_is_pmkid_found_for_peer() - check if pmkid sent by peer is present
|
||||||
in PMK cache. Used in SAP mode.
|
in PMK cache. Used in SAP mode.
|
||||||
|
@@ -2653,6 +2653,7 @@ bool csr_lookup_pmkid_using_bssid(struct mac_context *mac,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef FEATURE_CM_ENABLE
|
||||||
bool csr_lookup_fils_pmkid(struct mac_context *mac,
|
bool csr_lookup_fils_pmkid(struct mac_context *mac,
|
||||||
uint8_t vdev_id, uint8_t *cache_id,
|
uint8_t vdev_id, uint8_t *cache_id,
|
||||||
uint8_t *ssid, uint8_t ssid_len,
|
uint8_t *ssid, uint8_t ssid_len,
|
||||||
@@ -2680,7 +2681,7 @@ bool csr_lookup_fils_pmkid(struct mac_context *mac,
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#ifdef WLAN_FEATURE_FILS_SK
|
#ifdef WLAN_FEATURE_FILS_SK
|
||||||
/**
|
/**
|
||||||
* csr_update_pmksa_to_profile() - update pmk and pmkid to profile which will be
|
* csr_update_pmksa_to_profile() - update pmk and pmkid to profile which will be
|
||||||
@@ -2690,20 +2691,26 @@ bool csr_lookup_fils_pmkid(struct mac_context *mac,
|
|||||||
*
|
*
|
||||||
* Return: None
|
* Return: None
|
||||||
*/
|
*/
|
||||||
static inline void csr_update_pmksa_to_profile(struct csr_roam_profile *profile,
|
static inline void csr_update_pmksa_to_profile(struct wlan_objmgr_vdev *vdev,
|
||||||
struct wlan_crypto_pmksa *pmksa)
|
struct wlan_crypto_pmksa *pmksa)
|
||||||
{
|
{
|
||||||
if (!profile->fils_con_info)
|
struct mlme_legacy_priv *mlme_priv;
|
||||||
return;
|
|
||||||
|
|
||||||
profile->fils_con_info->pmk_len = pmksa->pmk_len;
|
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
|
||||||
qdf_mem_copy(profile->fils_con_info->pmk,
|
if (!mlme_priv) {
|
||||||
|
mlme_err("vdev legacy private object is NULL");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!mlme_priv->fils_con_info)
|
||||||
|
return;
|
||||||
|
mlme_priv->fils_con_info->pmk_len = pmksa->pmk_len;
|
||||||
|
qdf_mem_copy(mlme_priv->fils_con_info->pmk,
|
||||||
pmksa->pmk, pmksa->pmk_len);
|
pmksa->pmk, pmksa->pmk_len);
|
||||||
qdf_mem_copy(profile->fils_con_info->pmkid,
|
qdf_mem_copy(mlme_priv->fils_con_info->pmkid,
|
||||||
pmksa->pmkid, PMKID_LEN);
|
pmksa->pmkid, PMKID_LEN);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static inline void csr_update_pmksa_to_profile(struct csr_roam_profile *profile,
|
static inline void csr_update_pmksa_to_profile(struct wlan_objmgr_vdev *vdev,
|
||||||
struct wlan_crypto_pmksa *pmksa)
|
struct wlan_crypto_pmksa *pmksa)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -2800,7 +2807,7 @@ uint8_t csr_construct_rsn_ie(struct mac_context *mac, uint32_t sessionId,
|
|||||||
if (pmksa_peer) {
|
if (pmksa_peer) {
|
||||||
wlan_cm_set_psk_pmk(mac->pdev, sessionId,
|
wlan_cm_set_psk_pmk(mac->pdev, sessionId,
|
||||||
pmksa_peer->pmk, pmksa_peer->pmk_len);
|
pmksa_peer->pmk, pmksa_peer->pmk_len);
|
||||||
csr_update_pmksa_to_profile(pProfile, pmksa_peer);
|
csr_update_pmksa_to_profile(vdev, pmksa_peer);
|
||||||
}
|
}
|
||||||
rso_cfg = wlan_cm_get_rso_config(vdev);
|
rso_cfg = wlan_cm_get_rso_config(vdev);
|
||||||
if (rso_cfg) {
|
if (rso_cfg) {
|
||||||
|
Reference in New Issue
Block a user