Browse Source

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
Surya Prakash Sivaraj 2 years ago
parent
commit
2c5995f78e

+ 2 - 0
components/mlme/core/inc/wlan_mlme_main.h

@@ -376,6 +376,7 @@ struct ft_context {
  * @cckm_ie_len: cckm_ie len
  * @ese_tspec_info: ese tspec info
  * @ext_cap_ie: Ext CAP IE
+ * @assoc_btm_cap: BSS transition management cap used in (re)assoc req
  */
 struct mlme_connect_info {
 	uint8_t timing_meas_cap;
@@ -400,6 +401,7 @@ struct mlme_connect_info {
 #endif
 #endif
 	uint8_t ext_cap_ie[DOT11F_IE_EXTCAP_MAX_LEN + 2];
+	bool assoc_btm_cap;
 };
 
 /** struct wait_for_key_timer - wait for key timer object

+ 38 - 0
components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_fw_sync.c

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

+ 6 - 0
components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.c

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

+ 20 - 0
components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_api.h

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

+ 30 - 0
components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_roam_api.c

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

+ 2 - 0
core/mac/src/pe/lim/lim_send_management_frames.c

@@ -2843,6 +2843,8 @@ lim_send_assoc_req_mgmt_frame(struct mac_context *mac_ctx,
 		 */
 		populate_dot11f_twt_extended_caps(mac_ctx, pe_session,
 						  &frm->ExtCap);
+	} else {
+		wlan_cm_set_assoc_btm_cap(pe_session->vdev, false);
 	}
 
 	if (QDF_STATUS_SUCCESS != lim_strip_supp_op_class_update_struct(mac_ctx,

+ 1 - 0
core/mac/src/sys/legacy/src/utils/src/parser_api.c

@@ -11044,6 +11044,7 @@ QDF_STATUS populate_dot11f_btm_extended_caps(struct mac_context *mac_ctx,
 		pe_debug("ext ie length become 0, disable the ext caps");
 	}
 
+	wlan_cm_set_assoc_btm_cap(pe_session->vdev, p_ext_cap->bss_transition);
 	return QDF_STATUS_SUCCESS;
 }