• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Linux Packet (skb) interface
4  *
5  * Copyright (C) 1999-2019, Broadcom.
6  *
7  *      Unless you and Broadcom execute a separate written software license
8  * agreement governing use of this software, this software is licensed to you
9  * under the terms of the GNU General Public License version 2 (the "GPL"),
10  * available at http://www.broadcom.com/licenses/GPLv2.php, with the
11  * following added to such license:
12  *
13  *      As a special exception, the copyright holders of this software give you
14  * permission to link this software with independent modules, and to copy and
15  * distribute the resulting executable under terms of your choice, provided that
16  * you also meet, for each linked independent module, the terms and conditions of
17  * the license of that module.  An independent module is a module which is not
18  * derived from this software.  The special exception does not apply to any
19  * modifications of the software.
20  *
21  *      Notwithstanding the above, under no circumstances may you combine this
22  * software in any way with any other Broadcom software provided under a license
23  * other than the GPL, without Broadcom's express prior written consent.
24  *
25  *
26  * <<Broadcom-WL-IPTag/Open:>>
27  *
28  * $Id: linux_pkt.h 701430 2017-05-25 00:03:02Z $
29  */
30 
31 #ifndef _linux_pkt_h_
32 #define _linux_pkt_h_
33 
34 #include <typedefs.h>
35 
36 #ifdef __ARM_ARCH_7A__
37 #define PKT_HEADROOM_DEFAULT NET_SKB_PAD /**< NET_SKB_PAD is defined in a linux kernel header */
38 #else
39 #define PKT_HEADROOM_DEFAULT 16
40 #endif /* __ARM_ARCH_7A__ */
41 
42 #ifdef BCMDRIVER
43 /*
44  * BINOSL selects the slightly slower function-call-based binary compatible osl.
45  * Macros expand to calls to functions defined in linux_osl.c .
46  */
47 /* Because the non BINOSL implemenation of the PKT OSL routines are macros (for
48  * performance reasons),  we need the Linux headers.
49  */
50 #include <linuxver.h>
51 
52 /* packet primitives */
53 #ifdef BCM_OBJECT_TRACE
54 #define	PKTGET(osh, len, send)		linux_pktget((osh), (len), __LINE__, __FUNCTION__)
55 #define	PKTDUP(osh, skb)		osl_pktdup((osh), (skb), __LINE__, __FUNCTION__)
56 #else
57 #define	PKTGET(osh, len, send)		linux_pktget((osh), (len))
58 #define	PKTDUP(osh, skb)		osl_pktdup((osh), (skb))
59 #endif /* BCM_OBJECT_TRACE */
60 #define PKTLIST_DUMP(osh, buf)		BCM_REFERENCE(osh)
61 #define PKTDBG_TRACE(osh, pkt, bit)	BCM_REFERENCE(osh)
62 #if defined(BCM_OBJECT_TRACE)
63 #define	PKTFREE(osh, skb, send)		linux_pktfree((osh), (skb), (send), __LINE__, __FUNCTION__)
64 #else
65 #define	PKTFREE(osh, skb, send)		linux_pktfree((osh), (skb), (send))
66 #endif /* BCM_OBJECT_TRACE */
67 #ifdef CONFIG_DHD_USE_STATIC_BUF
68 #define	PKTGET_STATIC(osh, len, send)		osl_pktget_static((osh), (len))
69 #define	PKTFREE_STATIC(osh, skb, send)		osl_pktfree_static((osh), (skb), (send))
70 #else
71 #define	PKTGET_STATIC	PKTGET
72 #define	PKTFREE_STATIC	PKTFREE
73 #endif /* CONFIG_DHD_USE_STATIC_BUF */
74 #define	PKTDATA(osh, skb)		({BCM_REFERENCE(osh); (((struct sk_buff*)(skb))->data);})
75 #define	PKTLEN(osh, skb)		({BCM_REFERENCE(osh); (((struct sk_buff*)(skb))->len);})
76 #define	PKTHEAD(osh, skb)		({BCM_REFERENCE(osh); (((struct sk_buff*)(skb))->head);})
77 #define PKTSETHEAD(osh, skb, h)		({BCM_REFERENCE(osh); \
78 					(((struct sk_buff *)(skb))->head = (h));})
79 #define PKTHEADROOM(osh, skb)		(PKTDATA(osh, skb)-(((struct sk_buff*)(skb))->head))
80 #define PKTEXPHEADROOM(osh, skb, b)	\
81 	({ \
82 	 BCM_REFERENCE(osh); \
83 	 skb_realloc_headroom((struct sk_buff*)(skb), (b)); \
84 	 })
85 #define PKTTAILROOM(osh, skb)		\
86 	({ \
87 	 BCM_REFERENCE(osh); \
88 	 skb_tailroom((struct sk_buff*)(skb)); \
89 	 })
90 #define PKTPADTAILROOM(osh, skb, padlen) \
91 	({ \
92 	 BCM_REFERENCE(osh); \
93 	 skb_pad((struct sk_buff*)(skb), (padlen)); \
94 	 })
95 #define	PKTNEXT(osh, skb)		({BCM_REFERENCE(osh); (((struct sk_buff*)(skb))->next);})
96 #define	PKTSETNEXT(osh, skb, x)		\
97 	({ \
98 	 BCM_REFERENCE(osh); \
99 	 (((struct sk_buff*)(skb))->next = (struct sk_buff*)(x)); \
100 	 })
101 #define	PKTSETLEN(osh, skb, len)	\
102 	({ \
103 	 BCM_REFERENCE(osh); \
104 	 __skb_trim((struct sk_buff*)(skb), (len)); \
105 	 })
106 #define	PKTPUSH(osh, skb, bytes)	\
107 	({ \
108 	 BCM_REFERENCE(osh); \
109 	 skb_push((struct sk_buff*)(skb), (bytes)); \
110 	 })
111 #define	PKTPULL(osh, skb, bytes)	\
112 	({ \
113 	 BCM_REFERENCE(osh); \
114 	 skb_pull((struct sk_buff*)(skb), (bytes)); \
115 	 })
116 #define	PKTTAG(skb)			((void*)(((struct sk_buff*)(skb))->cb))
117 #define PKTSETPOOL(osh, skb, x, y)	BCM_REFERENCE(osh)
118 #define	PKTPOOL(osh, skb)		({BCM_REFERENCE(osh); BCM_REFERENCE(skb); FALSE;})
119 #define PKTFREELIST(skb)        PKTLINK(skb)
120 #define PKTSETFREELIST(skb, x)  PKTSETLINK((skb), (x))
121 #define PKTPTR(skb)             (skb)
122 #define PKTID(skb)              ({BCM_REFERENCE(skb); 0;})
123 #define PKTSETID(skb, id)       ({BCM_REFERENCE(skb); BCM_REFERENCE(id);})
124 #define PKTSHRINK(osh, m)		({BCM_REFERENCE(osh); m;})
125 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) && defined(TSQ_MULTIPLIER)
126 #define PKTORPHAN(skb, tsq)          osl_pkt_orphan_partial(skb, tsq)
127 extern void osl_pkt_orphan_partial(struct sk_buff *skb, int tsq);
128 #else
129 #define PKTORPHAN(skb, tsq)          ({BCM_REFERENCE(skb); 0;})
130 #endif /* LINUX VERSION >= 3.6 */
131 
132 #define	PKTSETFAST(osh, skb)	({BCM_REFERENCE(osh); BCM_REFERENCE(skb);})
133 #define	PKTCLRFAST(osh, skb)	({BCM_REFERENCE(osh); BCM_REFERENCE(skb);})
134 #define	PKTISFAST(osh, skb)	({BCM_REFERENCE(osh); BCM_REFERENCE(skb); FALSE;})
135 
136 #define	PKTSETCTF(osh, skb)	({BCM_REFERENCE(osh); BCM_REFERENCE(skb);})
137 #define	PKTCLRCTF(osh, skb)	({BCM_REFERENCE(osh); BCM_REFERENCE(skb);})
138 #define	PKTISCTF(osh, skb)	({BCM_REFERENCE(osh); BCM_REFERENCE(skb); FALSE;})
139 
140 #define	PKTSETSKIPCT(osh, skb)	({BCM_REFERENCE(osh); BCM_REFERENCE(skb);})
141 #define	PKTCLRSKIPCT(osh, skb)	({BCM_REFERENCE(osh); BCM_REFERENCE(skb);})
142 #define	PKTSKIPCT(osh, skb)	({BCM_REFERENCE(osh); BCM_REFERENCE(skb);})
143 #define CTF_MARK(m)		({BCM_REFERENCE(m); 0;})
144 
145 #define PKTFRAGLEN(osh, lb, ix)			(0)
146 #define PKTSETFRAGLEN(osh, lb, ix, len)		BCM_REFERENCE(osh)
147 
148 #define PKTSETFWDERBUF(osh, skb)  ({ BCM_REFERENCE(osh); BCM_REFERENCE(skb); })
149 #define PKTCLRFWDERBUF(osh, skb)  ({ BCM_REFERENCE(osh); BCM_REFERENCE(skb); })
150 #define PKTISFWDERBUF(osh, skb)   ({ BCM_REFERENCE(osh); BCM_REFERENCE(skb); FALSE;})
151 
152 #define	PKTSETTOBR(osh, skb)	({BCM_REFERENCE(osh); BCM_REFERENCE(skb);})
153 #define	PKTCLRTOBR(osh, skb)	({BCM_REFERENCE(osh); BCM_REFERENCE(skb);})
154 #define	PKTISTOBR(skb)	({BCM_REFERENCE(skb); FALSE;})
155 
156 #ifdef BCMFA
157 #ifdef BCMFA_HW_HASH
158 #define PKTSETFAHIDX(skb, idx)	(((struct sk_buff*)(skb))->napt_idx = idx)
159 #else
160 #define PKTSETFAHIDX(skb, idx)	({BCM_REFERENCE(skb); BCM_REFERENCE(idx);})
161 #endif /* BCMFA_SW_HASH */
162 #define PKTGETFAHIDX(skb)	(((struct sk_buff*)(skb))->napt_idx)
163 #define PKTSETFADEV(skb, imp)	(((struct sk_buff*)(skb))->dev = imp)
164 #define PKTSETRXDEV(skb)	(((struct sk_buff*)(skb))->rxdev = ((struct sk_buff*)(skb))->dev)
165 
166 #define	AUX_TCP_FIN_RST	(1 << 0)
167 #define	AUX_FREED	(1 << 1)
168 #define PKTSETFAAUX(skb)	(((struct sk_buff*)(skb))->napt_flags |= AUX_TCP_FIN_RST)
169 #define	PKTCLRFAAUX(skb)	(((struct sk_buff*)(skb))->napt_flags &= (~AUX_TCP_FIN_RST))
170 #define	PKTISFAAUX(skb)		(((struct sk_buff*)(skb))->napt_flags & AUX_TCP_FIN_RST)
171 #define PKTSETFAFREED(skb)	(((struct sk_buff*)(skb))->napt_flags |= AUX_FREED)
172 #define	PKTCLRFAFREED(skb)	(((struct sk_buff*)(skb))->napt_flags &= (~AUX_FREED))
173 #define	PKTISFAFREED(skb)	(((struct sk_buff*)(skb))->napt_flags & AUX_FREED)
174 #define	PKTISFABRIDGED(skb)	PKTISFAAUX(skb)
175 #else
176 #define	PKTISFAAUX(skb)		({BCM_REFERENCE(skb); FALSE;})
177 #define	PKTISFABRIDGED(skb)	({BCM_REFERENCE(skb); FALSE;})
178 #define	PKTISFAFREED(skb)	({BCM_REFERENCE(skb); FALSE;})
179 
180 #define	PKTCLRFAAUX(skb)	BCM_REFERENCE(skb)
181 #define PKTSETFAFREED(skb)	BCM_REFERENCE(skb)
182 #define	PKTCLRFAFREED(skb)	BCM_REFERENCE(skb)
183 #endif /* BCMFA */
184 
185 #if defined(BCM_OBJECT_TRACE)
186 extern void linux_pktfree(osl_t *osh, void *skb, bool send, int line, const char *caller);
187 extern void linux_pktfree_irq(osl_t *osh, void *skb, bool send, int line, const char *caller);
188 #else
189 extern void linux_pktfree(osl_t *osh, void *skb, bool send);
190 extern void linux_pktfree_irq(osl_t *osh, void *skb, bool send);
191 #endif /* BCM_OBJECT_TRACE */
192 extern void *osl_pktget_static(osl_t *osh, uint len);
193 extern void osl_pktfree_static(osl_t *osh, void *skb, bool send);
194 extern void osl_pktclone(osl_t *osh, void **pkt);
195 
196 #ifdef BCM_OBJECT_TRACE
197 extern void *linux_pktget(osl_t *osh, uint len, int line, const char *caller);
198 extern void *osl_pktdup(osl_t *osh, void *skb, int line, const char *caller);
199 #else
200 extern void *linux_pktget(osl_t *osh, uint len);
201 extern void *osl_pktdup(osl_t *osh, void *skb);
202 #endif /* BCM_OBJECT_TRACE */
203 extern void *osl_pkt_frmnative(osl_t *osh, void *skb);
204 extern struct sk_buff *osl_pkt_tonative(osl_t *osh, void *pkt);
205 #define PKTFRMNATIVE(osh, skb)	osl_pkt_frmnative(((osl_t *)osh), (struct sk_buff*)(skb))
206 #define PKTTONATIVE(osh, pkt)		osl_pkt_tonative((osl_t *)(osh), (pkt))
207 
208 #define	PKTLINK(skb)			(((struct sk_buff*)(skb))->prev)
209 #define	PKTSETLINK(skb, x)		(((struct sk_buff*)(skb))->prev = (struct sk_buff*)(x))
210 #define	PKTPRIO(skb)			(((struct sk_buff*)(skb))->priority)
211 #define	PKTSETPRIO(skb, x)		(((struct sk_buff*)(skb))->priority = (x))
212 #define PKTSUMNEEDED(skb)		(((struct sk_buff*)(skb))->ip_summed == CHECKSUM_HW)
213 #define PKTSETSUMGOOD(skb, x)		(((struct sk_buff*)(skb))->ip_summed = \
214 						((x) ? CHECKSUM_UNNECESSARY : CHECKSUM_NONE))
215 /* PKTSETSUMNEEDED and PKTSUMGOOD are not possible because skb->ip_summed is overloaded */
216 #define PKTSHARED(skb)                  (((struct sk_buff*)(skb))->cloned)
217 
218 #ifdef CONFIG_NF_CONNTRACK_MARK
219 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0))
220 #define PKTMARK(p)                     (((struct sk_buff *)(p))->mark)
221 #define PKTSETMARK(p, m)               ((struct sk_buff *)(p))->mark = (m)
222 #else /* !2.6.0 */
223 #define PKTMARK(p)                     (((struct sk_buff *)(p))->nfmark)
224 #define PKTSETMARK(p, m)               ((struct sk_buff *)(p))->nfmark = (m)
225 #endif /* 2.6.0 */
226 #else /* CONFIG_NF_CONNTRACK_MARK */
227 #define PKTMARK(p)                     0
228 #define PKTSETMARK(p, m)
229 #endif /* CONFIG_NF_CONNTRACK_MARK */
230 
231 #define PKTALLOCED(osh)		osl_pktalloced(osh)
232 extern uint osl_pktalloced(osl_t *osh);
233 
234 #endif /* BCMDRIVER */
235 
236 #endif	/* _linux_pkt_h_ */
237