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