qcacld-3.0: Disable BTM offload based on BTM cap
The wpa_supplicant disables the BTM cap in extcap IE whenever the MBO AP is not PMF capable, or if the btm_disable conf is set. In current host driver design, the BTM offload is disabled only for the MBO+non-PMF case. Therefore, add change to disable the btm offload config if the BTM CAP is not present in the (re)assoc request as this is determined based on intersection of peer and self cap. Change-Id: I2fdc1010bccf5ce23f4ab2177aed6c374f7a510f CRs-Fixed: 3369096
This commit is contained in:

committad av
Madan Koyyalamudi

förälder
a85a02cb95
incheckning
2c5995f78e
@@ -465,6 +465,43 @@ cm_fill_bssid_freq_info(uint8_t vdev_id,
|
||||
}
|
||||
#endif
|
||||
|
||||
static void
|
||||
cm_update_assoc_btm_cap(struct wlan_objmgr_vdev *vdev,
|
||||
struct cm_vdev_join_rsp *rsp)
|
||||
{
|
||||
struct wlan_connect_rsp_ies *connect_ies;
|
||||
const uint8_t *ext_cap_ie;
|
||||
struct s_ext_cap *extcap;
|
||||
uint8_t offset;
|
||||
|
||||
connect_ies = &rsp->connect_rsp.connect_ies;
|
||||
/*
|
||||
* Retain the btm cap from initial assoc if
|
||||
* there is no assoc request
|
||||
*/
|
||||
if (!connect_ies->assoc_req.ptr ||
|
||||
!connect_ies->assoc_req.len)
|
||||
return;
|
||||
|
||||
if (rsp->connect_rsp.is_assoc)
|
||||
offset = WLAN_ASSOC_REQ_IES_OFFSET;
|
||||
else
|
||||
offset = WLAN_REASSOC_REQ_IES_OFFSET;
|
||||
|
||||
ext_cap_ie =
|
||||
wlan_get_ie_ptr_from_eid(WLAN_ELEMID_XCAPS,
|
||||
connect_ies->assoc_req.ptr + offset,
|
||||
connect_ies->assoc_req.len - offset);
|
||||
|
||||
if (!ext_cap_ie) {
|
||||
mlme_debug("Ext cap is not present, disable btm");
|
||||
wlan_cm_set_assoc_btm_cap(vdev, false);
|
||||
return;
|
||||
}
|
||||
extcap = (struct s_ext_cap *)&ext_cap_ie[2];
|
||||
wlan_cm_set_assoc_btm_cap(vdev, extcap->bss_transition);
|
||||
}
|
||||
|
||||
static QDF_STATUS
|
||||
cm_fill_roam_info(struct wlan_objmgr_vdev *vdev,
|
||||
struct roam_offload_synch_ind *roam_synch_data,
|
||||
@@ -549,6 +586,7 @@ cm_fill_roam_info(struct wlan_objmgr_vdev *vdev,
|
||||
roaming_info->next_erp_seq_num = roam_synch_data->next_erp_seq_num;
|
||||
|
||||
cm_fils_update_erp_seq_num(vdev, roaming_info->next_erp_seq_num, cm_id);
|
||||
cm_update_assoc_btm_cap(vdev, rsp);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
@@ -2768,6 +2768,12 @@ cm_update_btm_offload_config(struct wlan_objmgr_psoc *psoc,
|
||||
if (!(*btm_offload_config))
|
||||
return;
|
||||
|
||||
if (!wlan_cm_get_assoc_btm_cap(vdev)) {
|
||||
mlme_debug("BTM not supported, disable BTM offload");
|
||||
*btm_offload_config = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
vdev_id = wlan_vdev_get_id(vdev);
|
||||
wlan_cm_roam_cfg_get_value(psoc, vdev_id, HS_20_AP, &temp);
|
||||
is_hs_20_ap = temp.bool_value;
|
||||
|
@@ -1810,4 +1810,24 @@ QDF_STATUS
|
||||
wlan_cm_get_sae_auth_ta(struct wlan_objmgr_pdev *pdev,
|
||||
uint8_t vdev_id,
|
||||
struct qdf_mac_addr *sae_auth_ta);
|
||||
|
||||
/**
|
||||
* wlan_cm_set_assoc_btm_cap() - Set the assoc BTM capability
|
||||
* @vdev: pointer to vdev
|
||||
* @val: BTM cap
|
||||
*
|
||||
* Return: None
|
||||
*/
|
||||
void
|
||||
wlan_cm_set_assoc_btm_cap(struct wlan_objmgr_vdev *vdev, bool val);
|
||||
|
||||
/**
|
||||
* wlan_cm_get_assoc_btm_cap() - Get the assoc BTM capability
|
||||
* @vdev: pointer to vdev
|
||||
*
|
||||
* Return: BTM cap
|
||||
*/
|
||||
bool
|
||||
wlan_cm_get_assoc_btm_cap(struct wlan_objmgr_vdev *vdev);
|
||||
|
||||
#endif /* WLAN_CM_ROAM_API_H__ */
|
||||
|
@@ -3820,3 +3820,33 @@ wlan_cm_get_sae_auth_ta(struct wlan_objmgr_pdev *pdev,
|
||||
|
||||
return QDF_STATUS_E_ALREADY;
|
||||
}
|
||||
|
||||
void
|
||||
wlan_cm_set_assoc_btm_cap(struct wlan_objmgr_vdev *vdev, bool val)
|
||||
{
|
||||
struct mlme_legacy_priv *mlme_priv;
|
||||
|
||||
if (!vdev)
|
||||
return;
|
||||
|
||||
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
|
||||
if (!mlme_priv)
|
||||
return;
|
||||
|
||||
mlme_priv->connect_info.assoc_btm_cap = val;
|
||||
}
|
||||
|
||||
bool
|
||||
wlan_cm_get_assoc_btm_cap(struct wlan_objmgr_vdev *vdev)
|
||||
{
|
||||
struct mlme_legacy_priv *mlme_priv;
|
||||
|
||||
if (!vdev)
|
||||
return true;
|
||||
|
||||
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
|
||||
if (!mlme_priv)
|
||||
return true;
|
||||
|
||||
return mlme_priv->connect_info.assoc_btm_cap;
|
||||
}
|
||||
|
Referens i nytt ärende
Block a user