blob: 83412a48199a20cf01398402459f6aa3830fb809 [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#ifndef _RA_NAT_WANTED
8#define _RA_NAT_WANTED
9
10#include <linux/ip.h>
11#include <linux/ipv6.h>
12
13
14#ifndef NEXTHDR_IPIP
15#define NEXTHDR_IPIP 4
16#endif
17
18#define hwnat_vlan_tx_tag_present(__skb) ((__skb)->vlan_tci & VLAN_TAG_PRESENT)
19#define hwnat_vlan_tag_get(__skb) ((__skb)->vlan_tci & ~VLAN_TAG_PRESENT)
20
21#if defined(CONFIG_HW_NAT)
22extern void hwnat_magic_tag_set_zero(struct sk_buff *skb);
23extern void hwnat_check_magic_tag(struct sk_buff *skb);
24extern void hwnat_set_headroom_zero(struct sk_buff *skb);
25extern void hwnat_set_tailroom_zero(struct sk_buff *skb);
26extern void hwnat_copy_headroom(u8 *data, struct sk_buff *skb);
27extern void hwnat_copy_tailroom(u8 *data, int size, struct sk_buff *skb);
28extern void hwnat_setup_dma_ops(struct device *dev, bool coherent);
29#else
30
31static inline void hwnat_magic_tag_set_zero(struct sk_buff *skb)
32{
33}
34
35static inline void hwnat_check_magic_tag(struct sk_buff *skb)
36{
37}
38
39static inline void hwnat_set_headroom_zero(struct sk_buff *skb)
40{
41}
42
43static inline void hwnat_set_tailroom_zero(struct sk_buff *skb)
44{
45}
46
47static inline void hwnat_copy_headroom(u8 *data, struct sk_buff *skb)
48{
49}
50
51static inline void hwnat_copy_tailroom(u8 *data, int size, struct sk_buff *skb)
52{
53}
54
55#endif
56enum foe_cpu_reason {
57 TTL_0 = 0x02, /* IPv4(IPv6) TTL(hop limit) = 0 */
58 /* IPv4(IPv6) has option(extension) header */
59 HAS_OPTION_HEADER = 0x03,
60 NO_FLOW_IS_ASSIGNED = 0x07, /* No flow is assigned */
61 /* IPv4 HNAT doesn't support IPv4 /w fragment */
62 IPV4_WITH_FRAGMENT = 0x08,
63 /* IPv4 HNAPT/DS-Lite doesn't support IPv4 /w fragment */
64 IPV4_HNAPT_DSLITE_WITH_FRAGMENT = 0x09,
65 /* IPv4 HNAPT/DS-Lite can't find TCP/UDP sport/dport */
66 IPV4_HNAPT_DSLITE_WITHOUT_TCP_UDP = 0x0A,
67 /* IPv6 5T-route/6RD can't find TCP/UDP sport/dport */
68 IPV6_5T_6RD_WITHOUT_TCP_UDP = 0x0B,
69 /* Ingress packet is TCP fin/syn/rst */
70 /*(for IPv4 NAPT/DS-Lite or IPv6 5T-route/6RD) */
71 TCP_FIN_SYN_RST = 0x0C,
72 UN_HIT = 0x0D, /* FOE Un-hit */
73 HIT_UNBIND = 0x0E, /* FOE Hit unbind */
74 /* FOE Hit unbind & rate reach */
75 HIT_UNBIND_RATE_REACH = 0x0F,
76 HIT_BIND_TCP_FIN = 0x10, /* Hit bind PPE TCP FIN entry */
77 /* Hit bind PPE entry and TTL(hop limit) = 1 */
78 /* and TTL(hot limit) - 1 */
79 HIT_BIND_TTL_1 = 0x11,
80 /* Hit bind and VLAN replacement violation */
81 /*(Ingress 1(0) VLAN layers and egress 4(3 or 4) VLAN layers) */
82 HIT_BIND_WITH_VLAN_VIOLATION = 0x12,
83 /* Hit bind and keep alive with unicast old-header packet */
84 HIT_BIND_KEEPALIVE_UC_OLD_HDR = 0x13,
85 /* Hit bind and keep alive with multicast new-header packet */
86 HIT_BIND_KEEPALIVE_MC_NEW_HDR = 0x14,
87 /* Hit bind and keep alive with duplicate old-header packet */
88 HIT_BIND_KEEPALIVE_DUP_OLD_HDR = 0x15,
89 /* FOE Hit bind & force to CPU */
90 HIT_BIND_FORCE_TO_CPU = 0x16,
91 /* Hit bind and remove tunnel IP header, */
92 /* but inner IP has option/next header */
93 HIT_BIND_WITH_OPTION_HEADER = 0x17,
94 /* Hit bind and exceed MTU */
95 HIT_BIND_EXCEED_MTU = 0x1C,
96 HIT_BIND_PACKET_SAMPLING = 0x1B, /* PS packet */
97 /* Switch clone multicast packet to CPU */
98 HIT_BIND_MULTICAST_TO_CPU = 0x18,
99 /* Switch clone multicast packet to GMAC1 & CPU */
100 HIT_BIND_MULTICAST_TO_GMAC_CPU = 0x19,
101 HIT_PRE_BIND = 0x1A /* Pre-bind */
102};
103
104#define MAX_IF_NUM 64
105
106struct dmad_rx_descinfo4 {
107 uint32_t foe_entry_num:15;
108 uint32_t rsv0:3;
109 uint32_t CRSN:5;
110 uint32_t rsv1:3;
111 uint32_t SPORT:4;
112 uint32_t ppe:1;
113 uint32_t ALG:1;
114 uint32_t IF:8;
115 uint32_t WDMAID:2;
116 uint32_t RXID:2;
117 uint32_t WCID:10;
118 uint32_t BSSID:6;
119 uint32_t rsv3:4;
120 uint16_t minfo:1;
121 uint16_t ntype:3;
122 uint16_t chid:8;
123 uint16_t rsv4:4;
124 u16 MAGIC_TAG_PROTECT;
125} __packed;
126
127struct pdma_rx_desc_info4 {
128 u16 MAGIC_TAG_PROTECT;
129 uint32_t foe_entry_num:14;
130 uint32_t CRSN:5;
131 uint32_t SPORT:4;
132 uint32_t rsv:6;
133 uint32_t foe_entry_num_1:1;
134 uint32_t ppe:1;
135 uint32_t ALG:1;
136 uint32_t IF:8;
137 uint32_t WDMAID:2;
138 uint32_t RXID:2;
139 uint32_t WCID:10;
140 uint32_t BSSID:6;
141 uint32_t rsv2:4;
142 uint16_t minfo:1;
143 uint16_t ntype:3;
144 uint16_t chid:8;
145 uint16_t rsv3:4;
146#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP)
147 u16 SOURCE;
148 u16 DEST;
149#endif
150} __packed;
151
developer72d7e362021-07-08 19:29:25 +0800152#if defined(CONFIG_MEDIATEK_NETSYS_V2)
developerfd40db22021-04-29 10:08:25 +0800153struct head_rx_descinfo4 {
154 uint32_t foe_entry_num:14;
155 uint32_t CRSN:5;
156 uint32_t SPORT:4;
157 uint32_t rsv:6;
158 uint32_t foe_entry_num_1:1;
159 uint32_t ppe:1;
160 uint32_t ALG:1;
161 uint32_t IF:8;
162 uint32_t WDMAID:2;
163 uint32_t RXID:2;
164 uint32_t WCID:10;
165 uint32_t BSSID:6;
166 uint32_t rsv2:4;
167 uint16_t minfo:1;
168 uint16_t ntype:3;
169 uint16_t chid:8;
170 uint16_t rsv3:4;
171#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP)
172 u16 SOURCE;
173 u16 DEST;
174#endif
175 u16 MAGIC_TAG_PROTECT;
176} __packed;
developer72d7e362021-07-08 19:29:25 +0800177#else
178struct head_rx_descinfo4 {
179 uint32_t foe_entry_num:14;
180 uint32_t CRSN:5;
181 uint32_t SPORT:3;
182 uint32_t rsv:1;
183 uint32_t ALG:1;
184 uint32_t IF:4;
185 uint32_t rsv2:4;
186 uint32_t MAGIC_TAG_PROTECT: 16;
187 uint32_t WDMAID:2;
188 uint32_t RXID:2;
189 uint32_t WCID:10;
190 uint32_t BSSID:6;
191#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP)
192 u16 SOURCE;
193 u16 DEST;
194#endif
195} __packed;
196#endif
developerfd40db22021-04-29 10:08:25 +0800197
198struct cb_rx_desc_info4 {
199 u16 MAGIC_TAG_PROTECT0;
200 uint32_t foe_entry_num:15;
201 uint32_t CRSN:5;
202 uint32_t SPORT:4;
203 uint32_t ALG:1;
204 uint32_t rsv:7;
205 uint16_t IF:8;
206 uint16_t WDMAID:2;
207 uint16_t RXID:2;
208 uint16_t WCID:10;
209 uint16_t BSSID:6;
210 uint16_t rsv1:4;
211 uint16_t minfo:1;
212 uint16_t ntype:3;
213 uint16_t chid:8;
214 uint16_t rsv2:4;
215#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP)
216 u16 SOURCE;
217 u16 DEST;
218#endif
219 u16 MAGIC_TAG_PROTECT1;
220} __packed;
221
222
223
224#define FOE_INFO_LEN 12
225#define WIFI_INFO_LEN 6
226
227
228#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP)
229#define FOE_INFO_LEN (6 + 4 + WIFI_INFO_LEN)
230#define FOE_MAGIC_FASTPATH 0x77
231#define FOE_MAGIC_L2TPPATH 0x78
232#endif
233
234#define FOE_MAGIC_PCI 0x73
235#define FOE_MAGIC_WLAN 0x74
236#define FOE_MAGIC_GE 0x75
237#define FOE_MAGIC_PPE 0x76
238#define FOE_MAGIC_WED0 0x78
239#define FOE_MAGIC_WED1 0x79
240#define FOE_MAGIC_MED 0x80
241#define FOE_MAGIC_EDMA0 0x81
242#define FOE_MAGIC_EDMA1 0x82
243#define TAG_PROTECT 0x6789
244#define USE_HEAD_ROOM 0
245#define USE_TAIL_ROOM 1
246#define USE_CB 2
247#define ALL_INFO_ERROR 3
248
249/**************************DMAD FORMAT********************************/
250#define FOE_TAG_PROTECT(skb) \
251 (((struct dmad_rx_descinfo4 *)((skb)->head))->MAGIC_TAG_PROTECT)
252
253#define FOE_ENTRY_NUM(skb) \
254 (((struct dmad_rx_descinfo4 *)((skb)->head))->foe_entry_num)
255#define FOE_ALG(skb) \
256 (((struct dmad_rx_descinfo4 *)((skb)->head))->ALG)
257#define FOE_AI(skb) \
258 (((struct dmad_rx_descinfo4 *)((skb)->head))->CRSN)
259#define FOE_SP(skb) \
260 (((struct dmad_rx_descinfo4 *)((skb)->head))->SPORT)
261#define FOE_MAGIC_TAG(skb) \
262 (((struct dmad_rx_descinfo4 *)((skb)->head))->IF)
263#define FOE_WDMA_ID(skb) \
264 (((struct dmad_rx_descinfo4 *)((skb)->head))->WDMAID)
265#define FOE_RX_ID(skb) (((struct dmad_rx_descinfo4 *)((skb)->head))->RXID)
266#define FOE_WC_ID(skb) (((struct dmad_rx_descinfo4 *)((skb)->head))->WCID)
267#define FOE_BSS_ID(skb) (((struct dmad_rx_descinfo4 *)((skb)->head))->BSSID)
268#define FOE_PPE(skb) (((struct dmad_rx_descinfo4 *)((skb)->head))->ppe)
269
270/***********************HEAD FORMAT*************************************/
271
272#define FOE_TAG_PROTECT_HEAD(skb) \
273 (((struct head_rx_descinfo4 *)((skb)->head))->MAGIC_TAG_PROTECT)
274#define FOE_ENTRY_NUM_LSB_HEAD(skb) \
275 (((struct head_rx_descinfo4 *)((skb)->head))->foe_entry_num)
276#define FOE_ENTRY_NUM_MSB_HEAD(skb) \
277 (((struct head_rx_descinfo4 *)((skb)->head))->foe_entry_num_1)
278
279#define FOE_ENTRY_NUM_HEAD(skb) \
280 (((FOE_ENTRY_NUM_MSB_HEAD(skb) & 0x1) << 14) | FOE_ENTRY_NUM_LSB_HEAD(skb))
281
282
283#define FOE_ALG_HEAD(skb) \
284 (((struct head_rx_descinfo4 *)((skb)->head))->ALG)
285#define FOE_AI_HEAD(skb) \
286 (((struct head_rx_descinfo4 *)((skb)->head))->CRSN)
287#define FOE_SP_HEAD(skb) \
288 (((struct head_rx_descinfo4 *)((skb)->head))->SPORT)
289#define FOE_MAGIC_TAG_HEAD(skb) \
290 (((struct head_rx_descinfo4 *)((skb)->head))->IF)
291
292
293#define FOE_WDMA_ID_HEAD(skb) \
294 (((struct head_rx_descinfo4 *)((skb)->head))->WDMAID)
295#define FOE_RX_ID_HEAD(skb) \
296 (((struct head_rx_descinfo4 *)((skb)->head))->RXID)
297#define FOE_WC_ID_HEAD(skb) \
298 (((struct head_rx_descinfo4 *)((skb)->head))->WCID)
299#define FOE_BSS_ID_HEAD(skb) \
300 (((struct head_rx_descinfo4 *)((skb)->head))->BSSID)
301#define FOE_PPE_HEAD(skb) \
302 (((struct head_rx_descinfo4 *)((skb)->head))->PPE)
303
304/****************************TAIL FORMAT***************************************/
305#define FOE_TAG_PROTECT_TAIL(skb) \
306 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->MAGIC_TAG_PROTECT)
307#define FOE_ENTRY_NUM_LSB_TAIL(skb) \
308 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->foe_entry_num)
309
310#define FOE_ENTRY_NUM_MSB_TAIL(skb) \
311 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->foe_entry_num_1)
312#define FOE_ENTRY_NUM_TAIL(skb) \
313 (((FOE_ENTRY_NUM_MSB_TAIL(skb) & 0x1) << 14) | FOE_ENTRY_NUM_LSB_TAIL(skb))
314#define FOE_ALG_TAIL(skb) \
315 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->ALG)
316#define FOE_AI_TAIL(skb) \
317 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->CRSN)
318#define FOE_SP_TAIL(skb) \
319 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->SPORT)
320#define FOE_MAGIC_TAG_TAIL(skb) \
321 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->IF)
322
323#define FOE_WDMA_ID_TAIL(skb) \
324 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->WDMAID)
325#define FOE_RX_ID_TAIL(skb) \
326 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->RXID)
327#define FOE_WC_ID_TAIL(skb) \
328 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->WCID)
329#define FOE_BSS_ID_TAIL(skb) \
330 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->BSSID)
331
332#define FOE_PPE_TAIL(skb) \
333 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->ppe)
334/*********************************************************************/
335#define FOE_WDMA_ID_CB(skb) \
336 (((struct cb_rx_desc_info4 *)((skb)->head))->WDMAID)
337#define FOE_RX_ID_CB(skb) \
338 (((struct cb_rx_desc_info4 *)((skb)->head))->RXID)
339#define FOE_WC_ID_CB(skb) \
340 (((struct cb_rx_desc_info4 *)((skb)->head))->WCID)
341#define FOE_BSS_ID_CB(skb) \
342 (((struct cb_rx_desc_info4 *)((skb)->head))->BSSID)
343
344#define FOE_MINFO(skb) (((struct head_rx_descinfo4 *)((skb)->head))->minfo)
345#define FOE_MINFO_NTYPE(skb) (((struct head_rx_descinfo4 *)((skb)->head))->ntype)
346#define FOE_MINFO_CHID(skb) (((struct head_rx_descinfo4 *)((skb)->head))->chid)
347#define FOE_MINFO_HEAD(skb) (((struct head_rx_descinfo4 *)((skb)->head))->minfo)
348#define FOE_MINFO_NTYPE_HEAD(skb) (((struct head_rx_descinfo4 *)((skb)->head))->ntype)
349#define FOE_MINFO_CHID_HEAD(skb) (((struct head_rx_descinfo4 *)((skb)->head))->chid)
350
351#define FOE_MINFO_TAIL(skb) \
352 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->minfo)
353#define FOE_MINFO_NTYPE_TAIL(skb) \
354 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->ntype)
355#define FOE_MINFO_CHID_TAIL(skb) \
356 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->chid)
357
358#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP)
359#define FOE_SOURCE(skb) (((struct head_rx_descinfo4 *)((skb)->head))->SOURCE)
360#define FOE_DEST(skb) (((struct head_rx_descinfo4 *)((skb)->head))->DEST)
361#endif
362
363#define IS_SPACE_AVAILABLE_HEAD(skb) \
364 ((((skb_headroom(skb) >= FOE_INFO_LEN) ? 1 : 0)))
365#define IS_SPACE_AVAILABLE_HEAD(skb) \
366 ((((skb_headroom(skb) >= FOE_INFO_LEN) ? 1 : 0)))
367#define FOE_INFO_START_ADDR_HEAD(skb) (skb->head)
368
369#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP)
370#define FOE_SOURCE_HEAD(skb) \
371 (((struct head_rx_descinfo4 *)((skb)->head))->SOURCE)
372#define FOE_DEST_HEAD(skb) \
373 (((struct head_rx_descinfo4 *)((skb)->head))->DEST)
374#endif
375
376#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP)
377#define FOE_SOURCE_HEAD(skb) \
378 (((struct head_rx_descinfo4 *)((skb)->head))->SOURCE)
379#define FOE_DEST_HEAD(skb) \
380 (((struct head_rx_descinfo4 *)((skb)->head))->DEST)
381#endif
382#define IS_SPACE_AVAILABLE_TAIL(skb) \
383 (((skb_tailroom(skb) >= FOE_INFO_LEN) ? 1 : 0))
384#define IS_SPACE_AVAILABLE_TAIL(skb) \
385 (((skb_tailroom(skb) >= FOE_INFO_LEN) ? 1 : 0))
386#define FOE_INFO_START_ADDR_TAIL(skb) \
387 ((unsigned char *)(long)(skb_end_pointer(skb) - FOE_INFO_LEN))
388
389#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP)
390#define FOE_SOURCE_TAIL(skb) \
391 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->SOURCE)
392#define FOE_DEST_TAIL(skb) \
393 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->DEST)
394#endif
395
396/* change the position of skb_CB if necessary */
397#define CB_OFFSET 40
398#define IS_SPACE_AVAILABLE_CB(skb) 1
399#define FOE_INFO_START_ADDR_CB(skb) (skb->cb + CB_OFFSET)
400#define FOE_TAG_PROTECT_CB0(skb) \
401 (((struct cb_rx_desc_info4 *)((skb)->cb + CB_OFFSET))->MAGIC_TAG_PROTECT0)
402#define FOE_TAG_PROTECT_CB1(skb) \
403 (((struct cb_rx_desc_info4 *)((skb)->cb + CB_OFFSET))->MAGIC_TAG_PROTECT1)
404#define FOE_ENTRY_NUM_CB(skb) \
405 (((struct cb_rx_desc_info4 *)((skb)->cb + CB_OFFSET))->foe_entry_num)
406#define FOE_ALG_CB(skb) \
407 (((struct cb_rx_desc_info4 *)((skb)->cb + CB_OFFSET))->ALG)
408#define FOE_AI_CB(skb) \
409 (((struct cb_rx_desc_info4 *)((skb)->cb + CB_OFFSET))->CRSN)
410#define FOE_SP_CB(skb) \
411 (((struct cb_rx_desc_info4 *)((skb)->cb + CB_OFFSET))->SPORT)
412#define FOE_MAGIC_TAG_CB(skb) \
413 (((struct cb_rx_desc_info4 *)((skb)->cb + CB_OFFSET))->IF)
414
415#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP)
416#define FOE_SOURCE_CB(skb) (((struct cb_rx_desc_info4 *)((skb)->cb + CB_OFFSET))->SOURCE)
417#define FOE_DEST_CB(skb) (((struct cb_rx_desc_info4 *)((skb)->cb + CB_OFFSET))->DEST)
418#endif
419
420#define IS_MAGIC_TAG_PROTECT_VALID_HEAD(skb) \
421 (FOE_TAG_PROTECT_HEAD(skb) == TAG_PROTECT)
422#define IS_MAGIC_TAG_PROTECT_VALID_TAIL(skb) \
423 (FOE_TAG_PROTECT_TAIL(skb) == TAG_PROTECT)
424#define IS_MAGIC_TAG_PROTECT_VALID_CB(skb) \
425 ((FOE_TAG_PROTECT_CB0(skb) == TAG_PROTECT) && \
426 (FOE_TAG_PROTECT_CB0(skb) == FOE_TAG_PROTECT_CB1(skb)))
427
428#define IS_IF_PCIE_WLAN_HEAD(skb) \
429 ((FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_PCI) || \
430 (FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_WLAN) || \
431 (FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_GE))
432
433#define IS_IF_PCIE_WLAN_TAIL(skb) \
434 ((FOE_MAGIC_TAG_TAIL(skb) == FOE_MAGIC_PCI) || \
435 (FOE_MAGIC_TAG_TAIL(skb) == FOE_MAGIC_WLAN))
436
437#define IS_IF_PCIE_WLAN_CB(skb) \
438 ((FOE_MAGIC_TAG_CB(skb) == FOE_MAGIC_PCI) || \
439 (FOE_MAGIC_TAG_CB(skb) == FOE_MAGIC_WLAN))
440
441/* macros */
442#define magic_tag_set_zero(skb) \
443{ \
444 if ((FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_PCI) || \
445 (FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_WLAN) || \
446 (FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_GE)) { \
447 if (IS_SPACE_AVAILABLE_HEAD(skb)) \
448 FOE_MAGIC_TAG_HEAD(skb) = 0; \
449 } \
450 if ((FOE_MAGIC_TAG_TAIL(skb) == FOE_MAGIC_PCI) || \
451 (FOE_MAGIC_TAG_TAIL(skb) == FOE_MAGIC_WLAN) || \
452 (FOE_MAGIC_TAG_TAIL(skb) == FOE_MAGIC_GE)) { \
453 if (IS_SPACE_AVAILABLE_TAIL(skb)) \
454 FOE_MAGIC_TAG_TAIL(skb) = 0; \
455 } \
456}
457
458static inline void hwnat_set_l2tp_unhit(struct iphdr *iph, struct sk_buff *skb)
459{
460#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP)
461 /* only clear headeroom for TCP OR not L2TP packets */
462 if ((iph->protocol == 0x6) || (ntohs(udp_hdr(skb)->dest) != 1701)) {
463 if (IS_SPACE_AVAILABLE_HEAD(skb)) {
464 FOE_MAGIC_TAG(skb) = 0;
465 FOE_AI(skb) = UN_HIT;
466 }
467 }
468#endif
469}
470
471static inline void hwnat_set_l2tp_fast_path(u32 l2tp_fast_path, u32 pptp_fast_path)
472{
473#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP)
474 l2tp_fast_path = 1;
475 pptp_fast_path = 0;
476#endif
477}
478
479static inline void hwnat_clear_l2tp_fast_path(u32 l2tp_fast_path)
480{
481#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP)
482 l2tp_fast_path = 0;
483#endif
484}
485
486/* #define CONFIG_HW_NAT_IPI */
487#if defined(CONFIG_HW_NAT_IPI)
488extern int debug_level;
489int get_rps_cpu(struct net_device *dev, struct sk_buff *skb,
490 struct rps_dev_flow **rflowp);
491uint32_t ppe_extif_rx_handler(struct sk_buff *skb);
492int hitbind_force_to_cpu_handler(struct sk_buff *skb, struct foe_entry *entry);
493extern unsigned int ipidbg[num_possible_cpus()][10];
494extern unsigned int ipidbg2[num_possible_cpus()][10];
495/* #define HNAT_IPI_RXQUEUE 1 */
496#define HNAT_IPI_DQ 1
497#define HNAT_IPI_HASH_NORMAL 0
498#define HNAT_IPI_HASH_VTAG 1
499#define HNAT_IPI_HASH_FROM_EXTIF 2
500#define HNAT_IPI_HASH_FROM_GMAC 4
501
502struct hnat_ipi_s {
503#if defined(HNAT_IPI_DQ)
504 struct sk_buff_head skb_input_queue;
505 struct sk_buff_head skb_process_queue;
506#elif defined(HNAT_IPI_RXQUEUE)
507 atomic_t rx_queue_num;
508 unsigned int rx_queue_ridx;
509 unsigned int rx_queue_widx;
510 struct sk_buff **rx_queue;
511#else
512 /* unsigned int dummy0[0]; */
513 struct sk_buff_head skb_ipi_queue;
514 /* unsigned int dummy1[8]; */
515#endif
516 unsigned long time_rec, recv_time;
517 unsigned int ipi_accum;
518 /*hwnat ipi use*/
519 spinlock_t ipilock;
520 struct tasklet_struct smp_func_call_tsk;
521} ____cacheline_aligned_in_smp;
522
523struct hnat_ipi_stat {
524 unsigned long drop_pkt_num_from_extif;
525 unsigned long drop_pkt_num_from_ppehit;
526 unsigned int smp_call_cnt_from_extif;
527 unsigned int smp_call_cnt_from_ppehit;
528 atomic_t cpu_status;
529 /* atomic_t cpu_status_from_extif; */
530 /* atomic_t cpu_status_from_ppehit; */
531
532 /* atomic_t hook_status_from_extif; */
533 /* atomic_t hook_status_from_ppehit; */
534} ____cacheline_aligned_in_smp;
535
536#define cpu_status_from_extif cpu_status
537#define cpu_status_from_ppehit cpu_status
538
539struct hnat_ipi_cfg {
540 unsigned int enable_from_extif;
541 unsigned int enable_from_ppehit;
542 unsigned int queue_thresh_from_extif;
543 unsigned int queue_thresh_from_ppehit;
544 unsigned int drop_pkt_from_extif;
545 unsigned int drop_pkt_from_ppehit;
546 unsigned int ipi_cnt_mod_from_extif;
547 unsigned int ipi_cnt_mod_from_ppehit;
548} ____cacheline_aligned_in_smp;
549
550int hnat_ipi_init(void);
551int hnat_ipi_de_init(void);
552#endif
553
554#define QDMA_RX 5
555#define PDMA_RX 0
556
557
558#endif