Browse Source

qcacld-3.0: Avoid sending RSNXE to legacy APs

Userspace may send RSNXE also in connect request irrespective
of the connecting AP capabilities to allow the driver to chose
best candidate based on score. But the chosen candidate may
not support the RSNXE feature and may not advertise RSNXE
in beacon/probe response. Station is not supposed to include
the RSNX IE in assoc request in such cases as legacy APs
may misbehave due to the new IE. It's observed that few
legacy APs which don't support the RSNXE reject the
connection at EAPOL stage. So, strip the IE if AP doesn't
support/advertise the RSNXE to avoid sending the RSNXE to
legacy APs.

Change-Id: Ia7dee29792718a6514da44b13b36b46586ef25ab
CRs-Fixed: 3228057
Srinivas Dasari 2 years ago
parent
commit
b09e99f046
1 changed files with 26 additions and 0 deletions
  1. 26 0
      core/mac/src/pe/lim/lim_process_sme_req_messages.c

+ 26 - 0
core/mac/src/pe/lim/lim_process_sme_req_messages.c

@@ -3659,6 +3659,30 @@ static inline void lim_update_pmksa_to_profile(struct wlan_objmgr_vdev *vdev,
 }
 #endif
 
+static inline void
+lim_strip_rsnx_ie(struct mac_context *mac_ctx,
+		  struct cm_vdev_join_req *req)
+{
+	/*
+	 * Userspace may send RSNXE also in connect request irrespective
+	 * of the connecting AP capabilities to allow the driver to chose
+	 * best candidate based on score. But the chosen candidate may
+	 * not support the RSNXE feature and may not advertise RSNXE
+	 * in beacon/probe response. Station is not supposed to include
+	 * the RSNX IE in assoc request in such cases as legacy APs
+	 * may misbahave due to the new IE. It's observed that few
+	 * legacy APs which don't support the RSNXE reject the
+	 * connection at EAPOL stage. So, strip the IE if AP doesn't
+	 * support/advertise the RSNXE to avoid sending the RSNXE to
+	 * legacy APs.
+	 */
+	if (!util_scan_entry_rsnxe(req->entry))
+		lim_strip_ie(mac_ctx, req->assoc_ie.ptr,
+			     (uint16_t *)&req->assoc_ie.len,
+			     WLAN_ELEMID_RSNXE, ONE_BYTE,
+			     NULL, 0, NULL, WLAN_MAX_IE_LEN);
+}
+
 static QDF_STATUS
 lim_fill_rsn_ie(struct mac_context *mac_ctx, struct pe_session *session,
 		struct cm_vdev_join_req *req)
@@ -3740,6 +3764,8 @@ lim_fill_rsn_ie(struct mac_context *mac_ctx, struct pe_session *session,
 		lim_update_pmksa_to_profile(session->vdev, pmksa_peer);
 	}
 
+	lim_strip_rsnx_ie(mac_ctx, req);
+
 	return QDF_STATUS_SUCCESS;
 }