[][MAC80211][hnat][Fix issue of PPE entry deletion by enhancing roaming handler]

[Description]
Fix issue of PPE entry deletion by enhancing roaming handler.

Added condition to check if the PPE entry src/dest port is WDMA,
without this patch, in test center scenario, the PPE entries may be
deleted unexpectedly by roaming handler even if the traffic is
not related to WiFi.

[Release-log]
N/A


Change-Id: I1ffdf064b39629907202825f30660a1de064fe7b
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/9616093
diff --git a/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3025-flow-offload-add-mtkhnat-roaming.patch b/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3025-flow-offload-add-mtkhnat-roaming.patch
index 85030dc..ecd063c 100644
--- a/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3025-flow-offload-add-mtkhnat-roaming.patch
+++ b/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3025-flow-offload-add-mtkhnat-roaming.patch
@@ -1,21 +1,21 @@
-From cbd7e4c840a459f14434bcc82a3e4af5673f9b3d Mon Sep 17 00:00:00 2001
-From: Bo-Cun Chen <bc-bocun.chen@mediatek.com>
-Date: Wed, 5 Jun 2024 13:22:08 +0800
+From 1173eb589ef1676ccae92d669e98e7a4716aa323 Mon Sep 17 00:00:00 2001
+From: "chak-kei.lam" <chak-kei.lam@mediatek.com>
+Date: Tue, 10 Sep 2024 14:56:41 +0800
 Subject: [PATCH] flow offload add mtkhnat roaming
 
 ---
  drivers/net/ethernet/mediatek/mtk_eth_soc.c   |   8 +
  drivers/net/ethernet/mediatek/mtk_eth_soc.h   |   4 +
- drivers/net/ethernet/mediatek/mtk_ppe.c       | 171 ++++++++++++++++++
+ drivers/net/ethernet/mediatek/mtk_ppe.c       | 191 ++++++++++++++++++
  drivers/net/ethernet/mediatek/mtk_ppe.h       |   2 +
- .../net/ethernet/mediatek/mtk_ppe_debugfs.c   |  55 ++++++
- 5 files changed, 240 insertions(+)
+ .../net/ethernet/mediatek/mtk_ppe_debugfs.c   |  55 +++++
+ 5 files changed, 260 insertions(+)
 
 diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-index 2ae6370..7ac034d 100644
+index 72fb677..60994c5 100644
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -4055,6 +4055,12 @@ static int mtk_open(struct net_device *dev)
+@@ -4233,6 +4233,12 @@ static int mtk_open(struct net_device *dev)
  		if (err)
  			return err;
  
