[][Add sanity check for HNAT binding flow]

[Description]
Add sanity check for HNAT binding flow.

It's known that HNAT binding path can be divided into two parts:
    1. skb_to_hnat_info(): fill basic acceleration information
			   of a rate-reach session.
    2. mtk_sw_nat_hook_tx(): fill WiFi Tx related information
		    if the session is routed to WiFi stations.

These two functions are called in sequential order.
So it's unnecessary to process the second part if the first one
is not properly completed.

[Release-log]
N/A

Change-Id: I20414572f96407369829d1702335c902a46d0447
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/4995189
diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.c
index 642f204..ea3ff92 100755
--- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -1476,6 +1476,7 @@
 			*(u32 *)(skb->head) = trxd.rxd4;
 
 		skb_hnat_alg(skb) = 0;
+		skb_hnat_filled(skb) = 0;
 		skb_hnat_magic_tag(skb) = HNAT_MAGIC_TAG;
 
 		if (skb_hnat_reason(skb) == HIT_BIND_FORCE_TO_CPU) {
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 7f2dfb6..9863f13 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
@@ -1547,6 +1547,7 @@
 		       0, sizeof(struct mib_entry));
 
 	wmb();
+	skb_hnat_filled(skb) = HNAT_INFO_FILLED;
 
 	return 0;
 }
@@ -1556,7 +1557,8 @@
 	struct foe_entry *entry;
 	struct ethhdr *eth;
 
-	if (skb_hnat_alg(skb) || !is_magic_tag_valid(skb) || !IS_SPACE_AVAILABLE_HEAD(skb))
+	if (skb_hnat_alg(skb) || !is_hnat_info_filled(skb) ||
+	    !is_magic_tag_valid(skb) || !IS_SPACE_AVAILABLE_HEAD(skb))
 		return NF_ACCEPT;
 
 	trace_printk(
@@ -1586,8 +1588,15 @@
 	eth = eth_hdr(skb);
 
 	/*not bind multicast if PPE mcast not enable*/
-	if (!hnat_priv->data->mcast && is_multicast_ether_addr(eth->h_dest))
-		return NF_ACCEPT;
+	if (!hnat_priv->data->mcast) {
+		if (is_multicast_ether_addr(eth->h_dest))
+			return NF_ACCEPT;
+
+		if (IS_IPV4_GRP(entry))
+			entry->ipv4_hnapt.iblk2.mcast = 0;
+		else
+			entry->ipv6_5t_route.iblk2.mcast = 0;
+	}
 
 	/* Some mt_wifi virtual interfaces, such as apcli,
 	 * will change the smac for specail purpose.
@@ -1703,6 +1712,7 @@
 	}
 
 	skb_hnat_alg(skb) = 0;
+	skb_hnat_filled(skb) = 0;
 	skb_hnat_magic_tag(skb) = HNAT_MAGIC_TAG;
 
 	if (skb_hnat_iface(skb) == FOE_MAGIC_WED0)
diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/nf_hnat_mtk.h b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/nf_hnat_mtk.h
index a7ae954..0493337 100644
--- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/nf_hnat_mtk.h
+++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/nf_hnat_mtk.h
@@ -26,7 +26,7 @@
 #if defined(CONFIG_MEDIATEK_NETSYS_V2)
 struct hnat_desc {
 	u32 entry : 15;
-	u32 resv0 : 3;
+	u32 filled : 3;
 	u32 crsn : 5;
 	u32 resv1 : 3;
 	u32 sport : 4;
@@ -47,7 +47,8 @@
 	u32 sport : 4;
 	u32 alg : 1;
 	u32 iface : 4;
-	u32 resv : 4;
+	u32 filled : 3;
+	u32 resv : 1;
 	u32 magic_tag_protect : 16;
 	u32 wdmaid : 8;
 	u32 rxid : 2;
@@ -64,6 +65,7 @@
 #endif
 
 #define HNAT_MAGIC_TAG 0x6789
+#define HNAT_INFO_FILLED 0x7
 #define WIFI_INFO_LEN 3
 #define FOE_INFO_LEN (10 + WIFI_INFO_LEN)
 #define IS_SPACE_AVAILABLE_HEAD(skb)                                           \
@@ -76,6 +78,7 @@
 #define skb_hnat_sport(skb) (((struct hnat_desc *)(skb->head))->sport)
 #define skb_hnat_alg(skb) (((struct hnat_desc *)(skb->head))->alg)
 #define skb_hnat_iface(skb) (((struct hnat_desc *)(skb->head))->iface)
+#define skb_hnat_filled(skb) (((struct hnat_desc *)(skb->head))->filled)
 #define skb_hnat_magic_tag(skb) (((struct hnat_desc *)((skb)->head))->magic_tag_protect)
 #define skb_hnat_wdma_id(skb) (((struct hnat_desc *)((skb)->head))->wdmaid)
 #define skb_hnat_rx_id(skb) (((struct hnat_desc *)((skb)->head))->rxid)
@@ -89,6 +92,7 @@
 #define clr_from_extge(skb) (HNAT_SKB_CB2(skb)->magic = 0x0)
 #define set_to_ppe(skb) (HNAT_SKB_CB2(skb)->magic = 0x78681415)
 #define is_from_extge(skb) (HNAT_SKB_CB2(skb)->magic == 0x78786688)
+#define is_hnat_info_filled(skb) (skb_hnat_filled(skb) == HNAT_INFO_FILLED)
 #define is_magic_tag_valid(skb) (skb_hnat_magic_tag(skb) == HNAT_MAGIC_TAG)
 #define set_from_mape(skb) (HNAT_SKB_CB2(skb)->magic = 0x78787788)
 #define is_from_mape(skb) (HNAT_SKB_CB2(skb)->magic == 0x78787788)