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
This commit is contained in:
Pragaspathi Thilagaraj
2021-02-04 01:24:44 +05:30
committed by snandini
parent f226f7620d
commit 9d61fc3d0e
10 changed files with 192 additions and 29 deletions

View File

@@ -3699,6 +3699,8 @@ char *mlme_get_roam_trigger_str(uint32_t roam_scan_trigger)
return "WTC BTM";
case WMI_ROAM_TRIGGER_REASON_NONE:
return "NONE";
case WMI_ROAM_TRIGGER_REASON_PMK_TIMEOUT:
return "PMK Expired";
default:
return "UNKNOWN";
}
@@ -3778,7 +3780,7 @@ void wlan_mlme_get_sae_single_pmk_info(struct wlan_objmgr_vdev *vdev,
struct wlan_mlme_sae_single_pmk *pmksa)
{
struct mlme_legacy_priv *mlme_priv;
struct mlme_pmk_info pmk_info;
struct mlme_pmk_info *pmk_info;
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
if (!mlme_priv) {
@@ -3786,15 +3788,17 @@ void wlan_mlme_get_sae_single_pmk_info(struct wlan_objmgr_vdev *vdev,
return;
}
pmk_info = mlme_priv->mlme_roam.sae_single_pmk.pmk_info;
pmk_info = &mlme_priv->mlme_roam.sae_single_pmk.pmk_info;
pmksa->sae_single_pmk_ap =
mlme_priv->mlme_roam.sae_single_pmk.sae_single_pmk_ap;
pmksa->pmk_info.spmk_timeout_period = pmk_info->spmk_timeout_period;
pmksa->pmk_info.spmk_timestamp = pmk_info->spmk_timestamp;
if (pmk_info.pmk_len) {
qdf_mem_copy(pmksa->pmk_info.pmk, pmk_info.pmk,
pmk_info.pmk_len);
pmksa->pmk_info.pmk_len = pmk_info.pmk_len;
if (pmk_info->pmk_len) {
qdf_mem_copy(pmksa->pmk_info.pmk, pmk_info->pmk,
pmk_info->pmk_len);
pmksa->pmk_info.pmk_len = pmk_info->pmk_len;
return;
}