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