ソースを参照

qcacmn: Add flag WLAN_VDEV_FEXT2_MLO_STA_TDLS

Add a flag WLAN_VDEV_FEXT2_MLO_STA_TDLS to mark whether
the vdev is used for TDLS or not.
It can use these API:
wlan_vdev_mlme_feat_ext2_cap_set(vdev, WLAN_VDEV_FEXT2_MLO_STA_TDLS);
wlan_vdev_mlme_feat_ext2_cap_clear(vdev, WLAN_VDEV_FEXT2_MLO_STA_TDLS);
tdls_vdev = mlo_get_tdls_link_vdev().

Change-Id: I89c50ad5321013993e798ebb5549c5015ac18969
CRs-Fixed: 3435963
Paul Zhang 2 年 前
コミット
2859ea85d1

+ 11 - 0
umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h

@@ -168,6 +168,8 @@
 #define WLAN_VDEV_FEXT2_MLO_MCAST           0x00000004
 	/* 20TU BCAST PROBE RESP on 6G SAP*/
 #define WLAN_VDEV_FEXT2_20TU_PRB_RESP       0x00000008
+	/* STA VDEV is TDLS link type */
+#define WLAN_VDEV_FEXT2_MLO_STA_TDLS        0x00000010
 
 /* VDEV OP flags  */
   /* if the vap destroyed by user */
@@ -1618,6 +1620,15 @@ static inline bool wlan_vdev_mlme_is_ap(struct wlan_objmgr_vdev *vdev)
  */
 bool wlan_vdev_mlme_is_mlo_vdev(struct wlan_objmgr_vdev *vdev);
 
+/**
+ * wlan_vdev_mlme_is_tdls_vdev() - Determine whether the given vdev is tdls MLO
+ * vdev or not
+ * @vdev: VDEV object
+ *
+ * Return: True if it is tdls MLO, otherwise false.
+ */
+bool wlan_vdev_mlme_is_tdls_vdev(struct wlan_objmgr_vdev *vdev);
+
 /**
  * wlan_vdev_mlme_is_mlo_ap() - whether it is mlo ap or not
  * @vdev: VDEV object

+ 22 - 0
umac/cmn_services/obj_mgr/src/wlan_objmgr_vdev_obj.c

@@ -1475,6 +1475,28 @@ QDF_STATUS wlan_vdev_get_bss_peer_mld_mac(struct wlan_objmgr_vdev *vdev,
 	return QDF_STATUS_SUCCESS;
 }
 
+bool wlan_vdev_mlme_is_tdls_vdev(struct wlan_objmgr_vdev *vdev)
+{
+	bool is_tdls_vdev;
+
+	if (!vdev) {
+		obj_mgr_err("vdev is NULL");
+		return false;
+	}
+
+	wlan_acquire_vdev_mlo_lock(vdev);
+
+	is_tdls_vdev =
+		wlan_vdev_mlme_feat_ext2_cap_get(vdev,
+						 WLAN_VDEV_FEXT2_MLO_STA_TDLS);
+
+	wlan_release_vdev_mlo_lock(vdev);
+
+	return is_tdls_vdev;
+}
+
+qdf_export_symbol(wlan_vdev_mlme_is_tdls_vdev);
+
 bool wlan_vdev_mlme_is_mlo_vdev(struct wlan_objmgr_vdev *vdev)
 {
 	bool is_mlo_vdev;

+ 9 - 0
umac/mlo_mgr/inc/wlan_mlo_mgr_sta.h

@@ -164,6 +164,15 @@ bool ucfg_mlo_is_mld_connected(struct wlan_objmgr_vdev *vdev);
 void ucfg_mlo_mld_clear_mlo_cap(struct wlan_objmgr_vdev *vdev);
 #endif
 
+/**
+ * wlan_mlo_get_tdls_link_vdev() - API to get tdls link vdev
+ * @vdev: vdev object
+ *
+ * Return: MLD tdls link vdev
+ */
+struct wlan_objmgr_vdev *
+wlan_mlo_get_tdls_link_vdev(struct wlan_objmgr_vdev *vdev);
+
 /**
  * ucfg_mlo_get_assoc_link_vdev - API to get assoc link vdev
  * @vdev: vdev object

+ 35 - 0
umac/mlo_mgr/src/wlan_mlo_mgr_sta.c

@@ -83,6 +83,41 @@ mlo_free_connect_ies(struct wlan_cm_connect_req *connect_req)
 	}
 }
 
+/*
+ * mlo_get_tdls_link_vdev() - API to get tdls link vdev
+ * @mlo_dev_ctx: pointer to mlo dev context
+ *
+ * Return: MLD tdls link vdev
+ */
+static inline struct wlan_objmgr_vdev *
+mlo_get_tdls_link_vdev(struct wlan_mlo_dev_context *mlo_dev_ctx)
+{
+	uint8_t i = 0;
+
+	if (!mlo_dev_ctx)
+		return NULL;
+
+	for (i =  0; i < WLAN_UMAC_MLO_MAX_VDEVS; i++) {
+		if (!mlo_dev_ctx->wlan_vdev_list[i])
+			continue;
+
+		if (wlan_vdev_mlme_is_tdls_vdev(mlo_dev_ctx->wlan_vdev_list[i]))
+			return mlo_dev_ctx->wlan_vdev_list[i];
+	}
+	return NULL;
+}
+
+struct wlan_objmgr_vdev *
+wlan_mlo_get_tdls_link_vdev(struct wlan_objmgr_vdev *vdev)
+{
+	struct wlan_mlo_dev_context *mlo_dev_ctx = vdev->mlo_dev_ctx;
+
+	if (!mlo_dev_ctx || !wlan_vdev_mlme_is_mlo_vdev(vdev))
+		return NULL;
+
+	return mlo_get_tdls_link_vdev(mlo_dev_ctx);
+}
+
 /*
  * mlo_get_assoc_link_vdev - API to get assoc link vdev
  *