developer | fd40db2 | 2021-04-29 10:08:25 +0800 | [diff] [blame] | 1 | /* 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])) |
| 22 | struct hnat_skb_cb2 { |
| 23 | __u32 magic; |
| 24 | }; |
| 25 | |
developer | d35bbcc | 2022-09-28 22:46:01 +0800 | [diff] [blame] | 26 | #if defined(CONFIG_MEDIATEK_NETSYS_V3) |
developer | fd40db2 | 2021-04-29 10:08:25 +0800 | [diff] [blame] | 27 | struct hnat_desc { |
| 28 | u32 entry : 15; |
developer | fdfe157 | 2021-09-13 16:56:33 +0800 | [diff] [blame] | 29 | u32 filled : 3; |
developer | fd40db2 | 2021-04-29 10:08:25 +0800 | [diff] [blame] | 30 | u32 crsn : 5; |
| 31 | u32 resv1 : 3; |
| 32 | u32 sport : 4; |
| 33 | u32 resv2 : 1; |
| 34 | u32 alg : 1; |
developer | e567ad3 | 2021-05-25 17:16:17 +0800 | [diff] [blame] | 35 | u32 iface : 8; |
developer | fd40db2 | 2021-04-29 10:08:25 +0800 | [diff] [blame] | 36 | u32 wdmaid : 2; |
| 37 | u32 rxid : 2; |
developer | d35bbcc | 2022-09-28 22:46:01 +0800 | [diff] [blame] | 38 | 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; |
developer | 8ecd51b | 2023-03-13 11:28:28 +0800 | [diff] [blame] | 50 | #elif defined(CONFIG_MEDIATEK_NETSYS_RX_V2) |
developer | d35bbcc | 2022-09-28 22:46:01 +0800 | [diff] [blame] | 51 | struct 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; |
developer | fd40db2 | 2021-04-29 10:08:25 +0800 | [diff] [blame] | 62 | u32 wcid : 10; |
| 63 | u32 bssid : 6; |
developer | e567ad3 | 2021-05-25 17:16:17 +0800 | [diff] [blame] | 64 | u32 resv5 : 20; |
| 65 | u32 magic_tag_protect : 16; |
developer | fd40db2 | 2021-04-29 10:08:25 +0800 | [diff] [blame] | 66 | } __packed; |
| 67 | #else |
| 68 | struct hnat_desc { |
| 69 | u32 entry : 14; |
| 70 | u32 crsn : 5; |
| 71 | u32 sport : 4; |
| 72 | u32 alg : 1; |
developer | 8ecd51b | 2023-03-13 11:28:28 +0800 | [diff] [blame] | 73 | u32 iface : 8; |
developer | fdfe157 | 2021-09-13 16:56:33 +0800 | [diff] [blame] | 74 | u32 filled : 3; |
| 75 | u32 resv : 1; |
developer | fd40db2 | 2021-04-29 10:08:25 +0800 | [diff] [blame] | 76 | u32 magic_tag_protect : 16; |
| 77 | u32 wdmaid : 8; |
| 78 | u32 rxid : 2; |
developer | 8ecd51b | 2023-03-13 11:28:28 +0800 | [diff] [blame] | 79 | u32 wcid : 10; |
developer | fd40db2 | 2021-04-29 10:08:25 +0800 | [diff] [blame] | 80 | u32 bssid : 6; |
| 81 | } __packed; |
| 82 | #endif |
| 83 | |
developer | fd40db2 | 2021-04-29 10:08:25 +0800 | [diff] [blame] | 84 | #define HQOS_MAGIC_TAG 0x5678 |
developer | 2494820 | 2021-11-24 17:38:27 +0800 | [diff] [blame] | 85 | #define HAS_HQOS_MAGIC_TAG(skb) (qos_toggle && skb->protocol == HQOS_MAGIC_TAG) |
developer | fd40db2 | 2021-04-29 10:08:25 +0800 | [diff] [blame] | 86 | |
| 87 | #define HNAT_MAGIC_TAG 0x6789 |
developer | fdfe157 | 2021-09-13 16:56:33 +0800 | [diff] [blame] | 88 | #define HNAT_INFO_FILLED 0x7 |
developer | d35bbcc | 2022-09-28 22:46:01 +0800 | [diff] [blame] | 89 | #define WIFI_INFO_LEN 6 |
developer | fd40db2 | 2021-04-29 10:08:25 +0800 | [diff] [blame] | 90 | #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) |
developer | fdfe157 | 2021-09-13 16:56:33 +0800 | [diff] [blame] | 101 | #define skb_hnat_filled(skb) (((struct hnat_desc *)(skb->head))->filled) |
developer | fd40db2 | 2021-04-29 10:08:25 +0800 | [diff] [blame] | 102 | #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) |
developer | d35bbcc | 2022-09-28 22:46:01 +0800 | [diff] [blame] | 107 | #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)) |
developer | e8b7dfa | 2023-04-20 10:16:44 +0800 | [diff] [blame^] | 123 | #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 | |
developer | e567ad3 | 2021-05-25 17:16:17 +0800 | [diff] [blame] | 133 | #define do_ext2ge_fast_try(dev, skb) \ |
| 134 | ((skb_hnat_iface(skb) == FOE_MAGIC_EXT) && !is_from_extge(skb)) |
developer | fd40db2 | 2021-04-29 10:08:25 +0800 | [diff] [blame] | 135 | #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) |
developer | fdfe157 | 2021-09-13 16:56:33 +0800 | [diff] [blame] | 139 | #define is_hnat_info_filled(skb) (skb_hnat_filled(skb) == HNAT_INFO_FILLED) |
developer | fd40db2 | 2021-04-29 10:08:25 +0800 | [diff] [blame] | 140 | #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 | |
developer | 659fdeb | 2022-12-01 23:03:07 +0800 | [diff] [blame] | 172 | #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 | |
developer | fd40db2 | 2021-04-29 10:08:25 +0800 | [diff] [blame] | 176 | u32 hnat_tx(struct sk_buff *skb); |
| 177 | u32 hnat_set_skb_info(struct sk_buff *skb, u32 *rxd); |
| 178 | u32 hnat_reg(struct net_device *, void __iomem *); |
| 179 | u32 hnat_unreg(void); |
| 180 | |
| 181 | #endif |