Browse Source

qcacld-3.0: Avoid ARP and NS offloads for MLO partner links

In case of MLO connection, whenever firmware receives
enable or disable ARP/NS offload request from host on any vdev,
firmware enables/disables ARP/NS offload for all MLO vdevs.

So, during system resume though host sends disable ARP offload
only for MLO partner link vdev, firmware disables ARP offload
for all MLO vdevs. But during system suspend, as host is unaware
of ARP offload disabled on all vdevs, it will not send enable ARP
offload request to firmware. Because of this, all ARP requests are
forwarded to host instead of firmware in suspend mode.

To address this issue, add logic in host to avoid ARP/NS offload
requests for MLO partner link vdevs.

Change-Id: I1ffe503911705a41be26e44d1db6d15a5988e34d
CRs-Fixed: 3295050
Aditya Kodukula 2 years ago
parent
commit
87db27184b

+ 7 - 0
components/pmo/core/src/wlan_pmo_arp.c

@@ -231,6 +231,13 @@ QDF_STATUS pmo_core_arp_check_offload(struct wlan_objmgr_psoc *psoc,
 		return QDF_STATUS_E_INVAL;
 	}
 
+	if (wlan_vdev_mlme_get_is_mlo_link(psoc, vdev_id)) {
+		pmo_debug("ARP offload not supported for MLO partner link "
+			  "with vdev_id[%d]", vdev_id);
+		wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
+		return QDF_STATUS_E_INVAL;
+	}
+
 	vdev_ctx = pmo_vdev_get_priv(vdev);
 	psoc_ctx = vdev_ctx->pmo_psoc_ctx;
 

+ 7 - 0
components/pmo/core/src/wlan_pmo_ns.c

@@ -269,6 +269,13 @@ QDF_STATUS pmo_core_ns_check_offload(struct wlan_objmgr_psoc *psoc,
 		return QDF_STATUS_E_INVAL;
 	}
 
+	if (wlan_vdev_mlme_get_is_mlo_link(psoc, vdev_id)) {
+		pmo_debug("NS offload not supported for MLO partner link "
+			  "with vdev_id[%d]", vdev_id);
+		wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
+		return QDF_STATUS_E_INVAL;
+	}
+
 	vdev_ctx = pmo_vdev_get_priv(vdev);
 	psoc_ctx = vdev_ctx->pmo_psoc_ctx;
 

+ 4 - 0
core/hdd/src/wlan_hdd_power.c

@@ -1306,6 +1306,8 @@ void hdd_enable_arp_offload(struct hdd_adapter *adapter,
 	struct in_ifaddr *ifa;
 	struct wlan_objmgr_vdev *vdev;
 
+	hdd_enter();
+
 	arp_req = qdf_mem_malloc(sizeof(*arp_req));
 	if (!arp_req)
 		return;
@@ -1524,6 +1526,8 @@ void hdd_disable_arp_offload(struct hdd_adapter *adapter,
 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
 	struct wlan_objmgr_vdev *vdev;
 
+	hdd_enter();
+
 	status = ucfg_pmo_check_arp_offload(hdd_ctx->psoc, trigger,
 					    adapter->vdev_id);
 	if (status != QDF_STATUS_SUCCESS) {