[][kernel][mt7988][hnat][Update PPPQ and HQOS coexistense feature]

[Description]
Refactor PPPQ and HQOS coexistense feature.

In our design, users are allowed to assign specific session into HQoS
TXQ using iptables/ebtables mark under PPPQ mode.
However, we have found that this feature is not working in NETSYS_V3.

Without this patch, the users are unable to assign TXQ using the
skb mark under PPPQ mode in NETSYS_V3.

[Release-log]
N/A


Change-Id: I770c52a8a00329e782f48f50b6c7797eb5ada458
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/8203892
diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.h b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.h
index d770db5..8f11a83 100644
--- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.h
+++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.h
@@ -1219,10 +1219,11 @@
 #define UDF_HNAT_PRE_FILLED BIT(4)
 
 #if defined(CONFIG_MEDIATEK_NETSYS_V3)
-#define TPORT_FLAG(dev, skb)				\
+#define TPORT_FLAG(dev, skb, qid)			\
 	((IS_HQOS_UL_MODE && IS_WAN(dev)) ||		\
 	 (IS_HQOS_DL_MODE && IS_LAN_GRP(dev)) ||	\
-	 (IS_PPPQ_MODE && IS_PPPQ_PATH(dev, skb)))
+	 (IS_PPPQ_MODE && (IS_PPPQ_PATH(dev, skb) ||	\
+			   qid >= MAX_PPPQ_PORT_NUM)))
 #endif
 
 extern const struct of_device_id of_hnat_match[];
diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_nf_hook.c b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_nf_hook.c
index 77d2638..7af79ee 100644
--- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_nf_hook.c
+++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_nf_hook.c
@@ -1781,17 +1781,12 @@
 			}
 
 			if (FROM_EXT(skb) || skb_hnat_sport(skb) == NR_QDMA_PORT ||
-			    (IS_PPPQ_MODE && !IS_DSA_LAN(dev) && !IS_DSA_WAN(dev)))
+			    (IS_PPPQ_MODE && (qid < MAX_PPPQ_PORT_NUM) &&
+			     !IS_DSA_LAN(dev) && !IS_DSA_WAN(dev)))
 				entry.ipv4_hnapt.iblk2.fqos = 0;
 			else
 #if defined(CONFIG_MEDIATEK_NETSYS_V3)
-				if ((IS_HQOS_UL_MODE && IS_WAN(dev)) ||
-				    (IS_HQOS_DL_MODE && IS_LAN_GRP(dev)) ||
-				    (IS_PPPQ_MODE &&
-				     IS_PPPQ_PATH(dev, skb)))
-					entry.ipv4_hnapt.tport_id = 1;
-				else
-					entry.ipv4_hnapt.tport_id = 0;
+				entry.ipv4_hnapt.tport_id = TPORT_FLAG(dev, skb, qid) ? 1 : 0;
 #else
 				entry.ipv4_hnapt.iblk2.fqos =
 					(!IS_PPPQ_MODE ||
@@ -1827,21 +1822,25 @@
 			}
 
 			if (FROM_EXT(skb) ||
-			    (IS_PPPQ_MODE && !IS_DSA_LAN(dev) && !IS_DSA_WAN(dev)))
+			    (IS_PPPQ_MODE && (qid < MAX_PPPQ_PORT_NUM) &&
+			     !IS_DSA_LAN(dev) && !IS_DSA_WAN(dev)))
 				entry.ipv6_5t_route.iblk2.fqos = 0;
 			else
 #if defined(CONFIG_MEDIATEK_NETSYS_V3)
 				switch (foe->bfib1.pkt_type) {
 				case IPV4_MAP_E:
 				case IPV4_MAP_T:
-					entry.ipv4_mape.tport_id = TPORT_FLAG(dev, skb) ? 1 : 0;
+					entry.ipv4_mape.tport_id =
+						TPORT_FLAG(dev, skb, qid) ? 1 : 0;
 					break;
 				case IPV6_HNAPT:
 				case IPV6_HNAT:
-					entry.ipv6_hnapt.tport_id = TPORT_FLAG(dev, skb) ? 1 : 0;
+					entry.ipv6_hnapt.tport_id =
+						TPORT_FLAG(dev, skb, qid) ? 1 : 0;
 					break;
 				default:
-					entry.ipv6_5t_route.tport_id = TPORT_FLAG(dev, skb) ? 1 : 0;
+					entry.ipv6_5t_route.tport_id =
+						TPORT_FLAG(dev, skb, qid) ? 1 : 0;
 					break;
 				}
 #else