فهرست منبع

qcacmn: Add mlo mlme ext callbacks

Add template to define and register MLO MLME ext callbacks

Change-Id: Iac1f33bd97afbc9744e5873ca342585cfd4d5c93
CRs-Fixed: 2964102
Santosh Anbu 4 سال پیش
والد
کامیت
404f4a0c23
3فایلهای تغییر یافته به همراه275 افزوده شده و 1 حذف شده
  1. 97 0
      umac/mlo_mgr/inc/wlan_mlo_mgr_cmn.h
  2. 31 1
      umac/mlo_mgr/inc/wlan_mlo_mgr_public_structs.h
  3. 147 0
      umac/mlo_mgr/src/wlan_mlo_mgr_cmn.c

+ 97 - 0
umac/mlo_mgr/inc/wlan_mlo_mgr_cmn.h

@@ -101,4 +101,101 @@ void mlo_get_link_information(struct qdf_mac_addr *mld_addr,
  */
 void is_mlo_all_links_up(struct wlan_mlo_dev_context *ml_dev);
 
+/**
+ * mlo_get_partner_vdev_by_link_id() - get partner vdev by link id
+ * @vdev: vdev pointer
+ * @link_id: link id
+ *
+ * Caller should make sure to release the reference of thus obtained vdev
+ * by calling mlo_release_vdev_ref() after usage of vdev.
+ *
+ * Return: vdev object pointer to partner link
+ */
+struct wlan_objmgr_vdev *mlo_get_partner_vdev_by_link_id(
+			struct wlan_objmgr_vdev *vdev,
+			uint8_t link_id);
+
+/**
+ * mlo_release_vdev_ref() - release vdev reference
+ * @vdev: vdev pointer
+ *
+ * Return: void
+ */
+void mlo_release_vdev_ref(struct wlan_objmgr_vdev *vdev);
+
+/**
+ * mlo_reg_mlme_ext_cb() - Function to register mlme extended callbacks
+ * @ctx: Pointer to mlo manager global context
+ * @ops: Pointer to the struct containing the callbacks
+ *
+ * Return: QDF_STATUS_SUCCESS on successful registration else failure
+ */
+QDF_STATUS mlo_reg_mlme_ext_cb(struct mlo_mgr_context *ctx,
+			       struct mlo_mlme_ext_ops *ops);
+
+/**
+ * mlo_unreg_mlme_ext_cb() - Function to unregister mlme extended callbacks
+ * @ctx: Pointer to mlo manager global context
+ *
+ * Return: QDF_STATUS_SUCCESS on success else failure
+ */
+QDF_STATUS mlo_unreg_mlme_ext_cb(struct mlo_mgr_context *ctx);
+
+/**
+ * mlo_mlme_validate_conn_req() - Validate connect request
+ * @vdev: Object manager vdev
+ * @ext_data: Data object to be passed to callback
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS mlo_mlme_validate_conn_req(struct wlan_objmgr_vdev *vdev,
+				      void *ext_data);
+
+/**
+ * mlo_mlme_ext_create_link_vdev() - Create link vdev for ML STA
+ * @vdev: Object manager vdev
+ * @ext_data: Data object to be passed to callback
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS mlo_mlme_create_link_vdev(struct wlan_objmgr_vdev *vdev,
+				     void *ext_data);
+
+/**
+ * mlo_mlme_peer_create() - Create mlo peer
+ * @vdev: Object manager vdev
+ * @ml_peer: MLO peer context
+ * @addr: Peer addr
+ * @frm_buf: Frame buffer for IE processing
+ *
+ * Return: void
+ */
+void mlo_mlme_peer_create(struct wlan_objmgr_vdev *vdev,
+			  struct wlan_mlo_peer_context *ml_peer,
+			  struct qdf_mac_addr addr,
+			  qdf_nbuf_t frm_buf);
+
+/**
+ * mlo_mlme_peer_assoc() - Send ML Peer assoc
+ * @peer: Object manager peer
+ *
+ * Return: void
+ */
+void mlo_mlme_peer_assoc(struct wlan_objmgr_peer *peer);
+
+/**
+ * mlo_mlme_peer_assoc_fail() - Send ML Peer assoc fail
+ * @peer: Object manager peer
+ *
+ * Return: void
+ */
+void mlo_mlme_peer_assoc_fail(struct wlan_objmgr_peer *peer);
+
+/**
+ * mlo_mlme_peer_delete() - Send ML Peer delete
+ * @peer: Object manager peer
+ *
+ * Return: void
+ */
+void mlo_mlme_peer_delete(struct wlan_objmgr_peer *peer);
 #endif

+ 31 - 1
umac/mlo_mgr/inc/wlan_mlo_mgr_public_structs.h

@@ -23,8 +23,11 @@
 #include <wlan_objmgr_cmn.h>
 #include <qdf_list.h>
 #include <qdf_atomic.h>
+#include <qdf_nbuf.h>
 #include <wlan_cmn_ieee80211.h>
 #include <wlan_cmn.h>
+#include <wlan_objmgr_global_obj.h>
+#include <include/wlan_vdev_mlme.h>
 
 /* MAX MLO dev support */
 #define WLAN_UMAC_MLO_MAX_VDEVS 3
@@ -35,6 +38,8 @@
 /* Max PEER support */
 #define MAX_MLO_PEER 512
 
+struct mlo_mlme_ext_ops;
+
 /*
  * struct mlo_setup_info
  * To store the MLO setup related information
@@ -47,6 +52,7 @@ struct mlo_setup_info {
  * @ml_dev_list_lock: ML device list lock
  * @context: Array of MLO device context
  * @info: MLO setup info
+ * @mlme_ops: MLO MLME callback function pointers
  */
 struct mlo_mgr_context {
 #ifdef WLAN_MLO_USE_SPINLOCK
@@ -56,6 +62,7 @@ struct mlo_mgr_context {
 #endif
 	qdf_list_t ml_dev_list;
 	struct mlo_setup_info info;
+	struct mlo_mlme_ext_ops *mlme_ops;
 };
 
 /*
@@ -161,7 +168,7 @@ struct wlan_mlo_link_peer_entry {
  * @primary_umac_psoc_id: Primary UMAC PSOC id
  * @ref_cnt: Reference counter to avoid use after free
  */
-struct mlo_peer_context {
+struct wlan_mlo_peer_context {
 	struct wlan_mlo_link_peer_entry peer_list[MAX_MLO_PEER];
 	uint8_t link_peer_cnt;
 	uint32_t mlo_peer_id;
@@ -204,4 +211,27 @@ struct mlo_partner_info {
 	uint8_t num_partner_links;
 	struct mlo_link_info partner_link_info[WLAN_UMAC_MLO_MAX_VDEVS];
 };
+
+/*
+ * struct mlo_mlme_ext_ops - MLME callback functions
+ * @mlo_mlme_ext_validate_conn_req: Callback to validate connect request
+ * @mlo_mlme_ext_create_link_vdev: Callback to create link vdev for ML STA
+ * @mlo_mlme_ext_peer_create: Callback to create link peer
+ * @mlo_mlme_ext_peer_assoc: Callback to initiate peer assoc
+ * @mlo_mlme_ext_peer_assoc_fail: Callback to notify peer assoc failure
+ * @mlo_mlme_ext_peer_delete: Callback to initiate link peer delete
+ */
+struct mlo_mlme_ext_ops {
+	QDF_STATUS (*mlo_mlme_ext_validate_conn_req)(
+		    struct vdev_mlme_obj *vdev_mlme, void *ext_data);
+	QDF_STATUS (*mlo_mlme_ext_create_link_vdev)(
+		    struct vdev_mlme_obj *vdev_mlme, void *ext_data);
+	void (*mlo_mlme_ext_peer_create)(struct wlan_objmgr_vdev *vdev,
+					 struct wlan_mlo_peer_context *ml_peer,
+					 struct qdf_mac_addr addr,
+					 qdf_nbuf_t frm_buf);
+	void (*mlo_mlme_ext_peer_assoc)(struct wlan_objmgr_peer *peer);
+	void (*mlo_mlme_ext_peer_assoc_fail)(struct wlan_objmgr_peer *peer);
+	void (*mlo_mlme_ext_peer_delete)(struct wlan_objmgr_peer *peer);
+};
 #endif

+ 147 - 0
umac/mlo_mgr/src/wlan_mlo_mgr_cmn.c

@@ -18,6 +18,7 @@
  * DOC: contains MLO manager ap related functionality
  */
 #include "wlan_mlo_mgr_cmn.h"
+#include "wlan_mlo_mgr_main.h"
 
 void mlo_get_link_information(struct qdf_mac_addr *mld_addr,
 			      struct mlo_link_info *info)
@@ -30,3 +31,149 @@ void is_mlo_all_links_up(struct wlan_mlo_dev_context *mldev)
 /* Loop through all the vdev's part of the ML device*/
 /* STA: Loop through all the associated vdev status. */
 }
+
+struct wlan_objmgr_vdev *mlo_get_partner_vdev_by_link_id(
+			struct wlan_objmgr_vdev *vdev,
+			uint8_t link_id)
+{
+	struct wlan_mlo_dev_context *dev_ctx;
+	int i;
+	struct wlan_objmgr_vdev *partner_vdev = NULL;
+
+	if (!vdev || !vdev->mlo_dev_ctx) {
+		mlo_err("Invalid input");
+		return partner_vdev;
+	}
+
+	dev_ctx = vdev->mlo_dev_ctx;
+
+	mlo_dev_lock_acquire(dev_ctx);
+	for (i = 0; i < WLAN_UMAC_MLO_MAX_VDEVS; i++) {
+		if (dev_ctx->wlan_vdev_list[i] &&
+		    wlan_vdev_mlme_is_mlo_vdev(dev_ctx->wlan_vdev_list[i]) &&
+		    dev_ctx->wlan_vdev_list[i]->vdev_mlme.mlo_link_id ==
+		    link_id) {
+			wlan_objmgr_vdev_try_get_ref(dev_ctx->wlan_vdev_list[i],
+						     WLAN_MLO_MGR_ID);
+			partner_vdev = dev_ctx->wlan_vdev_list[i];
+			break;
+		}
+	}
+	mlo_dev_lock_release(dev_ctx);
+
+	return partner_vdev;
+}
+
+void mlo_release_vdev_ref(struct wlan_objmgr_vdev *vdev)
+{
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLO_MGR_ID);
+}
+
+QDF_STATUS mlo_reg_mlme_ext_cb(struct mlo_mgr_context *ctx,
+			       struct mlo_mlme_ext_ops *ops)
+{
+	if (!ctx)
+		return QDF_STATUS_E_FAILURE;
+
+	ctx->mlme_ops = ops;
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS mlo_unreg_mlme_ext_cb(struct mlo_mgr_context *ctx)
+{
+	if (!ctx)
+		return QDF_STATUS_E_FAILURE;
+
+	ctx->mlme_ops = NULL;
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS mlo_mlme_validate_conn_req(struct wlan_objmgr_vdev *vdev,
+				      void *ext_data)
+{
+	struct mlo_mgr_context *mlo_ctx = wlan_objmgr_get_mlo_ctx();
+	struct vdev_mlme_obj *vdev_mlme;
+	QDF_STATUS status;
+
+	if (!mlo_ctx || !mlo_ctx->mlme_ops ||
+	    !mlo_ctx->mlme_ops->mlo_mlme_ext_validate_conn_req)
+		return QDF_STATUS_E_FAILURE;
+
+	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
+	if (!vdev_mlme)
+		return QDF_STATUS_E_FAILURE;
+
+	status =
+		mlo_ctx->mlme_ops->mlo_mlme_ext_validate_conn_req(vdev_mlme,
+								  ext_data);
+	return status;
+}
+
+QDF_STATUS mlo_mlme_create_link_vdev(struct wlan_objmgr_vdev *vdev,
+				     void *ext_data)
+{
+	struct mlo_mgr_context *mlo_ctx = wlan_objmgr_get_mlo_ctx();
+	struct vdev_mlme_obj *vdev_mlme;
+	QDF_STATUS status;
+
+	if (!mlo_ctx || !mlo_ctx->mlme_ops ||
+	    !mlo_ctx->mlme_ops->mlo_mlme_ext_create_link_vdev)
+		return QDF_STATUS_E_FAILURE;
+
+	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
+	if (!vdev_mlme)
+		return QDF_STATUS_E_FAILURE;
+
+	status =
+		mlo_ctx->mlme_ops->mlo_mlme_ext_create_link_vdev(vdev_mlme,
+								 ext_data);
+	return status;
+}
+
+void mlo_mlme_peer_create(struct wlan_objmgr_vdev *vdev,
+			  struct wlan_mlo_peer_context *ml_peer,
+			  struct qdf_mac_addr addr,
+			  qdf_nbuf_t frm_buf)
+{
+	struct mlo_mgr_context *mlo_ctx = wlan_objmgr_get_mlo_ctx();
+
+	if (!mlo_ctx || !mlo_ctx->mlme_ops ||
+	    !mlo_ctx->mlme_ops->mlo_mlme_ext_peer_create)
+		return;
+
+	mlo_ctx->mlme_ops->mlo_mlme_ext_peer_create(vdev, ml_peer,
+						    addr, frm_buf);
+}
+
+void mlo_mlme_peer_assoc(struct wlan_objmgr_peer *peer)
+{
+	struct mlo_mgr_context *mlo_ctx = wlan_objmgr_get_mlo_ctx();
+
+	if (!mlo_ctx || !mlo_ctx->mlme_ops ||
+	    !mlo_ctx->mlme_ops->mlo_mlme_ext_peer_assoc)
+		return;
+
+	mlo_ctx->mlme_ops->mlo_mlme_ext_peer_assoc(peer);
+}
+
+void mlo_mlme_peer_assoc_fail(struct wlan_objmgr_peer *peer)
+{
+	struct mlo_mgr_context *mlo_ctx = wlan_objmgr_get_mlo_ctx();
+
+	if (!mlo_ctx || !mlo_ctx->mlme_ops ||
+	    !mlo_ctx->mlme_ops->mlo_mlme_ext_peer_assoc_fail)
+		return;
+
+	mlo_ctx->mlme_ops->mlo_mlme_ext_peer_assoc_fail(peer);
+}
+
+void mlo_mlme_peer_delete(struct wlan_objmgr_peer *peer)
+{
+	struct mlo_mgr_context *mlo_ctx = wlan_objmgr_get_mlo_ctx();
+
+	if (!mlo_ctx || !mlo_ctx->mlme_ops ||
+	    !mlo_ctx->mlme_ops->mlo_mlme_ext_peer_delete)
+		return;
+
+	mlo_ctx->mlme_ops->mlo_mlme_ext_peer_delete(peer);
+}