149ed6e97SBjoern A. Zeeb /*- 2262c5e81SBjoern A. Zeeb * Copyright (c) 2020-2023 The FreeBSD Foundation 31213a6beSBjoern A. Zeeb * Copyright (c) 2021-2023 Bjoern A. Zeeb 449ed6e97SBjoern A. Zeeb * 549ed6e97SBjoern A. Zeeb * This software was developed by Björn Zeeb under sponsorship from 649ed6e97SBjoern A. Zeeb * the FreeBSD Foundation. 749ed6e97SBjoern A. Zeeb * 849ed6e97SBjoern A. Zeeb * Redistribution and use in source and binary forms, with or without 949ed6e97SBjoern A. Zeeb * modification, are permitted provided that the following conditions 1049ed6e97SBjoern A. Zeeb * are met: 1149ed6e97SBjoern A. Zeeb * 1. Redistributions of source code must retain the above copyright 1249ed6e97SBjoern A. Zeeb * notice, this list of conditions and the following disclaimer. 1349ed6e97SBjoern A. Zeeb * 2. Redistributions in binary form must reproduce the above copyright 1449ed6e97SBjoern A. Zeeb * notice, this list of conditions and the following disclaimer in the 1549ed6e97SBjoern A. Zeeb * documentation and/or other materials provided with the distribution. 1649ed6e97SBjoern A. Zeeb * 1749ed6e97SBjoern A. Zeeb * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1849ed6e97SBjoern A. Zeeb * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1949ed6e97SBjoern A. Zeeb * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2049ed6e97SBjoern A. Zeeb * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2149ed6e97SBjoern A. Zeeb * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2249ed6e97SBjoern A. Zeeb * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2349ed6e97SBjoern A. Zeeb * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2449ed6e97SBjoern A. Zeeb * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2549ed6e97SBjoern A. Zeeb * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2649ed6e97SBjoern A. Zeeb * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2749ed6e97SBjoern A. Zeeb * SUCH DAMAGE. 2849ed6e97SBjoern A. Zeeb */ 2949ed6e97SBjoern A. Zeeb 3049ed6e97SBjoern A. Zeeb /* 3149ed6e97SBjoern A. Zeeb * NOTE: this socket buffer compatibility code is highly EXPERIMENTAL. 3249ed6e97SBjoern A. Zeeb * Do not rely on the internals of this implementation. They are highly 3349ed6e97SBjoern A. Zeeb * likely to change as we will improve the integration to FreeBSD mbufs. 3449ed6e97SBjoern A. Zeeb */ 3549ed6e97SBjoern A. Zeeb 3649ed6e97SBjoern A. Zeeb #ifndef _LINUXKPI_LINUX_SKBUFF_H 3749ed6e97SBjoern A. Zeeb #define _LINUXKPI_LINUX_SKBUFF_H 3849ed6e97SBjoern A. Zeeb 399df5f29cSBjoern A. Zeeb #include <linux/kernel.h> 4049ed6e97SBjoern A. Zeeb #include <linux/page.h> 4149ed6e97SBjoern A. Zeeb #include <linux/dma-mapping.h> 4249ed6e97SBjoern A. Zeeb #include <linux/netdev_features.h> 4349ed6e97SBjoern A. Zeeb #include <linux/list.h> 4449ed6e97SBjoern A. Zeeb #include <linux/gfp.h> 456baea331SBjoern A. Zeeb #include <linux/compiler.h> 466baea331SBjoern A. Zeeb #include <linux/spinlock.h> 47262c5e81SBjoern A. Zeeb #include <linux/ktime.h> 4849ed6e97SBjoern A. Zeeb 4959d262feSBjoern A. Zeeb #include "opt_wlan.h" 5059d262feSBjoern A. Zeeb 5159d262feSBjoern A. Zeeb /* Currently this is only used for wlan so we can depend on that. */ 5259d262feSBjoern A. Zeeb #if defined(IEEE80211_DEBUG) && !defined(SKB_DEBUG) 5359d262feSBjoern A. Zeeb #define SKB_DEBUG 5459d262feSBjoern A. Zeeb #endif 5559d262feSBjoern A. Zeeb 5649ed6e97SBjoern A. Zeeb /* #define SKB_DEBUG */ 5759d262feSBjoern A. Zeeb 5849ed6e97SBjoern A. Zeeb #ifdef SKB_DEBUG 5949ed6e97SBjoern A. Zeeb #define DSKB_TODO 0x01 606baea331SBjoern A. Zeeb #define DSKB_IMPROVE 0x02 616baea331SBjoern A. Zeeb #define DSKB_TRACE 0x10 626baea331SBjoern A. Zeeb #define DSKB_TRACEX 0x20 636baea331SBjoern A. Zeeb extern int linuxkpi_debug_skb; 6449ed6e97SBjoern A. Zeeb 656baea331SBjoern A. Zeeb #define SKB_TODO() \ 666baea331SBjoern A. Zeeb if (linuxkpi_debug_skb & DSKB_TODO) \ 6749ed6e97SBjoern A. Zeeb printf("SKB_TODO %s:%d\n", __func__, __LINE__) 686baea331SBjoern A. Zeeb #define SKB_IMPROVE(...) \ 696baea331SBjoern A. Zeeb if (linuxkpi_debug_skb & DSKB_IMPROVE) \ 706baea331SBjoern A. Zeeb printf("SKB_IMPROVE %s:%d\n", __func__, __LINE__) 716baea331SBjoern A. Zeeb #define SKB_TRACE(_s) \ 726baea331SBjoern A. Zeeb if (linuxkpi_debug_skb & DSKB_TRACE) \ 736baea331SBjoern A. Zeeb printf("SKB_TRACE %s:%d %p\n", __func__, __LINE__, _s) 746baea331SBjoern A. Zeeb #define SKB_TRACE2(_s, _p) \ 756baea331SBjoern A. Zeeb if (linuxkpi_debug_skb & DSKB_TRACE) \ 766baea331SBjoern A. Zeeb printf("SKB_TRACE %s:%d %p, %p\n", __func__, __LINE__, _s, _p) 776baea331SBjoern A. Zeeb #define SKB_TRACE_FMT(_s, _fmt, ...) \ 786baea331SBjoern A. Zeeb if (linuxkpi_debug_skb & DSKB_TRACE) \ 796baea331SBjoern A. Zeeb printf("SKB_TRACE %s:%d %p " _fmt "\n", __func__, __LINE__, _s, \ 806baea331SBjoern A. Zeeb __VA_ARGS__) 8149ed6e97SBjoern A. Zeeb #else 826baea331SBjoern A. Zeeb #define SKB_TODO() do { } while(0) 836baea331SBjoern A. Zeeb #define SKB_IMPROVE(...) do { } while(0) 8449ed6e97SBjoern A. Zeeb #define SKB_TRACE(_s) do { } while(0) 8549ed6e97SBjoern A. Zeeb #define SKB_TRACE2(_s, _p) do { } while(0) 8649ed6e97SBjoern A. Zeeb #define SKB_TRACE_FMT(_s, ...) do { } while(0) 8749ed6e97SBjoern A. Zeeb #endif 8849ed6e97SBjoern A. Zeeb 8949ed6e97SBjoern A. Zeeb enum sk_buff_pkt_type { 9049ed6e97SBjoern A. Zeeb PACKET_BROADCAST, 9149ed6e97SBjoern A. Zeeb PACKET_MULTICAST, 9249ed6e97SBjoern A. Zeeb PACKET_OTHERHOST, 9349ed6e97SBjoern A. Zeeb }; 9449ed6e97SBjoern A. Zeeb 95262c5e81SBjoern A. Zeeb struct skb_shared_hwtstamps { 96262c5e81SBjoern A. Zeeb ktime_t hwtstamp; 97262c5e81SBjoern A. Zeeb }; 98262c5e81SBjoern A. Zeeb 999df5f29cSBjoern A. Zeeb #define NET_SKB_PAD max(CACHE_LINE_SIZE, 32) 1003d3ec178SBjoern A. Zeeb #define SKB_DATA_ALIGN(_x) roundup2(_x, CACHE_LINE_SIZE) 10149ed6e97SBjoern A. Zeeb 10249ed6e97SBjoern A. Zeeb struct sk_buff_head { 10349ed6e97SBjoern A. Zeeb /* XXX TODO */ 104b2dcb848SBjoern A. Zeeb union { 105b2dcb848SBjoern A. Zeeb struct { 10649ed6e97SBjoern A. Zeeb struct sk_buff *next; 10749ed6e97SBjoern A. Zeeb struct sk_buff *prev; 108b2dcb848SBjoern A. Zeeb }; 109b2dcb848SBjoern A. Zeeb struct sk_buff_head_l { 110b2dcb848SBjoern A. Zeeb struct sk_buff *next; 111b2dcb848SBjoern A. Zeeb struct sk_buff *prev; 112b2dcb848SBjoern A. Zeeb } list; 113b2dcb848SBjoern A. Zeeb }; 11449ed6e97SBjoern A. Zeeb size_t qlen; 1156baea331SBjoern A. Zeeb spinlock_t lock; 11649ed6e97SBjoern A. Zeeb }; 11749ed6e97SBjoern A. Zeeb 11849ed6e97SBjoern A. Zeeb enum sk_checksum_flags { 11949ed6e97SBjoern A. Zeeb CHECKSUM_NONE = 0x00, 12049ed6e97SBjoern A. Zeeb CHECKSUM_UNNECESSARY = 0x01, 12149ed6e97SBjoern A. Zeeb CHECKSUM_PARTIAL = 0x02, 12249ed6e97SBjoern A. Zeeb CHECKSUM_COMPLETE = 0x04, 12349ed6e97SBjoern A. Zeeb }; 12449ed6e97SBjoern A. Zeeb 12549ed6e97SBjoern A. Zeeb struct skb_frag { 12649ed6e97SBjoern A. Zeeb /* XXX TODO */ 12749ed6e97SBjoern A. Zeeb struct page *page; /* XXX-BZ These three are a wild guess so far! */ 12849ed6e97SBjoern A. Zeeb off_t offset; 12949ed6e97SBjoern A. Zeeb size_t size; 13049ed6e97SBjoern A. Zeeb }; 13149ed6e97SBjoern A. Zeeb typedef struct skb_frag skb_frag_t; 13249ed6e97SBjoern A. Zeeb 13349ed6e97SBjoern A. Zeeb enum skb_shared_info_gso_type { 13449ed6e97SBjoern A. Zeeb SKB_GSO_TCPV4, 13549ed6e97SBjoern A. Zeeb SKB_GSO_TCPV6, 13649ed6e97SBjoern A. Zeeb }; 13749ed6e97SBjoern A. Zeeb 13849ed6e97SBjoern A. Zeeb struct skb_shared_info { 13949ed6e97SBjoern A. Zeeb enum skb_shared_info_gso_type gso_type; 14049ed6e97SBjoern A. Zeeb uint16_t gso_size; 14149ed6e97SBjoern A. Zeeb uint16_t nr_frags; 1426baea331SBjoern A. Zeeb struct sk_buff *frag_list; 14349ed6e97SBjoern A. Zeeb skb_frag_t frags[64]; /* XXX TODO, 16xpage? */ 14449ed6e97SBjoern A. Zeeb }; 14549ed6e97SBjoern A. Zeeb 14649ed6e97SBjoern A. Zeeb struct sk_buff { 14749ed6e97SBjoern A. Zeeb /* XXX TODO */ 14889c32dafSBjoern A. Zeeb union { 14949ed6e97SBjoern A. Zeeb /* struct sk_buff_head */ 15089c32dafSBjoern A. Zeeb struct { 15149ed6e97SBjoern A. Zeeb struct sk_buff *next; 15249ed6e97SBjoern A. Zeeb struct sk_buff *prev; 15389c32dafSBjoern A. Zeeb }; 15489c32dafSBjoern A. Zeeb struct list_head list; 15589c32dafSBjoern A. Zeeb }; 15649ed6e97SBjoern A. Zeeb uint32_t _alloc_len; /* Length of alloc data-buf. XXX-BZ give up for truesize? */ 15749ed6e97SBjoern A. Zeeb uint32_t len; /* ? */ 15849ed6e97SBjoern A. Zeeb uint32_t data_len; /* ? If we have frags? */ 15949ed6e97SBjoern A. Zeeb uint32_t truesize; /* The total size of all buffers, incl. frags. */ 16049ed6e97SBjoern A. Zeeb uint16_t mac_len; /* Link-layer header length. */ 16149ed6e97SBjoern A. Zeeb __sum16 csum; 16249ed6e97SBjoern A. Zeeb uint16_t l3hdroff; /* network header offset from *head */ 16349ed6e97SBjoern A. Zeeb uint16_t l4hdroff; /* transport header offset from *head */ 16449ed6e97SBjoern A. Zeeb uint32_t priority; 16549ed6e97SBjoern A. Zeeb uint16_t qmap; /* queue mapping */ 1665504bd59SBjoern A. Zeeb uint16_t _flags; /* Internal flags. */ 1675504bd59SBjoern A. Zeeb #define _SKB_FLAGS_SKBEXTFRAG 0x0001 16849ed6e97SBjoern A. Zeeb enum sk_buff_pkt_type pkt_type; 169262c5e81SBjoern A. Zeeb uint16_t mac_header; /* offset of mac_header */ 17049ed6e97SBjoern A. Zeeb 17149ed6e97SBjoern A. Zeeb /* "Scratch" area for layers to store metadata. */ 17249ed6e97SBjoern A. Zeeb /* ??? I see sizeof() operations so probably an array. */ 17349ed6e97SBjoern A. Zeeb uint8_t cb[64] __aligned(CACHE_LINE_SIZE); 17449ed6e97SBjoern A. Zeeb 17549ed6e97SBjoern A. Zeeb struct net_device *dev; 17649ed6e97SBjoern A. Zeeb void *sk; /* XXX net/sock.h? */ 17749ed6e97SBjoern A. Zeeb 17849ed6e97SBjoern A. Zeeb int csum_offset, csum_start, ip_summed, protocol; 17949ed6e97SBjoern A. Zeeb 18049ed6e97SBjoern A. Zeeb uint8_t *head; /* Head of buffer. */ 18149ed6e97SBjoern A. Zeeb uint8_t *data; /* Head of data. */ 18249ed6e97SBjoern A. Zeeb uint8_t *tail; /* End of data. */ 18349ed6e97SBjoern A. Zeeb uint8_t *end; /* End of buffer. */ 18449ed6e97SBjoern A. Zeeb 18549ed6e97SBjoern A. Zeeb struct skb_shared_info *shinfo; 18649ed6e97SBjoern A. Zeeb 18749ed6e97SBjoern A. Zeeb /* FreeBSD specific bandaid (see linuxkpi_kfree_skb). */ 18849ed6e97SBjoern A. Zeeb void *m; 18949ed6e97SBjoern A. Zeeb void(*m_free_func)(void *); 19049ed6e97SBjoern A. Zeeb 19149ed6e97SBjoern A. Zeeb /* Force padding to CACHE_LINE_SIZE. */ 19249ed6e97SBjoern A. Zeeb uint8_t __scratch[0] __aligned(CACHE_LINE_SIZE); 19349ed6e97SBjoern A. Zeeb }; 19449ed6e97SBjoern A. Zeeb 19549ed6e97SBjoern A. Zeeb /* -------------------------------------------------------------------------- */ 19649ed6e97SBjoern A. Zeeb 19749ed6e97SBjoern A. Zeeb struct sk_buff *linuxkpi_alloc_skb(size_t, gfp_t); 1989df5f29cSBjoern A. Zeeb struct sk_buff *linuxkpi_dev_alloc_skb(size_t, gfp_t); 1995504bd59SBjoern A. Zeeb struct sk_buff *linuxkpi_build_skb(void *, size_t); 20049ed6e97SBjoern A. Zeeb void linuxkpi_kfree_skb(struct sk_buff *); 20149ed6e97SBjoern A. Zeeb 202349b042bSBjoern A. Zeeb struct sk_buff *linuxkpi_skb_copy(struct sk_buff *, gfp_t); 203349b042bSBjoern A. Zeeb 20449ed6e97SBjoern A. Zeeb /* -------------------------------------------------------------------------- */ 20549ed6e97SBjoern A. Zeeb 20649ed6e97SBjoern A. Zeeb static inline struct sk_buff * 20749ed6e97SBjoern A. Zeeb alloc_skb(size_t size, gfp_t gfp) 20849ed6e97SBjoern A. Zeeb { 20949ed6e97SBjoern A. Zeeb struct sk_buff *skb; 21049ed6e97SBjoern A. Zeeb 21149ed6e97SBjoern A. Zeeb skb = linuxkpi_alloc_skb(size, gfp); 21249ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 21349ed6e97SBjoern A. Zeeb return (skb); 21449ed6e97SBjoern A. Zeeb } 21549ed6e97SBjoern A. Zeeb 21649ed6e97SBjoern A. Zeeb static inline struct sk_buff * 2176baea331SBjoern A. Zeeb __dev_alloc_skb(size_t len, gfp_t gfp) 2186baea331SBjoern A. Zeeb { 2196baea331SBjoern A. Zeeb struct sk_buff *skb; 2206baea331SBjoern A. Zeeb 2219df5f29cSBjoern A. Zeeb skb = linuxkpi_dev_alloc_skb(len, gfp); 2226baea331SBjoern A. Zeeb SKB_IMPROVE(); 2236baea331SBjoern A. Zeeb SKB_TRACE(skb); 2246baea331SBjoern A. Zeeb return (skb); 2256baea331SBjoern A. Zeeb } 2266baea331SBjoern A. Zeeb 2276baea331SBjoern A. Zeeb static inline struct sk_buff * 22849ed6e97SBjoern A. Zeeb dev_alloc_skb(size_t len) 22949ed6e97SBjoern A. Zeeb { 23049ed6e97SBjoern A. Zeeb struct sk_buff *skb; 23149ed6e97SBjoern A. Zeeb 2329df5f29cSBjoern A. Zeeb skb = __dev_alloc_skb(len, GFP_NOWAIT); 2336baea331SBjoern A. Zeeb SKB_IMPROVE(); 23449ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 23549ed6e97SBjoern A. Zeeb return (skb); 23649ed6e97SBjoern A. Zeeb } 23749ed6e97SBjoern A. Zeeb 23849ed6e97SBjoern A. Zeeb static inline void 23949ed6e97SBjoern A. Zeeb kfree_skb(struct sk_buff *skb) 24049ed6e97SBjoern A. Zeeb { 24149ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 24249ed6e97SBjoern A. Zeeb linuxkpi_kfree_skb(skb); 24349ed6e97SBjoern A. Zeeb } 24449ed6e97SBjoern A. Zeeb 24549ed6e97SBjoern A. Zeeb static inline void 24649ed6e97SBjoern A. Zeeb dev_kfree_skb(struct sk_buff *skb) 24749ed6e97SBjoern A. Zeeb { 24849ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 24949ed6e97SBjoern A. Zeeb kfree_skb(skb); 25049ed6e97SBjoern A. Zeeb } 25149ed6e97SBjoern A. Zeeb 25249ed6e97SBjoern A. Zeeb static inline void 25349ed6e97SBjoern A. Zeeb dev_kfree_skb_any(struct sk_buff *skb) 25449ed6e97SBjoern A. Zeeb { 25549ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 25649ed6e97SBjoern A. Zeeb dev_kfree_skb(skb); 25749ed6e97SBjoern A. Zeeb } 25849ed6e97SBjoern A. Zeeb 25949ed6e97SBjoern A. Zeeb static inline void 26049ed6e97SBjoern A. Zeeb dev_kfree_skb_irq(struct sk_buff *skb) 26149ed6e97SBjoern A. Zeeb { 26249ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 263952643eaSBjoern A. Zeeb SKB_IMPROVE("Do we have to defer this?"); 264952643eaSBjoern A. Zeeb dev_kfree_skb(skb); 26549ed6e97SBjoern A. Zeeb } 26649ed6e97SBjoern A. Zeeb 2675504bd59SBjoern A. Zeeb static inline struct sk_buff * 2685504bd59SBjoern A. Zeeb build_skb(void *data, unsigned int fragsz) 2695504bd59SBjoern A. Zeeb { 2705504bd59SBjoern A. Zeeb struct sk_buff *skb; 2715504bd59SBjoern A. Zeeb 2725504bd59SBjoern A. Zeeb skb = linuxkpi_build_skb(data, fragsz); 2735504bd59SBjoern A. Zeeb SKB_TRACE(skb); 2745504bd59SBjoern A. Zeeb return (skb); 2755504bd59SBjoern A. Zeeb } 2765504bd59SBjoern A. Zeeb 27749ed6e97SBjoern A. Zeeb /* -------------------------------------------------------------------------- */ 27849ed6e97SBjoern A. Zeeb 27949ed6e97SBjoern A. Zeeb /* XXX BZ review this one for terminal condition as Linux "queues" are special. */ 28049ed6e97SBjoern A. Zeeb #define skb_list_walk_safe(_q, skb, tmp) \ 28149ed6e97SBjoern A. Zeeb for ((skb) = (_q)->next; (skb) != NULL && ((tmp) = (skb)->next); (skb) = (tmp)) 28249ed6e97SBjoern A. Zeeb 28349ed6e97SBjoern A. Zeeb /* Add headroom; cannot do once there is data in there. */ 28449ed6e97SBjoern A. Zeeb static inline void 28549ed6e97SBjoern A. Zeeb skb_reserve(struct sk_buff *skb, size_t len) 28649ed6e97SBjoern A. Zeeb { 28749ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 2886baea331SBjoern A. Zeeb #if 0 2896baea331SBjoern A. Zeeb /* Apparently it is allowed to call skb_reserve multiple times in a row. */ 29049ed6e97SBjoern A. Zeeb KASSERT(skb->data == skb->head, ("%s: skb %p not empty head %p data %p " 29149ed6e97SBjoern A. Zeeb "tail %p\n", __func__, skb, skb->head, skb->data, skb->tail)); 2926baea331SBjoern A. Zeeb #else 2936baea331SBjoern A. Zeeb KASSERT(skb->len == 0 && skb->data == skb->tail, ("%s: skb %p not " 2946baea331SBjoern A. Zeeb "empty head %p data %p tail %p len %u\n", __func__, skb, 2956baea331SBjoern A. Zeeb skb->head, skb->data, skb->tail, skb->len)); 2966baea331SBjoern A. Zeeb #endif 29749ed6e97SBjoern A. Zeeb skb->data += len; 29849ed6e97SBjoern A. Zeeb skb->tail += len; 29949ed6e97SBjoern A. Zeeb } 30049ed6e97SBjoern A. Zeeb 30149ed6e97SBjoern A. Zeeb /* 30249ed6e97SBjoern A. Zeeb * Remove headroom; return new data pointer; basically make space at the 30349ed6e97SBjoern A. Zeeb * front to copy data in (manually). 30449ed6e97SBjoern A. Zeeb */ 30549ed6e97SBjoern A. Zeeb static inline void * 30689c32dafSBjoern A. Zeeb __skb_push(struct sk_buff *skb, size_t len) 30749ed6e97SBjoern A. Zeeb { 30849ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 30949ed6e97SBjoern A. Zeeb KASSERT(((skb->data - len) >= skb->head), ("%s: skb %p (data %p - " 31049ed6e97SBjoern A. Zeeb "len %zu) < head %p\n", __func__, skb, skb->data, len, skb->data)); 31149ed6e97SBjoern A. Zeeb skb->len += len; 31249ed6e97SBjoern A. Zeeb skb->data -= len; 31349ed6e97SBjoern A. Zeeb return (skb->data); 31449ed6e97SBjoern A. Zeeb } 31549ed6e97SBjoern A. Zeeb 31689c32dafSBjoern A. Zeeb static inline void * 31789c32dafSBjoern A. Zeeb skb_push(struct sk_buff *skb, size_t len) 31889c32dafSBjoern A. Zeeb { 31989c32dafSBjoern A. Zeeb 32089c32dafSBjoern A. Zeeb SKB_TRACE(skb); 32189c32dafSBjoern A. Zeeb return (__skb_push(skb, len)); 32289c32dafSBjoern A. Zeeb } 32389c32dafSBjoern A. Zeeb 32449ed6e97SBjoern A. Zeeb /* 32549ed6e97SBjoern A. Zeeb * Length of the data on the skb (without any frags)??? 32649ed6e97SBjoern A. Zeeb */ 32749ed6e97SBjoern A. Zeeb static inline size_t 32849ed6e97SBjoern A. Zeeb skb_headlen(struct sk_buff *skb) 32949ed6e97SBjoern A. Zeeb { 33049ed6e97SBjoern A. Zeeb 33149ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 33249ed6e97SBjoern A. Zeeb return (skb->len - skb->data_len); 33349ed6e97SBjoern A. Zeeb } 33449ed6e97SBjoern A. Zeeb 33549ed6e97SBjoern A. Zeeb 33649ed6e97SBjoern A. Zeeb /* Return the end of data (tail pointer). */ 33749ed6e97SBjoern A. Zeeb static inline uint8_t * 33849ed6e97SBjoern A. Zeeb skb_tail_pointer(struct sk_buff *skb) 33949ed6e97SBjoern A. Zeeb { 34049ed6e97SBjoern A. Zeeb 34149ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 34249ed6e97SBjoern A. Zeeb return (skb->tail); 34349ed6e97SBjoern A. Zeeb } 34449ed6e97SBjoern A. Zeeb 34549ed6e97SBjoern A. Zeeb /* Return number of bytes available at end of buffer. */ 34649ed6e97SBjoern A. Zeeb static inline unsigned int 34749ed6e97SBjoern A. Zeeb skb_tailroom(struct sk_buff *skb) 34849ed6e97SBjoern A. Zeeb { 34949ed6e97SBjoern A. Zeeb 35049ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 35149ed6e97SBjoern A. Zeeb KASSERT((skb->end - skb->tail) >= 0, ("%s: skb %p tailroom < 0, " 35249ed6e97SBjoern A. Zeeb "end %p tail %p\n", __func__, skb, skb->end, skb->tail)); 35349ed6e97SBjoern A. Zeeb return (skb->end - skb->tail); 35449ed6e97SBjoern A. Zeeb } 35549ed6e97SBjoern A. Zeeb 35649ed6e97SBjoern A. Zeeb /* Return numer of bytes available at the beginning of buffer. */ 35749ed6e97SBjoern A. Zeeb static inline unsigned int 35849ed6e97SBjoern A. Zeeb skb_headroom(struct sk_buff *skb) 35949ed6e97SBjoern A. Zeeb { 36049ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 36149ed6e97SBjoern A. Zeeb KASSERT((skb->data - skb->head) >= 0, ("%s: skb %p headroom < 0, " 36249ed6e97SBjoern A. Zeeb "data %p head %p\n", __func__, skb, skb->data, skb->head)); 36349ed6e97SBjoern A. Zeeb return (skb->data - skb->head); 36449ed6e97SBjoern A. Zeeb } 36549ed6e97SBjoern A. Zeeb 36649ed6e97SBjoern A. Zeeb 36749ed6e97SBjoern A. Zeeb /* 36849ed6e97SBjoern A. Zeeb * Remove tailroom; return the old tail pointer; basically make space at 36949ed6e97SBjoern A. Zeeb * the end to copy data in (manually). See also skb_put_data() below. 37049ed6e97SBjoern A. Zeeb */ 37149ed6e97SBjoern A. Zeeb static inline void * 37289c32dafSBjoern A. Zeeb __skb_put(struct sk_buff *skb, size_t len) 37349ed6e97SBjoern A. Zeeb { 37449ed6e97SBjoern A. Zeeb void *s; 37549ed6e97SBjoern A. Zeeb 37649ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 37749ed6e97SBjoern A. Zeeb KASSERT(((skb->tail + len) <= skb->end), ("%s: skb %p (tail %p + " 37849ed6e97SBjoern A. Zeeb "len %zu) > end %p, head %p data %p len %u\n", __func__, 37949ed6e97SBjoern A. Zeeb skb, skb->tail, len, skb->end, skb->head, skb->data, skb->len)); 38049ed6e97SBjoern A. Zeeb 38149ed6e97SBjoern A. Zeeb s = skb_tail_pointer(skb); 382952643eaSBjoern A. Zeeb if (len == 0) 383952643eaSBjoern A. Zeeb return (s); 38449ed6e97SBjoern A. Zeeb skb->tail += len; 38549ed6e97SBjoern A. Zeeb skb->len += len; 38649ed6e97SBjoern A. Zeeb #ifdef SKB_DEBUG 3876baea331SBjoern A. Zeeb if (linuxkpi_debug_skb & DSKB_TRACEX) 38849ed6e97SBjoern A. Zeeb printf("%s: skb %p (%u) head %p data %p tail %p end %p, s %p len %zu\n", 38949ed6e97SBjoern A. Zeeb __func__, skb, skb->len, skb->head, skb->data, skb->tail, skb->end, 39049ed6e97SBjoern A. Zeeb s, len); 39149ed6e97SBjoern A. Zeeb #endif 39249ed6e97SBjoern A. Zeeb return (s); 39349ed6e97SBjoern A. Zeeb } 39449ed6e97SBjoern A. Zeeb 39589c32dafSBjoern A. Zeeb static inline void * 39689c32dafSBjoern A. Zeeb skb_put(struct sk_buff *skb, size_t len) 39789c32dafSBjoern A. Zeeb { 39889c32dafSBjoern A. Zeeb 39989c32dafSBjoern A. Zeeb SKB_TRACE(skb); 40089c32dafSBjoern A. Zeeb return (__skb_put(skb, len)); 40189c32dafSBjoern A. Zeeb } 40289c32dafSBjoern A. Zeeb 40349ed6e97SBjoern A. Zeeb /* skb_put() + copying data in. */ 40449ed6e97SBjoern A. Zeeb static inline void * 40549ed6e97SBjoern A. Zeeb skb_put_data(struct sk_buff *skb, const void *buf, size_t len) 40649ed6e97SBjoern A. Zeeb { 40749ed6e97SBjoern A. Zeeb void *s; 40849ed6e97SBjoern A. Zeeb 40949ed6e97SBjoern A. Zeeb SKB_TRACE2(skb, buf); 41049ed6e97SBjoern A. Zeeb s = skb_put(skb, len); 411952643eaSBjoern A. Zeeb if (len == 0) 412952643eaSBjoern A. Zeeb return (s); 41349ed6e97SBjoern A. Zeeb memcpy(s, buf, len); 41449ed6e97SBjoern A. Zeeb return (s); 41549ed6e97SBjoern A. Zeeb } 41649ed6e97SBjoern A. Zeeb 41749ed6e97SBjoern A. Zeeb /* skb_put() + filling with zeros. */ 41849ed6e97SBjoern A. Zeeb static inline void * 41949ed6e97SBjoern A. Zeeb skb_put_zero(struct sk_buff *skb, size_t len) 42049ed6e97SBjoern A. Zeeb { 42149ed6e97SBjoern A. Zeeb void *s; 42249ed6e97SBjoern A. Zeeb 42349ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 42449ed6e97SBjoern A. Zeeb s = skb_put(skb, len); 42549ed6e97SBjoern A. Zeeb memset(s, '\0', len); 42649ed6e97SBjoern A. Zeeb return (s); 42749ed6e97SBjoern A. Zeeb } 42849ed6e97SBjoern A. Zeeb 42949ed6e97SBjoern A. Zeeb /* 43049ed6e97SBjoern A. Zeeb * Remove len bytes from beginning of data. 43149ed6e97SBjoern A. Zeeb * 43249ed6e97SBjoern A. Zeeb * XXX-BZ ath10k checks for !NULL conditions so I assume this doesn't panic; 43349ed6e97SBjoern A. Zeeb * we return the advanced data pointer so we don't have to keep a temp, correct? 43449ed6e97SBjoern A. Zeeb */ 43549ed6e97SBjoern A. Zeeb static inline void * 43649ed6e97SBjoern A. Zeeb skb_pull(struct sk_buff *skb, size_t len) 43749ed6e97SBjoern A. Zeeb { 43849ed6e97SBjoern A. Zeeb 43949ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 44049ed6e97SBjoern A. Zeeb #if 0 /* Apparently this doesn't barf... */ 44149ed6e97SBjoern A. Zeeb KASSERT(skb->len >= len, ("%s: skb %p skb->len %u < len %u, data %p\n", 44249ed6e97SBjoern A. Zeeb __func__, skb, skb->len, len, skb->data)); 44349ed6e97SBjoern A. Zeeb #endif 44449ed6e97SBjoern A. Zeeb if (skb->len < len) 44549ed6e97SBjoern A. Zeeb return (NULL); 44649ed6e97SBjoern A. Zeeb skb->len -= len; 44749ed6e97SBjoern A. Zeeb skb->data += len; 44849ed6e97SBjoern A. Zeeb return (skb->data); 44949ed6e97SBjoern A. Zeeb } 45049ed6e97SBjoern A. Zeeb 45149ed6e97SBjoern A. Zeeb /* Reduce skb data to given length or do nothing if smaller already. */ 45249ed6e97SBjoern A. Zeeb static inline void 45349ed6e97SBjoern A. Zeeb __skb_trim(struct sk_buff *skb, unsigned int len) 45449ed6e97SBjoern A. Zeeb { 45549ed6e97SBjoern A. Zeeb 45649ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 45749ed6e97SBjoern A. Zeeb if (skb->len < len) 45849ed6e97SBjoern A. Zeeb return; 45949ed6e97SBjoern A. Zeeb 46049ed6e97SBjoern A. Zeeb skb->len = len; 46149ed6e97SBjoern A. Zeeb skb->tail = skb->data + skb->len; 46249ed6e97SBjoern A. Zeeb } 46349ed6e97SBjoern A. Zeeb 46449ed6e97SBjoern A. Zeeb static inline void 46549ed6e97SBjoern A. Zeeb skb_trim(struct sk_buff *skb, unsigned int len) 46649ed6e97SBjoern A. Zeeb { 46749ed6e97SBjoern A. Zeeb 46849ed6e97SBjoern A. Zeeb return (__skb_trim(skb, len)); 46949ed6e97SBjoern A. Zeeb } 47049ed6e97SBjoern A. Zeeb 47149ed6e97SBjoern A. Zeeb static inline struct skb_shared_info * 47249ed6e97SBjoern A. Zeeb skb_shinfo(struct sk_buff *skb) 47349ed6e97SBjoern A. Zeeb { 47449ed6e97SBjoern A. Zeeb 47549ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 47649ed6e97SBjoern A. Zeeb return (skb->shinfo); 47749ed6e97SBjoern A. Zeeb } 47849ed6e97SBjoern A. Zeeb 47949ed6e97SBjoern A. Zeeb static inline void 48049ed6e97SBjoern A. Zeeb skb_add_rx_frag(struct sk_buff *skb, int fragno, struct page *page, 48149ed6e97SBjoern A. Zeeb off_t offset, size_t size, unsigned int truesize) 48249ed6e97SBjoern A. Zeeb { 48349ed6e97SBjoern A. Zeeb struct skb_shared_info *shinfo; 48449ed6e97SBjoern A. Zeeb 48549ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 48649ed6e97SBjoern A. Zeeb #ifdef SKB_DEBUG 4876baea331SBjoern A. Zeeb if (linuxkpi_debug_skb & DSKB_TRACEX) 48849ed6e97SBjoern A. Zeeb printf("%s: skb %p head %p data %p tail %p end %p len %u fragno %d " 48949ed6e97SBjoern A. Zeeb "page %#jx offset %ju size %zu truesize %u\n", __func__, 49049ed6e97SBjoern A. Zeeb skb, skb->head, skb->data, skb->tail, skb->end, skb->len, fragno, 49149ed6e97SBjoern A. Zeeb (uintmax_t)(uintptr_t)linux_page_address(page), (uintmax_t)offset, 49249ed6e97SBjoern A. Zeeb size, truesize); 49349ed6e97SBjoern A. Zeeb #endif 49449ed6e97SBjoern A. Zeeb 49549ed6e97SBjoern A. Zeeb shinfo = skb_shinfo(skb); 49649ed6e97SBjoern A. Zeeb KASSERT(fragno >= 0 && fragno < nitems(shinfo->frags), ("%s: skb %p " 49749ed6e97SBjoern A. Zeeb "fragno %d too big\n", __func__, skb, fragno)); 49849ed6e97SBjoern A. Zeeb shinfo->frags[fragno].page = page; 49949ed6e97SBjoern A. Zeeb shinfo->frags[fragno].offset = offset; 50049ed6e97SBjoern A. Zeeb shinfo->frags[fragno].size = size; 50149ed6e97SBjoern A. Zeeb shinfo->nr_frags = fragno + 1; 50249ed6e97SBjoern A. Zeeb skb->len += size; 5035504bd59SBjoern A. Zeeb skb->data_len += size; 50449ed6e97SBjoern A. Zeeb skb->truesize += truesize; 50549ed6e97SBjoern A. Zeeb 50649ed6e97SBjoern A. Zeeb /* XXX TODO EXTEND truesize? */ 50749ed6e97SBjoern A. Zeeb } 50849ed6e97SBjoern A. Zeeb 50949ed6e97SBjoern A. Zeeb /* -------------------------------------------------------------------------- */ 51049ed6e97SBjoern A. Zeeb 51149ed6e97SBjoern A. Zeeb /* XXX BZ review this one for terminal condition as Linux "queues" are special. */ 51249ed6e97SBjoern A. Zeeb #define skb_queue_walk(_q, skb) \ 51349ed6e97SBjoern A. Zeeb for ((skb) = (_q)->next; (skb) != (struct sk_buff *)(_q); \ 51449ed6e97SBjoern A. Zeeb (skb) = (skb)->next) 51549ed6e97SBjoern A. Zeeb 51649ed6e97SBjoern A. Zeeb #define skb_queue_walk_safe(_q, skb, tmp) \ 51749ed6e97SBjoern A. Zeeb for ((skb) = (_q)->next, (tmp) = (skb)->next; \ 51849ed6e97SBjoern A. Zeeb (skb) != (struct sk_buff *)(_q); (skb) = (tmp), (tmp) = (skb)->next) 51949ed6e97SBjoern A. Zeeb 52049ed6e97SBjoern A. Zeeb static inline bool 52149ed6e97SBjoern A. Zeeb skb_queue_empty(struct sk_buff_head *q) 52249ed6e97SBjoern A. Zeeb { 52349ed6e97SBjoern A. Zeeb 52449ed6e97SBjoern A. Zeeb SKB_TRACE(q); 52549ed6e97SBjoern A. Zeeb return (q->qlen == 0); 52649ed6e97SBjoern A. Zeeb } 52749ed6e97SBjoern A. Zeeb 52849ed6e97SBjoern A. Zeeb static inline void 52949ed6e97SBjoern A. Zeeb __skb_queue_head_init(struct sk_buff_head *q) 53049ed6e97SBjoern A. Zeeb { 53149ed6e97SBjoern A. Zeeb SKB_TRACE(q); 53249ed6e97SBjoern A. Zeeb q->prev = q->next = (struct sk_buff *)q; 53349ed6e97SBjoern A. Zeeb q->qlen = 0; 53449ed6e97SBjoern A. Zeeb } 53549ed6e97SBjoern A. Zeeb 53649ed6e97SBjoern A. Zeeb static inline void 53749ed6e97SBjoern A. Zeeb skb_queue_head_init(struct sk_buff_head *q) 53849ed6e97SBjoern A. Zeeb { 53949ed6e97SBjoern A. Zeeb SKB_TRACE(q); 54049ed6e97SBjoern A. Zeeb return (__skb_queue_head_init(q)); 54149ed6e97SBjoern A. Zeeb } 54249ed6e97SBjoern A. Zeeb 54349ed6e97SBjoern A. Zeeb static inline void 54449ed6e97SBjoern A. Zeeb __skb_insert(struct sk_buff *new, struct sk_buff *prev, struct sk_buff *next, 54549ed6e97SBjoern A. Zeeb struct sk_buff_head *q) 54649ed6e97SBjoern A. Zeeb { 54749ed6e97SBjoern A. Zeeb 54849ed6e97SBjoern A. Zeeb SKB_TRACE_FMT(new, "prev %p next %p q %p", prev, next, q); 54949ed6e97SBjoern A. Zeeb new->prev = prev; 55049ed6e97SBjoern A. Zeeb new->next = next; 551b2dcb848SBjoern A. Zeeb ((struct sk_buff_head_l *)next)->prev = new; 552b2dcb848SBjoern A. Zeeb ((struct sk_buff_head_l *)prev)->next = new; 55349ed6e97SBjoern A. Zeeb q->qlen++; 55449ed6e97SBjoern A. Zeeb } 55549ed6e97SBjoern A. Zeeb 55649ed6e97SBjoern A. Zeeb static inline void 55749ed6e97SBjoern A. Zeeb __skb_queue_after(struct sk_buff_head *q, struct sk_buff *skb, 55849ed6e97SBjoern A. Zeeb struct sk_buff *new) 55949ed6e97SBjoern A. Zeeb { 56049ed6e97SBjoern A. Zeeb 56149ed6e97SBjoern A. Zeeb SKB_TRACE_FMT(q, "skb %p new %p", skb, new); 562b2dcb848SBjoern A. Zeeb __skb_insert(new, skb, ((struct sk_buff_head_l *)skb)->next, q); 56349ed6e97SBjoern A. Zeeb } 56449ed6e97SBjoern A. Zeeb 56549ed6e97SBjoern A. Zeeb static inline void 56649ed6e97SBjoern A. Zeeb __skb_queue_before(struct sk_buff_head *q, struct sk_buff *skb, 56749ed6e97SBjoern A. Zeeb struct sk_buff *new) 56849ed6e97SBjoern A. Zeeb { 56949ed6e97SBjoern A. Zeeb 57049ed6e97SBjoern A. Zeeb SKB_TRACE_FMT(q, "skb %p new %p", skb, new); 57149ed6e97SBjoern A. Zeeb __skb_insert(new, skb->prev, skb, q); 57249ed6e97SBjoern A. Zeeb } 57349ed6e97SBjoern A. Zeeb 57449ed6e97SBjoern A. Zeeb static inline void 575b2dcb848SBjoern A. Zeeb __skb_queue_tail(struct sk_buff_head *q, struct sk_buff *new) 57649ed6e97SBjoern A. Zeeb { 57749ed6e97SBjoern A. Zeeb 578b2dcb848SBjoern A. Zeeb SKB_TRACE2(q, new); 579d3befb53STom Coldrick __skb_queue_before(q, (struct sk_buff *)q, new); 58049ed6e97SBjoern A. Zeeb } 58149ed6e97SBjoern A. Zeeb 58249ed6e97SBjoern A. Zeeb static inline void 583b2dcb848SBjoern A. Zeeb skb_queue_tail(struct sk_buff_head *q, struct sk_buff *new) 58449ed6e97SBjoern A. Zeeb { 585149c457dSBjoern A. Zeeb SKB_TRACE2(q, new); 586b2dcb848SBjoern A. Zeeb return (__skb_queue_tail(q, new)); 58749ed6e97SBjoern A. Zeeb } 58849ed6e97SBjoern A. Zeeb 58949ed6e97SBjoern A. Zeeb static inline struct sk_buff * 590ce9f3661SBjoern A. Zeeb skb_peek(struct sk_buff_head *q) 591ce9f3661SBjoern A. Zeeb { 592ce9f3661SBjoern A. Zeeb struct sk_buff *skb; 593ce9f3661SBjoern A. Zeeb 594ce9f3661SBjoern A. Zeeb skb = q->next; 595ce9f3661SBjoern A. Zeeb SKB_TRACE2(q, skb); 596ce9f3661SBjoern A. Zeeb if (skb == (struct sk_buff *)q) 597ce9f3661SBjoern A. Zeeb return (NULL); 598ce9f3661SBjoern A. Zeeb return (skb); 599ce9f3661SBjoern A. Zeeb } 600ce9f3661SBjoern A. Zeeb 601ce9f3661SBjoern A. Zeeb static inline struct sk_buff * 60249ed6e97SBjoern A. Zeeb skb_peek_tail(struct sk_buff_head *q) 60349ed6e97SBjoern A. Zeeb { 60449ed6e97SBjoern A. Zeeb struct sk_buff *skb; 60549ed6e97SBjoern A. Zeeb 60649ed6e97SBjoern A. Zeeb skb = q->prev; 60749ed6e97SBjoern A. Zeeb SKB_TRACE2(q, skb); 60849ed6e97SBjoern A. Zeeb if (skb == (struct sk_buff *)q) 60949ed6e97SBjoern A. Zeeb return (NULL); 61049ed6e97SBjoern A. Zeeb return (skb); 61149ed6e97SBjoern A. Zeeb } 61249ed6e97SBjoern A. Zeeb 61349ed6e97SBjoern A. Zeeb static inline void 61449ed6e97SBjoern A. Zeeb __skb_unlink(struct sk_buff *skb, struct sk_buff_head *head) 61549ed6e97SBjoern A. Zeeb { 61649ed6e97SBjoern A. Zeeb SKB_TRACE2(skb, head); 617*b4856b8eSZhenlei Huang struct sk_buff *p, *n; 61849ed6e97SBjoern A. Zeeb 61949ed6e97SBjoern A. Zeeb head->qlen--; 62049ed6e97SBjoern A. Zeeb p = skb->prev; 62149ed6e97SBjoern A. Zeeb n = skb->next; 62249ed6e97SBjoern A. Zeeb p->next = n; 62349ed6e97SBjoern A. Zeeb n->prev = p; 62449ed6e97SBjoern A. Zeeb skb->prev = skb->next = NULL; 62549ed6e97SBjoern A. Zeeb } 62649ed6e97SBjoern A. Zeeb 62749ed6e97SBjoern A. Zeeb static inline void 62849ed6e97SBjoern A. Zeeb skb_unlink(struct sk_buff *skb, struct sk_buff_head *head) 62949ed6e97SBjoern A. Zeeb { 63049ed6e97SBjoern A. Zeeb SKB_TRACE2(skb, head); 63149ed6e97SBjoern A. Zeeb return (__skb_unlink(skb, head)); 63249ed6e97SBjoern A. Zeeb } 63349ed6e97SBjoern A. Zeeb 63449ed6e97SBjoern A. Zeeb static inline struct sk_buff * 63549ed6e97SBjoern A. Zeeb __skb_dequeue(struct sk_buff_head *q) 63649ed6e97SBjoern A. Zeeb { 63749ed6e97SBjoern A. Zeeb struct sk_buff *skb; 63849ed6e97SBjoern A. Zeeb 63949ed6e97SBjoern A. Zeeb SKB_TRACE(q); 64049ed6e97SBjoern A. Zeeb skb = q->next; 64149ed6e97SBjoern A. Zeeb if (skb == (struct sk_buff *)q) 64249ed6e97SBjoern A. Zeeb return (NULL); 64349ed6e97SBjoern A. Zeeb if (skb != NULL) 64449ed6e97SBjoern A. Zeeb __skb_unlink(skb, q); 64549ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 64649ed6e97SBjoern A. Zeeb return (skb); 64749ed6e97SBjoern A. Zeeb } 64849ed6e97SBjoern A. Zeeb 64949ed6e97SBjoern A. Zeeb static inline struct sk_buff * 65049ed6e97SBjoern A. Zeeb skb_dequeue(struct sk_buff_head *q) 65149ed6e97SBjoern A. Zeeb { 65249ed6e97SBjoern A. Zeeb SKB_TRACE(q); 65349ed6e97SBjoern A. Zeeb return (__skb_dequeue(q)); 65449ed6e97SBjoern A. Zeeb } 65549ed6e97SBjoern A. Zeeb 65649ed6e97SBjoern A. Zeeb static inline struct sk_buff * 65749ed6e97SBjoern A. Zeeb skb_dequeue_tail(struct sk_buff_head *q) 65849ed6e97SBjoern A. Zeeb { 65949ed6e97SBjoern A. Zeeb struct sk_buff *skb; 66049ed6e97SBjoern A. Zeeb 66149ed6e97SBjoern A. Zeeb skb = skb_peek_tail(q); 66249ed6e97SBjoern A. Zeeb if (skb != NULL) 66349ed6e97SBjoern A. Zeeb __skb_unlink(skb, q); 66449ed6e97SBjoern A. Zeeb 66549ed6e97SBjoern A. Zeeb SKB_TRACE2(q, skb); 66649ed6e97SBjoern A. Zeeb return (skb); 66749ed6e97SBjoern A. Zeeb } 66849ed6e97SBjoern A. Zeeb 66949ed6e97SBjoern A. Zeeb static inline void 6706baea331SBjoern A. Zeeb __skb_queue_head(struct sk_buff_head *q, struct sk_buff *skb) 6716baea331SBjoern A. Zeeb { 6726baea331SBjoern A. Zeeb 6736baea331SBjoern A. Zeeb SKB_TRACE2(q, skb); 6746baea331SBjoern A. Zeeb __skb_queue_after(q, (struct sk_buff *)q, skb); 6756baea331SBjoern A. Zeeb } 6766baea331SBjoern A. Zeeb 6776baea331SBjoern A. Zeeb static inline void 67849ed6e97SBjoern A. Zeeb skb_queue_head(struct sk_buff_head *q, struct sk_buff *skb) 67949ed6e97SBjoern A. Zeeb { 68049ed6e97SBjoern A. Zeeb 68149ed6e97SBjoern A. Zeeb SKB_TRACE2(q, skb); 68249ed6e97SBjoern A. Zeeb __skb_queue_after(q, (struct sk_buff *)q, skb); 68349ed6e97SBjoern A. Zeeb } 68449ed6e97SBjoern A. Zeeb 68549ed6e97SBjoern A. Zeeb static inline uint32_t 68649ed6e97SBjoern A. Zeeb skb_queue_len(struct sk_buff_head *head) 68749ed6e97SBjoern A. Zeeb { 6886baea331SBjoern A. Zeeb 68949ed6e97SBjoern A. Zeeb SKB_TRACE(head); 69049ed6e97SBjoern A. Zeeb return (head->qlen); 69149ed6e97SBjoern A. Zeeb } 69249ed6e97SBjoern A. Zeeb 6936baea331SBjoern A. Zeeb static inline uint32_t 6946baea331SBjoern A. Zeeb skb_queue_len_lockless(const struct sk_buff_head *head) 6956baea331SBjoern A. Zeeb { 6966baea331SBjoern A. Zeeb 6976baea331SBjoern A. Zeeb SKB_TRACE(head); 6986baea331SBjoern A. Zeeb return (READ_ONCE(head->qlen)); 6996baea331SBjoern A. Zeeb } 7006baea331SBjoern A. Zeeb 70149ed6e97SBjoern A. Zeeb static inline void 70249ed6e97SBjoern A. Zeeb __skb_queue_purge(struct sk_buff_head *q) 70349ed6e97SBjoern A. Zeeb { 70449ed6e97SBjoern A. Zeeb struct sk_buff *skb; 70549ed6e97SBjoern A. Zeeb 70649ed6e97SBjoern A. Zeeb SKB_TRACE(q); 70749ed6e97SBjoern A. Zeeb while ((skb = __skb_dequeue(q)) != NULL) 70849ed6e97SBjoern A. Zeeb kfree_skb(skb); 70949ed6e97SBjoern A. Zeeb } 71049ed6e97SBjoern A. Zeeb 71149ed6e97SBjoern A. Zeeb static inline void 71249ed6e97SBjoern A. Zeeb skb_queue_purge(struct sk_buff_head *q) 71349ed6e97SBjoern A. Zeeb { 71449ed6e97SBjoern A. Zeeb SKB_TRACE(q); 71549ed6e97SBjoern A. Zeeb return (__skb_queue_purge(q)); 71649ed6e97SBjoern A. Zeeb } 71749ed6e97SBjoern A. Zeeb 71849ed6e97SBjoern A. Zeeb static inline struct sk_buff * 71949ed6e97SBjoern A. Zeeb skb_queue_prev(struct sk_buff_head *q, struct sk_buff *skb) 72049ed6e97SBjoern A. Zeeb { 72149ed6e97SBjoern A. Zeeb 72249ed6e97SBjoern A. Zeeb SKB_TRACE2(q, skb); 72349ed6e97SBjoern A. Zeeb /* XXX what is the q argument good for? */ 72449ed6e97SBjoern A. Zeeb return (skb->prev); 72549ed6e97SBjoern A. Zeeb } 72649ed6e97SBjoern A. Zeeb 72749ed6e97SBjoern A. Zeeb /* -------------------------------------------------------------------------- */ 72849ed6e97SBjoern A. Zeeb 72949ed6e97SBjoern A. Zeeb static inline struct sk_buff * 73049ed6e97SBjoern A. Zeeb skb_copy(struct sk_buff *skb, gfp_t gfp) 73149ed6e97SBjoern A. Zeeb { 732349b042bSBjoern A. Zeeb struct sk_buff *new; 733349b042bSBjoern A. Zeeb 734349b042bSBjoern A. Zeeb new = linuxkpi_skb_copy(skb, gfp); 735349b042bSBjoern A. Zeeb SKB_TRACE2(skb, new); 736349b042bSBjoern A. Zeeb return (new); 73749ed6e97SBjoern A. Zeeb } 73849ed6e97SBjoern A. Zeeb 73949ed6e97SBjoern A. Zeeb static inline void 74049ed6e97SBjoern A. Zeeb consume_skb(struct sk_buff *skb) 74149ed6e97SBjoern A. Zeeb { 74249ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 74349ed6e97SBjoern A. Zeeb SKB_TODO(); 74449ed6e97SBjoern A. Zeeb } 74549ed6e97SBjoern A. Zeeb 74649ed6e97SBjoern A. Zeeb static inline uint16_t 74749ed6e97SBjoern A. Zeeb skb_checksum(struct sk_buff *skb, int offs, size_t len, int x) 74849ed6e97SBjoern A. Zeeb { 74949ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 75049ed6e97SBjoern A. Zeeb SKB_TODO(); 75149ed6e97SBjoern A. Zeeb return (0xffff); 75249ed6e97SBjoern A. Zeeb } 75349ed6e97SBjoern A. Zeeb 75449ed6e97SBjoern A. Zeeb static inline int 75549ed6e97SBjoern A. Zeeb skb_checksum_start_offset(struct sk_buff *skb) 75649ed6e97SBjoern A. Zeeb { 75749ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 75849ed6e97SBjoern A. Zeeb SKB_TODO(); 75949ed6e97SBjoern A. Zeeb return (-1); 76049ed6e97SBjoern A. Zeeb } 76149ed6e97SBjoern A. Zeeb 76249ed6e97SBjoern A. Zeeb static inline dma_addr_t 76349ed6e97SBjoern A. Zeeb skb_frag_dma_map(struct device *dev, const skb_frag_t *frag, int x, 76449ed6e97SBjoern A. Zeeb size_t fragsz, enum dma_data_direction dir) 76549ed6e97SBjoern A. Zeeb { 76649ed6e97SBjoern A. Zeeb SKB_TRACE2(frag, dev); 76749ed6e97SBjoern A. Zeeb SKB_TODO(); 76849ed6e97SBjoern A. Zeeb return (-1); 76949ed6e97SBjoern A. Zeeb } 77049ed6e97SBjoern A. Zeeb 77149ed6e97SBjoern A. Zeeb static inline size_t 77249ed6e97SBjoern A. Zeeb skb_frag_size(const skb_frag_t *frag) 77349ed6e97SBjoern A. Zeeb { 77449ed6e97SBjoern A. Zeeb SKB_TRACE(frag); 77549ed6e97SBjoern A. Zeeb SKB_TODO(); 77649ed6e97SBjoern A. Zeeb return (-1); 77749ed6e97SBjoern A. Zeeb } 77849ed6e97SBjoern A. Zeeb 77949ed6e97SBjoern A. Zeeb #define skb_walk_frags(_skb, _frag) \ 78049ed6e97SBjoern A. Zeeb for ((_frag) = (_skb); false; (_frag)++) 78149ed6e97SBjoern A. Zeeb 78249ed6e97SBjoern A. Zeeb static inline void 78349ed6e97SBjoern A. Zeeb skb_checksum_help(struct sk_buff *skb) 78449ed6e97SBjoern A. Zeeb { 78549ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 78649ed6e97SBjoern A. Zeeb SKB_TODO(); 78749ed6e97SBjoern A. Zeeb } 78849ed6e97SBjoern A. Zeeb 78949ed6e97SBjoern A. Zeeb static inline bool 79049ed6e97SBjoern A. Zeeb skb_ensure_writable(struct sk_buff *skb, size_t off) 79149ed6e97SBjoern A. Zeeb { 79249ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 79349ed6e97SBjoern A. Zeeb SKB_TODO(); 79449ed6e97SBjoern A. Zeeb return (false); 79549ed6e97SBjoern A. Zeeb } 79649ed6e97SBjoern A. Zeeb 79749ed6e97SBjoern A. Zeeb static inline void * 79849ed6e97SBjoern A. Zeeb skb_frag_address(const skb_frag_t *frag) 79949ed6e97SBjoern A. Zeeb { 80049ed6e97SBjoern A. Zeeb SKB_TRACE(frag); 80149ed6e97SBjoern A. Zeeb SKB_TODO(); 80249ed6e97SBjoern A. Zeeb return (NULL); 80349ed6e97SBjoern A. Zeeb } 80449ed6e97SBjoern A. Zeeb 80589c32dafSBjoern A. Zeeb static inline void 80689c32dafSBjoern A. Zeeb skb_free_frag(void *frag) 80789c32dafSBjoern A. Zeeb { 80889c32dafSBjoern A. Zeeb 809dbbf46ebSBjoern A. Zeeb page_frag_free(frag); 81089c32dafSBjoern A. Zeeb } 81189c32dafSBjoern A. Zeeb 81249ed6e97SBjoern A. Zeeb static inline struct sk_buff * 81349ed6e97SBjoern A. Zeeb skb_gso_segment(struct sk_buff *skb, netdev_features_t netdev_flags) 81449ed6e97SBjoern A. Zeeb { 81549ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 81649ed6e97SBjoern A. Zeeb SKB_TODO(); 81749ed6e97SBjoern A. Zeeb return (NULL); 81849ed6e97SBjoern A. Zeeb } 81949ed6e97SBjoern A. Zeeb 82049ed6e97SBjoern A. Zeeb static inline bool 82149ed6e97SBjoern A. Zeeb skb_is_gso(struct sk_buff *skb) 82249ed6e97SBjoern A. Zeeb { 82349ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 824952643eaSBjoern A. Zeeb SKB_IMPROVE("Really a TODO but get it away from logging"); 82549ed6e97SBjoern A. Zeeb return (false); 82649ed6e97SBjoern A. Zeeb } 82749ed6e97SBjoern A. Zeeb 82849ed6e97SBjoern A. Zeeb static inline void 82949ed6e97SBjoern A. Zeeb skb_mark_not_on_list(struct sk_buff *skb) 83049ed6e97SBjoern A. Zeeb { 83149ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 83249ed6e97SBjoern A. Zeeb SKB_TODO(); 83349ed6e97SBjoern A. Zeeb } 83449ed6e97SBjoern A. Zeeb 83549ed6e97SBjoern A. Zeeb static inline void 8363d3ec178SBjoern A. Zeeb ___skb_queue_splice(const struct sk_buff_head *from, 837b2dcb848SBjoern A. Zeeb struct sk_buff *p, struct sk_buff *n) 838b2dcb848SBjoern A. Zeeb { 839b2dcb848SBjoern A. Zeeb struct sk_buff *b, *e; 840b2dcb848SBjoern A. Zeeb 841b2dcb848SBjoern A. Zeeb b = from->next; 842b2dcb848SBjoern A. Zeeb e = from->prev; 843b2dcb848SBjoern A. Zeeb 844b2dcb848SBjoern A. Zeeb b->prev = p; 845b2dcb848SBjoern A. Zeeb ((struct sk_buff_head_l *)p)->next = b; 846b2dcb848SBjoern A. Zeeb e->next = n; 847b2dcb848SBjoern A. Zeeb ((struct sk_buff_head_l *)n)->prev = e; 848b2dcb848SBjoern A. Zeeb } 849b2dcb848SBjoern A. Zeeb 850b2dcb848SBjoern A. Zeeb static inline void 8516a8973c3SBjoern A. Zeeb skb_queue_splice_init(struct sk_buff_head *from, struct sk_buff_head *to) 85249ed6e97SBjoern A. Zeeb { 8536baea331SBjoern A. Zeeb 8546a8973c3SBjoern A. Zeeb SKB_TRACE2(from, to); 8556baea331SBjoern A. Zeeb 8566a8973c3SBjoern A. Zeeb if (skb_queue_empty(from)) 8576baea331SBjoern A. Zeeb return; 8586baea331SBjoern A. Zeeb 8593d3ec178SBjoern A. Zeeb ___skb_queue_splice(from, (struct sk_buff *)to, to->next); 8603d3ec178SBjoern A. Zeeb to->qlen += from->qlen; 8613d3ec178SBjoern A. Zeeb __skb_queue_head_init(from); 8623d3ec178SBjoern A. Zeeb } 8633d3ec178SBjoern A. Zeeb 8643d3ec178SBjoern A. Zeeb static inline void 8653d3ec178SBjoern A. Zeeb skb_queue_splice_tail_init(struct sk_buff_head *from, struct sk_buff_head *to) 8663d3ec178SBjoern A. Zeeb { 8673d3ec178SBjoern A. Zeeb 8683d3ec178SBjoern A. Zeeb SKB_TRACE2(from, to); 8693d3ec178SBjoern A. Zeeb 8703d3ec178SBjoern A. Zeeb if (skb_queue_empty(from)) 8713d3ec178SBjoern A. Zeeb return; 8723d3ec178SBjoern A. Zeeb 8733d3ec178SBjoern A. Zeeb ___skb_queue_splice(from, to->prev, (struct sk_buff *)to); 8746a8973c3SBjoern A. Zeeb to->qlen += from->qlen; 8756a8973c3SBjoern A. Zeeb __skb_queue_head_init(from); 87649ed6e97SBjoern A. Zeeb } 87749ed6e97SBjoern A. Zeeb 87849ed6e97SBjoern A. Zeeb static inline void 87949ed6e97SBjoern A. Zeeb skb_reset_transport_header(struct sk_buff *skb) 88049ed6e97SBjoern A. Zeeb { 88149ed6e97SBjoern A. Zeeb 88249ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 88349ed6e97SBjoern A. Zeeb skb->l4hdroff = skb->data - skb->head; 88449ed6e97SBjoern A. Zeeb } 88549ed6e97SBjoern A. Zeeb 88649ed6e97SBjoern A. Zeeb static inline uint8_t * 88749ed6e97SBjoern A. Zeeb skb_transport_header(struct sk_buff *skb) 88849ed6e97SBjoern A. Zeeb { 88949ed6e97SBjoern A. Zeeb 89049ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 89149ed6e97SBjoern A. Zeeb return (skb->head + skb->l4hdroff); 89249ed6e97SBjoern A. Zeeb } 89349ed6e97SBjoern A. Zeeb 89449ed6e97SBjoern A. Zeeb static inline uint8_t * 89549ed6e97SBjoern A. Zeeb skb_network_header(struct sk_buff *skb) 89649ed6e97SBjoern A. Zeeb { 89749ed6e97SBjoern A. Zeeb 89849ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 89949ed6e97SBjoern A. Zeeb return (skb->head + skb->l3hdroff); 90049ed6e97SBjoern A. Zeeb } 90149ed6e97SBjoern A. Zeeb 9025504bd59SBjoern A. Zeeb static inline bool 9035504bd59SBjoern A. Zeeb skb_is_nonlinear(struct sk_buff *skb) 9045504bd59SBjoern A. Zeeb { 9055504bd59SBjoern A. Zeeb SKB_TRACE(skb); 9065504bd59SBjoern A. Zeeb return ((skb->data_len > 0) ? true : false); 9075504bd59SBjoern A. Zeeb } 9085504bd59SBjoern A. Zeeb 90949ed6e97SBjoern A. Zeeb static inline int 91049ed6e97SBjoern A. Zeeb __skb_linearize(struct sk_buff *skb) 91149ed6e97SBjoern A. Zeeb { 91249ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 91349ed6e97SBjoern A. Zeeb SKB_TODO(); 91449ed6e97SBjoern A. Zeeb return (ENXIO); 91549ed6e97SBjoern A. Zeeb } 91649ed6e97SBjoern A. Zeeb 9176baea331SBjoern A. Zeeb static inline int 9185504bd59SBjoern A. Zeeb skb_linearize(struct sk_buff *skb) 9195504bd59SBjoern A. Zeeb { 9205504bd59SBjoern A. Zeeb 9215504bd59SBjoern A. Zeeb return (skb_is_nonlinear(skb) ? __skb_linearize(skb) : 0); 9225504bd59SBjoern A. Zeeb } 9235504bd59SBjoern A. Zeeb 9245504bd59SBjoern A. Zeeb static inline int 92549ed6e97SBjoern A. Zeeb pskb_expand_head(struct sk_buff *skb, int x, int len, gfp_t gfp) 92649ed6e97SBjoern A. Zeeb { 92749ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 92849ed6e97SBjoern A. Zeeb SKB_TODO(); 9296baea331SBjoern A. Zeeb return (-ENXIO); 93049ed6e97SBjoern A. Zeeb } 93149ed6e97SBjoern A. Zeeb 93249ed6e97SBjoern A. Zeeb /* Not really seen this one but need it as symmetric accessor function. */ 93349ed6e97SBjoern A. Zeeb static inline void 93449ed6e97SBjoern A. Zeeb skb_set_queue_mapping(struct sk_buff *skb, uint16_t qmap) 93549ed6e97SBjoern A. Zeeb { 93649ed6e97SBjoern A. Zeeb 93749ed6e97SBjoern A. Zeeb SKB_TRACE_FMT(skb, "qmap %u", qmap); 93849ed6e97SBjoern A. Zeeb skb->qmap = qmap; 93949ed6e97SBjoern A. Zeeb } 94049ed6e97SBjoern A. Zeeb 94149ed6e97SBjoern A. Zeeb static inline uint16_t 94249ed6e97SBjoern A. Zeeb skb_get_queue_mapping(struct sk_buff *skb) 94349ed6e97SBjoern A. Zeeb { 94449ed6e97SBjoern A. Zeeb 94549ed6e97SBjoern A. Zeeb SKB_TRACE_FMT(skb, "qmap %u", skb->qmap); 94649ed6e97SBjoern A. Zeeb return (skb->qmap); 94749ed6e97SBjoern A. Zeeb } 94849ed6e97SBjoern A. Zeeb 94949ed6e97SBjoern A. Zeeb static inline bool 95049ed6e97SBjoern A. Zeeb skb_header_cloned(struct sk_buff *skb) 95149ed6e97SBjoern A. Zeeb { 95249ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 95349ed6e97SBjoern A. Zeeb SKB_TODO(); 95449ed6e97SBjoern A. Zeeb return (false); 95549ed6e97SBjoern A. Zeeb } 95649ed6e97SBjoern A. Zeeb 95749ed6e97SBjoern A. Zeeb static inline uint8_t * 958262c5e81SBjoern A. Zeeb skb_mac_header(const struct sk_buff *skb) 959262c5e81SBjoern A. Zeeb { 960262c5e81SBjoern A. Zeeb SKB_TRACE(skb); 961262c5e81SBjoern A. Zeeb return (skb->head + skb->mac_header); 962262c5e81SBjoern A. Zeeb } 963f0e59b69SBjoern A. Zeeb 964262c5e81SBjoern A. Zeeb static inline void 965262c5e81SBjoern A. Zeeb skb_reset_mac_header(struct sk_buff *skb) 966262c5e81SBjoern A. Zeeb { 967262c5e81SBjoern A. Zeeb SKB_TRACE(skb); 968262c5e81SBjoern A. Zeeb skb->mac_header = skb->data - skb->head; 969262c5e81SBjoern A. Zeeb } 970262c5e81SBjoern A. Zeeb 971262c5e81SBjoern A. Zeeb static inline void 972262c5e81SBjoern A. Zeeb skb_set_mac_header(struct sk_buff *skb, const size_t len) 973262c5e81SBjoern A. Zeeb { 974262c5e81SBjoern A. Zeeb SKB_TRACE(skb); 975262c5e81SBjoern A. Zeeb skb_reset_mac_header(skb); 976262c5e81SBjoern A. Zeeb skb->mac_header += len; 977262c5e81SBjoern A. Zeeb } 978262c5e81SBjoern A. Zeeb 979262c5e81SBjoern A. Zeeb static inline struct skb_shared_hwtstamps * 980262c5e81SBjoern A. Zeeb skb_hwtstamps(struct sk_buff *skb) 98149ed6e97SBjoern A. Zeeb { 98249ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 98349ed6e97SBjoern A. Zeeb SKB_TODO(); 98449ed6e97SBjoern A. Zeeb return (NULL); 98549ed6e97SBjoern A. Zeeb } 98649ed6e97SBjoern A. Zeeb 98749ed6e97SBjoern A. Zeeb static inline void 98849ed6e97SBjoern A. Zeeb skb_orphan(struct sk_buff *skb) 98949ed6e97SBjoern A. Zeeb { 99049ed6e97SBjoern A. Zeeb SKB_TRACE(skb); 99149ed6e97SBjoern A. Zeeb SKB_TODO(); 99249ed6e97SBjoern A. Zeeb } 99349ed6e97SBjoern A. Zeeb 99449ed6e97SBjoern A. Zeeb static inline __sum16 99549ed6e97SBjoern A. Zeeb csum_unfold(__sum16 sum) 99649ed6e97SBjoern A. Zeeb { 99749ed6e97SBjoern A. Zeeb SKB_TODO(); 99849ed6e97SBjoern A. Zeeb return (sum); 99949ed6e97SBjoern A. Zeeb } 100049ed6e97SBjoern A. Zeeb 1001a3e07b6eSBjoern A. Zeeb static __inline void 1002a3e07b6eSBjoern A. Zeeb skb_postpush_rcsum(struct sk_buff *skb, const void *data, size_t len) 1003a3e07b6eSBjoern A. Zeeb { 1004a3e07b6eSBjoern A. Zeeb SKB_TODO(); 1005a3e07b6eSBjoern A. Zeeb } 1006a3e07b6eSBjoern A. Zeeb 10076baea331SBjoern A. Zeeb static inline void 10086baea331SBjoern A. Zeeb skb_reset_tail_pointer(struct sk_buff *skb) 10096baea331SBjoern A. Zeeb { 10106baea331SBjoern A. Zeeb 10116baea331SBjoern A. Zeeb SKB_TRACE(skb); 10125504bd59SBjoern A. Zeeb #ifdef SKB_DOING_OFFSETS_US_NOT 10136baea331SBjoern A. Zeeb skb->tail = (uint8_t *)(uintptr_t)(skb->data - skb->head); 10145504bd59SBjoern A. Zeeb #endif 10155504bd59SBjoern A. Zeeb skb->tail = skb->data; 10166baea331SBjoern A. Zeeb SKB_TRACE(skb); 10176baea331SBjoern A. Zeeb } 10186baea331SBjoern A. Zeeb 10196baea331SBjoern A. Zeeb static inline struct sk_buff * 10206baea331SBjoern A. Zeeb skb_get(struct sk_buff *skb) 10216baea331SBjoern A. Zeeb { 10226baea331SBjoern A. Zeeb 10236baea331SBjoern A. Zeeb SKB_TODO(); /* XXX refcnt? as in get/put_device? */ 10246baea331SBjoern A. Zeeb return (skb); 10256baea331SBjoern A. Zeeb } 10266baea331SBjoern A. Zeeb 10276baea331SBjoern A. Zeeb static inline struct sk_buff * 10286baea331SBjoern A. Zeeb skb_realloc_headroom(struct sk_buff *skb, unsigned int headroom) 10296baea331SBjoern A. Zeeb { 10306baea331SBjoern A. Zeeb 10316baea331SBjoern A. Zeeb SKB_TODO(); 10326baea331SBjoern A. Zeeb return (NULL); 10336baea331SBjoern A. Zeeb } 10346baea331SBjoern A. Zeeb 10356baea331SBjoern A. Zeeb static inline void 10366baea331SBjoern A. Zeeb skb_copy_from_linear_data(const struct sk_buff *skb, void *dst, size_t len) 10376baea331SBjoern A. Zeeb { 10386baea331SBjoern A. Zeeb 10396baea331SBjoern A. Zeeb SKB_TRACE(skb); 10406baea331SBjoern A. Zeeb /* Let us just hope the destination has len space ... */ 10416baea331SBjoern A. Zeeb memcpy(dst, skb->data, len); 10426baea331SBjoern A. Zeeb } 10436baea331SBjoern A. Zeeb 104489c32dafSBjoern A. Zeeb static inline int 104589c32dafSBjoern A. Zeeb skb_pad(struct sk_buff *skb, int pad) 104689c32dafSBjoern A. Zeeb { 104789c32dafSBjoern A. Zeeb 104889c32dafSBjoern A. Zeeb SKB_TRACE(skb); 104989c32dafSBjoern A. Zeeb SKB_TODO(); 105089c32dafSBjoern A. Zeeb return (-1); 105189c32dafSBjoern A. Zeeb } 105289c32dafSBjoern A. Zeeb 105389c32dafSBjoern A. Zeeb static inline void 105489c32dafSBjoern A. Zeeb skb_list_del_init(struct sk_buff *skb) 105589c32dafSBjoern A. Zeeb { 105689c32dafSBjoern A. Zeeb 105789c32dafSBjoern A. Zeeb SKB_TRACE(skb); 105889c32dafSBjoern A. Zeeb SKB_TODO(); 105989c32dafSBjoern A. Zeeb } 106089c32dafSBjoern A. Zeeb 106189c32dafSBjoern A. Zeeb static inline void 106289c32dafSBjoern A. Zeeb napi_consume_skb(struct sk_buff *skb, int budget) 106389c32dafSBjoern A. Zeeb { 106489c32dafSBjoern A. Zeeb 106589c32dafSBjoern A. Zeeb SKB_TRACE(skb); 106689c32dafSBjoern A. Zeeb SKB_TODO(); 106789c32dafSBjoern A. Zeeb } 106889c32dafSBjoern A. Zeeb 10691213a6beSBjoern A. Zeeb static inline struct sk_buff * 10701213a6beSBjoern A. Zeeb napi_build_skb(void *data, size_t len) 10711213a6beSBjoern A. Zeeb { 10721213a6beSBjoern A. Zeeb 10731213a6beSBjoern A. Zeeb SKB_TODO(); 10741213a6beSBjoern A. Zeeb return (NULL); 10751213a6beSBjoern A. Zeeb } 10761213a6beSBjoern A. Zeeb 1077369264acSBjoern A. Zeeb static inline uint32_t 1078369264acSBjoern A. Zeeb skb_get_hash(struct sk_buff *skb) 1079369264acSBjoern A. Zeeb { 1080369264acSBjoern A. Zeeb SKB_TRACE(skb); 1081369264acSBjoern A. Zeeb SKB_TODO(); 1082369264acSBjoern A. Zeeb return (0); 1083369264acSBjoern A. Zeeb } 1084369264acSBjoern A. Zeeb 10851213a6beSBjoern A. Zeeb static inline void 10861213a6beSBjoern A. Zeeb skb_mark_for_recycle(struct sk_buff *skb) 10871213a6beSBjoern A. Zeeb { 10881213a6beSBjoern A. Zeeb SKB_TRACE(skb); 10891213a6beSBjoern A. Zeeb SKB_TODO(); 10901213a6beSBjoern A. Zeeb } 10911213a6beSBjoern A. Zeeb 1092e039b38dSBjoern A. Zeeb static inline int 1093e039b38dSBjoern A. Zeeb skb_cow_head(struct sk_buff *skb, unsigned int headroom) 1094e039b38dSBjoern A. Zeeb { 1095e039b38dSBjoern A. Zeeb SKB_TRACE(skb); 1096e039b38dSBjoern A. Zeeb SKB_TODO(); 1097e039b38dSBjoern A. Zeeb return (-1); 1098e039b38dSBjoern A. Zeeb } 1099e039b38dSBjoern A. Zeeb 110089c32dafSBjoern A. Zeeb #define SKB_WITH_OVERHEAD(_s) \ 110189c32dafSBjoern A. Zeeb (_s) - ALIGN(sizeof(struct skb_shared_info), CACHE_LINE_SIZE) 110289c32dafSBjoern A. Zeeb 110349ed6e97SBjoern A. Zeeb #endif /* _LINUXKPI_LINUX_SKBUFF_H */ 1104