blob: 7ac691c773833f6b98159bc7a37c133714c06ea3 [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
152struct head_rx_descinfo4 {
153 uint32_t foe_entry_num:14;
154 uint32_t CRSN:5;
155 uint32_t SPORT:4;
156 uint32_t rsv:6;
157 uint32_t foe_entry_num_1:1;
158 uint32_t ppe:1;
159 uint32_t ALG:1;
160 uint32_t IF:8;
161 uint32_t WDMAID:2;
162 uint32_t RXID:2;
163 uint32_t WCID:10;
164 uint32_t BSSID:6;
165 uint32_t rsv2:4;
166 uint16_t minfo:1;
167 uint16_t ntype:3;
168 uint16_t chid:8;
169 uint16_t rsv3:4;
170#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP)
171 u16 SOURCE;
172 u16 DEST;
173#endif
174 u16 MAGIC_TAG_PROTECT;
175} __packed;
176
177struct cb_rx_desc_info4 {
178 u16 MAGIC_TAG_PROTECT0;
179 uint32_t foe_entry_num:15;
180 uint32_t CRSN:5;
181 uint32_t SPORT:4;
182 uint32_t ALG:1;
183 uint32_t rsv:7;
184 uint16_t IF:8;
185 uint16_t WDMAID:2;
186 uint16_t RXID:2;
187 uint16_t WCID:10;
188 uint16_t BSSID:6;
189 uint16_t rsv1:4;
190 uint16_t minfo:1;
191 uint16_t ntype:3;
192 uint16_t chid:8;
193 uint16_t rsv2:4;
194#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP)
195 u16 SOURCE;
196 u16 DEST;
197#endif
198 u16 MAGIC_TAG_PROTECT1;
199} __packed;
200
201
202
203#define FOE_INFO_LEN 12
204#define WIFI_INFO_LEN 6
205
206
207#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP)
208#define FOE_INFO_LEN (6 + 4 + WIFI_INFO_LEN)
209#define FOE_MAGIC_FASTPATH 0x77
210#define FOE_MAGIC_L2TPPATH 0x78
211#endif
212
213#define FOE_MAGIC_PCI 0x73
214#define FOE_MAGIC_WLAN 0x74
215#define FOE_MAGIC_GE 0x75
216#define FOE_MAGIC_PPE 0x76
217#define FOE_MAGIC_WED0 0x78
218#define FOE_MAGIC_WED1 0x79
219#define FOE_MAGIC_MED 0x80
220#define FOE_MAGIC_EDMA0 0x81
221#define FOE_MAGIC_EDMA1 0x82
222#define TAG_PROTECT 0x6789
223#define USE_HEAD_ROOM 0
224#define USE_TAIL_ROOM 1
225#define USE_CB 2
226#define ALL_INFO_ERROR 3
227
228/**************************DMAD FORMAT********************************/
229#define FOE_TAG_PROTECT(skb) \
230 (((struct dmad_rx_descinfo4 *)((skb)->head))->MAGIC_TAG_PROTECT)
231
232#define FOE_ENTRY_NUM(skb) \
233 (((struct dmad_rx_descinfo4 *)((skb)->head))->foe_entry_num)
234#define FOE_ALG(skb) \
235 (((struct dmad_rx_descinfo4 *)((skb)->head))->ALG)
236#define FOE_AI(skb) \
237 (((struct dmad_rx_descinfo4 *)((skb)->head))->CRSN)
238#define FOE_SP(skb) \
239 (((struct dmad_rx_descinfo4 *)((skb)->head))->SPORT)
240#define FOE_MAGIC_TAG(skb) \
241 (((struct dmad_rx_descinfo4 *)((skb)->head))->IF)
242#define FOE_WDMA_ID(skb) \
243 (((struct dmad_rx_descinfo4 *)((skb)->head))->WDMAID)
244#define FOE_RX_ID(skb) (((struct dmad_rx_descinfo4 *)((skb)->head))->RXID)
245#define FOE_WC_ID(skb) (((struct dmad_rx_descinfo4 *)((skb)->head))->WCID)
246#define FOE_BSS_ID(skb) (((struct dmad_rx_descinfo4 *)((skb)->head))->BSSID)
247#define FOE_PPE(skb) (((struct dmad_rx_descinfo4 *)((skb)->head))->ppe)
248
249/***********************HEAD FORMAT*************************************/
250
251#define FOE_TAG_PROTECT_HEAD(skb) \
252 (((struct head_rx_descinfo4 *)((skb)->head))->MAGIC_TAG_PROTECT)
253#define FOE_ENTRY_NUM_LSB_HEAD(skb) \
254 (((struct head_rx_descinfo4 *)((skb)->head))->foe_entry_num)
255#define FOE_ENTRY_NUM_MSB_HEAD(skb) \
256 (((struct head_rx_descinfo4 *)((skb)->head))->foe_entry_num_1)
257
258#define FOE_ENTRY_NUM_HEAD(skb) \
259 (((FOE_ENTRY_NUM_MSB_HEAD(skb) & 0x1) << 14) | FOE_ENTRY_NUM_LSB_HEAD(skb))
260
261
262#define FOE_ALG_HEAD(skb) \
263 (((struct head_rx_descinfo4 *)((skb)->head))->ALG)
264#define FOE_AI_HEAD(skb) \
265 (((struct head_rx_descinfo4 *)((skb)->head))->CRSN)
266#define FOE_SP_HEAD(skb) \
267 (((struct head_rx_descinfo4 *)((skb)->head))->SPORT)
268#define FOE_MAGIC_TAG_HEAD(skb) \
269 (((struct head_rx_descinfo4 *)((skb)->head))->IF)
270
271
272#define FOE_WDMA_ID_HEAD(skb) \
273 (((struct head_rx_descinfo4 *)((skb)->head))->WDMAID)
274#define FOE_RX_ID_HEAD(skb) \
275 (((struct head_rx_descinfo4 *)((skb)->head))->RXID)
276#define FOE_WC_ID_HEAD(skb) \
277 (((struct head_rx_descinfo4 *)((skb)->head))->WCID)
278#define FOE_BSS_ID_HEAD(skb) \
279 (((struct head_rx_descinfo4 *)((skb)->head))->BSSID)
280#define FOE_PPE_HEAD(skb) \
281 (((struct head_rx_descinfo4 *)((skb)->head))->PPE)
282
283/****************************TAIL FORMAT***************************************/
284#define FOE_TAG_PROTECT_TAIL(skb) \
285 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->MAGIC_TAG_PROTECT)
286#define FOE_ENTRY_NUM_LSB_TAIL(skb) \
287 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->foe_entry_num)
288
289#define FOE_ENTRY_NUM_MSB_TAIL(skb) \
290 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->foe_entry_num_1)
291#define FOE_ENTRY_NUM_TAIL(skb) \
292 (((FOE_ENTRY_NUM_MSB_TAIL(skb) & 0x1) << 14) | FOE_ENTRY_NUM_LSB_TAIL(skb))
293#define FOE_ALG_TAIL(skb) \
294 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->ALG)
295#define FOE_AI_TAIL(skb) \
296 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->CRSN)
297#define FOE_SP_TAIL(skb) \
298 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->SPORT)
299#define FOE_MAGIC_TAG_TAIL(skb) \
300 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->IF)
301
302#define FOE_WDMA_ID_TAIL(skb) \
303 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->WDMAID)
304#define FOE_RX_ID_TAIL(skb) \
305 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->RXID)
306#define FOE_WC_ID_TAIL(skb) \
307 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->WCID)
308#define FOE_BSS_ID_TAIL(skb) \
309 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->BSSID)
310
311#define FOE_PPE_TAIL(skb) \
312 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->ppe)
313/*********************************************************************/
314#define FOE_WDMA_ID_CB(skb) \
315 (((struct cb_rx_desc_info4 *)((skb)->head))->WDMAID)
316#define FOE_RX_ID_CB(skb) \
317 (((struct cb_rx_desc_info4 *)((skb)->head))->RXID)
318#define FOE_WC_ID_CB(skb) \
319 (((struct cb_rx_desc_info4 *)((skb)->head))->WCID)
320#define FOE_BSS_ID_CB(skb) \
321 (((struct cb_rx_desc_info4 *)((skb)->head))->BSSID)
322
323#define FOE_MINFO(skb) (((struct head_rx_descinfo4 *)((skb)->head))->minfo)
324#define FOE_MINFO_NTYPE(skb) (((struct head_rx_descinfo4 *)((skb)->head))->ntype)
325#define FOE_MINFO_CHID(skb) (((struct head_rx_descinfo4 *)((skb)->head))->chid)
326#define FOE_MINFO_HEAD(skb) (((struct head_rx_descinfo4 *)((skb)->head))->minfo)
327#define FOE_MINFO_NTYPE_HEAD(skb) (((struct head_rx_descinfo4 *)((skb)->head))->ntype)
328#define FOE_MINFO_CHID_HEAD(skb) (((struct head_rx_descinfo4 *)((skb)->head))->chid)
329
330#define FOE_MINFO_TAIL(skb) \
331 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->minfo)
332#define FOE_MINFO_NTYPE_TAIL(skb) \
333 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->ntype)
334#define FOE_MINFO_CHID_TAIL(skb) \
335 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->chid)
336
337#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP)
338#define FOE_SOURCE(skb) (((struct head_rx_descinfo4 *)((skb)->head))->SOURCE)
339#define FOE_DEST(skb) (((struct head_rx_descinfo4 *)((skb)->head))->DEST)
340#endif
341
342#define IS_SPACE_AVAILABLE_HEAD(skb) \
343 ((((skb_headroom(skb) >= FOE_INFO_LEN) ? 1 : 0)))
344#define IS_SPACE_AVAILABLE_HEAD(skb) \
345 ((((skb_headroom(skb) >= FOE_INFO_LEN) ? 1 : 0)))
346#define FOE_INFO_START_ADDR_HEAD(skb) (skb->head)
347
348#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP)
349#define FOE_SOURCE_HEAD(skb) \
350 (((struct head_rx_descinfo4 *)((skb)->head))->SOURCE)
351#define FOE_DEST_HEAD(skb) \
352 (((struct head_rx_descinfo4 *)((skb)->head))->DEST)
353#endif
354
355#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP)
356#define FOE_SOURCE_HEAD(skb) \
357 (((struct head_rx_descinfo4 *)((skb)->head))->SOURCE)
358#define FOE_DEST_HEAD(skb) \
359 (((struct head_rx_descinfo4 *)((skb)->head))->DEST)
360#endif
361#define IS_SPACE_AVAILABLE_TAIL(skb) \
362 (((skb_tailroom(skb) >= FOE_INFO_LEN) ? 1 : 0))
363#define IS_SPACE_AVAILABLE_TAIL(skb) \
364 (((skb_tailroom(skb) >= FOE_INFO_LEN) ? 1 : 0))
365#define FOE_INFO_START_ADDR_TAIL(skb) \
366 ((unsigned char *)(long)(skb_end_pointer(skb) - FOE_INFO_LEN))
367
368#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP)
369#define FOE_SOURCE_TAIL(skb) \
370 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->SOURCE)
371#define FOE_DEST_TAIL(skb) \
372 (((struct pdma_rx_desc_info4 *)((long)((skb_end_pointer(skb)) - FOE_INFO_LEN)))->DEST)
373#endif
374
375/* change the position of skb_CB if necessary */
376#define CB_OFFSET 40
377#define IS_SPACE_AVAILABLE_CB(skb) 1
378#define FOE_INFO_START_ADDR_CB(skb) (skb->cb + CB_OFFSET)
379#define FOE_TAG_PROTECT_CB0(skb) \
380 (((struct cb_rx_desc_info4 *)((skb)->cb + CB_OFFSET))->MAGIC_TAG_PROTECT0)
381#define FOE_TAG_PROTECT_CB1(skb) \
382 (((struct cb_rx_desc_info4 *)((skb)->cb + CB_OFFSET))->MAGIC_TAG_PROTECT1)
383#define FOE_ENTRY_NUM_CB(skb) \
384 (((struct cb_rx_desc_info4 *)((skb)->cb + CB_OFFSET))->foe_entry_num)
385#define FOE_ALG_CB(skb) \
386 (((struct cb_rx_desc_info4 *)((skb)->cb + CB_OFFSET))->ALG)
387#define FOE_AI_CB(skb) \
388 (((struct cb_rx_desc_info4 *)((skb)->cb + CB_OFFSET))->CRSN)
389#define FOE_SP_CB(skb) \
390 (((struct cb_rx_desc_info4 *)((skb)->cb + CB_OFFSET))->SPORT)
391#define FOE_MAGIC_TAG_CB(skb) \
392 (((struct cb_rx_desc_info4 *)((skb)->cb + CB_OFFSET))->IF)
393
394#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP)
395#define FOE_SOURCE_CB(skb) (((struct cb_rx_desc_info4 *)((skb)->cb + CB_OFFSET))->SOURCE)
396#define FOE_DEST_CB(skb) (((struct cb_rx_desc_info4 *)((skb)->cb + CB_OFFSET))->DEST)
397#endif
398
399#define IS_MAGIC_TAG_PROTECT_VALID_HEAD(skb) \
400 (FOE_TAG_PROTECT_HEAD(skb) == TAG_PROTECT)
401#define IS_MAGIC_TAG_PROTECT_VALID_TAIL(skb) \
402 (FOE_TAG_PROTECT_TAIL(skb) == TAG_PROTECT)
403#define IS_MAGIC_TAG_PROTECT_VALID_CB(skb) \
404 ((FOE_TAG_PROTECT_CB0(skb) == TAG_PROTECT) && \
405 (FOE_TAG_PROTECT_CB0(skb) == FOE_TAG_PROTECT_CB1(skb)))
406
407#define IS_IF_PCIE_WLAN_HEAD(skb) \
408 ((FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_PCI) || \
409 (FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_WLAN) || \
410 (FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_GE))
411
412#define IS_IF_PCIE_WLAN_TAIL(skb) \
413 ((FOE_MAGIC_TAG_TAIL(skb) == FOE_MAGIC_PCI) || \
414 (FOE_MAGIC_TAG_TAIL(skb) == FOE_MAGIC_WLAN))
415
416#define IS_IF_PCIE_WLAN_CB(skb) \
417 ((FOE_MAGIC_TAG_CB(skb) == FOE_MAGIC_PCI) || \
418 (FOE_MAGIC_TAG_CB(skb) == FOE_MAGIC_WLAN))
419
420/* macros */
421#define magic_tag_set_zero(skb) \
422{ \
423 if ((FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_PCI) || \
424 (FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_WLAN) || \
425 (FOE_MAGIC_TAG_HEAD(skb) == FOE_MAGIC_GE)) { \
426 if (IS_SPACE_AVAILABLE_HEAD(skb)) \
427 FOE_MAGIC_TAG_HEAD(skb) = 0; \
428 } \
429 if ((FOE_MAGIC_TAG_TAIL(skb) == FOE_MAGIC_PCI) || \
430 (FOE_MAGIC_TAG_TAIL(skb) == FOE_MAGIC_WLAN) || \
431 (FOE_MAGIC_TAG_TAIL(skb) == FOE_MAGIC_GE)) { \
432 if (IS_SPACE_AVAILABLE_TAIL(skb)) \
433 FOE_MAGIC_TAG_TAIL(skb) = 0; \
434 } \
435}
436
437static inline void hwnat_set_l2tp_unhit(struct iphdr *iph, struct sk_buff *skb)
438{
439#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP)
440 /* only clear headeroom for TCP OR not L2TP packets */
441 if ((iph->protocol == 0x6) || (ntohs(udp_hdr(skb)->dest) != 1701)) {
442 if (IS_SPACE_AVAILABLE_HEAD(skb)) {
443 FOE_MAGIC_TAG(skb) = 0;
444 FOE_AI(skb) = UN_HIT;
445 }
446 }
447#endif
448}
449
450static inline void hwnat_set_l2tp_fast_path(u32 l2tp_fast_path, u32 pptp_fast_path)
451{
452#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP)
453 l2tp_fast_path = 1;
454 pptp_fast_path = 0;
455#endif
456}
457
458static inline void hwnat_clear_l2tp_fast_path(u32 l2tp_fast_path)
459{
460#if defined(CONFIG_RA_HW_NAT_PPTP_L2TP)
461 l2tp_fast_path = 0;
462#endif
463}
464
465/* #define CONFIG_HW_NAT_IPI */
466#if defined(CONFIG_HW_NAT_IPI)
467extern int debug_level;
468int get_rps_cpu(struct net_device *dev, struct sk_buff *skb,
469 struct rps_dev_flow **rflowp);
470uint32_t ppe_extif_rx_handler(struct sk_buff *skb);
471int hitbind_force_to_cpu_handler(struct sk_buff *skb, struct foe_entry *entry);
472extern unsigned int ipidbg[num_possible_cpus()][10];
473extern unsigned int ipidbg2[num_possible_cpus()][10];
474/* #define HNAT_IPI_RXQUEUE 1 */
475#define HNAT_IPI_DQ 1
476#define HNAT_IPI_HASH_NORMAL 0
477#define HNAT_IPI_HASH_VTAG 1
478#define HNAT_IPI_HASH_FROM_EXTIF 2
479#define HNAT_IPI_HASH_FROM_GMAC 4
480
481struct hnat_ipi_s {
482#if defined(HNAT_IPI_DQ)
483 struct sk_buff_head skb_input_queue;
484 struct sk_buff_head skb_process_queue;
485#elif defined(HNAT_IPI_RXQUEUE)
486 atomic_t rx_queue_num;
487 unsigned int rx_queue_ridx;
488 unsigned int rx_queue_widx;
489 struct sk_buff **rx_queue;
490#else
491 /* unsigned int dummy0[0]; */
492 struct sk_buff_head skb_ipi_queue;
493 /* unsigned int dummy1[8]; */
494#endif
495 unsigned long time_rec, recv_time;
496 unsigned int ipi_accum;
497 /*hwnat ipi use*/
498 spinlock_t ipilock;
499 struct tasklet_struct smp_func_call_tsk;
500} ____cacheline_aligned_in_smp;
501
502struct hnat_ipi_stat {
503 unsigned long drop_pkt_num_from_extif;
504 unsigned long drop_pkt_num_from_ppehit;
505 unsigned int smp_call_cnt_from_extif;
506 unsigned int smp_call_cnt_from_ppehit;
507 atomic_t cpu_status;
508 /* atomic_t cpu_status_from_extif; */
509 /* atomic_t cpu_status_from_ppehit; */
510
511 /* atomic_t hook_status_from_extif; */
512 /* atomic_t hook_status_from_ppehit; */
513} ____cacheline_aligned_in_smp;
514
515#define cpu_status_from_extif cpu_status
516#define cpu_status_from_ppehit cpu_status
517
518struct hnat_ipi_cfg {
519 unsigned int enable_from_extif;
520 unsigned int enable_from_ppehit;
521 unsigned int queue_thresh_from_extif;
522 unsigned int queue_thresh_from_ppehit;
523 unsigned int drop_pkt_from_extif;
524 unsigned int drop_pkt_from_ppehit;
525 unsigned int ipi_cnt_mod_from_extif;
526 unsigned int ipi_cnt_mod_from_ppehit;
527} ____cacheline_aligned_in_smp;
528
529int hnat_ipi_init(void);
530int hnat_ipi_de_init(void);
531#endif
532
533#define QDMA_RX 5
534#define PDMA_RX 0
535
536
537#endif