[Bugfix][API-1415] merge MTK hwnat patch

Only Configure: No
Affected branch: GSW3.0-No-Connman
Affected module: ethernet
Is it affected on both ZXIC and MTK: only MTK
Self-test: No
Doc Update: No

Change-Id: Ifda159aed9c922e459442d341dd6ccfe41cbafbf
diff --git a/src/kernel/linux/v4.19/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/src/kernel/linux/v4.19/drivers/net/ethernet/mediatek/mtk_eth_soc.c
index aa4453b..709b7c9 100755
--- a/src/kernel/linux/v4.19/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/src/kernel/linux/v4.19/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -916,21 +916,8 @@
 	/* set the forward port */
 	fport = (mac->id + 1) << TX_DMA_FPORT_SHIFT;
 #if defined(CONFIG_HW_NAT)
-	if (IS_MAGIC_TAG_PROTECT_VALID_HEAD(skb)) {
-		if (FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_PPE) {
-			if (ppe_hook_rx_eth) {
-				fport = (3 << TX_DMA_FPORT_SHIFT);
-				FOE_MAGIC_TAG(skb) = 0;
-			}
-		}
-	} else if (IS_MAGIC_TAG_PROTECT_VALID_TAIL(skb)) {
-		if (FOE_MAGIC_TAG_TAIL(skb) == FOE_MAGIC_PPE) {
-			if (ppe_hook_rx_eth) {
-				fport = (3 << TX_DMA_FPORT_SHIFT);
-				FOE_MAGIC_TAG(skb) = 0;
-			}
-		}
-	}
+	if (ppe_hook_tx_eth_fport && ppe_hook_tx_eth_fport(skb))
+		fport = (3 << TX_DMA_FPORT_SHIFT);
 #endif
 	txd4 |= fport;
 
diff --git a/src/kernel/linux/v4.19/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/src/kernel/linux/v4.19/drivers/net/ethernet/mediatek/mtk_eth_soc.h
index 745ec1c..bcfe59c 100644
--- a/src/kernel/linux/v4.19/drivers/net/ethernet/mediatek/mtk_eth_soc.h
+++ b/src/kernel/linux/v4.19/drivers/net/ethernet/mediatek/mtk_eth_soc.h
@@ -1180,6 +1180,7 @@
 #if defined(CONFIG_HW_NAT)
 extern int (*ppe_hook_rx_eth)(struct sk_buff *skb);
 extern int (*ppe_hook_tx_eth)(struct sk_buff *skb, int gmac_no);
+extern int (*ppe_hook_tx_eth_fport)(struct sk_buff *skb);
 extern void (*ppe_dev_register_hook)(struct net_device *dev);
 extern void (*ppe_dev_unregister_hook)(struct net_device *dev);
 #endif
diff --git a/src/kernel/linux/v4.19/include/net/ra_nat.h b/src/kernel/linux/v4.19/include/net/ra_nat.h
index 189e119..5b715e8 100644
--- a/src/kernel/linux/v4.19/include/net/ra_nat.h
+++ b/src/kernel/linux/v4.19/include/net/ra_nat.h
@@ -224,7 +224,9 @@
 #define FOE_MAGIC_EDMARX	    0x85
 #define FOE_MAGIC_RNDIS		    0x86
 #define FOE_MAGIC_SNPS		    0x87
-#define TAG_PROTECT                 0x6789
+#define FOE_MAGIC_VALID(num)	    ((num >= FOE_MAGIC_PCI) && (num <= FOE_MAGIC_SNPS))
+
+#define TAG_PROTECT                 0xDEAD
 #define USE_HEAD_ROOM               0
 #define USE_TAIL_ROOM               1
 #define USE_CB                      2
@@ -427,23 +429,7 @@
 	(FOE_MAGIC_TAG_CB(skb) == FOE_MAGIC_RNDIS))
 
 /* macros */
