[][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