blob: 72afec4612a16d600f682d27fa0d645b76a286e7 [file] [log] [blame]
developerfd40db22021-04-29 10:08:25 +08001/* SPDX-License-Identifier: GPL-2.0
2 *
3 * Copyright (c) 2019 MediaTek Inc.
4 * Author: Harry Huang <harry.huang@mediatek.com>
5 */
6
7#include <linux/version.h>
8#include <linux/module.h>
9#include <linux/kernel.h>
10#include <linux/types.h>
11#include <linux/skbuff.h>
12#include <net/ra_nat.h>
13
14struct net_device *dst_port[MAX_IF_NUM];
15EXPORT_SYMBOL(dst_port);
16u8 dst_port_type[MAX_IF_NUM];
17EXPORT_SYMBOL(dst_port_type);
18
19struct foe_entry *ppe_virt_foe_base_tmp;
20EXPORT_SYMBOL(ppe_virt_foe_base_tmp);
21struct foe_entry *ppe1_virt_foe_base_tmp;
22EXPORT_SYMBOL(ppe1_virt_foe_base_tmp);
23
24int (*ppe_hook_rx_wifi)(struct sk_buff *skb) = NULL;
25EXPORT_SYMBOL(ppe_hook_rx_wifi);
26int (*ppe_hook_tx_wifi)(struct sk_buff *skb, int gmac_no) = NULL;
27EXPORT_SYMBOL(ppe_hook_tx_wifi);
28
29int (*ppe_hook_rx_modem)(struct sk_buff *skb, u32 cpu_reason, u32 foe_entry_num) = NULL;
30EXPORT_SYMBOL(ppe_hook_rx_modem);
31int (*ppe_hook_tx_modem)(struct sk_buff *skb, u32 net_type, u32 channel_id) = NULL;
32EXPORT_SYMBOL(ppe_hook_tx_modem);
33
34int (*ppe_hook_rx_eth)(struct sk_buff *skb) = NULL;
35EXPORT_SYMBOL(ppe_hook_rx_eth);
36int (*ppe_hook_tx_eth)(struct sk_buff *skb, int gmac_no) = NULL;
37EXPORT_SYMBOL(ppe_hook_tx_eth);
38
39int (*ppe_hook_rx_ext)(struct sk_buff *skb) = NULL;
40EXPORT_SYMBOL(ppe_hook_rx_ext);
41int (*ppe_hook_tx_ext)(struct sk_buff *skb, int gmac_no) = NULL;
42EXPORT_SYMBOL(ppe_hook_tx_ext);
43
44void (*ppe_dev_register_hook)(struct net_device *dev) = NULL;
45EXPORT_SYMBOL(ppe_dev_register_hook);
46void (*ppe_dev_unregister_hook)(struct net_device *dev) = NULL;
47EXPORT_SYMBOL(ppe_dev_unregister_hook);
48
49void hwnat_magic_tag_set_zero(struct sk_buff *skb)
50{
51 if ((FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_PCI) ||
52 (FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_WLAN) ||
53 (FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_GE)) {
54 if (IS_SPACE_AVAILABLE_HEAD(skb))
55 FOE_MAGIC_TAG_HEAD(skb) = 0;
56 }
57 if ((FOE_MAGIC_TAG_TAIL(skb) == FOE_MAGIC_PCI) ||
58 (FOE_MAGIC_TAG_TAIL(skb) == FOE_MAGIC_WLAN) ||
59 (FOE_MAGIC_TAG_TAIL(skb) == FOE_MAGIC_GE)) {
60 if (IS_SPACE_AVAILABLE_TAIL(skb))
61 FOE_MAGIC_TAG_TAIL(skb) = 0;
62 }
63}
64EXPORT_SYMBOL(hwnat_magic_tag_set_zero);
65
66void hwnat_check_magic_tag(struct sk_buff *skb)
67{
68 if (IS_SPACE_AVAILABLE_HEAD(skb)) {
69 FOE_MAGIC_TAG_HEAD(skb) = 0;
70 FOE_AI_HEAD(skb) = UN_HIT;
71 }
72 if (IS_SPACE_AVAILABLE_TAIL(skb)) {
73 FOE_MAGIC_TAG_TAIL(skb) = 0;
74 FOE_AI_TAIL(skb) = UN_HIT;
75 }
76}
77EXPORT_SYMBOL(hwnat_check_magic_tag);
78
79void hwnat_set_headroom_zero(struct sk_buff *skb)
80{
81 if (skb->cloned != 1) {
82 if (IS_MAGIC_TAG_PROTECT_VALID_HEAD(skb) ||
83 (FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_PPE)) {
84 if (IS_SPACE_AVAILABLE_HEAD(skb))
85 memset(FOE_INFO_START_ADDR_HEAD(skb), 0,
86 FOE_INFO_LEN);
87 }
88 }
89}
90EXPORT_SYMBOL(hwnat_set_headroom_zero);
91
92void hwnat_set_tailroom_zero(struct sk_buff *skb)
93{
94 if (skb->cloned != 1) {
95 if (IS_MAGIC_TAG_PROTECT_VALID_TAIL(skb) ||
96 (FOE_MAGIC_TAG_TAIL(skb) == FOE_MAGIC_PPE)) {
97 if (IS_SPACE_AVAILABLE_TAIL(skb))
98 memset(FOE_INFO_START_ADDR_TAIL(skb), 0,
99 FOE_INFO_LEN);
100 }
101 }
102}
103EXPORT_SYMBOL(hwnat_set_tailroom_zero);
104
105void hwnat_copy_headroom(u8 *data, struct sk_buff *skb)
106{
107 memcpy(data, skb->head, FOE_INFO_LEN);
108}
109EXPORT_SYMBOL(hwnat_copy_headroom);
110
111void hwnat_copy_tailroom(u8 *data, int size, struct sk_buff *skb)
112{
113 memcpy((data + size - FOE_INFO_LEN),
114 (skb_end_pointer(skb) - FOE_INFO_LEN),
115 FOE_INFO_LEN);
116}
117EXPORT_SYMBOL(hwnat_copy_tailroom);
118
119void hwnat_setup_dma_ops(struct device *dev, bool coherent)
120{
121 arch_setup_dma_ops(dev, 0, 0, NULL, coherent);
122}
123EXPORT_SYMBOL(hwnat_setup_dma_ops);
124