Browse Source

qcacld-3.0: Add logic to create bss peer from connection manager

Add logic to create bss peer from connection manager.

Change-Id: Ia150669b2bbc55ddf722a92617de2a13b7357cb5
CRs-Fixed: 2832727
gaurank kathpalia 4 năm trước cách đây
mục cha
commit
81465cfdd5

+ 18 - 0
components/umac/mlme/connection_mgr/core/src/wlan_cm_vdev_api.h

@@ -59,6 +59,16 @@ struct cm_vdev_join_rsp {
 	struct wlan_cm_connect_resp connect_rsp;
 	struct wlan_cm_connect_resp connect_rsp;
 };
 };
 
 
+/**
+ * struct cm_peer_create_req - bss peer create req
+ * @vdev_id: vdev_id
+ * @peer_mac: peer mac to create
+ */
+struct cm_peer_create_req {
+	uint8_t vdev_id;
+	struct qdf_mac_addr peer_mac;
+};
+
 /**
 /**
  * cm_handle_connect_req() - Connection manager ext connect request to start
  * cm_handle_connect_req() - Connection manager ext connect request to start
  * vdev and peer assoc state machine
  * vdev and peer assoc state machine
@@ -156,6 +166,14 @@ void cm_free_join_req(struct cm_vdev_join_req *join_req);
  */
  */
 QDF_STATUS cm_process_join_req(struct scheduler_msg *msg);
 QDF_STATUS cm_process_join_req(struct scheduler_msg *msg);
 
 
+/**
+ * cm_process_peer_create() - Process bss peer create req
+ * @msg: scheduler message
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS cm_process_peer_create(struct scheduler_msg *msg);
+
 /**
 /**
  * cm_process_disconnect_req() - Process vdev disconnect request
  * cm_process_disconnect_req() - Process vdev disconnect request
  * @msg: scheduler message
  * @msg: scheduler message

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

@@ -155,7 +155,33 @@ QDF_STATUS
 cm_send_bss_peer_create_req(struct wlan_objmgr_vdev *vdev,
 cm_send_bss_peer_create_req(struct wlan_objmgr_vdev *vdev,
 			    struct qdf_mac_addr *peer_mac)
 			    struct qdf_mac_addr *peer_mac)
 {
 {
-	return QDF_STATUS_SUCCESS;
+	struct scheduler_msg msg;
+	QDF_STATUS status;
+	struct cm_peer_create_req *req;
+
+	if (!vdev || !peer_mac)
+		return QDF_STATUS_E_FAILURE;
+
+	qdf_mem_zero(&msg, sizeof(msg));
+	req = qdf_mem_malloc(sizeof(*req));
+
+	if (!req)
+		return QDF_STATUS_E_NOMEM;
+
+	req->vdev_id = wlan_vdev_get_id(vdev);
+	qdf_copy_macaddr(&req->peer_mac, peer_mac);
+
+	msg.bodyptr = req;
+	msg.callback = cm_process_peer_create;
+
+	status = scheduler_post_message(QDF_MODULE_ID_MLME,
+					QDF_MODULE_ID_PE,
+					QDF_MODULE_ID_PE, &msg);
+	if (QDF_IS_STATUS_ERROR(status))
+		qdf_mem_free(req);
+
+	return status;
+
 }
 }
 
 
 QDF_STATUS
 QDF_STATUS

+ 36 - 15
core/mac/src/pe/lim/lim_process_mlm_req_messages.c

@@ -43,6 +43,7 @@
 #include "../../core/src/vdev_mgr_ops.h"
 #include "../../core/src/vdev_mgr_ops.h"
 #include "wlan_pmo_ucfg_api.h"
 #include "wlan_pmo_ucfg_api.h"
 #include "wlan_objmgr_vdev_obj.h"
 #include "wlan_objmgr_vdev_obj.h"
+#include <wlan_cm_api.h>
 
 
 static void lim_process_mlm_auth_req(struct mac_context *, uint32_t *);
 static void lim_process_mlm_auth_req(struct mac_context *, uint32_t *);
 static void lim_process_mlm_assoc_req(struct mac_context *, uint32_t *);
 static void lim_process_mlm_assoc_req(struct mac_context *, uint32_t *);
@@ -386,21 +387,40 @@ failure:
 	lim_post_sme_message(mac, LIM_MLM_JOIN_CNF, (uint32_t *) &mlm_join_cnf);
 	lim_post_sme_message(mac, LIM_MLM_JOIN_CNF, (uint32_t *) &mlm_join_cnf);
 }
 }
 
 
-/**
- * lim_process_mlm_post_join_suspend_link() - This function is called after the
- * suspend link while joining off channel.
- * @mac_ctx:    Pointer to Global MAC structure
- * @session:     session
- *
- * This function does following:
- *   Check for suspend state.
- *   If success, proceed with setting link state to receive the
- *   probe response/beacon from intended AP.
- *   Switch to the APs channel.
- *   On an error case, send the MLM_JOIN_CNF with error status.
- *
- * @Return None
- */
+#ifdef FEATURE_CM_ENABLE
+void lim_send_peer_create_resp(struct mac_context *mac, uint8_t vdev_id,
+			       QDF_STATUS status, uint8_t *peer_mac)
+{
+	struct wlan_objmgr_vdev *vdev;
+
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(mac->psoc,
+						    vdev_id,
+						    WLAN_LEGACY_MAC_ID);
+	wlan_cm_bss_peer_create_rsp(vdev, status,
+				    (struct qdf_mac_addr *)peer_mac);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID);
+}
+
+static void
+lim_process_mlm_post_join_suspend_link(struct mac_context *mac_ctx,
+				       struct pe_session *session)
+{
+	lim_deactivate_and_change_timer(mac_ctx, eLIM_JOIN_FAIL_TIMER);
+
+	/* assign appropriate sessionId to the timer object */
+	mac_ctx->lim.lim_timers.gLimJoinFailureTimer.sessionId =
+		session->peSessionId;
+
+	lim_post_join_set_link_state_callback(mac_ctx, session->vdev_id,
+					      QDF_STATUS_SUCCESS);
+}
+#else
+void lim_send_peer_create_resp(struct mac_context *mac, uint8_t vdev_id,
+			       QDF_STATUS status, uint8_t *peer_mac)
+{
+	lim_post_join_set_link_state_callback(mac, vdev_id, status);
+}
+
 static void
 static void
 lim_process_mlm_post_join_suspend_link(struct mac_context *mac_ctx,
 lim_process_mlm_post_join_suspend_link(struct mac_context *mac_ctx,
 				       struct pe_session *session)
 				       struct pe_session *session)
