Parcourir la source

qcacld-3.0: validate ap ocv capa before sending rsn to fw

Currently driver sends rsn caps to fw via
WMI_VDEV_PARAM_RSN_CAPABILITY without validation of ap
capability to support ocv which may cause issue during csa.
when ocv cap is set in vdev param, then fw does sa query and
may not get any data if ap doesn't support ocv which may lead
to disconnection.

Fix is to set ocv capability in rsn based on ap capability to
avoid unwanted disconnection.

Change-Id: I90f9ccffb00878592179a3159adee0b3199555a3
CRs-Fixed: 3008137
sheenam monga il y a 3 ans
Parent
commit
65ff004e45
1 fichiers modifiés avec 36 ajouts et 0 suppressions
  1. 36 0
      core/sme/src/csr/csr_api_roam.c

+ 36 - 0
core/sme/src/csr/csr_api_roam.c

@@ -6352,6 +6352,41 @@ QDF_STATUS cm_csr_connect_rsp(struct wlan_objmgr_vdev *vdev,
 	return QDF_STATUS_SUCCESS;
 }
 
+static void
+cm_update_rsn_ocv_cap(int32_t *rsn_cap,
+		      struct wlan_cm_connect_resp *rsp)
+{
+	struct wlan_crypto_params crypto_params;
+	uint8_t *ie_ptr;
+	uint32_t ie_len;
+	QDF_STATUS status;
+
+	if (!rsp->connect_ies.bcn_probe_rsp.ptr ||
+	    !rsp->connect_ies.bcn_probe_rsp.len ||
+	    (rsp->connect_ies.bcn_probe_rsp.len <
+		(sizeof(struct wlan_frame_hdr) +
+		offsetof(struct wlan_bcn_frame, ie)))) {
+		sme_err("invalid beacon probe rsp");
+		return;
+	}
+
+	ie_len = (rsp->connect_ies.bcn_probe_rsp.len -
+			sizeof(struct wlan_frame_hdr) -
+			offsetof(struct wlan_bcn_frame, ie));
+	ie_ptr = (uint8_t *)(rsp->connect_ies.bcn_probe_rsp.ptr +
+			     sizeof(struct wlan_frame_hdr) +
+			     offsetof(struct wlan_bcn_frame, ie));
+
+	status = wlan_get_crypto_params_from_rsn_ie(&crypto_params, ie_ptr,
+						    ie_len);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		sme_err("get crypto prarams from RSN IE failed");
+		return;
+	}
+	if (!(crypto_params.rsn_caps & WLAN_CRYPTO_RSN_CAP_OCV_SUPPORTED))
+		*rsn_cap &= ~WLAN_CRYPTO_RSN_CAP_OCV_SUPPORTED;
+}
+
 QDF_STATUS
 cm_csr_connect_done_ind(struct wlan_objmgr_vdev *vdev,
 			struct wlan_cm_connect_resp *rsp)
@@ -6451,6 +6486,7 @@ cm_csr_connect_done_ind(struct wlan_objmgr_vdev *vdev,
 
 	rsn_cap = wlan_crypto_get_param(vdev, WLAN_CRYPTO_PARAM_RSN_CAP);
 	if (rsn_cap >= 0) {
+		cm_update_rsn_ocv_cap(&rsn_cap, rsp);
 		if (wma_cli_set2_command(vdev_id, WMI_VDEV_PARAM_RSN_CAPABILITY,
 					 rsn_cap, 0, VDEV_CMD))
 			sme_err("Failed to update WMI_VDEV_PARAM_RSN_CAPABILITY for vdev id %d",