-#define magic_tag_set_zero(skb) \
-{ \
-	if ((FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_PCI) || \
-	    (FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_WLAN) || \
-	    (FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_RNDIS) || \
-	    (FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_GE)) { \
-		if (IS_SPACE_AVAILABLE_HEAD(skb)) \
-			FOE_MAGIC_TAG_HEAD(skb) = 0; \
-	} \
-	if ((FOE_MAGIC_TAG_TAIL(skb) == FOE_MAGIC_PCI) || \
-	    (FOE_MAGIC_TAG_TAIL(skb) == FOE_MAGIC_WLAN) || \
-	    (FOE_MAGIC_TAG_TAIL(skb) == FOE_MAGIC_RNDIS) || \
-	    (FOE_MAGIC_TAG_TAIL(skb) == FOE_MAGIC_GE)) { \
-		if (IS_SPACE_AVAILABLE_TAIL(skb)) \
-			FOE_MAGIC_TAG_TAIL(skb) = 0; \
-	} \
-}
+#define magic_tag_set_zero(skb) hwnat_magic_tag_set_zero(skb)
 
 static inline void hwnat_set_l2tp_unhit(struct iphdr *iph, struct sk_buff *skb)
 {
diff --git a/src/kernel/linux/v4.19/net/nat/foe_hook/hook_ext.c b/src/kernel/linux/v4.19/net/nat/foe_hook/hook_ext.c
index 85a3482..5fad032 100644
--- a/src/kernel/linux/v4.19/net/nat/foe_hook/hook_ext.c
+++ b/src/kernel/linux/v4.19/net/nat/foe_hook/hook_ext.c
@@ -41,6 +41,8 @@
 EXPORT_SYMBOL(ppe_hook_rx_eth);
 int (*ppe_hook_tx_eth)(struct sk_buff *skb, int gmac_no) = NULL;
 EXPORT_SYMBOL(ppe_hook_tx_eth);
+int (*ppe_hook_tx_eth_fport)(struct sk_buff *skb) = NULL;
+EXPORT_SYMBOL(ppe_hook_tx_eth_fport);
 
 int (*ppe_hook_rx_ext)(struct sk_buff *skb) = NULL;
 EXPORT_SYMBOL(ppe_hook_rx_ext);
@@ -76,16 +78,26 @@
 	if ((FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_PCI) ||
 	    (FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_WLAN) ||
 	    (FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_GE) ||
+	    (FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_WED0) ||
+	    (FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_WED1) ||
+	    (FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_MED) ||
 	    (FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_RNDIS)) {
-		if (IS_SPACE_AVAILABLE_HEAD(skb))
+		if (IS_SPACE_AVAILABLE_HEAD(skb)) {
 			FOE_MAGIC_TAG_HEAD(skb) = 0;
+			FOE_TAG_PROTECT_HEAD(skb) = 0;
+		}
 	}
 	if ((FOE_MAGIC_TAG_TAIL(skb) == FOE_MAGIC_PCI) ||
 	    (FOE_MAGIC_TAG_TAIL(skb) == FOE_MAGIC_WLAN) ||
 	    (FOE_MAGIC_TAG_TAIL(skb) == FOE_MAGIC_GE) ||
+	    (FOE_MAGIC_TAG_TAIL(skb) == FOE_MAGIC_WED0) ||
+	    (FOE_MAGIC_TAG_TAIL(skb) == FOE_MAGIC_WED1) ||
+	    (FOE_MAGIC_TAG_TAIL(skb) == FOE_MAGIC_MED) ||
 	    (FOE_MAGIC_TAG_TAIL(skb) == FOE_MAGIC_RNDIS)) {
-		if (IS_SPACE_AVAILABLE_TAIL(skb))
+		if (IS_SPACE_AVAILABLE_TAIL(skb)) {
 			FOE_MAGIC_TAG_TAIL(skb) = 0;
+			FOE_TAG_PROTECT_TAIL(skb) = 0;
+		}
 	}
 }
 EXPORT_SYMBOL(hwnat_magic_tag_set_zero);
@@ -94,7 +106,7 @@
 {
 	if (IS_SPACE_AVAILABLE_HEAD(skb)) {
 		FOE_MAGIC_TAG_HEAD(skb) = 0;
-		FOE_AI_HEAD(skb) = UN_HIT;
+		FOE_AI(skb) = UN_HIT;
 	}
 	if (IS_SPACE_AVAILABLE_TAIL(skb)) {
 		FOE_MAGIC_TAG_TAIL(skb) = 0;