blob: d9eba8dcc200f1e11e11c75d6f3136409b8c19d2 [file] [log] [blame]
developerfd40db22021-04-29 10:08:25 +08001/* This program is free software; you can redistribute it and/or modify
2 * it under the terms of the GNU General Public License as published by
3 * the Free Software Foundation; version 2 of the License
4 *
5 * This program is distributed in the hope that it will be useful,
6 * but WITHOUT ANY WARRANTY; without even the implied warranty of
7 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8 * GNU General Public License for more details.
9 *
10 * Copyright (C) 2014-2016 Sean Wang <sean.wang@mediatek.com>
11 * Copyright (C) 2016-2017 John Crispin <blogic@openwrt.org>
12 */
13
14#ifndef NF_HNAT_MTK_H
15#define NF_HNAT_MTK_H
16
17#include <linux/dma-mapping.h>
18#include <linux/netdevice.h>
19#include "../mtk_eth_soc.h"
20
21#define HNAT_SKB_CB2(__skb) ((struct hnat_skb_cb2 *)&((__skb)->cb[44]))
22struct hnat_skb_cb2 {
23 __u32 magic;
24};
25
developerd35bbcc2022-09-28 22:46:01 +080026#if defined(CONFIG_MEDIATEK_NETSYS_V3)
developerfd40db22021-04-29 10:08:25 +080027struct hnat_desc {
28 u32 entry : 15;
developerfdfe1572021-09-13 16:56:33 +080029 u32 filled : 3;
developerfd40db22021-04-29 10:08:25 +080030 u32 crsn : 5;
31 u32 resv1 : 3;
32 u32 sport : 4;
33 u32 resv2 : 1;
34 u32 alg : 1;
developere567ad32021-05-25 17:16:17 +080035 u32 iface : 8;
developerfd40db22021-04-29 10:08:25 +080036 u32 wdmaid : 2;
37 u32 rxid : 2;
developerd35bbcc2022-09-28 22:46:01 +080038 u32 wcid : 16;
39 u32 bssid : 8;
40 u32 usr_info : 16;
41 u32 tid : 4;
42 u32 is_fixedrate : 1;
43 u32 is_prior : 1;
44 u32 is_sp : 1;
45 u32 hf : 1;
46 u32 amsdu : 1;
47 u32 resv3 : 19;
48 u32 magic_tag_protect : 16;
49} __packed;
developer8ecd51b2023-03-13 11:28:28 +080050#elif defined(CONFIG_MEDIATEK_NETSYS_RX_V2)
developerd35bbcc2022-09-28 22:46:01 +080051struct hnat_desc {
52 u32 entry : 15;
53 u32 filled : 3;
54 u32 crsn : 5;
55 u32 resv1 : 3;
56 u32 sport : 4;
57 u32 resv2 : 1;
58 u32 alg : 1;
59 u32 iface : 8;
60 u32 wdmaid : 2;
61 u32 rxid : 2;
developerfd40db22021-04-29 10:08:25 +080062 u32 wcid : 10;
63 u32 bssid : 6;
developere567ad32021-05-25 17:16:17 +080064 u32 resv5 : 20;
65 u32 magic_tag_protect : 16;
developerfd40db22021-04-29 10:08:25 +080066} __packed;
67#else
68struct hnat_desc {
69 u32 entry : 14;
70 u32 crsn : 5;
71 u32 sport : 4;
72 u32 alg : 1;
developer8ecd51b2023-03-13 11:28:28 +080073 u32 iface : 8;
developerfdfe1572021-09-13 16:56:33 +080074 u32 filled : 3;
75 u32 resv : 1;
developerfd40db22021-04-29 10:08:25 +080076 u32 magic_tag_protect : 16;
77 u32 wdmaid : 8;
78 u32 rxid : 2;
developer8ecd51b2023-03-13 11:28:28 +080079 u32 wcid : 10;
developerfd40db22021-04-29 10:08:25 +080080 u32 bssid : 6;
81} __packed;
82#endif
83
developerfd40db22021-04-29 10:08:25 +080084#define HQOS_MAGIC_TAG 0x5678
developer24948202021-11-24 17:38:27 +080085#define HAS_HQOS_MAGIC_TAG(skb) (qos_toggle && skb->protocol == HQOS_MAGIC_TAG)
developerfd40db22021-04-29 10:08:25 +080086
87#define HNAT_MAGIC_TAG 0x6789
developerfdfe1572021-09-13 16:56:33 +080088#define HNAT_INFO_FILLED 0x7
developerd35bbcc2022-09-28 22:46:01 +080089#define WIFI_INFO_LEN 6
developerfd40db22021-04-29 10:08:25 +080090#define FOE_INFO_LEN (10 + WIFI_INFO_LEN)
91#define IS_SPACE_AVAILABLE_HEAD(skb) \
92 ((((skb_headroom(skb) >= FOE_INFO_LEN) ? 1 : 0)))
93
94#define skb_hnat_info(skb) ((struct hnat_desc *)(skb->head))
95#define skb_hnat_magic(skb) (((struct hnat_desc *)(skb->head))->magic)
96#define skb_hnat_reason(skb) (((struct hnat_desc *)(skb->head))->crsn)
97#define skb_hnat_entry(skb) (((struct hnat_desc *)(skb->head))->entry)
98#define skb_hnat_sport(skb) (((struct hnat_desc *)(skb->head))->sport)
99#define skb_hnat_alg(skb) (((struct hnat_desc *)(skb->head))->alg)
100#define skb_hnat_iface(skb) (((struct hnat_desc *)(skb->head))->iface)
developerfdfe1572021-09-13 16:56:33 +0800101#define skb_hnat_filled(skb) (((struct hnat_desc *)(skb->head))->filled)
developerfd40db22021-04-29 10:08:25 +0800102#define skb_hnat_magic_tag(skb) (((struct hnat_desc *)((skb)->head))->magic_tag_protect)
103#define skb_hnat_wdma_id(skb) (((struct hnat_desc *)((skb)->head))->wdmaid)
104#define skb_hnat_rx_id(skb) (((struct hnat_desc *)((skb)->head))->rxid)
105#define skb_hnat_wc_id(skb) (((struct hnat_desc *)((skb)->head))->wcid)
106#define skb_hnat_bss_id(skb) (((struct hnat_desc *)((skb)->head))->bssid)
developerd35bbcc2022-09-28 22:46:01 +0800107#define skb_hnat_usr_info(skb) (((struct hnat_desc *)((skb)->head))->usr_info)
108#define skb_hnat_tid(skb) (((struct hnat_desc *)((skb)->head))->tid)
109#define skb_hnat_is_fixedrate(skb) \
110 (((struct hnat_desc *)((skb)->head))->is_fixedrate)
111#define skb_hnat_is_prior(skb) (((struct hnat_desc *)((skb)->head))->is_prior)
112#define skb_hnat_is_sp(skb) (((struct hnat_desc *)((skb)->head))->is_sp)
113#define skb_hnat_hf(skb) (((struct hnat_desc *)((skb)->head))->hf)
114#define skb_hnat_amsdu(skb) (((struct hnat_desc *)((skb)->head))->amsdu)
115#define skb_hnat_ppe2(skb) \
116 ((skb_hnat_iface(skb) == FOE_MAGIC_GE_LAN2 || \
117 skb_hnat_iface(skb) == FOE_MAGIC_WED2) && CFG_PPE_NUM == 3)
118#define skb_hnat_ppe1(skb) \
119 ((skb_hnat_iface(skb) == FOE_MAGIC_GE_WAN && CFG_PPE_NUM == 3) || \
120 (skb_hnat_iface(skb) == FOE_MAGIC_WED1 && CFG_PPE_NUM > 1))
121#define skb_hnat_ppe(skb) \
122 (skb_hnat_ppe2(skb) ? 2 : (skb_hnat_ppe1(skb) ? 1 : 0))
developere8b7dfa2023-04-20 10:16:44 +0800123#define headroom_iface(h) (h.iface)
124#define headroom_ppe1(h) \
125 ((headroom_iface(h) == FOE_MAGIC_GE_LAN2 || \
126 headroom_iface(h) == FOE_MAGIC_WED2) && CFG_PPE_NUM == 3)
127#define headroom_ppe2(h) \
128 ((headroom_iface(h) == FOE_MAGIC_GE_LAN2 || \
129 headroom_iface(h) == FOE_MAGIC_WED2) && CFG_PPE_NUM == 3)
130#define headroom_ppe(h) \
131 (headroom_ppe2(h) ? 2 : (headroom_ppe1(h) ? 1 : 0))
132
developere567ad32021-05-25 17:16:17 +0800133#define do_ext2ge_fast_try(dev, skb) \
134 ((skb_hnat_iface(skb) == FOE_MAGIC_EXT) && !is_from_extge(skb))
developerfd40db22021-04-29 10:08:25 +0800135#define set_from_extge(skb) (HNAT_SKB_CB2(skb)->magic = 0x78786688)
136#define clr_from_extge(skb) (HNAT_SKB_CB2(skb)->magic = 0x0)
137#define set_to_ppe(skb) (HNAT_SKB_CB2(skb)->magic = 0x78681415)
138#define is_from_extge(skb) (HNAT_SKB_CB2(skb)->magic == 0x78786688)
developerfdfe1572021-09-13 16:56:33 +0800139#define is_hnat_info_filled(skb) (skb_hnat_filled(skb) == HNAT_INFO_FILLED)
developerfd40db22021-04-29 10:08:25 +0800140#define is_magic_tag_valid(skb) (skb_hnat_magic_tag(skb) == HNAT_MAGIC_TAG)
141#define set_from_mape(skb) (HNAT_SKB_CB2(skb)->magic = 0x78787788)
142#define is_from_mape(skb) (HNAT_SKB_CB2(skb)->magic == 0x78787788)
143#define is_unreserved_port(hdr) \
144 ((ntohs(hdr->source) > 1023) && (ntohs(hdr->dest) > 1023))
145
146#define TTL_0 0x02
147#define HAS_OPTION_HEADER 0x03
148#define NO_FLOW_IS_ASSIGNED 0x07
149#define IPV4_WITH_FRAGMENT 0x08
150#define IPV4_HNAPT_DSLITE_WITH_FRAGMENT 0x09
151#define IPV4_HNAPT_DSLITE_WITHOUT_TCP_UDP 0x0A
152#define IPV6_5T_6RD_WITHOUT_TCP_UDP 0x0B
153#define TCP_FIN_SYN_RST \
154 0x0C /* Ingress packet is TCP fin/syn/rst (for IPv4 NAPT/DS-Lite or IPv6 5T-route/6RD) */
155#define UN_HIT 0x0D /* FOE Un-hit */
156#define HIT_UNBIND 0x0E /* FOE Hit unbind */
157#define HIT_UNBIND_RATE_REACH 0x0F
158#define HIT_BIND_TCP_FIN 0x10
159#define HIT_BIND_TTL_1 0x11
160#define HIT_BIND_WITH_VLAN_VIOLATION 0x12
161#define HIT_BIND_KEEPALIVE_UC_OLD_HDR 0x13
162#define HIT_BIND_KEEPALIVE_MC_NEW_HDR 0x14
163#define HIT_BIND_KEEPALIVE_DUP_OLD_HDR 0x15
164#define HIT_BIND_FORCE_TO_CPU 0x16
165#define HIT_BIND_WITH_OPTION_HEADER 0x17
166#define HIT_BIND_MULTICAST_TO_CPU 0x18
167#define HIT_BIND_MULTICAST_TO_GMAC_CPU 0x19
168#define HIT_PRE_BIND 0x1A
169#define HIT_BIND_PACKET_SAMPLING 0x1B
170#define HIT_BIND_EXCEED_MTU 0x1C
171
developer659fdeb2022-12-01 23:03:07 +0800172#define TPORT_ID(x) ((x) & GENMASK(3, 0))
173#define TOPS_ENTRY(x) ((x) & GENMASK(5, 0))
174#define CDRT_ID(x) ((x) & GENMASK(7, 0))
175
developerfd40db22021-04-29 10:08:25 +0800176u32 hnat_tx(struct sk_buff *skb);
177u32 hnat_set_skb_info(struct sk_buff *skb, u32 *rxd);
178u32 hnat_reg(struct net_device *, void __iomem *);
179u32 hnat_unreg(void);
180
181#endif