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