xref: /OK3568_Linux_fs/external/rkwifibt/drivers/bcmdhd/include/linux_pkt.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Linux Packet (skb) interface
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Copyright (C) 2020, Broadcom.
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  *      Unless you and Broadcom execute a separate written software license
7*4882a593Smuzhiyun  * agreement governing use of this software, this software is licensed to you
8*4882a593Smuzhiyun  * under the terms of the GNU General Public License version 2 (the "GPL"),
9*4882a593Smuzhiyun  * available at http://www.broadcom.com/licenses/GPLv2.php, with the
10*4882a593Smuzhiyun  * following added to such license:
11*4882a593Smuzhiyun  *
12*4882a593Smuzhiyun  *      As a special exception, the copyright holders of this software give you
13*4882a593Smuzhiyun  * permission to link this software with independent modules, and to copy and
14*4882a593Smuzhiyun  * distribute the resulting executable under terms of your choice, provided that
15*4882a593Smuzhiyun  * you also meet, for each linked independent module, the terms and conditions of
16*4882a593Smuzhiyun  * the license of that module.  An independent module is a module which is not
17*4882a593Smuzhiyun  * derived from this software.  The special exception does not apply to any
18*4882a593Smuzhiyun  * modifications of the software.
19*4882a593Smuzhiyun  *
20*4882a593Smuzhiyun  *
21*4882a593Smuzhiyun  * <<Broadcom-WL-IPTag/Dual:>>
22*4882a593Smuzhiyun  */
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #ifndef _linux_pkt_h_
25*4882a593Smuzhiyun #define _linux_pkt_h_
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #include <typedefs.h>
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun #ifdef __ARM_ARCH_7A__
30*4882a593Smuzhiyun #define PKT_HEADROOM_DEFAULT NET_SKB_PAD /**< NET_SKB_PAD is defined in a linux kernel header */
31*4882a593Smuzhiyun #else
32*4882a593Smuzhiyun #define PKT_HEADROOM_DEFAULT 16
33*4882a593Smuzhiyun #endif /* __ARM_ARCH_7A__ */
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun #ifdef BCMDRIVER
36*4882a593Smuzhiyun /*
37*4882a593Smuzhiyun  * BINOSL selects the slightly slower function-call-based binary compatible osl.
38*4882a593Smuzhiyun  * Macros expand to calls to functions defined in linux_osl.c .
39*4882a593Smuzhiyun  */
40*4882a593Smuzhiyun #ifndef BINOSL
41*4882a593Smuzhiyun /* Because the non BINOSL implemenation of the PKT OSL routines are macros (for
42*4882a593Smuzhiyun  * performance reasons),  we need the Linux headers.
43*4882a593Smuzhiyun  */
44*4882a593Smuzhiyun #include <linuxver.h>
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun /* packet primitives */
47*4882a593Smuzhiyun #ifndef BCMDBG_PKT
48*4882a593Smuzhiyun #ifdef BCMDBG_CTRACE
49*4882a593Smuzhiyun #define	PKTGET(osh, len, send)		linux_pktget((osh), (len), __LINE__, __FILE__)
50*4882a593Smuzhiyun #define	PKTDUP(osh, skb)		osl_pktdup((osh), (skb), __LINE__, __FILE__)
51*4882a593Smuzhiyun #else
52*4882a593Smuzhiyun #ifdef BCM_OBJECT_TRACE
53*4882a593Smuzhiyun #define	PKTGET(osh, len, send)		linux_pktget((osh), (len), __LINE__, __FUNCTION__)
54*4882a593Smuzhiyun #define	PKTDUP(osh, skb)		osl_pktdup((osh), (skb), __LINE__, __FUNCTION__)
55*4882a593Smuzhiyun #else
56*4882a593Smuzhiyun #define	PKTGET(osh, len, send)		linux_pktget((osh), (len))
57*4882a593Smuzhiyun #define	PKTDUP(osh, skb)		osl_pktdup((osh), (skb))
58*4882a593Smuzhiyun #endif /* BCM_OBJECT_TRACE */
59*4882a593Smuzhiyun #endif /* BCMDBG_CTRACE */
60*4882a593Smuzhiyun #define PKTLIST_DUMP(osh, buf)		BCM_REFERENCE(osh)
61*4882a593Smuzhiyun #define PKTDBG_TRACE(osh, pkt, bit)	BCM_REFERENCE(osh)
62*4882a593Smuzhiyun #else /* BCMDBG_PKT pkt logging for debugging */
63*4882a593Smuzhiyun #define	PKTGET(osh, len, send)		linux_pktget((osh), (len), __LINE__, __FILE__)
64*4882a593Smuzhiyun #define	PKTDUP(osh, skb)		osl_pktdup((osh), (skb), __LINE__, __FILE__)
65*4882a593Smuzhiyun #define PKTLIST_DUMP(osh, buf) 		osl_pktlist_dump(osh, buf)
66*4882a593Smuzhiyun #define BCMDBG_PTRACE
67*4882a593Smuzhiyun #define PKTLIST_IDX(skb)		((uint16 *)((char *)PKTTAG(skb) + \
68*4882a593Smuzhiyun 					sizeof(((struct sk_buff*)(skb))->cb) - sizeof(uint16)))
69*4882a593Smuzhiyun #define PKTDBG_TRACE(osh, pkt, bit)     osl_pkttrace(osh, pkt, bit)
70*4882a593Smuzhiyun #endif /* BCMDBG_PKT */
71*4882a593Smuzhiyun #if defined(BCM_OBJECT_TRACE)
72*4882a593Smuzhiyun #define	PKTFREE(osh, skb, send)		linux_pktfree((osh), (skb), (send), __LINE__, __FUNCTION__)
73*4882a593Smuzhiyun #else
74*4882a593Smuzhiyun #define	PKTFREE(osh, skb, send)		linux_pktfree((osh), (skb), (send))
75*4882a593Smuzhiyun #endif /* BCM_OBJECT_TRACE */
76*4882a593Smuzhiyun #ifdef CONFIG_DHD_USE_STATIC_BUF
77*4882a593Smuzhiyun #define	PKTGET_STATIC(osh, len, send)		osl_pktget_static((osh), (len))
78*4882a593Smuzhiyun #define	PKTFREE_STATIC(osh, skb, send)		osl_pktfree_static((osh), (skb), (send))
79*4882a593Smuzhiyun #else
80*4882a593Smuzhiyun #define	PKTGET_STATIC	PKTGET
81*4882a593Smuzhiyun #define	PKTFREE_STATIC	PKTFREE
82*4882a593Smuzhiyun #endif /* CONFIG_DHD_USE_STATIC_BUF */
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun #define	PKTDATA(osh, skb)		({BCM_REFERENCE(osh); (((struct sk_buff*)(skb))->data);})
85*4882a593Smuzhiyun #define	PKTLEN(osh, skb)		({BCM_REFERENCE(osh); (((struct sk_buff*)(skb))->len);})
86*4882a593Smuzhiyun #define	PKTHEAD(osh, skb)		({BCM_REFERENCE(osh); (((struct sk_buff*)(skb))->head);})
87*4882a593Smuzhiyun #define	PKTSOCK(osh, skb)		({BCM_REFERENCE(osh); (((struct sk_buff*)(skb))->sk);})
88*4882a593Smuzhiyun #define PKTSETHEAD(osh, skb, h)		({BCM_REFERENCE(osh); \
89*4882a593Smuzhiyun 					(((struct sk_buff *)(skb))->head = (h));})
90*4882a593Smuzhiyun #define PKTHEADROOM(osh, skb)		(PKTDATA(osh, skb)-(((struct sk_buff*)(skb))->head))
91*4882a593Smuzhiyun #define PKTEXPHEADROOM(osh, skb, b)	\
92*4882a593Smuzhiyun 	({ \
93*4882a593Smuzhiyun 	 BCM_REFERENCE(osh); \
94*4882a593Smuzhiyun 	 skb_realloc_headroom((struct sk_buff*)(skb), (b)); \
95*4882a593Smuzhiyun 	 })
96*4882a593Smuzhiyun #define PKTTAILROOM(osh, skb)		\
97*4882a593Smuzhiyun 	({ \
98*4882a593Smuzhiyun 	 BCM_REFERENCE(osh); \
99*4882a593Smuzhiyun 	 skb_tailroom((struct sk_buff*)(skb)); \
100*4882a593Smuzhiyun 	 })
101*4882a593Smuzhiyun #define PKTPADTAILROOM(osh, skb, padlen) \
102*4882a593Smuzhiyun 	({ \
103*4882a593Smuzhiyun 	 BCM_REFERENCE(osh); \
104*4882a593Smuzhiyun 	 skb_pad((struct sk_buff*)(skb), (padlen)); \
105*4882a593Smuzhiyun 	 })
106*4882a593Smuzhiyun #define	PKTNEXT(osh, skb)		({BCM_REFERENCE(osh); (((struct sk_buff*)(skb))->next);})
107*4882a593Smuzhiyun #define	PKTSETNEXT(osh, skb, x)		\
108*4882a593Smuzhiyun 	({ \
109*4882a593Smuzhiyun 	 BCM_REFERENCE(osh); \
110*4882a593Smuzhiyun 	 (((struct sk_buff*)(skb))->next = (struct sk_buff*)(x)); \
111*4882a593Smuzhiyun 	 })
112*4882a593Smuzhiyun #define	PKTSETLEN(osh, skb, len)	\
113*4882a593Smuzhiyun 	({ \
114*4882a593Smuzhiyun 	 BCM_REFERENCE(osh); \
115*4882a593Smuzhiyun 	 __skb_trim((struct sk_buff*)(skb), (len)); \
116*4882a593Smuzhiyun 	 })
117*4882a593Smuzhiyun #define	PKTPUSH(osh, skb, bytes)	\
118*4882a593Smuzhiyun 	({ \
119*4882a593Smuzhiyun 	 BCM_REFERENCE(osh); \
120*4882a593Smuzhiyun 	 skb_push((struct sk_buff*)(skb), (bytes)); \
121*4882a593Smuzhiyun 	 })
122*4882a593Smuzhiyun #define	PKTPULL(osh, skb, bytes)	\
123*4882a593Smuzhiyun 	({ \
124*4882a593Smuzhiyun 	 BCM_REFERENCE(osh); \
125*4882a593Smuzhiyun 	 skb_pull((struct sk_buff*)(skb), (bytes)); \
126*4882a593Smuzhiyun 	 })
127*4882a593Smuzhiyun #define	PKTTAG(skb)			((void*)(((struct sk_buff*)(skb))->cb))
128*4882a593Smuzhiyun #define PKTSETPOOL(osh, skb, x, y)	BCM_REFERENCE(osh)
129*4882a593Smuzhiyun #define	PKTPOOL(osh, skb)		({BCM_REFERENCE(osh); BCM_REFERENCE(skb); FALSE;})
130*4882a593Smuzhiyun #define PKTFREELIST(skb)        PKTLINK(skb)
131*4882a593Smuzhiyun #define PKTSETFREELIST(skb, x)  PKTSETLINK((skb), (x))
132*4882a593Smuzhiyun #define PKTPTR(skb)             (skb)
133*4882a593Smuzhiyun #define PKTID(skb)              ({BCM_REFERENCE(skb); 0;})
134*4882a593Smuzhiyun #define PKTSETID(skb, id)       ({BCM_REFERENCE(skb); BCM_REFERENCE(id);})
135*4882a593Smuzhiyun #define PKTIDAVAIL()            (0xFFFFFFFFu)
136*4882a593Smuzhiyun #define PKTSHRINK(osh, m)		({BCM_REFERENCE(osh); m;})
137*4882a593Smuzhiyun #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) && defined(TSQ_MULTIPLIER)
138*4882a593Smuzhiyun #define PKTORPHAN(skb, tsq)          osl_pkt_orphan_partial(skb, tsq)
139*4882a593Smuzhiyun extern void osl_pkt_orphan_partial(struct sk_buff *skb, int tsq);
140*4882a593Smuzhiyun #else
141*4882a593Smuzhiyun #define PKTORPHAN(skb, tsq)          ({BCM_REFERENCE(skb); 0;})
142*4882a593Smuzhiyun #endif /* Linux Version >= 3.6 */
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun #ifdef BCMDBG_CTRACE
145*4882a593Smuzhiyun #define	DEL_CTRACE(zosh, zskb) { \
146*4882a593Smuzhiyun 	unsigned long zflags; \
147*4882a593Smuzhiyun 	OSL_CTRACE_LOCK(&(zosh)->ctrace_lock, zflags); \
148*4882a593Smuzhiyun 	list_del(&(zskb)->ctrace_list); \
149*4882a593Smuzhiyun 	(zosh)->ctrace_num--; \
150*4882a593Smuzhiyun 	(zskb)->ctrace_start = 0; \
151*4882a593Smuzhiyun 	(zskb)->ctrace_count = 0; \
152*4882a593Smuzhiyun 	OSL_CTRACE_UNLOCK(&(zosh)->ctrace_lock, zflags); \
153*4882a593Smuzhiyun }
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun #define	UPDATE_CTRACE(zskb, zfile, zline) { \
156*4882a593Smuzhiyun 	struct sk_buff *_zskb = (struct sk_buff *)(zskb); \
157*4882a593Smuzhiyun 	if (_zskb->ctrace_count < CTRACE_NUM) { \
158*4882a593Smuzhiyun 		_zskb->func[_zskb->ctrace_count] = zfile; \
159*4882a593Smuzhiyun 		_zskb->line[_zskb->ctrace_count] = zline; \
160*4882a593Smuzhiyun 		_zskb->ctrace_count++; \
161*4882a593Smuzhiyun 	} \
162*4882a593Smuzhiyun 	else { \
163*4882a593Smuzhiyun 		_zskb->func[_zskb->ctrace_start] = zfile; \
164*4882a593Smuzhiyun 		_zskb->line[_zskb->ctrace_start] = zline; \
165*4882a593Smuzhiyun 		_zskb->ctrace_start++; \
166*4882a593Smuzhiyun 		if (_zskb->ctrace_start >= CTRACE_NUM) \
167*4882a593Smuzhiyun 			_zskb->ctrace_start = 0; \
168*4882a593Smuzhiyun 	} \
169*4882a593Smuzhiyun }
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun #define	ADD_CTRACE(zosh, zskb, zfile, zline) { \
172*4882a593Smuzhiyun 	unsigned long zflags; \
173*4882a593Smuzhiyun 	OSL_CTRACE_LOCK(&(zosh)->ctrace_lock, zflags); \
174*4882a593Smuzhiyun 	list_add(&(zskb)->ctrace_list, &(zosh)->ctrace_list); \
175*4882a593Smuzhiyun 	(zosh)->ctrace_num++; \
176*4882a593Smuzhiyun 	UPDATE_CTRACE(zskb, zfile, zline); \
177*4882a593Smuzhiyun 	OSL_CTRACE_UNLOCK(&(zosh)->ctrace_lock, zflags); \
178*4882a593Smuzhiyun }
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun #define PKTCALLER(zskb)	UPDATE_CTRACE((struct sk_buff *)zskb, (char *)__FUNCTION__, __LINE__)
181*4882a593Smuzhiyun #endif /* BCMDBG_CTRACE */
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun #define	PKTSETFAST(osh, skb)	({BCM_REFERENCE(osh); BCM_REFERENCE(skb);})
184*4882a593Smuzhiyun #define	PKTCLRFAST(osh, skb)	({BCM_REFERENCE(osh); BCM_REFERENCE(skb);})
185*4882a593Smuzhiyun #define	PKTISFAST(osh, skb)	({BCM_REFERENCE(osh); BCM_REFERENCE(skb); FALSE;})
186*4882a593Smuzhiyun #define PKTLITIDX(skb)		({BCM_REFERENCE(skb); 0;})
187*4882a593Smuzhiyun #define PKTSETLITIDX(skb, idx)	({BCM_REFERENCE(skb); BCM_REFERENCE(idx);})
188*4882a593Smuzhiyun #define PKTRESETLITIDX(skb)	({BCM_REFERENCE(skb);})
189*4882a593Smuzhiyun #define PKTRITIDX(skb)		({BCM_REFERENCE(skb); 0;})
190*4882a593Smuzhiyun #define PKTSETRITIDX(skb, idx)	({BCM_REFERENCE(skb); BCM_REFERENCE(idx);})
191*4882a593Smuzhiyun #define PKTRESETRITIDX(skb)	({BCM_REFERENCE(skb);})
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun #define	PKTSETSKIPCT(osh, skb)	({BCM_REFERENCE(osh); BCM_REFERENCE(skb);})
194*4882a593Smuzhiyun #define	PKTCLRSKIPCT(osh, skb)	({BCM_REFERENCE(osh); BCM_REFERENCE(skb);})
195*4882a593Smuzhiyun #define	PKTSKIPCT(osh, skb)	({BCM_REFERENCE(osh); BCM_REFERENCE(skb);})
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun #define PKTFRAGLEN(osh, lb, ix)			(0)
198*4882a593Smuzhiyun #define PKTSETFRAGLEN(osh, lb, ix, len)		BCM_REFERENCE(osh)
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun #define	PKTSETTOBR(osh, skb)	({BCM_REFERENCE(osh); BCM_REFERENCE(skb);})
201*4882a593Smuzhiyun #define	PKTCLRTOBR(osh, skb)	({BCM_REFERENCE(osh); BCM_REFERENCE(skb);})
202*4882a593Smuzhiyun #define	PKTISTOBR(skb)	({BCM_REFERENCE(skb); FALSE;})
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun #ifdef BCMFA
205*4882a593Smuzhiyun #ifdef BCMFA_HW_HASH
206*4882a593Smuzhiyun #define PKTSETFAHIDX(skb, idx)	(((struct sk_buff*)(skb))->napt_idx = idx)
207*4882a593Smuzhiyun #else
208*4882a593Smuzhiyun #define PKTSETFAHIDX(skb, idx)	({BCM_REFERENCE(skb); BCM_REFERENCE(idx);})
209*4882a593Smuzhiyun #endif /* BCMFA_SW_HASH */
210*4882a593Smuzhiyun #define PKTGETFAHIDX(skb)	(((struct sk_buff*)(skb))->napt_idx)
211*4882a593Smuzhiyun #define PKTSETFADEV(skb, imp)	(((struct sk_buff*)(skb))->dev = imp)
212*4882a593Smuzhiyun #define PKTSETRXDEV(skb)	(((struct sk_buff*)(skb))->rxdev = ((struct sk_buff*)(skb))->dev)
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun #define	AUX_TCP_FIN_RST	(1 << 0)
215*4882a593Smuzhiyun #define	AUX_FREED	(1 << 1)
216*4882a593Smuzhiyun #define PKTSETFAAUX(skb)	(((struct sk_buff*)(skb))->napt_flags |= AUX_TCP_FIN_RST)
217*4882a593Smuzhiyun #define	PKTCLRFAAUX(skb)	(((struct sk_buff*)(skb))->napt_flags &= (~AUX_TCP_FIN_RST))
218*4882a593Smuzhiyun #define	PKTISFAAUX(skb)		(((struct sk_buff*)(skb))->napt_flags & AUX_TCP_FIN_RST)
219*4882a593Smuzhiyun #define PKTSETFAFREED(skb)	(((struct sk_buff*)(skb))->napt_flags |= AUX_FREED)
220*4882a593Smuzhiyun #define	PKTCLRFAFREED(skb)	(((struct sk_buff*)(skb))->napt_flags &= (~AUX_FREED))
221*4882a593Smuzhiyun #define	PKTISFAFREED(skb)	(((struct sk_buff*)(skb))->napt_flags & AUX_FREED)
222*4882a593Smuzhiyun #define	PKTISFABRIDGED(skb)	PKTISFAAUX(skb)
223*4882a593Smuzhiyun #else
224*4882a593Smuzhiyun #define	PKTISFAAUX(skb)		({BCM_REFERENCE(skb); FALSE;})
225*4882a593Smuzhiyun #define	PKTISFABRIDGED(skb)	({BCM_REFERENCE(skb); FALSE;})
226*4882a593Smuzhiyun #define	PKTISFAFREED(skb)	({BCM_REFERENCE(skb); FALSE;})
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun #define	PKTCLRFAAUX(skb)	BCM_REFERENCE(skb)
229*4882a593Smuzhiyun #define PKTSETFAFREED(skb)	BCM_REFERENCE(skb)
230*4882a593Smuzhiyun #define	PKTCLRFAFREED(skb)	BCM_REFERENCE(skb)
231*4882a593Smuzhiyun #endif /* BCMFA */
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun #if defined(BCM_OBJECT_TRACE)
234*4882a593Smuzhiyun extern void linux_pktfree(osl_t *osh, void *skb, bool send, int line, const char *caller);
235*4882a593Smuzhiyun #else
236*4882a593Smuzhiyun extern void linux_pktfree(osl_t *osh, void *skb, bool send);
237*4882a593Smuzhiyun #endif /* BCM_OBJECT_TRACE */
238*4882a593Smuzhiyun extern void *osl_pktget_static(osl_t *osh, uint len);
239*4882a593Smuzhiyun extern void osl_pktfree_static(osl_t *osh, void *skb, bool send);
240*4882a593Smuzhiyun extern void osl_pktclone(osl_t *osh, void **pkt);
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun #ifdef BCMDBG_PKT /* pkt logging for debugging */
243*4882a593Smuzhiyun extern void *linux_pktget(osl_t *osh, uint len, int line, char *file);
244*4882a593Smuzhiyun extern void *osl_pkt_frmnative(osl_t *osh, void *skb, int line, char *file);
245*4882a593Smuzhiyun extern void *osl_pktdup(osl_t *osh, void *skb, int line, char *file);
246*4882a593Smuzhiyun extern void osl_pktlist_add(osl_t *osh, void *p, int line, char *file);
247*4882a593Smuzhiyun extern void osl_pktlist_remove(osl_t *osh, void *p);
248*4882a593Smuzhiyun extern char *osl_pktlist_dump(osl_t *osh, char *buf);
249*4882a593Smuzhiyun #ifdef BCMDBG_PTRACE
250*4882a593Smuzhiyun extern void osl_pkttrace(osl_t *osh, void *pkt, uint16 bit);
251*4882a593Smuzhiyun #endif /* BCMDBG_PTRACE */
252*4882a593Smuzhiyun #else /* BCMDBG_PKT */
253*4882a593Smuzhiyun #ifdef BCMDBG_CTRACE
254*4882a593Smuzhiyun #define PKT_CTRACE_DUMP(osh, b)	osl_ctrace_dump((osh), (b))
255*4882a593Smuzhiyun extern void *linux_pktget(osl_t *osh, uint len, int line, char *file);
256*4882a593Smuzhiyun extern void *osl_pkt_frmnative(osl_t *osh, void *skb, int line, char *file);
257*4882a593Smuzhiyun extern int osl_pkt_is_frmnative(osl_t *osh, struct sk_buff *pkt);
258*4882a593Smuzhiyun extern void *osl_pktdup(osl_t *osh, void *skb, int line, char *file);
259*4882a593Smuzhiyun struct bcmstrbuf;
260*4882a593Smuzhiyun extern void osl_ctrace_dump(osl_t *osh, struct bcmstrbuf *b);
261*4882a593Smuzhiyun #else
262*4882a593Smuzhiyun #ifdef BCM_OBJECT_TRACE
263*4882a593Smuzhiyun extern void *linux_pktget(osl_t *osh, uint len, int line, const char *caller);
264*4882a593Smuzhiyun extern void *osl_pktdup(osl_t *osh, void *skb, int line, const char *caller);
265*4882a593Smuzhiyun #else
266*4882a593Smuzhiyun extern void *linux_pktget(osl_t *osh, uint len);
267*4882a593Smuzhiyun extern void *osl_pktdup(osl_t *osh, void *skb);
268*4882a593Smuzhiyun #endif /* BCM_OBJECT_TRACE */
269*4882a593Smuzhiyun extern void *osl_pkt_frmnative(osl_t *osh, void *skb);
270*4882a593Smuzhiyun #endif /* BCMDBG_CTRACE */
271*4882a593Smuzhiyun #endif /* BCMDBG_PKT */
272*4882a593Smuzhiyun extern struct sk_buff *osl_pkt_tonative(osl_t *osh, void *pkt);
273*4882a593Smuzhiyun #ifdef BCMDBG_PKT
274*4882a593Smuzhiyun #define PKTFRMNATIVE(osh, skb)  osl_pkt_frmnative(((osl_t *)osh), \
275*4882a593Smuzhiyun 				(struct sk_buff*)(skb), __LINE__, __FILE__)
276*4882a593Smuzhiyun #else /* BCMDBG_PKT */
277*4882a593Smuzhiyun #ifdef BCMDBG_CTRACE
278*4882a593Smuzhiyun #define PKTFRMNATIVE(osh, skb)  osl_pkt_frmnative(((osl_t *)osh), \
279*4882a593Smuzhiyun 				(struct sk_buff*)(skb), __LINE__, __FILE__)
280*4882a593Smuzhiyun #define	PKTISFRMNATIVE(osh, skb) osl_pkt_is_frmnative((osl_t *)(osh), (struct sk_buff *)(skb))
281*4882a593Smuzhiyun #else
282*4882a593Smuzhiyun #define PKTFRMNATIVE(osh, skb)	osl_pkt_frmnative(((osl_t *)osh), (struct sk_buff*)(skb))
283*4882a593Smuzhiyun #endif /* BCMDBG_CTRACE */
284*4882a593Smuzhiyun #endif /* BCMDBG_PKT */
285*4882a593Smuzhiyun #define PKTTONATIVE(osh, pkt)		osl_pkt_tonative((osl_t *)(osh), (pkt))
286*4882a593Smuzhiyun 
287*4882a593Smuzhiyun #define	PKTLINK(skb)			(((struct sk_buff*)(skb))->prev)
288*4882a593Smuzhiyun #define	PKTSETLINK(skb, x)		(((struct sk_buff*)(skb))->prev = (struct sk_buff*)(x))
289*4882a593Smuzhiyun #define	PKTPRIO(skb)			(((struct sk_buff*)(skb))->priority)
290*4882a593Smuzhiyun #define	PKTSETPRIO(skb, x)		(((struct sk_buff*)(skb))->priority = (x))
291*4882a593Smuzhiyun #define PKTSUMNEEDED(skb)		(((struct sk_buff*)(skb))->ip_summed == CHECKSUM_HW)
292*4882a593Smuzhiyun #define PKTSETSUMGOOD(skb, x)		(((struct sk_buff*)(skb))->ip_summed = \
293*4882a593Smuzhiyun 						((x) ? CHECKSUM_UNNECESSARY : CHECKSUM_NONE))
294*4882a593Smuzhiyun /* PKTSETSUMNEEDED and PKTSUMGOOD are not possible because skb->ip_summed is overloaded */
295*4882a593Smuzhiyun #define PKTSHARED(skb)                  (((struct sk_buff*)(skb))->cloned)
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun #ifdef CONFIG_NF_CONNTRACK_MARK
298*4882a593Smuzhiyun #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0))
299*4882a593Smuzhiyun #define PKTMARK(p)                     (((struct sk_buff *)(p))->mark)
300*4882a593Smuzhiyun #define PKTSETMARK(p, m)               ((struct sk_buff *)(p))->mark = (m)
301*4882a593Smuzhiyun #else /* !2.6.0 */
302*4882a593Smuzhiyun #define PKTMARK(p)                     (((struct sk_buff *)(p))->nfmark)
303*4882a593Smuzhiyun #define PKTSETMARK(p, m)               ((struct sk_buff *)(p))->nfmark = (m)
304*4882a593Smuzhiyun #endif /* 2.6.0 */
305*4882a593Smuzhiyun #else /* CONFIG_NF_CONNTRACK_MARK */
306*4882a593Smuzhiyun #define PKTMARK(p)                     0
307*4882a593Smuzhiyun #define PKTSETMARK(p, m)
308*4882a593Smuzhiyun #endif /* CONFIG_NF_CONNTRACK_MARK */
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun #else	/* BINOSL */
311*4882a593Smuzhiyun 
312*4882a593Smuzhiyun #define OSL_PREF_RANGE_LD(va, sz)
313*4882a593Smuzhiyun #define OSL_PREF_RANGE_ST(va, sz)
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun /* packet primitives */
316*4882a593Smuzhiyun #ifdef BCMDBG_PKT
317*4882a593Smuzhiyun #define	PKTGET(osh, len, send)		linux_pktget((osh), (len), __LINE__, __FILE__)
318*4882a593Smuzhiyun #define	PKTDUP(osh, skb)		osl_pktdup((osh), (skb), __LINE__, __FILE__)
319*4882a593Smuzhiyun #define PKTFRMNATIVE(osh, skb)		osl_pkt_frmnative((osh), (skb), __LINE__, __FILE__)
320*4882a593Smuzhiyun #define PKTLIST_DUMP(osh, buf) 		osl_pktlist_dump(osh, buf)
321*4882a593Smuzhiyun #define PKTDBG_TRACE(osh, pkt, bit)	BCM_REFERENCE(osh)
322*4882a593Smuzhiyun #else /* BCMDBG_PKT */
323*4882a593Smuzhiyun #ifdef BCMDBG_CTRACE
324*4882a593Smuzhiyun #define	PKTGET(osh, len, send)		linux_pktget((osh), (len), __LINE__, __FILE__)
325*4882a593Smuzhiyun #define	PKTDUP(osh, skb)		osl_pktdup((osh), (skb), __LINE__, __FILE__)
326*4882a593Smuzhiyun #define PKTFRMNATIVE(osh, skb)		osl_pkt_frmnative((osh), (skb), __LINE__, __FILE__)
327*4882a593Smuzhiyun #else
328*4882a593Smuzhiyun #ifdef BCM_OBJECT_TRACE
329*4882a593Smuzhiyun #define	PKTGET(osh, len, send)		linux_pktget((osh), (len), __LINE__, __FUNCTION__)
330*4882a593Smuzhiyun #define	PKTDUP(osh, skb)		osl_pktdup((osh), (skb), __LINE__, __FUNCTION__)
331*4882a593Smuzhiyun #else
332*4882a593Smuzhiyun #define	PKTGET(osh, len, send)		linux_pktget((osh), (len))
333*4882a593Smuzhiyun #define	PKTDUP(osh, skb)		osl_pktdup((osh), (skb))
334*4882a593Smuzhiyun #endif /* BCM_OBJECT_TRACE */
335*4882a593Smuzhiyun #define PKTFRMNATIVE(osh, skb)		osl_pkt_frmnative((osh), (skb))
336*4882a593Smuzhiyun #endif /* BCMDBG_CTRACE */
337*4882a593Smuzhiyun #define PKTLIST_DUMP(osh, buf)		({BCM_REFERENCE(osh); BCM_REFERENCE(buf);})
338*4882a593Smuzhiyun #define PKTDBG_TRACE(osh, pkt, bit)	({BCM_REFERENCE(osh); BCM_REFERENCE(pkt);})
339*4882a593Smuzhiyun #endif /* BCMDBG_PKT */
340*4882a593Smuzhiyun #if defined(BCM_OBJECT_TRACE)
341*4882a593Smuzhiyun #define	PKTFREE(osh, skb, send)		linux_pktfree((osh), (skb), (send), __LINE__, __FUNCTION__)
342*4882a593Smuzhiyun #else
343*4882a593Smuzhiyun #define	PKTFREE(osh, skb, send)		linux_pktfree((osh), (skb), (send))
344*4882a593Smuzhiyun #endif /* BCM_OBJECT_TRACE */
345*4882a593Smuzhiyun #define	PKTDATA(osh, skb)		osl_pktdata((osh), (skb))
346*4882a593Smuzhiyun #define	PKTLEN(osh, skb)		osl_pktlen((osh), (skb))
347*4882a593Smuzhiyun #define PKTHEADROOM(osh, skb)		osl_pktheadroom((osh), (skb))
348*4882a593Smuzhiyun #define PKTTAILROOM(osh, skb)		osl_pkttailroom((osh), (skb))
349*4882a593Smuzhiyun #define	PKTNEXT(osh, skb)		osl_pktnext((osh), (skb))
350*4882a593Smuzhiyun #define	PKTSETNEXT(osh, skb, x)		({BCM_REFERENCE(osh); osl_pktsetnext((skb), (x));})
351*4882a593Smuzhiyun #define	PKTSETLEN(osh, skb, len)	osl_pktsetlen((osh), (skb), (len))
352*4882a593Smuzhiyun #define	PKTPUSH(osh, skb, bytes)	osl_pktpush((osh), (skb), (bytes))
353*4882a593Smuzhiyun #define	PKTPULL(osh, skb, bytes)	osl_pktpull((osh), (skb), (bytes))
354*4882a593Smuzhiyun #define PKTTAG(skb)			osl_pkttag((skb))
355*4882a593Smuzhiyun #define PKTTONATIVE(osh, pkt)		osl_pkt_tonative((osh), (pkt))
356*4882a593Smuzhiyun #define	PKTLINK(skb)			osl_pktlink((skb))
357*4882a593Smuzhiyun #define	PKTSETLINK(skb, x)		osl_pktsetlink((skb), (x))
358*4882a593Smuzhiyun #define	PKTPRIO(skb)			osl_pktprio((skb))
359*4882a593Smuzhiyun #define	PKTSETPRIO(skb, x)		osl_pktsetprio((skb), (x))
360*4882a593Smuzhiyun #define PKTSHARED(skb)                  osl_pktshared((skb))
361*4882a593Smuzhiyun #define PKTSETPOOL(osh, skb, x, y)	({BCM_REFERENCE(osh); BCM_REFERENCE(skb);})
362*4882a593Smuzhiyun #define	PKTPOOL(osh, skb)		({BCM_REFERENCE(osh); BCM_REFERENCE(skb); FALSE;})
363*4882a593Smuzhiyun #define PKTFREELIST(skb)        PKTLINK(skb)
364*4882a593Smuzhiyun #define PKTSETFREELIST(skb, x)  PKTSETLINK((skb), (x))
365*4882a593Smuzhiyun #define PKTPTR(skb)             (skb)
366*4882a593Smuzhiyun #define PKTID(skb)              ({BCM_REFERENCE(skb); 0;})
367*4882a593Smuzhiyun #define PKTSETID(skb, id)       ({BCM_REFERENCE(skb); BCM_REFERENCE(id);})
368*4882a593Smuzhiyun #define PKTIDAVAIL()            (0xFFFFFFFFu)
369*4882a593Smuzhiyun 
370*4882a593Smuzhiyun #ifdef BCMDBG_PKT /* pkt logging for debugging */
371*4882a593Smuzhiyun extern void *linux_pktget(osl_t *osh, uint len, int line, char *file);
372*4882a593Smuzhiyun extern void *osl_pktdup(osl_t *osh, void *skb, int line, char *file);
373*4882a593Smuzhiyun extern void *osl_pkt_frmnative(osl_t *osh, void *skb, int line, char *file);
374*4882a593Smuzhiyun #else /* BCMDBG_PKT */
375*4882a593Smuzhiyun #ifdef BCM_OBJECT_TRACE
376*4882a593Smuzhiyun extern void *linux_pktget(osl_t *osh, uint len, int line, const char *caller);
377*4882a593Smuzhiyun extern void *osl_pktdup(osl_t *osh, void *skb, int line, const char *caller);
378*4882a593Smuzhiyun #else
379*4882a593Smuzhiyun extern void *linux_pktget(osl_t *osh, uint len);
380*4882a593Smuzhiyun extern void *osl_pktdup(osl_t *osh, void *skb);
381*4882a593Smuzhiyun #endif /* BCM_OBJECT_TRACE */
382*4882a593Smuzhiyun extern void *osl_pkt_frmnative(osl_t *osh, void *skb);
383*4882a593Smuzhiyun #endif /* BCMDBG_PKT */
384*4882a593Smuzhiyun #if defined(BCM_OBJECT_TRACE)
385*4882a593Smuzhiyun extern void linux_pktfree(osl_t *osh, void *skb, bool send, int line, const char *caller);
386*4882a593Smuzhiyun #else
387*4882a593Smuzhiyun extern void linux_pktfree(osl_t *osh, void *skb, bool send);
388*4882a593Smuzhiyun #endif /* BCM_OBJECT_TRACE */
389*4882a593Smuzhiyun extern uchar *osl_pktdata(osl_t *osh, void *skb);
390*4882a593Smuzhiyun extern uint osl_pktlen(osl_t *osh, void *skb);
391*4882a593Smuzhiyun extern uint osl_pktheadroom(osl_t *osh, void *skb);
392*4882a593Smuzhiyun extern uint osl_pkttailroom(osl_t *osh, void *skb);
393*4882a593Smuzhiyun extern void *osl_pktnext(osl_t *osh, void *skb);
394*4882a593Smuzhiyun extern void osl_pktsetnext(void *skb, void *x);
395*4882a593Smuzhiyun extern void osl_pktsetlen(osl_t *osh, void *skb, uint len);
396*4882a593Smuzhiyun extern uchar *osl_pktpush(osl_t *osh, void *skb, int bytes);
397*4882a593Smuzhiyun extern uchar *osl_pktpull(osl_t *osh, void *skb, int bytes);
398*4882a593Smuzhiyun extern void *osl_pkttag(void *skb);
399*4882a593Smuzhiyun extern void *osl_pktlink(void *skb);
400*4882a593Smuzhiyun extern void osl_pktsetlink(void *skb, void *x);
401*4882a593Smuzhiyun extern uint osl_pktprio(void *skb);
402*4882a593Smuzhiyun extern void osl_pktsetprio(void *skb, uint x);
403*4882a593Smuzhiyun extern struct sk_buff *osl_pkt_tonative(osl_t *osh, void *pkt);
404*4882a593Smuzhiyun extern bool osl_pktshared(void *skb);
405*4882a593Smuzhiyun 
406*4882a593Smuzhiyun #ifdef BCMDBG_PKT /* pkt logging for debugging */
407*4882a593Smuzhiyun extern char *osl_pktlist_dump(osl_t *osh, char *buf);
408*4882a593Smuzhiyun extern void osl_pktlist_add(osl_t *osh, void *p, int line, char *file);
409*4882a593Smuzhiyun extern void osl_pktlist_remove(osl_t *osh, void *p);
410*4882a593Smuzhiyun #endif /* BCMDBG_PKT */
411*4882a593Smuzhiyun 
412*4882a593Smuzhiyun #endif	/* BINOSL */
413*4882a593Smuzhiyun 
414*4882a593Smuzhiyun #define PKTALLOCED(osh)		osl_pktalloced(osh)
415*4882a593Smuzhiyun extern uint osl_pktalloced(osl_t *osh);
416*4882a593Smuzhiyun 
417*4882a593Smuzhiyun #define PKTPOOLHEAPCOUNT()            (0u)
418*4882a593Smuzhiyun 
419*4882a593Smuzhiyun #endif /* BCMDRIVER */
420*4882a593Smuzhiyun 
421*4882a593Smuzhiyun #endif	/* _linux_pkt_h_ */
422