1
0

qcacld-3.0: Add support for SAE single pmk validity

Currently when SAE single pmk lifetime expires, the userspace
issues disconnect. To avoid this, on reaching a threshold value
of the total pmk lifetime, the firmware will clear the single
PMK and initiate a roam scan to perform full SAE and derive
new pmk.

Add changes to:
1. Send the remaining single pmk timeout value in seconds to
firmware.
this is calculated as the diffence in pmk timeout configured by
userspace and the time passed after set_pmksa was done (which is
system timestamp between the set_pmksa timestamp and timestamp at
which RSO command is filled).
2. Add internal roam trigger for SPMK timeout trigger.
3. Set the roam score delta value as 0 for SPMK timeout roam
trigger.

Change-Id: I62c2ddbbfeb2811a4342d41f2bdaa8d988568bcc
CRs-Fixed: 2869665
Este cometimento está contido em:
Pragaspathi Thilagaraj
2021-02-04 01:24:44 +05:30
cometido por snandini
ascendente f226f7620d
cometimento 9d61fc3d0e
10 ficheiros modificados com 192 adições e 29 eliminações

Ver ficheiro

@@ -239,25 +239,40 @@ cm_update_rso_ese_info(struct rso_config *rso_cfg,
#ifdef WLAN_SAE_SINGLE_PMK
static bool
csr_cm_fill_rso_sae_single_pmk_info(struct wlan_objmgr_vdev *vdev,
struct wlan_mlme_psoc_ext_obj *mlme_obj,
struct wlan_rso_11i_params *rso_11i_info)
cm_fill_rso_sae_single_pmk_info(struct wlan_objmgr_vdev *vdev,
struct wlan_mlme_psoc_ext_obj *mlme_obj,
struct wlan_roam_scan_offload_params *rso_cfg)
{
struct wlan_mlme_sae_single_pmk single_pmk;
struct wlan_mlme_sae_single_pmk single_pmk = {0};
struct wlan_rso_11i_params *rso_11i_info = &rso_cfg->rso_11i_info;
uint64_t time_expired;
wlan_mlme_get_sae_single_pmk_info(vdev, &single_pmk);
if (single_pmk.pmk_info.pmk_len && single_pmk.sae_single_pmk_ap &&
mlme_obj->cfg.lfr.sae_single_pmk_feature_enabled) {
mlme_debug("Update pmk with len %d same_pmk_info %d",
single_pmk.pmk_info.pmk_len,
single_pmk.sae_single_pmk_ap);
rso_11i_info->pmk_len = single_pmk.pmk_info.pmk_len;
/* Update sae same pmk info in rso */
qdf_mem_copy(rso_11i_info->psk_pmk, single_pmk.pmk_info.pmk,
rso_11i_info->pmk_len);
rso_11i_info->is_sae_same_pmk = single_pmk.sae_single_pmk_ap;
/* get the time expired in seconds */
time_expired = (qdf_get_system_timestamp() -
single_pmk.pmk_info.spmk_timestamp) / 1000;
rso_cfg->sae_offload_params.spmk_timeout = 0;
if (time_expired < single_pmk.pmk_info.spmk_timeout_period)
rso_cfg->sae_offload_params.spmk_timeout =
(single_pmk.pmk_info.spmk_timeout_period -
time_expired);
mlme_debug("Update spmk with len:%d is_spmk_ap:%d time_exp:%lld time left:%d",
single_pmk.pmk_info.pmk_len,
single_pmk.sae_single_pmk_ap, time_expired,
rso_cfg->sae_offload_params.spmk_timeout);
return true;
}
@@ -265,9 +280,9 @@ csr_cm_fill_rso_sae_single_pmk_info(struct wlan_objmgr_vdev *vdev,
}
#else
static inline bool
csr_cm_fill_rso_sae_single_pmk_info(struct wlan_objmgr_vdev *vdev,
struct wlan_mlme_psoc_ext_obj *mlme_obj,
struct wlan_rso_11i_params *rso_11i_info)
cm_fill_rso_sae_single_pmk_info(struct wlan_objmgr_vdev *vdev,
struct wlan_mlme_psoc_ext_obj *mlme_obj,
struct wlan_roam_scan_offload_params *rso_cfg)
{
return false;
}
@@ -433,8 +448,7 @@ cm_roam_scan_offload_fill_lfr3_config(struct wlan_objmgr_vdev *vdev,
(pmkid_modes & CFG_PMKID_MODES_PMKSA_CACHING) ? 1 : 0;
/* Check whether to send psk_pmk or sae_single pmk info */
if (!csr_cm_fill_rso_sae_single_pmk_info(vdev, mlme_obj,
&rso_config->rso_11i_info)) {
if (!cm_fill_rso_sae_single_pmk_info(vdev, mlme_obj, rso_config)) {
rso_config->rso_11i_info.is_sae_same_pmk = false;
wlan_cm_get_psk_pmk(pdev, vdev_id,
rso_config->rso_11i_info.psk_pmk,
@@ -3450,6 +3464,7 @@ cm_store_sae_single_pmk_to_global_cache(struct wlan_objmgr_psoc *psoc,
struct wlan_objmgr_vdev *vdev)
{
struct mlme_pmk_info *pmk_info;
struct wlan_crypto_pmksa *pmksa;
struct cm_roam_values_copy src_cfg;
struct qdf_mac_addr bssid;
uint8_t vdev_id = wlan_vdev_get_id(vdev);
@@ -3470,6 +3485,20 @@ cm_store_sae_single_pmk_to_global_cache(struct wlan_objmgr_psoc *psoc,
wlan_cm_get_psk_pmk(pdev, vdev_id, pmk_info->pmk, &pmk_info->pmk_len);
pmksa = wlan_crypto_get_pmksa(vdev, &bssid);
if (pmksa) {
pmk_info->spmk_timeout_period =
(pmksa->pmk_lifetime *
pmksa->pmk_lifetime_threshold / 100);
pmk_info->spmk_timestamp = pmksa->pmk_entry_ts;
mlme_debug("spmk_ts:%ld spmk_timeout_prd:%d secs",
pmk_info->spmk_timestamp,
pmk_info->spmk_timeout_period);
} else {
mlme_debug("PMK entry not found for bss:" QDF_MAC_ADDR_FMT,
QDF_MAC_ADDR_REF(bssid.bytes));
}
wlan_mlme_update_sae_single_pmk(vdev, pmk_info);
qdf_mem_zero(pmk_info, sizeof(*pmk_info));

Ver ficheiro

@@ -584,8 +584,8 @@ struct scoring_param {
};
/*
* Currently roam score delta value and min rssi values are sent
* for 2 triggers
* Currently roam score delta value is sent for 2 triggers and min rssi
* values are sent for 3 triggers
*/
#define NUM_OF_ROAM_TRIGGERS 2
#define IDLE_ROAM_TRIGGER 0
@@ -625,6 +625,7 @@ struct scoring_param {
* ROAM_TRIGGER_REASON_STA_KICKOUT: Roam triggered due to sta kickout event.
* ROAM_TRIGGER_REASON_ESS_RSSI: Roam triggered due to ess rssi
* ROAM_TRIGGER_REASON_WTC_BTM: Roam triggered due to WTC BTM
* ROAM_TRIGGER_REASON_PMK_TIMEOUT: Roam triggered due to PMK expiry
* ROAM_TRIGGER_REASON_MAX: Maximum number of roam triggers
*/
enum roam_trigger_reason {
@@ -646,6 +647,7 @@ enum roam_trigger_reason {
ROAM_TRIGGER_REASON_STA_KICKOUT,
ROAM_TRIGGER_REASON_ESS_RSSI,
ROAM_TRIGGER_REASON_WTC_BTM,
ROAM_TRIGGER_REASON_PMK_TIMEOUT,
ROAM_TRIGGER_REASON_MAX,
};
@@ -1162,6 +1164,15 @@ struct wlan_rso_ese_params {
uint8_t krk[WMI_KRK_KEY_LEN];
uint8_t btk[WMI_BTK_KEY_LEN];
};
/**
* struct wlan_rso_sae_offload_params - SAE authentication offload related
* parameters.
* @spmk_timeout: Single PMK timeout value in seconds.
*/
struct wlan_rso_sae_offload_params {
uint32_t spmk_timeout;
};
#endif
#define ROAM_SCAN_DWELL_TIME_ACTIVE_DEFAULT (100)
@@ -1190,6 +1201,7 @@ struct wlan_rso_ese_params {
* @rso_11r_info: FT related parameters
* @rso_ese_info: ESE related parameters
* @fils_roam_config: roam fils params
* @sae_offload_params: SAE offload/single pmk related parameters
*/
struct wlan_roam_scan_offload_params {
uint32_t vdev_id;
@@ -1213,6 +1225,7 @@ struct wlan_roam_scan_offload_params {
#ifdef WLAN_FEATURE_FILS_SK
struct wlan_roam_fils_params fils_roam_config;
#endif
struct wlan_rso_sae_offload_params sae_offload_params;
#endif
};