@@ -413,6 +433,7 @@ lim_process_mlm_post_join_suspend_link(struct mac_context *mac_ctx,
 
 
 	wma_add_bss_peer_sta(session->vdev_id, session->bssId);
 	wma_add_bss_peer_sta(session->vdev_id, session->bssId);
 }
 }
+#endif
 
 
 /**
 /**
  * lim_process_mlm_join_req() - process mlm join request.
  * lim_process_mlm_join_req() - process mlm join request.

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

@@ -1511,6 +1511,25 @@ QDF_STATUS cm_process_disconnect_req(struct scheduler_msg *msg)
 
 
 	return status;
 	return status;
 }
 }
+
+QDF_STATUS cm_process_peer_create(struct scheduler_msg *msg)
+{
+	struct cm_peer_create_req *req;
+	QDF_STATUS status;
+
+	if (!msg || !msg->bodyptr) {
+		mlme_err("msg or msg->bodyptr is NULL");
+		return QDF_STATUS_E_INVAL;
+	}
+
+	req = msg->bodyptr;
+
+	status = wma_add_bss_peer_sta(req->vdev_id, req->peer_mac.bytes);
+
+	qdf_mem_free(req);
+
+	return status;
+}
 #endif
 #endif
 
 
 static bool lim_is_fast_roam_enabled(struct mac_context *mac_ctx,
 static bool lim_is_fast_roam_enabled(struct mac_context *mac_ctx,

+ 2 - 0
core/mac/src/pe/lim/lim_types.h

@@ -1362,6 +1362,8 @@ void
 lim_post_join_set_link_state_callback(struct mac_context *mac, uint32_t vdev_id,
 lim_post_join_set_link_state_callback(struct mac_context *mac, uint32_t vdev_id,
 				      QDF_STATUS status);
 				      QDF_STATUS status);
 
 
+void lim_send_peer_create_resp(struct mac_context *mac, uint8_t vdev_id,
+			       QDF_STATUS status, uint8_t *peer_mac);
 /*
 /*
  * lim_process_mlm_deauth_req() - This function is called to process
  * lim_process_mlm_deauth_req() - This function is called to process
  * MLM_DEAUTH_REQ message from SME
  * MLM_DEAUTH_REQ message from SME

+ 6 - 6
core/wma/src/wma_dev_if.c

@@ -1962,7 +1962,7 @@ wma_create_sta_mode_bss_peer(tp_wma_handle wma,
 	return status;
 	return status;
 
 
 end:
 end:
-	lim_post_join_set_link_state_callback(mac, vdev_id, status);
+	lim_send_peer_create_resp(mac, vdev_id, status, peer_addr);
 
 
 	return status;
 	return status;
 }
 }
@@ -3074,9 +3074,8 @@ fail:
 				(peer_create_rsp->status > 0) ? true : false);
 				(peer_create_rsp->status > 0) ? true : false);
 
 
 	if (mac)
 	if (mac)
-		lim_post_join_set_link_state_callback(mac,
-						      peer_create_rsp->vdev_id,
-						      status);
+		lim_send_peer_create_resp(mac, peer_create_rsp->vdev_id, status,
+					  peer_mac.bytes);
 
 
 	return ret;
 	return ret;
 }
 }
@@ -3329,8 +3328,9 @@ void wma_hold_req_timer(void *data)
 		if (!mac)
 		if (!mac)
 			goto timer_destroy;
 			goto timer_destroy;
 
 
-		lim_post_join_set_link_state_callback(mac, tgt_req->vdev_id,
-						      QDF_STATUS_E_FAILURE);
+		lim_send_peer_create_resp(mac, tgt_req->vdev_id,
+					  QDF_STATUS_E_TIMEOUT,
+					  (uint8_t *)tgt_req->user_data);
 
 
 	} else {
 	} else {
 		wma_err("Unhandled timeout for msg_type:%d and type:%d",
 		wma_err("Unhandled timeout for msg_type:%d and type:%d",