Browse Source

qcacld-3.0: Fix for Interop issue in hidden BSS

In hidden SSID case, some IOT AP does not respond to the
unicast join probe requests and this leads to continuous
connection failures. The same AP however responds to broadcast
probe requests. The host announces join success only if the
probe response is received for the hidden SSID connection.

To fix this, after sending 3 unicast join probe requests, send
the pending probe requests as broadcast to proceed with to get
a probe response.

Change-Id: I686cbabd3b1b3d355829bc682de5d631b1738d86
CRs-Fixed: 3647028
Surya Prakash Sivaraj 1 year ago
parent
commit
1a41444bf7

+ 4 - 2
components/umac/mlme/connection_mgr/core/src/wlan_cm_vdev_api.h

@@ -46,7 +46,8 @@
  * as a testbed device with special functionality and not recommended
  * for production.
  * @is_wps_connection: is wps connection
- * @is_osen_connection: is osen connectgion
+ * @is_osen_connection: is osen connection
+ * @is_ssid_hidden: AP SSID is hidden
  * @assoc_ie: assoc ie to be used in assoc req
  * @scan_ie: Default scan ie to be used in the uncast probe req
  * @entry: scan entry for the candidate
@@ -59,7 +60,8 @@ struct cm_vdev_join_req {
 	wlan_cm_id cm_id;
 	uint8_t force_rsne_override:1,
 		is_wps_connection:1,
-		is_osen_connection:1;
+		is_osen_connection:1,
+		is_ssid_hidden:1;
 	struct element_info assoc_ie;
 	struct element_info scan_ie;
 	struct scan_cache_entry *entry;

+ 1 - 0
components/umac/mlme/connection_mgr/core/src/wlan_cm_vdev_connect.c

@@ -1325,6 +1325,7 @@ cm_copy_join_params(struct wlan_objmgr_vdev *vdev,
 	join_req->force_rsne_override = req->force_rsne_override;
 	join_req->is_wps_connection = req->is_wps_connection;
 	join_req->is_osen_connection = req->is_osen_connection;
+	join_req->is_ssid_hidden = req->bss->entry->is_hidden_ssid;
 
 	return QDF_STATUS_SUCCESS;
 }

+ 2 - 0
core/mac/src/pe/include/lim_session.h

@@ -678,6 +678,7 @@ struct wlan_mlo_ie_info {
  * @is_oui_auth_assoc_6mbps_2ghz_enable: send auth/assoc req with 6 Mbps rate
  * @is_unexpected_peer_error: true if unexpected peer error
  * on 2.4 GHz
+ * @join_probe_cnt: join probe request count
  */
 struct pe_session {
 	uint8_t available;
@@ -1006,6 +1007,7 @@ struct pe_session {
 	uint8_t user_edca_set;
 	bool is_oui_auth_assoc_6mbps_2ghz_enable;
 	bool is_unexpected_peer_error;
+	uint8_t join_probe_cnt;
 };
 
 /*-------------------------------------------------------------------------

+ 19 - 3
core/mac/src/pe/lim/lim_process_mlm_req_messages.c

@@ -1713,6 +1713,7 @@ void lim_process_join_failure_timeout(struct mac_context *mac_ctx)
 		rssi_log->rssi = session->rssi;
 	WLAN_HOST_DIAG_LOG_REPORT(rssi_log);
 #endif
+	session->join_probe_cnt = 0;
 
 	if (session->limMlmState == eLIM_MLM_WT_JOIN_BEACON_STATE) {
 		len = sizeof(tSirMacAddr);
@@ -1764,6 +1765,8 @@ static void lim_process_periodic_join_probe_req_timer(struct mac_context *mac_ct
 {
 	struct pe_session *session;
 	tSirMacSSid ssid;
+	tSirMacAddr bssid;
+	tSirMacAddr bcast_mac = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
 
 	session = pe_find_session_by_session_id(mac_ctx,
 	      mac_ctx->lim.lim_timers.gLimPeriodicJoinProbeReqTimer.sessionId);
@@ -1780,9 +1783,21 @@ static void lim_process_periodic_join_probe_req_timer(struct mac_context *mac_ct
 		qdf_mem_copy(ssid.ssId, session->ssId.ssId,
 			     session->ssId.length);
 		ssid.length = session->ssId.length;
-		lim_send_probe_req_mgmt_frame(mac_ctx, &ssid,
-			session->pLimMlmJoinReq->bssDescription.bssId,
-			session->curr_op_freq,
+		sir_copy_mac_addr(bssid,
+				  session->pLimMlmJoinReq->bssDescription.bssId);
+
+		/*
+		 * Some APs broadcasting hidden SSID doesn't respond to unicast
+		 * probe requests, however those APs respond to broadcast probe
+		 * requests. Therefore for hidden ssid connections, after 3
+		 * unicast probe requests, try the pending probes with broadcast
+		 * mac.
+		 */
+		if (session->ssidHidden && session->join_probe_cnt > 2)
+			sir_copy_mac_addr(bssid, bcast_mac);
+
+		lim_send_probe_req_mgmt_frame(mac_ctx, &ssid, bssid,
+					      session->curr_op_freq,
 			session->self_mac_addr, session->dot11mode,
 			&session->lim_join_req->addIEScan.length,
 			session->lim_join_req->addIEScan.addIEdata);
@@ -1795,6 +1810,7 @@ static void lim_process_periodic_join_probe_req_timer(struct mac_context *mac_ct
 			pe_warn("could not activate Periodic Join req failure timer");
 			return;
 		}
+		session->join_probe_cnt++;
 	}
 }
 

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

@@ -310,6 +310,7 @@ void lim_process_mlm_join_cnf(struct mac_context *mac_ctx,
 	wlan_connectivity_sta_info_event(mac_ctx->psoc, session_entry->vdev_id,
 					 false);
 
+	session_entry->join_probe_cnt = 0;
 	if (session_entry->limSmeState != eLIM_SME_WT_JOIN_STATE) {
 		pe_err("received unexpected MLM_JOIN_CNF in state %X",
 			session_entry->limSmeState);
@@ -3251,6 +3252,7 @@ static void lim_process_switch_channel_join_req(
 		goto error;
 	}
 
+	session_entry->join_probe_cnt++;
 	return;
 error:
 	if (session_entry) {

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

@@ -4557,6 +4557,7 @@ lim_fill_session_params(struct mac_context *mac_ctx,
 	session->ssId.length = req->entry->ssid.length;
 	qdf_mem_copy(session->ssId.ssId, req->entry->ssid.ssid,
 		     session->ssId.length);
+	session->ssidHidden = req->is_ssid_hidden;
 
 	status = lim_fill_pe_session(mac_ctx, session, bss_desc);
 	if (QDF_IS_STATUS_ERROR(status)) {

+ 1 - 0
core/mac/src/pe/lim/lim_session.c

@@ -670,6 +670,7 @@ struct pe_session *pe_create_session(struct mac_context *mac,
 	session_ptr->prev_auth_seq_num = 0xFFFF;
 
 	session_ptr->user_edca_set = 0;
+	session_ptr->join_probe_cnt = 0;
 
 	return &mac->lim.gpSession[i];