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:
Surya Prakash Sivaraj
2022-12-28 10:37:20 +05:30
committad av Madan Koyyalamudi
förälder a85a02cb95
incheckning 2c5995f78e
7 ändrade filer med 99 tillägg och 0 borttagningar

Visa fil

@@ -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;
}

Visa fil

@@ -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;

Visa fil

@@ -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__ */

Visa fil

@@ -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;
}