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