qcacld-3.0: Update PMK info in RSO update command

Requirement is to allow station to just keep the
first PMK1 and PMKID1 which gets derived while first
connection and re-use it for roaming to other AP
which has some specific VSIE.

To support this feature, STA should Set new flag in 11i
params during RSO start/update when initial connection is
completed based on the VSIE in AP beacon/probe response
frame. This flag will allow fw to roam to AP(s) which has
VSIE with single PMK.

Update PMK info in RSO update command with sae_single_pmk
info if roaming is completed with AP(s) contains VSIE.

Change-Id: I6ef7a5581a380b0db323199fbda9407a5e792f4e
CRs-Fixed: 2616031
This commit is contained in:
Abhinav Kumar
2020-02-10 20:29:09 +05:30
committed by nshrivas
parent 8747fd098c
commit 3868028546

View File

@@ -83,6 +83,9 @@
#define CSR_MIN_GLOBAL_STAT_QUERY_PERIOD 500 /* ms */
#define CSR_MIN_GLOBAL_STAT_QUERY_PERIOD_IN_BMPS 2000 /* ms */
#define CSR_SINGLE_PMK_OUI "\x00\x40\x96\x03"
#define CSR_SINGLE_PMK_OUI_SIZE 4
/* Flag to send/do not send disassoc frame over the air */
#define CSR_DONT_SEND_DISASSOC_OVER_THE_AIR 1
#define RSSI_HACK_BMPS (-40)
@@ -21152,6 +21155,83 @@ QDF_STATUS csr_fast_reassoc(mac_handle_t mac_handle,
return status;
}
#if defined(WLAN_SAE_SINGLE_PMK) && defined(WLAN_FEATURE_ROAM_OFFLOAD)
/**
* csr_is_sae_single_pmk_vsie_ap() - check if the Roamed AP supports sae
* roaming using single pmk connection
* with same pmk or not
* @bss_des: bss descriptor
*
* Return: True if same pmk IE is present
*/
static bool csr_is_sae_single_pmk_vsie_ap(struct bss_description *bss_des)
{
uint16_t ie_len;
const uint8_t *vendor_ie;
if (!bss_des) {
sme_debug("Invalid bss description");
return false;
}
ie_len = csr_get_ielen_from_bss_description(bss_des);
vendor_ie =
wlan_get_vendor_ie_ptr_from_oui(CSR_SINGLE_PMK_OUI,
CSR_SINGLE_PMK_OUI_SIZE,
(uint8_t *)bss_des->ieFields,
ie_len);
if (!vendor_ie)
return false;
sme_debug("AP supports sae single pmk feature");
return true;
}
/**
* csr_check_and_set_sae_single_pmk_cap() - check if the Roamed AP support
* roaming using single pmk
* with same pmk or not
* @mac_ctx: mac context
* @session: Session
* @vdev_id: session id
*
* Return: True if same pmk IE is present
*/
static void
csr_check_and_set_sae_single_pmk_cap(struct mac_context *mac_ctx,
struct csr_roam_session *session,
uint8_t vdev_id)
{
bool val;
struct wlan_objmgr_vdev *vdev;
uint32_t keymgmt;
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(mac_ctx->psoc, vdev_id,
WLAN_LEGACY_SME_ID);
if (!vdev) {
mlme_err("get vdev failed");
return;
}
keymgmt = wlan_crypto_get_param(vdev, WLAN_CRYPTO_PARAM_KEY_MGMT);
if (keymgmt & (1 << WLAN_CRYPTO_KEY_MGMT_SAE)) {
val = csr_is_sae_single_pmk_vsie_ap(session->pConnectBssDesc);
wlan_mlme_set_sae_single_pmk_bss_cap(mac_ctx->psoc, vdev_id,
val);
}
wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
}
#else
static inline void
csr_check_and_set_sae_single_pmk_cap(struct mac_context *mac_ctx,
struct csr_roam_session *session,
uint8_t vdev_id)
{
}
#endif
static QDF_STATUS csr_process_roam_sync_callback(struct mac_context *mac_ctx,
struct roam_offload_synch_ind *roam_synch_data,
@@ -21293,6 +21373,8 @@ static QDF_STATUS csr_process_roam_sync_callback(struct mac_context *mac_ctx,
mac_ctx->psoc);
mac_ctx->sme.set_connection_info_cb(false);
session->roam_synch_in_progress = false;
csr_check_and_set_sae_single_pmk_cap(mac_ctx, session,
session_id);
if (WLAN_REG_IS_5GHZ_CH_FREQ(bss_desc->chan_freq)) {
session->disable_hi_rssi = true;