Browse Source

qcacld-3.0: Add api to find pe session by bssid and vdev id

Adds new api to find pe session by bssid and vdev id. This api
is used to handle mlo self roaming scenario.

Change-Id: I1277cb867ee54ab9c83c566e31e05b93a17be5f2
CRs-Fixed: 3388130
Amruta Kulkarni 2 years ago
parent
commit
38f9e35aa3

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

@@ -1083,6 +1083,25 @@ struct pe_session
 				      uint8_t vdev_id,
 				      enum eLimMlmStates lim_state);
 
+/**
+ * pe_find_session_by_bssid_and_vdev_id() - looks up the PE session given
+ * the BSSID and vdev id.
+ * @mac:          pointer to global adapter context
+ * @bssid:         BSSID of the new session
+ * @vdev_id:         vdev id the session
+ * @sessionId:     session ID is returned here, if session is created.
+ *
+ * This function returns the session context and the session ID if the session
+ * corresponding to the given BSSID and vdev id is found in the PE
+ * session table.
+ *
+ * Return: pointer to the session context or NULL if session is not found.
+ */
+struct pe_session *pe_find_session_by_bssid_and_vdev_id(struct mac_context *mac,
+							uint8_t *bssid,
+							uint8_t vdev_id,
+							uint8_t *sessionId);
+
 /**
  * pe_find_session_by_peer_sta() - looks up the PE session given the Peer
  * Station Address.

+ 10 - 5
core/mac/src/pe/lim/lim_process_sme_req_messages.c

@@ -4544,8 +4544,10 @@ struct pe_session *lim_get_disconnect_session(struct mac_context *mac_ctx,
 	uint8_t pe_session_id;
 
 	/* Try to find pe session with bssid */
-	session = pe_find_session_by_bssid(mac_ctx, req->req.bssid.bytes,
-					   &pe_session_id);
+	session = pe_find_session_by_bssid_and_vdev_id(mac_ctx,
+						       req->req.bssid.bytes,
+						       req->req.vdev_id,
+						       &pe_session_id);
 	/*
 	 * If bssid search fail try to find by vdev id, this can happen if
 	 * Roaming change the BSSID during disconnect was getting processed.
@@ -5885,8 +5887,9 @@ static void __lim_process_sme_disassoc_req(struct mac_context *mac,
 		return;
 	}
 
-	pe_session = pe_find_session_by_bssid(mac,
+	pe_session = pe_find_session_by_bssid_and_vdev_id(mac,
 				smeDisassocReq.bssid.bytes,
+				smeDisassocReq.sessionId,
 				&sessionId);
 	if (!pe_session) {
 		pe_err("session does not exist for bssid " QDF_MAC_ADDR_FMT,
@@ -6066,8 +6069,9 @@ void __lim_process_sme_disassoc_cnf(struct mac_context *mac, uint32_t *msg_buf)
 
 	qdf_mem_copy(&smeDisassocCnf, msg_buf, sizeof(smeDisassocCnf));
 
-	pe_session = pe_find_session_by_bssid(mac,
+	pe_session = pe_find_session_by_bssid_and_vdev_id(mac,
 				smeDisassocCnf.bssid.bytes,
+				smeDisassocCnf.vdev_id,
 				&sessionId);
 	if (!pe_session) {
 		pe_err("session does not exist for bssid " QDF_MAC_ADDR_FMT,
@@ -6235,8 +6239,9 @@ static void __lim_process_sme_deauth_req(struct mac_context *mac_ctx,
 	 * We need to get a session first but we don't even know
 	 * if the message is correct.
 	 */
-	session_entry = pe_find_session_by_bssid(mac_ctx,
+	session_entry = pe_find_session_by_bssid_and_vdev_id(mac_ctx,
 					sme_deauth_req.bssid.bytes,
+					sme_deauth_req.vdev_id,
 					&session_id);
 	if (!session_entry) {
 		pe_err("session does not exist for bssid " QDF_MAC_ADDR_FMT,

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

@@ -770,6 +770,28 @@ struct pe_session
 	return NULL;
 }
 
+struct pe_session *
+pe_find_session_by_bssid_and_vdev_id(struct mac_context *mac,
+				     uint8_t *bssid,
+				     uint8_t vdev_id,
+				     uint8_t *sessionId)
+{
+	uint8_t i;
+
+	for (i = 0; i < mac->lim.maxBssId; i++) {
+		/* If BSSID matches return corresponding tables address */
+		if ((mac->lim.gpSession[i].valid) &&
+		    (mac->lim.gpSession[i].vdev_id == vdev_id) &&
+		    (sir_compare_mac_addr(mac->lim.gpSession[i].bssId,
+					    bssid))) {
+			*sessionId = i;
+			return &mac->lim.gpSession[i];
+		}
+	}
+
+	return NULL;
+}
+
 /*--------------------------------------------------------------------------
    \brief pe_find_session_by_session_id() - looks up the PE session given the session ID.