@@ -28,7 +28,7 @@
  
  		/* Indicates CDM to parse the MTK special tag from CPU */
  		if (netdev_uses_dsa(dev)) {
-@@ -4233,6 +4239,8 @@ static int mtk_stop(struct net_device *dev)
+@@ -4420,6 +4426,8 @@ static int mtk_stop(struct net_device *dev)
  	if (eth->soc->offload_version) {
  		for (i = 0; i < eth->ppe_num; i++)
  			mtk_ppe_stop(eth->ppe[i]);
@@ -38,10 +38,10 @@
  
  	return 0;
 diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-index 5d66707..fcba486 100644
+index dc0530c..81111b0 100644
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-@@ -1983,10 +1983,14 @@ struct mtk_eth {
+@@ -2008,10 +2008,14 @@ struct mtk_eth {
  	struct notifier_block		netdevice_notifier;
  	struct timer_list		mtk_dma_monitor_timer;
  
@@ -57,7 +57,7 @@
  
  /* struct mtk_mac -	the structure that holds the info about the MACs of the
 diff --git a/drivers/net/ethernet/mediatek/mtk_ppe.c b/drivers/net/ethernet/mediatek/mtk_ppe.c
-index 547b5a0..fa1992f 100644
+index 7aa9a8c..eb701ad 100644
 --- a/drivers/net/ethernet/mediatek/mtk_ppe.c
 +++ b/drivers/net/ethernet/mediatek/mtk_ppe.c
 @@ -10,6 +10,7 @@
@@ -68,7 +68,7 @@
  #include "mtk_eth_soc.h"
  #include "mtk_ppe.h"
  #include "mtk_ppe_regs.h"
-@@ -519,6 +520,28 @@ bool mtk_foe_entry_match(struct mtk_foe_entry *entry, struct mtk_foe_entry *data
+@@ -510,6 +511,28 @@ bool mtk_foe_entry_match(struct mtk_foe_entry *entry, struct mtk_foe_entry *data
  	return !memcmp(&entry->data, &data->data, len - 4);
  }
  
@@ -96,13 +96,32 @@
 +
  int mtk_foe_entry_set_sp(struct mtk_ppe *ppe, struct mtk_foe_entry *entry)
  {
- 	struct mtk_foe_entry *hwe;
-@@ -1114,3 +1137,151 @@ int mtk_ppe_stop(struct mtk_ppe *ppe)
+ 	struct mtk_eth *eth = ppe->eth;
+@@ -1136,3 +1159,171 @@ int mtk_ppe_stop(struct mtk_ppe *ppe)
  
  	return 0;
  }
 +
-+int mtk_flow_offload_teardown_by_mac(struct mtk_ppe *ppe, u8 *mac)
++static int
++mtk_ppe_check_wdma_path(struct mtk_eth *eth, struct mtk_foe_entry *foe)
++{
++	u32 sp, winfo;
++	u32 *ib2;
++
++	ib2 = mtk_foe_entry_ib2(foe);
++	sp = mtk_get_ib1_sp(eth, foe);
++	winfo = FIELD_GET(MTK_FOE_IB2_WDMA_WINFO, *ib2);
++
++	if (winfo || (sp == PSE_WDMA0_PORT ||
++		      sp == PSE_WDMA1_PORT ||
++		      sp == PSE_WDMA2_PORT))
++		return 1;
++
++	return 0;
++}
++
++static int
++mtk_flow_offload_teardown_by_roaming(struct mtk_ppe *ppe, u8 *mac)
 +{
 +	struct mtk_eth *eth = ppe->eth;
 +	int i, j, count = 0;
@@ -113,7 +132,8 @@
 +		int type, state;
 +
 +		state = FIELD_GET(MTK_FOE_IB1_STATE, entry->ib1);
-+		if (state != MTK_FOE_STATE_BIND || !mtk_foe_mac_match(entry, mac))
++		if (state != MTK_FOE_STATE_BIND || !mtk_foe_mac_match(entry, mac) ||
++		    !mtk_ppe_check_wdma_path(eth, entry))
 +			continue;
 +
 +		memset(&tuple, 0, sizeof(tuple));
@@ -191,7 +211,7 @@
 +		if (nla_type(nla) == NDA_LLADDR) {
 +			memcpy(mac, nla_data(nla), ETH_ALEN);
 +			for (i = 0; i < eth->ppe_num; i++)
-+				mtk_flow_offload_teardown_by_mac(eth->ppe[i], mac);
++				mtk_flow_offload_teardown_by_roaming(eth->ppe[i], mac);
 +			if (eth->debug_level >= 6)
 +				pr_info("mtk_ppe: the neighbor (%pM) has been updated\n", mac);
 +		}
@@ -250,11 +270,11 @@
 +	return 0;
 +}
 diff --git a/drivers/net/ethernet/mediatek/mtk_ppe.h b/drivers/net/ethernet/mediatek/mtk_ppe.h
-index 66c7f10..31ca702 100644
+index 38a3776..c74deae 100644
 --- a/drivers/net/ethernet/mediatek/mtk_ppe.h
 +++ b/drivers/net/ethernet/mediatek/mtk_ppe.h
-@@ -384,6 +384,8 @@ struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, int versio
- 			     int accounting);
+@@ -381,6 +381,8 @@ struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, int index)
+ void mtk_ppe_deinit(struct mtk_eth *eth);
  int mtk_ppe_start(struct mtk_ppe *ppe);
  int mtk_ppe_stop(struct mtk_ppe *ppe);
 +int mtk_ppe_roaming_start(struct mtk_eth *eth);
@@ -263,7 +283,7 @@
  void __mtk_ppe_check_skb(struct mtk_ppe *ppe, struct sk_buff *skb, u16 hash);
  
 diff --git a/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c b/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c
-index d713e2e..a97c1d7 100644
+index 40da60f..3d3a7f2 100644
 --- a/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c
 +++ b/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c
 @@ -206,6 +206,52 @@ mtk_ppe_debugfs_foe_open_bind(struct inode *inode, struct file *file)
@@ -343,5 +363,5 @@
  	return 0;
  }
 -- 
-2.18.0
+2.45.2