Jelajahi Sumber

qcacld-3.0: Inform frame via assoc link net device even in other interface

As per single netdev design, if the frame is received on the
on link vdev then retrieve assoc link net device and use that
to send the frame to userspace.

Change-Id: I85b2f7363cfb237877ca945c9b627f2bf89d0f54
CRs-Fixed: 3272194
Deeksha Gupta 2 tahun lalu
induk
melakukan
cbf711498e
2 mengubah file dengan 31 tambahan dan 4 penghapusan
  1. 16 2
      os_if/p2p/src/wlan_cfg80211_p2p.c
  2. 15 2
      os_if/tdls/src/wlan_cfg80211_tdls.c

+ 16 - 2
os_if/p2p/src/wlan_cfg80211_p2p.c

@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -33,6 +34,7 @@
 #include <wlan_osif_priv.h>
 #include "wlan_cfg80211.h"
 #include "wlan_cfg80211_p2p.h"
+#include "wlan_mlo_mgr_sta.h"
 
 #define MAX_NO_OF_2_4_CHANNELS 14
 #define MAX_OFFCHAN_TIME_FOR_DNBS 150
@@ -50,9 +52,10 @@ static void wlan_p2p_rx_callback(void *user_data,
 	struct p2p_rx_mgmt_frame *rx_frame)
 {
 	struct wlan_objmgr_psoc *psoc;
-	struct wlan_objmgr_vdev *vdev;
+	struct wlan_objmgr_vdev *vdev, *assoc_vdev;
 	struct vdev_osif_priv *osif_priv;
 	struct wireless_dev *wdev;
+	enum QDF_OPMODE opmode;
 
 	psoc = user_data;
 	if (!psoc) {
@@ -67,7 +70,18 @@ static void wlan_p2p_rx_callback(void *user_data,
 		return;
 	}
 
-	osif_priv = wlan_vdev_get_ospriv(vdev);
+	assoc_vdev = vdev;
+	opmode = wlan_vdev_mlme_get_opmode(assoc_vdev);
+
+	if (opmode == QDF_STA_MODE && wlan_vdev_mlme_is_mlo_vdev(vdev)) {
+		assoc_vdev = ucfg_mlo_get_assoc_link_vdev(vdev);
+		if (!assoc_vdev) {
+			osif_err("Assoc vdev is NULL");
+			goto fail;
+		}
+	}
+
+	osif_priv = wlan_vdev_get_ospriv(assoc_vdev);
 	if (!osif_priv) {
 		osif_err("osif_priv is null");
 		goto fail;

+ 15 - 2
os_if/tdls/src/wlan_cfg80211_tdls.c

@@ -38,6 +38,7 @@
 #include "sir_api.h"
 #include "wlan_tdls_ucfg_api.h"
 #include "wlan_cm_roam_api.h"
+#include "wlan_mlo_mgr_sta.h"
 
 #define TDLS_MAX_NO_OF_2_4_CHANNELS 14
 
@@ -660,9 +661,10 @@ void wlan_cfg80211_tdls_rx_callback(void *user_data,
 	struct tdls_rx_mgmt_frame *rx_frame)
 {
 	struct wlan_objmgr_psoc *psoc;
-	struct wlan_objmgr_vdev *vdev;
+	struct wlan_objmgr_vdev *vdev, *assoc_vdev;
 	struct vdev_osif_priv *osif_priv;
 	struct wireless_dev *wdev;
+	enum QDF_OPMODE opmode;
 
 	psoc = user_data;
 	if (!psoc) {
@@ -677,7 +679,18 @@ void wlan_cfg80211_tdls_rx_callback(void *user_data,
 		return;
 	}
 
-	osif_priv = wlan_vdev_get_ospriv(vdev);
+	assoc_vdev = vdev;
+	opmode = wlan_vdev_mlme_get_opmode(vdev);
+
+	if (opmode == QDF_STA_MODE && wlan_vdev_mlme_is_mlo_vdev(vdev)) {
+		assoc_vdev = ucfg_mlo_get_assoc_link_vdev(vdev);
+		if (!assoc_vdev) {
+			osif_err("assoc vdev is null");
+			goto fail;
+		}
+	}
+
+	osif_priv = wlan_vdev_get_ospriv(assoc_vdev);
 	if (!osif_priv) {
 		osif_err("osif_priv is null");
 		goto fail;