xref: /freebsd/sys/compat/linuxkpi/common/include/linux/skbuff.h (revision 3d3ec17825a124f0119d76c4d2523d73012fa226)
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 
4949ed6e97SBjoern A. Zeeb /* #define	SKB_DEBUG */
5049ed6e97SBjoern A. Zeeb #ifdef SKB_DEBUG
5149ed6e97SBjoern A. Zeeb #define	DSKB_TODO	0x01
526baea331SBjoern A. Zeeb #define	DSKB_IMPROVE	0x02
536baea331SBjoern A. Zeeb #define	DSKB_TRACE	0x10
546baea331SBjoern A. Zeeb #define	DSKB_TRACEX	0x20
556baea331SBjoern A. Zeeb extern int linuxkpi_debug_skb;
5649ed6e97SBjoern A. Zeeb 
576baea331SBjoern A. Zeeb #define	SKB_TODO()							\
586baea331SBjoern A. Zeeb     if (linuxkpi_debug_skb & DSKB_TODO)					\
5949ed6e97SBjoern A. Zeeb 	printf("SKB_TODO %s:%d\n", __func__, __LINE__)
606baea331SBjoern A. Zeeb #define	SKB_IMPROVE(...)						\
616baea331SBjoern A. Zeeb     if (linuxkpi_debug_skb & DSKB_IMPROVE)				\
626baea331SBjoern A. Zeeb 	printf("SKB_IMPROVE %s:%d\n", __func__, __LINE__)
636baea331SBjoern A. Zeeb #define	SKB_TRACE(_s)							\
646baea331SBjoern A. Zeeb     if (linuxkpi_debug_skb & DSKB_TRACE)				\
656baea331SBjoern A. Zeeb 	printf("SKB_TRACE %s:%d %p\n", __func__, __LINE__, _s)
666baea331SBjoern A. Zeeb #define	SKB_TRACE2(_s, _p)						\
676baea331SBjoern A. Zeeb     if (linuxkpi_debug_skb & DSKB_TRACE)				\
686baea331SBjoern A. Zeeb 	printf("SKB_TRACE %s:%d %p, %p\n", __func__, __LINE__, _s, _p)
696baea331SBjoern A. Zeeb #define	SKB_TRACE_FMT(_s, _fmt, ...)					\
706baea331SBjoern A. Zeeb    if (linuxkpi_debug_skb & DSKB_TRACE)					\
716baea331SBjoern A. Zeeb 	printf("SKB_TRACE %s:%d %p " _fmt "\n", __func__, __LINE__, _s,	\
726baea331SBjoern A. Zeeb 	    __VA_ARGS__)
7349ed6e97SBjoern A. Zeeb #else
746baea331SBjoern A. Zeeb #define	SKB_TODO()		do { } while(0)
756baea331SBjoern A. Zeeb #define	SKB_IMPROVE(...)	do { } while(0)
7649ed6e97SBjoern A. Zeeb #define	SKB_TRACE(_s)		do { } while(0)
7749ed6e97SBjoern A. Zeeb #define	SKB_TRACE2(_s, _p)	do { } while(0)
7849ed6e97SBjoern A. Zeeb #define	SKB_TRACE_FMT(_s, ...)	do { } while(0)
7949ed6e97SBjoern A. Zeeb #endif
8049ed6e97SBjoern A. Zeeb 
8149ed6e97SBjoern A. Zeeb enum sk_buff_pkt_type {
8249ed6e97SBjoern A. Zeeb 	PACKET_BROADCAST,
8349ed6e97SBjoern A. Zeeb 	PACKET_MULTICAST,
8449ed6e97SBjoern A. Zeeb 	PACKET_OTHERHOST,
8549ed6e97SBjoern A. Zeeb };
8649ed6e97SBjoern A. Zeeb 
87262c5e81SBjoern A. Zeeb struct skb_shared_hwtstamps {
88262c5e81SBjoern A. Zeeb 	ktime_t			hwtstamp;
89262c5e81SBjoern A. Zeeb };
90262c5e81SBjoern A. Zeeb 
919df5f29cSBjoern A. Zeeb #define	NET_SKB_PAD		max(CACHE_LINE_SIZE, 32)
92*3d3ec178SBjoern A. Zeeb #define	SKB_DATA_ALIGN(_x)	roundup2(_x, CACHE_LINE_SIZE)
9349ed6e97SBjoern A. Zeeb 
9449ed6e97SBjoern A. Zeeb struct sk_buff_head {
9549ed6e97SBjoern A. Zeeb 		/* XXX TODO */
96b2dcb848SBjoern A. Zeeb 	union {
97b2dcb848SBjoern A. Zeeb 		struct {
9849ed6e97SBjoern A. Zeeb 			struct sk_buff		*next;
9949ed6e97SBjoern A. Zeeb 			struct sk_buff		*prev;
100b2dcb848SBjoern A. Zeeb 		};
101b2dcb848SBjoern A. Zeeb 		struct sk_buff_head_l {
102b2dcb848SBjoern A. Zeeb 			struct sk_buff		*next;
103b2dcb848SBjoern A. Zeeb 			struct sk_buff		*prev;
104b2dcb848SBjoern A. Zeeb 		} list;
105b2dcb848SBjoern A. Zeeb 	};
10649ed6e97SBjoern A. Zeeb 	size_t			qlen;
1076baea331SBjoern A. Zeeb 	spinlock_t		lock;
10849ed6e97SBjoern A. Zeeb };
10949ed6e97SBjoern A. Zeeb 
11049ed6e97SBjoern A. Zeeb enum sk_checksum_flags {
11149ed6e97SBjoern A. Zeeb 	CHECKSUM_NONE			= 0x00,
11249ed6e97SBjoern A. Zeeb 	CHECKSUM_UNNECESSARY		= 0x01,
11349ed6e97SBjoern A. Zeeb 	CHECKSUM_PARTIAL		= 0x02,
11449ed6e97SBjoern A. Zeeb 	CHECKSUM_COMPLETE		= 0x04,
11549ed6e97SBjoern A. Zeeb };
11649ed6e97SBjoern A. Zeeb 
11749ed6e97SBjoern A. Zeeb struct skb_frag {
11849ed6e97SBjoern A. Zeeb 		/* XXX TODO */
11949ed6e97SBjoern A. Zeeb 	struct page		*page;		/* XXX-BZ These three are a wild guess so far! */
12049ed6e97SBjoern A. Zeeb 	off_t			offset;
12149ed6e97SBjoern A. Zeeb 	size_t			size;
12249ed6e97SBjoern A. Zeeb };
12349ed6e97SBjoern A. Zeeb typedef	struct skb_frag	skb_frag_t;
12449ed6e97SBjoern A. Zeeb 
12549ed6e97SBjoern A. Zeeb enum skb_shared_info_gso_type {
12649ed6e97SBjoern A. Zeeb 	SKB_GSO_TCPV4,
12749ed6e97SBjoern A. Zeeb 	SKB_GSO_TCPV6,
12849ed6e97SBjoern A. Zeeb };
12949ed6e97SBjoern A. Zeeb 
13049ed6e97SBjoern A. Zeeb struct skb_shared_info {
13149ed6e97SBjoern A. Zeeb 	enum skb_shared_info_gso_type	gso_type;
13249ed6e97SBjoern A. Zeeb 	uint16_t			gso_size;
13349ed6e97SBjoern A. Zeeb 	uint16_t			nr_frags;
1346baea331SBjoern A. Zeeb 	struct sk_buff			*frag_list;
13549ed6e97SBjoern A. Zeeb 	skb_frag_t			frags[64];	/* XXX TODO, 16xpage? */
13649ed6e97SBjoern A. Zeeb };
13749ed6e97SBjoern A. Zeeb 
13849ed6e97SBjoern A. Zeeb struct sk_buff {
13949ed6e97SBjoern A. Zeeb 	/* XXX TODO */
14089c32dafSBjoern A. Zeeb 	union {
14149ed6e97SBjoern A. Zeeb 		/* struct sk_buff_head */
14289c32dafSBjoern A. Zeeb 		struct {
14349ed6e97SBjoern A. Zeeb 			struct sk_buff		*next;
14449ed6e97SBjoern A. Zeeb 			struct sk_buff		*prev;
14589c32dafSBjoern A. Zeeb 		};
14689c32dafSBjoern A. Zeeb 		struct list_head	list;
14789c32dafSBjoern A. Zeeb 	};
14849ed6e97SBjoern A. Zeeb 	uint32_t		_alloc_len;	/* Length of alloc data-buf. XXX-BZ give up for truesize? */
14949ed6e97SBjoern A. Zeeb 	uint32_t		len;		/* ? */
15049ed6e97SBjoern A. Zeeb 	uint32_t		data_len;	/* ? If we have frags? */
15149ed6e97SBjoern A. Zeeb 	uint32_t		truesize;	/* The total size of all buffers, incl. frags. */
15249ed6e97SBjoern A. Zeeb 	uint16_t		mac_len;	/* Link-layer header length. */
15349ed6e97SBjoern A. Zeeb 	__sum16			csum;
15449ed6e97SBjoern A. Zeeb 	uint16_t		l3hdroff;	/* network header offset from *head */
15549ed6e97SBjoern A. Zeeb 	uint16_t		l4hdroff;	/* transport header offset from *head */
15649ed6e97SBjoern A. Zeeb 	uint32_t		priority;
15749ed6e97SBjoern A. Zeeb 	uint16_t		qmap;		/* queue mapping */
1585504bd59SBjoern A. Zeeb 	uint16_t		_flags;		/* Internal flags. */
1595504bd59SBjoern A. Zeeb #define	_SKB_FLAGS_SKBEXTFRAG	0x0001
16049ed6e97SBjoern A. Zeeb 	enum sk_buff_pkt_type	pkt_type;
161262c5e81SBjoern A. Zeeb 	uint16_t		mac_header;	/* offset of mac_header */
16249ed6e97SBjoern A. Zeeb 
16349ed6e97SBjoern A. Zeeb 	/* "Scratch" area for layers to store metadata. */
16449ed6e97SBjoern A. Zeeb 	/* ??? I see sizeof() operations so probably an array. */
16549ed6e97SBjoern A. Zeeb 	uint8_t			cb[64] __aligned(CACHE_LINE_SIZE);
16649ed6e97SBjoern A. Zeeb 
16749ed6e97SBjoern A. Zeeb 	struct net_device	*dev;
16849ed6e97SBjoern A. Zeeb 	void			*sk;		/* XXX net/sock.h? */
16949ed6e97SBjoern A. Zeeb 
17049ed6e97SBjoern A. Zeeb 	int		csum_offset, csum_start, ip_summed, protocol;
17149ed6e97SBjoern A. Zeeb 
17249ed6e97SBjoern A. Zeeb 	uint8_t			*head;			/* Head of buffer. */
17349ed6e97SBjoern A. Zeeb 	uint8_t			*data;			/* Head of data. */
17449ed6e97SBjoern A. Zeeb 	uint8_t			*tail;			/* End of data. */
17549ed6e97SBjoern A. Zeeb 	uint8_t			*end;			/* End of buffer. */
17649ed6e97SBjoern A. Zeeb 
17749ed6e97SBjoern A. Zeeb 	struct skb_shared_info	*shinfo;
17849ed6e97SBjoern A. Zeeb 
17949ed6e97SBjoern A. Zeeb 	/* FreeBSD specific bandaid (see linuxkpi_kfree_skb). */
18049ed6e97SBjoern A. Zeeb 	void			*m;
18149ed6e97SBjoern A. Zeeb 	void(*m_free_func)(void *);
18249ed6e97SBjoern A. Zeeb 
18349ed6e97SBjoern A. Zeeb 	/* Force padding to CACHE_LINE_SIZE. */
18449ed6e97SBjoern A. Zeeb 	uint8_t			__scratch[0] __aligned(CACHE_LINE_SIZE);
18549ed6e97SBjoern A. Zeeb };
18649ed6e97SBjoern A. Zeeb 
18749ed6e97SBjoern A. Zeeb /* -------------------------------------------------------------------------- */
18849ed6e97SBjoern A. Zeeb 
18949ed6e97SBjoern A. Zeeb struct sk_buff *linuxkpi_alloc_skb(size_t, gfp_t);
1909df5f29cSBjoern A. Zeeb struct sk_buff *linuxkpi_dev_alloc_skb(size_t, gfp_t);
1915504bd59SBjoern A. Zeeb struct sk_buff *linuxkpi_build_skb(void *, size_t);
19249ed6e97SBjoern A. Zeeb void linuxkpi_kfree_skb(struct sk_buff *);
19349ed6e97SBjoern A. Zeeb 
194349b042bSBjoern A. Zeeb struct sk_buff *linuxkpi_skb_copy(struct sk_buff *, gfp_t);
195349b042bSBjoern A. Zeeb 
19649ed6e97SBjoern A. Zeeb /* -------------------------------------------------------------------------- */
19749ed6e97SBjoern A. Zeeb 
19849ed6e97SBjoern A. Zeeb static inline struct sk_buff *
19949ed6e97SBjoern A. Zeeb alloc_skb(size_t size, gfp_t gfp)
20049ed6e97SBjoern A. Zeeb {
20149ed6e97SBjoern A. Zeeb 	struct sk_buff *skb;
20249ed6e97SBjoern A. Zeeb 
20349ed6e97SBjoern A. Zeeb 	skb = linuxkpi_alloc_skb(size, gfp);
20449ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
20549ed6e97SBjoern A. Zeeb 	return (skb);
20649ed6e97SBjoern A. Zeeb }
20749ed6e97SBjoern A. Zeeb 
20849ed6e97SBjoern A. Zeeb static inline struct sk_buff *
2096baea331SBjoern A. Zeeb __dev_alloc_skb(size_t len, gfp_t gfp)
2106baea331SBjoern A. Zeeb {
2116baea331SBjoern A. Zeeb 	struct sk_buff *skb;
2126baea331SBjoern A. Zeeb 
2139df5f29cSBjoern A. Zeeb 	skb = linuxkpi_dev_alloc_skb(len, gfp);
2146baea331SBjoern A. Zeeb 	SKB_IMPROVE();
2156baea331SBjoern A. Zeeb 	SKB_TRACE(skb);
2166baea331SBjoern A. Zeeb 	return (skb);
2176baea331SBjoern A. Zeeb }
2186baea331SBjoern A. Zeeb 
2196baea331SBjoern A. Zeeb static inline struct sk_buff *
22049ed6e97SBjoern A. Zeeb dev_alloc_skb(size_t len)
22149ed6e97SBjoern A. Zeeb {
22249ed6e97SBjoern A. Zeeb 	struct sk_buff *skb;
22349ed6e97SBjoern A. Zeeb 
2249df5f29cSBjoern A. Zeeb 	skb = __dev_alloc_skb(len, GFP_NOWAIT);
2256baea331SBjoern A. Zeeb 	SKB_IMPROVE();
22649ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
22749ed6e97SBjoern A. Zeeb 	return (skb);
22849ed6e97SBjoern A. Zeeb }
22949ed6e97SBjoern A. Zeeb 
23049ed6e97SBjoern A. Zeeb static inline void
23149ed6e97SBjoern A. Zeeb kfree_skb(struct sk_buff *skb)
23249ed6e97SBjoern A. Zeeb {
23349ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
23449ed6e97SBjoern A. Zeeb 	linuxkpi_kfree_skb(skb);
23549ed6e97SBjoern A. Zeeb }
23649ed6e97SBjoern A. Zeeb 
23749ed6e97SBjoern A. Zeeb static inline void
23849ed6e97SBjoern A. Zeeb dev_kfree_skb(struct sk_buff *skb)
23949ed6e97SBjoern A. Zeeb {
24049ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
24149ed6e97SBjoern A. Zeeb 	kfree_skb(skb);
24249ed6e97SBjoern A. Zeeb }
24349ed6e97SBjoern A. Zeeb 
24449ed6e97SBjoern A. Zeeb static inline void
24549ed6e97SBjoern A. Zeeb dev_kfree_skb_any(struct sk_buff *skb)
24649ed6e97SBjoern A. Zeeb {
24749ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
24849ed6e97SBjoern A. Zeeb 	dev_kfree_skb(skb);
24949ed6e97SBjoern A. Zeeb }
25049ed6e97SBjoern A. Zeeb 
25149ed6e97SBjoern A. Zeeb static inline void
25249ed6e97SBjoern A. Zeeb dev_kfree_skb_irq(struct sk_buff *skb)
25349ed6e97SBjoern A. Zeeb {
25449ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
255952643eaSBjoern A. Zeeb 	SKB_IMPROVE("Do we have to defer this?");
256952643eaSBjoern A. Zeeb 	dev_kfree_skb(skb);
25749ed6e97SBjoern A. Zeeb }
25849ed6e97SBjoern A. Zeeb 
2595504bd59SBjoern A. Zeeb static inline struct sk_buff *
2605504bd59SBjoern A. Zeeb build_skb(void *data, unsigned int fragsz)
2615504bd59SBjoern A. Zeeb {
2625504bd59SBjoern A. Zeeb 	struct sk_buff *skb;
2635504bd59SBjoern A. Zeeb 
2645504bd59SBjoern A. Zeeb 	skb = linuxkpi_build_skb(data, fragsz);
2655504bd59SBjoern A. Zeeb 	SKB_TRACE(skb);
2665504bd59SBjoern A. Zeeb 	return (skb);
2675504bd59SBjoern A. Zeeb }
2685504bd59SBjoern A. Zeeb 
26949ed6e97SBjoern A. Zeeb /* -------------------------------------------------------------------------- */
27049ed6e97SBjoern A. Zeeb 
27149ed6e97SBjoern A. Zeeb /* XXX BZ review this one for terminal condition as Linux "queues" are special. */
27249ed6e97SBjoern A. Zeeb #define	skb_list_walk_safe(_q, skb, tmp)				\
27349ed6e97SBjoern A. Zeeb 	for ((skb) = (_q)->next; (skb) != NULL && ((tmp) = (skb)->next); (skb) = (tmp))
27449ed6e97SBjoern A. Zeeb 
27549ed6e97SBjoern A. Zeeb /* Add headroom; cannot do once there is data in there. */
27649ed6e97SBjoern A. Zeeb static inline void
27749ed6e97SBjoern A. Zeeb skb_reserve(struct sk_buff *skb, size_t len)
27849ed6e97SBjoern A. Zeeb {
27949ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
2806baea331SBjoern A. Zeeb #if 0
2816baea331SBjoern A. Zeeb 	/* Apparently it is allowed to call skb_reserve multiple times in a row. */
28249ed6e97SBjoern A. Zeeb 	KASSERT(skb->data == skb->head, ("%s: skb %p not empty head %p data %p "
28349ed6e97SBjoern A. Zeeb 	    "tail %p\n", __func__, skb, skb->head, skb->data, skb->tail));
2846baea331SBjoern A. Zeeb #else
2856baea331SBjoern A. Zeeb 	KASSERT(skb->len == 0 && skb->data == skb->tail, ("%s: skb %p not "
2866baea331SBjoern A. Zeeb 	    "empty head %p data %p tail %p len %u\n", __func__, skb,
2876baea331SBjoern A. Zeeb 	    skb->head, skb->data, skb->tail, skb->len));
2886baea331SBjoern A. Zeeb #endif
28949ed6e97SBjoern A. Zeeb 	skb->data += len;
29049ed6e97SBjoern A. Zeeb 	skb->tail += len;
29149ed6e97SBjoern A. Zeeb }
29249ed6e97SBjoern A. Zeeb 
29349ed6e97SBjoern A. Zeeb /*
29449ed6e97SBjoern A. Zeeb  * Remove headroom; return new data pointer; basically make space at the
29549ed6e97SBjoern A. Zeeb  * front to copy data in (manually).
29649ed6e97SBjoern A. Zeeb  */
29749ed6e97SBjoern A. Zeeb static inline void *
29889c32dafSBjoern A. Zeeb __skb_push(struct sk_buff *skb, size_t len)
29949ed6e97SBjoern A. Zeeb {
30049ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
30149ed6e97SBjoern A. Zeeb 	KASSERT(((skb->data - len) >= skb->head), ("%s: skb %p (data %p - "
30249ed6e97SBjoern A. Zeeb 	    "len %zu) < head %p\n", __func__, skb, skb->data, len, skb->data));
30349ed6e97SBjoern A. Zeeb 	skb->len  += len;
30449ed6e97SBjoern A. Zeeb 	skb->data -= len;
30549ed6e97SBjoern A. Zeeb 	return (skb->data);
30649ed6e97SBjoern A. Zeeb }
30749ed6e97SBjoern A. Zeeb 
30889c32dafSBjoern A. Zeeb static inline void *
30989c32dafSBjoern A. Zeeb skb_push(struct sk_buff *skb, size_t len)
31089c32dafSBjoern A. Zeeb {
31189c32dafSBjoern A. Zeeb 
31289c32dafSBjoern A. Zeeb 	SKB_TRACE(skb);
31389c32dafSBjoern A. Zeeb 	return (__skb_push(skb, len));
31489c32dafSBjoern A. Zeeb }
31589c32dafSBjoern A. Zeeb 
31649ed6e97SBjoern A. Zeeb /*
31749ed6e97SBjoern A. Zeeb  * Length of the data on the skb (without any frags)???
31849ed6e97SBjoern A. Zeeb  */
31949ed6e97SBjoern A. Zeeb static inline size_t
32049ed6e97SBjoern A. Zeeb skb_headlen(struct sk_buff *skb)
32149ed6e97SBjoern A. Zeeb {
32249ed6e97SBjoern A. Zeeb 
32349ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
32449ed6e97SBjoern A. Zeeb 	return (skb->len - skb->data_len);
32549ed6e97SBjoern A. Zeeb }
32649ed6e97SBjoern A. Zeeb 
32749ed6e97SBjoern A. Zeeb 
32849ed6e97SBjoern A. Zeeb /* Return the end of data (tail pointer). */
32949ed6e97SBjoern A. Zeeb static inline uint8_t *
33049ed6e97SBjoern A. Zeeb skb_tail_pointer(struct sk_buff *skb)
33149ed6e97SBjoern A. Zeeb {
33249ed6e97SBjoern A. Zeeb 
33349ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
33449ed6e97SBjoern A. Zeeb 	return (skb->tail);
33549ed6e97SBjoern A. Zeeb }
33649ed6e97SBjoern A. Zeeb 
33749ed6e97SBjoern A. Zeeb /* Return number of bytes available at end of buffer. */
33849ed6e97SBjoern A. Zeeb static inline unsigned int
33949ed6e97SBjoern A. Zeeb skb_tailroom(struct sk_buff *skb)
34049ed6e97SBjoern A. Zeeb {
34149ed6e97SBjoern A. Zeeb 
34249ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
34349ed6e97SBjoern A. Zeeb 	KASSERT((skb->end - skb->tail) >= 0, ("%s: skb %p tailroom < 0, "
34449ed6e97SBjoern A. Zeeb 	    "end %p tail %p\n", __func__, skb, skb->end, skb->tail));
34549ed6e97SBjoern A. Zeeb 	return (skb->end - skb->tail);
34649ed6e97SBjoern A. Zeeb }
34749ed6e97SBjoern A. Zeeb 
34849ed6e97SBjoern A. Zeeb /* Return numer of bytes available at the beginning of buffer. */
34949ed6e97SBjoern A. Zeeb static inline unsigned int
35049ed6e97SBjoern A. Zeeb skb_headroom(struct sk_buff *skb)
35149ed6e97SBjoern A. Zeeb {
35249ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
35349ed6e97SBjoern A. Zeeb 	KASSERT((skb->data - skb->head) >= 0, ("%s: skb %p headroom < 0, "
35449ed6e97SBjoern A. Zeeb 	    "data %p head %p\n", __func__, skb, skb->data, skb->head));
35549ed6e97SBjoern A. Zeeb 	return (skb->data - skb->head);
35649ed6e97SBjoern A. Zeeb }
35749ed6e97SBjoern A. Zeeb 
35849ed6e97SBjoern A. Zeeb 
35949ed6e97SBjoern A. Zeeb /*
36049ed6e97SBjoern A. Zeeb  * Remove tailroom; return the old tail pointer; basically make space at
36149ed6e97SBjoern A. Zeeb  * the end to copy data in (manually).  See also skb_put_data() below.
36249ed6e97SBjoern A. Zeeb  */
36349ed6e97SBjoern A. Zeeb static inline void *
36489c32dafSBjoern A. Zeeb __skb_put(struct sk_buff *skb, size_t len)
36549ed6e97SBjoern A. Zeeb {
36649ed6e97SBjoern A. Zeeb 	void *s;
36749ed6e97SBjoern A. Zeeb 
36849ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
36949ed6e97SBjoern A. Zeeb 	KASSERT(((skb->tail + len) <= skb->end), ("%s: skb %p (tail %p + "
37049ed6e97SBjoern A. Zeeb 	    "len %zu) > end %p, head %p data %p len %u\n", __func__,
37149ed6e97SBjoern A. Zeeb 	    skb, skb->tail, len, skb->end, skb->head, skb->data, skb->len));
37249ed6e97SBjoern A. Zeeb 
37349ed6e97SBjoern A. Zeeb 	s = skb_tail_pointer(skb);
374952643eaSBjoern A. Zeeb 	if (len == 0)
375952643eaSBjoern A. Zeeb 		return (s);
37649ed6e97SBjoern A. Zeeb 	skb->tail += len;
37749ed6e97SBjoern A. Zeeb 	skb->len += len;
37849ed6e97SBjoern A. Zeeb #ifdef SKB_DEBUG
3796baea331SBjoern A. Zeeb 	if (linuxkpi_debug_skb & DSKB_TRACEX)
38049ed6e97SBjoern A. Zeeb 	printf("%s: skb %p (%u) head %p data %p tail %p end %p, s %p len %zu\n",
38149ed6e97SBjoern A. Zeeb 	    __func__, skb, skb->len, skb->head, skb->data, skb->tail, skb->end,
38249ed6e97SBjoern A. Zeeb 	    s, len);
38349ed6e97SBjoern A. Zeeb #endif
38449ed6e97SBjoern A. Zeeb 	return (s);
38549ed6e97SBjoern A. Zeeb }
38649ed6e97SBjoern A. Zeeb 
38789c32dafSBjoern A. Zeeb static inline void *
38889c32dafSBjoern A. Zeeb skb_put(struct sk_buff *skb, size_t len)
38989c32dafSBjoern A. Zeeb {
39089c32dafSBjoern A. Zeeb 
39189c32dafSBjoern A. Zeeb 	SKB_TRACE(skb);
39289c32dafSBjoern A. Zeeb 	return (__skb_put(skb, len));
39389c32dafSBjoern A. Zeeb }
39489c32dafSBjoern A. Zeeb 
39549ed6e97SBjoern A. Zeeb /* skb_put() + copying data in. */
39649ed6e97SBjoern A. Zeeb static inline void *
39749ed6e97SBjoern A. Zeeb skb_put_data(struct sk_buff *skb, const void *buf, size_t len)
39849ed6e97SBjoern A. Zeeb {
39949ed6e97SBjoern A. Zeeb 	void *s;
40049ed6e97SBjoern A. Zeeb 
40149ed6e97SBjoern A. Zeeb 	SKB_TRACE2(skb, buf);
40249ed6e97SBjoern A. Zeeb 	s = skb_put(skb, len);
403952643eaSBjoern A. Zeeb 	if (len == 0)
404952643eaSBjoern A. Zeeb 		return (s);
40549ed6e97SBjoern A. Zeeb 	memcpy(s, buf, len);
40649ed6e97SBjoern A. Zeeb 	return (s);
40749ed6e97SBjoern A. Zeeb }
40849ed6e97SBjoern A. Zeeb 
40949ed6e97SBjoern A. Zeeb /* skb_put() + filling with zeros. */
41049ed6e97SBjoern A. Zeeb static inline void *
41149ed6e97SBjoern A. Zeeb skb_put_zero(struct sk_buff *skb, size_t len)
41249ed6e97SBjoern A. Zeeb {
41349ed6e97SBjoern A. Zeeb 	void *s;
41449ed6e97SBjoern A. Zeeb 
41549ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
41649ed6e97SBjoern A. Zeeb 	s = skb_put(skb, len);
41749ed6e97SBjoern A. Zeeb 	memset(s, '\0', len);
41849ed6e97SBjoern A. Zeeb 	return (s);
41949ed6e97SBjoern A. Zeeb }
42049ed6e97SBjoern A. Zeeb 
42149ed6e97SBjoern A. Zeeb /*
42249ed6e97SBjoern A. Zeeb  * Remove len bytes from beginning of data.
42349ed6e97SBjoern A. Zeeb  *
42449ed6e97SBjoern A. Zeeb  * XXX-BZ ath10k checks for !NULL conditions so I assume this doesn't panic;
42549ed6e97SBjoern A. Zeeb  * we return the advanced data pointer so we don't have to keep a temp, correct?
42649ed6e97SBjoern A. Zeeb  */
42749ed6e97SBjoern A. Zeeb static inline void *
42849ed6e97SBjoern A. Zeeb skb_pull(struct sk_buff *skb, size_t len)
42949ed6e97SBjoern A. Zeeb {
43049ed6e97SBjoern A. Zeeb 
43149ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
43249ed6e97SBjoern A. Zeeb #if 0	/* Apparently this doesn't barf... */
43349ed6e97SBjoern A. Zeeb 	KASSERT(skb->len >= len, ("%s: skb %p skb->len %u < len %u, data %p\n",
43449ed6e97SBjoern A. Zeeb 	    __func__, skb, skb->len, len, skb->data));
43549ed6e97SBjoern A. Zeeb #endif
43649ed6e97SBjoern A. Zeeb 	if (skb->len < len)
43749ed6e97SBjoern A. Zeeb 		return (NULL);
43849ed6e97SBjoern A. Zeeb 	skb->len -= len;
43949ed6e97SBjoern A. Zeeb 	skb->data += len;
44049ed6e97SBjoern A. Zeeb 	return (skb->data);
44149ed6e97SBjoern A. Zeeb }
44249ed6e97SBjoern A. Zeeb 
44349ed6e97SBjoern A. Zeeb /* Reduce skb data to given length or do nothing if smaller already. */
44449ed6e97SBjoern A. Zeeb static inline void
44549ed6e97SBjoern A. Zeeb __skb_trim(struct sk_buff *skb, unsigned int len)
44649ed6e97SBjoern A. Zeeb {
44749ed6e97SBjoern A. Zeeb 
44849ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
44949ed6e97SBjoern A. Zeeb 	if (skb->len < len)
45049ed6e97SBjoern A. Zeeb 		return;
45149ed6e97SBjoern A. Zeeb 
45249ed6e97SBjoern A. Zeeb 	skb->len = len;
45349ed6e97SBjoern A. Zeeb 	skb->tail = skb->data + skb->len;
45449ed6e97SBjoern A. Zeeb }
45549ed6e97SBjoern A. Zeeb 
45649ed6e97SBjoern A. Zeeb static inline void
45749ed6e97SBjoern A. Zeeb skb_trim(struct sk_buff *skb, unsigned int len)
45849ed6e97SBjoern A. Zeeb {
45949ed6e97SBjoern A. Zeeb 
46049ed6e97SBjoern A. Zeeb 	return (__skb_trim(skb, len));
46149ed6e97SBjoern A. Zeeb }
46249ed6e97SBjoern A. Zeeb 
46349ed6e97SBjoern A. Zeeb static inline struct skb_shared_info *
46449ed6e97SBjoern A. Zeeb skb_shinfo(struct sk_buff *skb)
46549ed6e97SBjoern A. Zeeb {
46649ed6e97SBjoern A. Zeeb 
46749ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
46849ed6e97SBjoern A. Zeeb 	return (skb->shinfo);
46949ed6e97SBjoern A. Zeeb }
47049ed6e97SBjoern A. Zeeb 
47149ed6e97SBjoern A. Zeeb static inline void
47249ed6e97SBjoern A. Zeeb skb_add_rx_frag(struct sk_buff *skb, int fragno, struct page *page,
47349ed6e97SBjoern A. Zeeb     off_t offset, size_t size, unsigned int truesize)
47449ed6e97SBjoern A. Zeeb {
47549ed6e97SBjoern A. Zeeb 	struct skb_shared_info *shinfo;
47649ed6e97SBjoern A. Zeeb 
47749ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
47849ed6e97SBjoern A. Zeeb #ifdef SKB_DEBUG
4796baea331SBjoern A. Zeeb 	if (linuxkpi_debug_skb & DSKB_TRACEX)
48049ed6e97SBjoern A. Zeeb 	printf("%s: skb %p head %p data %p tail %p end %p len %u fragno %d "
48149ed6e97SBjoern A. Zeeb 	    "page %#jx offset %ju size %zu truesize %u\n", __func__,
48249ed6e97SBjoern A. Zeeb 	    skb, skb->head, skb->data, skb->tail, skb->end, skb->len, fragno,
48349ed6e97SBjoern A. Zeeb 	    (uintmax_t)(uintptr_t)linux_page_address(page), (uintmax_t)offset,
48449ed6e97SBjoern A. Zeeb 	    size, truesize);
48549ed6e97SBjoern A. Zeeb #endif
48649ed6e97SBjoern A. Zeeb 
48749ed6e97SBjoern A. Zeeb 	shinfo = skb_shinfo(skb);
48849ed6e97SBjoern A. Zeeb 	KASSERT(fragno >= 0 && fragno < nitems(shinfo->frags), ("%s: skb %p "
48949ed6e97SBjoern A. Zeeb 	    "fragno %d too big\n", __func__, skb, fragno));
49049ed6e97SBjoern A. Zeeb 	shinfo->frags[fragno].page = page;
49149ed6e97SBjoern A. Zeeb 	shinfo->frags[fragno].offset = offset;
49249ed6e97SBjoern A. Zeeb 	shinfo->frags[fragno].size = size;
49349ed6e97SBjoern A. Zeeb 	shinfo->nr_frags = fragno + 1;
49449ed6e97SBjoern A. Zeeb         skb->len += size;
4955504bd59SBjoern A. Zeeb 	skb->data_len += size;
49649ed6e97SBjoern A. Zeeb         skb->truesize += truesize;
49749ed6e97SBjoern A. Zeeb 
49849ed6e97SBjoern A. Zeeb 	/* XXX TODO EXTEND truesize? */
49949ed6e97SBjoern A. Zeeb }
50049ed6e97SBjoern A. Zeeb 
50149ed6e97SBjoern A. Zeeb /* -------------------------------------------------------------------------- */
50249ed6e97SBjoern A. Zeeb 
50349ed6e97SBjoern A. Zeeb /* XXX BZ review this one for terminal condition as Linux "queues" are special. */
50449ed6e97SBjoern A. Zeeb #define	skb_queue_walk(_q, skb)						\
50549ed6e97SBjoern A. Zeeb 	for ((skb) = (_q)->next; (skb) != (struct sk_buff *)(_q);	\
50649ed6e97SBjoern A. Zeeb 	    (skb) = (skb)->next)
50749ed6e97SBjoern A. Zeeb 
50849ed6e97SBjoern A. Zeeb #define	skb_queue_walk_safe(_q, skb, tmp)				\
50949ed6e97SBjoern A. Zeeb 	for ((skb) = (_q)->next, (tmp) = (skb)->next;			\
51049ed6e97SBjoern A. Zeeb 	    (skb) != (struct sk_buff *)(_q); (skb) = (tmp), (tmp) = (skb)->next)
51149ed6e97SBjoern A. Zeeb 
51249ed6e97SBjoern A. Zeeb static inline bool
51349ed6e97SBjoern A. Zeeb skb_queue_empty(struct sk_buff_head *q)
51449ed6e97SBjoern A. Zeeb {
51549ed6e97SBjoern A. Zeeb 
51649ed6e97SBjoern A. Zeeb 	SKB_TRACE(q);
51749ed6e97SBjoern A. Zeeb 	return (q->qlen == 0);
51849ed6e97SBjoern A. Zeeb }
51949ed6e97SBjoern A. Zeeb 
52049ed6e97SBjoern A. Zeeb static inline void
52149ed6e97SBjoern A. Zeeb __skb_queue_head_init(struct sk_buff_head *q)
52249ed6e97SBjoern A. Zeeb {
52349ed6e97SBjoern A. Zeeb 	SKB_TRACE(q);
52449ed6e97SBjoern A. Zeeb 	q->prev = q->next = (struct sk_buff *)q;
52549ed6e97SBjoern A. Zeeb 	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 	return (__skb_queue_head_init(q));
53349ed6e97SBjoern A. Zeeb }
53449ed6e97SBjoern A. Zeeb 
53549ed6e97SBjoern A. Zeeb static inline void
53649ed6e97SBjoern A. Zeeb __skb_insert(struct sk_buff *new, struct sk_buff *prev, struct sk_buff *next,
53749ed6e97SBjoern A. Zeeb     struct sk_buff_head *q)
53849ed6e97SBjoern A. Zeeb {
53949ed6e97SBjoern A. Zeeb 
54049ed6e97SBjoern A. Zeeb 	SKB_TRACE_FMT(new, "prev %p next %p q %p", prev, next, q);
54149ed6e97SBjoern A. Zeeb 	new->prev = prev;
54249ed6e97SBjoern A. Zeeb 	new->next = next;
543b2dcb848SBjoern A. Zeeb 	((struct sk_buff_head_l *)next)->prev = new;
544b2dcb848SBjoern A. Zeeb 	((struct sk_buff_head_l *)prev)->next = new;
54549ed6e97SBjoern A. Zeeb 	q->qlen++;
54649ed6e97SBjoern A. Zeeb }
54749ed6e97SBjoern A. Zeeb 
54849ed6e97SBjoern A. Zeeb static inline void
54949ed6e97SBjoern A. Zeeb __skb_queue_after(struct sk_buff_head *q, struct sk_buff *skb,
55049ed6e97SBjoern A. Zeeb     struct sk_buff *new)
55149ed6e97SBjoern A. Zeeb {
55249ed6e97SBjoern A. Zeeb 
55349ed6e97SBjoern A. Zeeb 	SKB_TRACE_FMT(q, "skb %p new %p", skb, new);
554b2dcb848SBjoern A. Zeeb 	__skb_insert(new, skb, ((struct sk_buff_head_l *)skb)->next, q);
55549ed6e97SBjoern A. Zeeb }
55649ed6e97SBjoern A. Zeeb 
55749ed6e97SBjoern A. Zeeb static inline void
55849ed6e97SBjoern A. Zeeb __skb_queue_before(struct sk_buff_head *q, struct sk_buff *skb,
55949ed6e97SBjoern A. Zeeb     struct sk_buff *new)
56049ed6e97SBjoern A. Zeeb {
56149ed6e97SBjoern A. Zeeb 
56249ed6e97SBjoern A. Zeeb 	SKB_TRACE_FMT(q, "skb %p new %p", skb, new);
56349ed6e97SBjoern A. Zeeb 	__skb_insert(new, skb->prev, skb, q);
56449ed6e97SBjoern A. Zeeb }
56549ed6e97SBjoern A. Zeeb 
56649ed6e97SBjoern A. Zeeb static inline void
567b2dcb848SBjoern A. Zeeb __skb_queue_tail(struct sk_buff_head *q, struct sk_buff *new)
56849ed6e97SBjoern A. Zeeb {
56949ed6e97SBjoern A. Zeeb 
570b2dcb848SBjoern A. Zeeb 	SKB_TRACE2(q, new);
571d3befb53STom Coldrick 	__skb_queue_before(q, (struct sk_buff *)q, new);
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 {
577149c457dSBjoern A. Zeeb 	SKB_TRACE2(q, new);
578b2dcb848SBjoern A. Zeeb 	return (__skb_queue_tail(q, new));
57949ed6e97SBjoern A. Zeeb }
58049ed6e97SBjoern A. Zeeb 
58149ed6e97SBjoern A. Zeeb static inline struct sk_buff *
582ce9f3661SBjoern A. Zeeb skb_peek(struct sk_buff_head *q)
583ce9f3661SBjoern A. Zeeb {
584ce9f3661SBjoern A. Zeeb 	struct sk_buff *skb;
585ce9f3661SBjoern A. Zeeb 
586ce9f3661SBjoern A. Zeeb 	skb = q->next;
587ce9f3661SBjoern A. Zeeb 	SKB_TRACE2(q, skb);
588ce9f3661SBjoern A. Zeeb 	if (skb == (struct sk_buff *)q)
589ce9f3661SBjoern A. Zeeb 		return (NULL);
590ce9f3661SBjoern A. Zeeb 	return (skb);
591ce9f3661SBjoern A. Zeeb }
592ce9f3661SBjoern A. Zeeb 
593ce9f3661SBjoern A. Zeeb static inline struct sk_buff *
59449ed6e97SBjoern A. Zeeb skb_peek_tail(struct sk_buff_head *q)
59549ed6e97SBjoern A. Zeeb {
59649ed6e97SBjoern A. Zeeb 	struct sk_buff *skb;
59749ed6e97SBjoern A. Zeeb 
59849ed6e97SBjoern A. Zeeb 	skb = q->prev;
59949ed6e97SBjoern A. Zeeb 	SKB_TRACE2(q, skb);
60049ed6e97SBjoern A. Zeeb 	if (skb == (struct sk_buff *)q)
60149ed6e97SBjoern A. Zeeb 		return (NULL);
60249ed6e97SBjoern A. Zeeb 	return (skb);
60349ed6e97SBjoern A. Zeeb }
60449ed6e97SBjoern A. Zeeb 
60549ed6e97SBjoern A. Zeeb static inline void
60649ed6e97SBjoern A. Zeeb __skb_unlink(struct sk_buff *skb, struct sk_buff_head *head)
60749ed6e97SBjoern A. Zeeb {
60849ed6e97SBjoern A. Zeeb 	SKB_TRACE2(skb, head);
60949ed6e97SBjoern A. Zeeb 	struct sk_buff *p, *n;;
61049ed6e97SBjoern A. Zeeb 
61149ed6e97SBjoern A. Zeeb 	head->qlen--;
61249ed6e97SBjoern A. Zeeb 	p = skb->prev;
61349ed6e97SBjoern A. Zeeb 	n = skb->next;
61449ed6e97SBjoern A. Zeeb 	p->next = n;
61549ed6e97SBjoern A. Zeeb 	n->prev = p;
61649ed6e97SBjoern A. Zeeb 	skb->prev = skb->next = NULL;
61749ed6e97SBjoern A. Zeeb }
61849ed6e97SBjoern A. Zeeb 
61949ed6e97SBjoern A. Zeeb static inline void
62049ed6e97SBjoern A. Zeeb skb_unlink(struct sk_buff *skb, struct sk_buff_head *head)
62149ed6e97SBjoern A. Zeeb {
62249ed6e97SBjoern A. Zeeb 	SKB_TRACE2(skb, head);
62349ed6e97SBjoern A. Zeeb 	return (__skb_unlink(skb, head));
62449ed6e97SBjoern A. Zeeb }
62549ed6e97SBjoern A. Zeeb 
62649ed6e97SBjoern A. Zeeb static inline struct sk_buff *
62749ed6e97SBjoern A. Zeeb __skb_dequeue(struct sk_buff_head *q)
62849ed6e97SBjoern A. Zeeb {
62949ed6e97SBjoern A. Zeeb 	struct sk_buff *skb;
63049ed6e97SBjoern A. Zeeb 
63149ed6e97SBjoern A. Zeeb 	SKB_TRACE(q);
63249ed6e97SBjoern A. Zeeb 	skb = q->next;
63349ed6e97SBjoern A. Zeeb 	if (skb == (struct sk_buff *)q)
63449ed6e97SBjoern A. Zeeb 		return (NULL);
63549ed6e97SBjoern A. Zeeb 	if (skb != NULL)
63649ed6e97SBjoern A. Zeeb 		__skb_unlink(skb, q);
63749ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
63849ed6e97SBjoern A. Zeeb 	return (skb);
63949ed6e97SBjoern A. Zeeb }
64049ed6e97SBjoern A. Zeeb 
64149ed6e97SBjoern A. Zeeb static inline struct sk_buff *
64249ed6e97SBjoern A. Zeeb skb_dequeue(struct sk_buff_head *q)
64349ed6e97SBjoern A. Zeeb {
64449ed6e97SBjoern A. Zeeb 	SKB_TRACE(q);
64549ed6e97SBjoern A. Zeeb 	return (__skb_dequeue(q));
64649ed6e97SBjoern A. Zeeb }
64749ed6e97SBjoern A. Zeeb 
64849ed6e97SBjoern A. Zeeb static inline struct sk_buff *
64949ed6e97SBjoern A. Zeeb skb_dequeue_tail(struct sk_buff_head *q)
65049ed6e97SBjoern A. Zeeb {
65149ed6e97SBjoern A. Zeeb 	struct sk_buff *skb;
65249ed6e97SBjoern A. Zeeb 
65349ed6e97SBjoern A. Zeeb 	skb = skb_peek_tail(q);
65449ed6e97SBjoern A. Zeeb 	if (skb != NULL)
65549ed6e97SBjoern A. Zeeb 		__skb_unlink(skb, q);
65649ed6e97SBjoern A. Zeeb 
65749ed6e97SBjoern A. Zeeb 	SKB_TRACE2(q, skb);
65849ed6e97SBjoern A. Zeeb 	return (skb);
65949ed6e97SBjoern A. Zeeb }
66049ed6e97SBjoern A. Zeeb 
66149ed6e97SBjoern A. Zeeb static inline void
6626baea331SBjoern A. Zeeb __skb_queue_head(struct sk_buff_head *q, struct sk_buff *skb)
6636baea331SBjoern A. Zeeb {
6646baea331SBjoern A. Zeeb 
6656baea331SBjoern A. Zeeb 	SKB_TRACE2(q, skb);
6666baea331SBjoern A. Zeeb 	__skb_queue_after(q, (struct sk_buff *)q, skb);
6676baea331SBjoern A. Zeeb }
6686baea331SBjoern A. Zeeb 
6696baea331SBjoern A. Zeeb static inline void
67049ed6e97SBjoern A. Zeeb skb_queue_head(struct sk_buff_head *q, struct sk_buff *skb)
67149ed6e97SBjoern A. Zeeb {
67249ed6e97SBjoern A. Zeeb 
67349ed6e97SBjoern A. Zeeb 	SKB_TRACE2(q, skb);
67449ed6e97SBjoern A. Zeeb 	__skb_queue_after(q, (struct sk_buff *)q, skb);
67549ed6e97SBjoern A. Zeeb }
67649ed6e97SBjoern A. Zeeb 
67749ed6e97SBjoern A. Zeeb static inline uint32_t
67849ed6e97SBjoern A. Zeeb skb_queue_len(struct sk_buff_head *head)
67949ed6e97SBjoern A. Zeeb {
6806baea331SBjoern A. Zeeb 
68149ed6e97SBjoern A. Zeeb 	SKB_TRACE(head);
68249ed6e97SBjoern A. Zeeb 	return (head->qlen);
68349ed6e97SBjoern A. Zeeb }
68449ed6e97SBjoern A. Zeeb 
6856baea331SBjoern A. Zeeb static inline uint32_t
6866baea331SBjoern A. Zeeb skb_queue_len_lockless(const struct sk_buff_head *head)
6876baea331SBjoern A. Zeeb {
6886baea331SBjoern A. Zeeb 
6896baea331SBjoern A. Zeeb 	SKB_TRACE(head);
6906baea331SBjoern A. Zeeb 	return (READ_ONCE(head->qlen));
6916baea331SBjoern A. Zeeb }
6926baea331SBjoern A. Zeeb 
69349ed6e97SBjoern A. Zeeb static inline void
69449ed6e97SBjoern A. Zeeb __skb_queue_purge(struct sk_buff_head *q)
69549ed6e97SBjoern A. Zeeb {
69649ed6e97SBjoern A. Zeeb 	struct sk_buff *skb;
69749ed6e97SBjoern A. Zeeb 
69849ed6e97SBjoern A. Zeeb 	SKB_TRACE(q);
69949ed6e97SBjoern A. Zeeb         while ((skb = __skb_dequeue(q)) != NULL)
70049ed6e97SBjoern A. Zeeb 		kfree_skb(skb);
70149ed6e97SBjoern A. Zeeb }
70249ed6e97SBjoern A. Zeeb 
70349ed6e97SBjoern A. Zeeb static inline void
70449ed6e97SBjoern A. Zeeb skb_queue_purge(struct sk_buff_head *q)
70549ed6e97SBjoern A. Zeeb {
70649ed6e97SBjoern A. Zeeb 	SKB_TRACE(q);
70749ed6e97SBjoern A. Zeeb 	return (__skb_queue_purge(q));
70849ed6e97SBjoern A. Zeeb }
70949ed6e97SBjoern A. Zeeb 
71049ed6e97SBjoern A. Zeeb static inline struct sk_buff *
71149ed6e97SBjoern A. Zeeb skb_queue_prev(struct sk_buff_head *q, struct sk_buff *skb)
71249ed6e97SBjoern A. Zeeb {
71349ed6e97SBjoern A. Zeeb 
71449ed6e97SBjoern A. Zeeb 	SKB_TRACE2(q, skb);
71549ed6e97SBjoern A. Zeeb 	/* XXX what is the q argument good for? */
71649ed6e97SBjoern A. Zeeb 	return (skb->prev);
71749ed6e97SBjoern A. Zeeb }
71849ed6e97SBjoern A. Zeeb 
71949ed6e97SBjoern A. Zeeb /* -------------------------------------------------------------------------- */
72049ed6e97SBjoern A. Zeeb 
72149ed6e97SBjoern A. Zeeb static inline struct sk_buff *
72249ed6e97SBjoern A. Zeeb skb_copy(struct sk_buff *skb, gfp_t gfp)
72349ed6e97SBjoern A. Zeeb {
724349b042bSBjoern A. Zeeb 	struct sk_buff *new;
725349b042bSBjoern A. Zeeb 
726349b042bSBjoern A. Zeeb 	new = linuxkpi_skb_copy(skb, gfp);
727349b042bSBjoern A. Zeeb 	SKB_TRACE2(skb, new);
728349b042bSBjoern A. Zeeb 	return (new);
72949ed6e97SBjoern A. Zeeb }
73049ed6e97SBjoern A. Zeeb 
73149ed6e97SBjoern A. Zeeb static inline void
73249ed6e97SBjoern A. Zeeb consume_skb(struct sk_buff *skb)
73349ed6e97SBjoern A. Zeeb {
73449ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
73549ed6e97SBjoern A. Zeeb 	SKB_TODO();
73649ed6e97SBjoern A. Zeeb }
73749ed6e97SBjoern A. Zeeb 
73849ed6e97SBjoern A. Zeeb static inline uint16_t
73949ed6e97SBjoern A. Zeeb skb_checksum(struct sk_buff *skb, int offs, size_t len, int x)
74049ed6e97SBjoern A. Zeeb {
74149ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
74249ed6e97SBjoern A. Zeeb 	SKB_TODO();
74349ed6e97SBjoern A. Zeeb 	return (0xffff);
74449ed6e97SBjoern A. Zeeb }
74549ed6e97SBjoern A. Zeeb 
74649ed6e97SBjoern A. Zeeb static inline int
74749ed6e97SBjoern A. Zeeb skb_checksum_start_offset(struct sk_buff *skb)
74849ed6e97SBjoern A. Zeeb {
74949ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
75049ed6e97SBjoern A. Zeeb 	SKB_TODO();
75149ed6e97SBjoern A. Zeeb 	return (-1);
75249ed6e97SBjoern A. Zeeb }
75349ed6e97SBjoern A. Zeeb 
75449ed6e97SBjoern A. Zeeb static inline dma_addr_t
75549ed6e97SBjoern A. Zeeb skb_frag_dma_map(struct device *dev, const skb_frag_t *frag, int x,
75649ed6e97SBjoern A. Zeeb     size_t fragsz, enum dma_data_direction dir)
75749ed6e97SBjoern A. Zeeb {
75849ed6e97SBjoern A. Zeeb 	SKB_TRACE2(frag, dev);
75949ed6e97SBjoern A. Zeeb 	SKB_TODO();
76049ed6e97SBjoern A. Zeeb 	return (-1);
76149ed6e97SBjoern A. Zeeb }
76249ed6e97SBjoern A. Zeeb 
76349ed6e97SBjoern A. Zeeb static inline size_t
76449ed6e97SBjoern A. Zeeb skb_frag_size(const skb_frag_t *frag)
76549ed6e97SBjoern A. Zeeb {
76649ed6e97SBjoern A. Zeeb 	SKB_TRACE(frag);
76749ed6e97SBjoern A. Zeeb 	SKB_TODO();
76849ed6e97SBjoern A. Zeeb 	return (-1);
76949ed6e97SBjoern A. Zeeb }
77049ed6e97SBjoern A. Zeeb 
77149ed6e97SBjoern A. Zeeb #define	skb_walk_frags(_skb, _frag)					\
77249ed6e97SBjoern A. Zeeb 	for ((_frag) = (_skb); false; (_frag)++)
77349ed6e97SBjoern A. Zeeb 
77449ed6e97SBjoern A. Zeeb static inline void
77549ed6e97SBjoern A. Zeeb skb_checksum_help(struct sk_buff *skb)
77649ed6e97SBjoern A. Zeeb {
77749ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
77849ed6e97SBjoern A. Zeeb 	SKB_TODO();
77949ed6e97SBjoern A. Zeeb }
78049ed6e97SBjoern A. Zeeb 
78149ed6e97SBjoern A. Zeeb static inline bool
78249ed6e97SBjoern A. Zeeb skb_ensure_writable(struct sk_buff *skb, size_t off)
78349ed6e97SBjoern A. Zeeb {
78449ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
78549ed6e97SBjoern A. Zeeb 	SKB_TODO();
78649ed6e97SBjoern A. Zeeb 	return (false);
78749ed6e97SBjoern A. Zeeb }
78849ed6e97SBjoern A. Zeeb 
78949ed6e97SBjoern A. Zeeb static inline void *
79049ed6e97SBjoern A. Zeeb skb_frag_address(const skb_frag_t *frag)
79149ed6e97SBjoern A. Zeeb {
79249ed6e97SBjoern A. Zeeb 	SKB_TRACE(frag);
79349ed6e97SBjoern A. Zeeb 	SKB_TODO();
79449ed6e97SBjoern A. Zeeb 	return (NULL);
79549ed6e97SBjoern A. Zeeb }
79649ed6e97SBjoern A. Zeeb 
79789c32dafSBjoern A. Zeeb static inline void
79889c32dafSBjoern A. Zeeb skb_free_frag(void *frag)
79989c32dafSBjoern A. Zeeb {
80089c32dafSBjoern A. Zeeb 
801dbbf46ebSBjoern A. Zeeb 	page_frag_free(frag);
80289c32dafSBjoern A. Zeeb }
80389c32dafSBjoern A. Zeeb 
80449ed6e97SBjoern A. Zeeb static inline struct sk_buff *
80549ed6e97SBjoern A. Zeeb skb_gso_segment(struct sk_buff *skb, netdev_features_t netdev_flags)
80649ed6e97SBjoern A. Zeeb {
80749ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
80849ed6e97SBjoern A. Zeeb 	SKB_TODO();
80949ed6e97SBjoern A. Zeeb 	return (NULL);
81049ed6e97SBjoern A. Zeeb }
81149ed6e97SBjoern A. Zeeb 
81249ed6e97SBjoern A. Zeeb static inline bool
81349ed6e97SBjoern A. Zeeb skb_is_gso(struct sk_buff *skb)
81449ed6e97SBjoern A. Zeeb {
81549ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
816952643eaSBjoern A. Zeeb 	SKB_IMPROVE("Really a TODO but get it away from logging");
81749ed6e97SBjoern A. Zeeb 	return (false);
81849ed6e97SBjoern A. Zeeb }
81949ed6e97SBjoern A. Zeeb 
82049ed6e97SBjoern A. Zeeb static inline void
82149ed6e97SBjoern A. Zeeb skb_mark_not_on_list(struct sk_buff *skb)
82249ed6e97SBjoern A. Zeeb {
82349ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
82449ed6e97SBjoern A. Zeeb 	SKB_TODO();
82549ed6e97SBjoern A. Zeeb }
82649ed6e97SBjoern A. Zeeb 
82749ed6e97SBjoern A. Zeeb static inline void
828*3d3ec178SBjoern A. Zeeb ___skb_queue_splice(const struct sk_buff_head *from,
829b2dcb848SBjoern A. Zeeb     struct sk_buff *p, struct sk_buff *n)
830b2dcb848SBjoern A. Zeeb {
831b2dcb848SBjoern A. Zeeb 	struct sk_buff *b, *e;
832b2dcb848SBjoern A. Zeeb 
833b2dcb848SBjoern A. Zeeb 	b = from->next;
834b2dcb848SBjoern A. Zeeb 	e = from->prev;
835b2dcb848SBjoern A. Zeeb 
836b2dcb848SBjoern A. Zeeb 	b->prev = p;
837b2dcb848SBjoern A. Zeeb 	((struct sk_buff_head_l *)p)->next = b;
838b2dcb848SBjoern A. Zeeb 	e->next = n;
839b2dcb848SBjoern A. Zeeb 	((struct sk_buff_head_l *)n)->prev = e;
840b2dcb848SBjoern A. Zeeb }
841b2dcb848SBjoern A. Zeeb 
842b2dcb848SBjoern A. Zeeb static inline void
8436a8973c3SBjoern A. Zeeb skb_queue_splice_init(struct sk_buff_head *from, struct sk_buff_head *to)
84449ed6e97SBjoern A. Zeeb {
8456baea331SBjoern A. Zeeb 
8466a8973c3SBjoern A. Zeeb 	SKB_TRACE2(from, to);
8476baea331SBjoern A. Zeeb 
8486a8973c3SBjoern A. Zeeb 	if (skb_queue_empty(from))
8496baea331SBjoern A. Zeeb 		return;
8506baea331SBjoern A. Zeeb 
851*3d3ec178SBjoern A. Zeeb 	___skb_queue_splice(from, (struct sk_buff *)to, to->next);
852*3d3ec178SBjoern A. Zeeb 	to->qlen += from->qlen;
853*3d3ec178SBjoern A. Zeeb 	__skb_queue_head_init(from);
854*3d3ec178SBjoern A. Zeeb }
855*3d3ec178SBjoern A. Zeeb 
856*3d3ec178SBjoern A. Zeeb static inline void
857*3d3ec178SBjoern A. Zeeb skb_queue_splice_tail_init(struct sk_buff_head *from, struct sk_buff_head *to)
858*3d3ec178SBjoern A. Zeeb {
859*3d3ec178SBjoern A. Zeeb 
860*3d3ec178SBjoern A. Zeeb 	SKB_TRACE2(from, to);
861*3d3ec178SBjoern A. Zeeb 
862*3d3ec178SBjoern A. Zeeb 	if (skb_queue_empty(from))
863*3d3ec178SBjoern A. Zeeb 		return;
864*3d3ec178SBjoern A. Zeeb 
865*3d3ec178SBjoern A. Zeeb 	___skb_queue_splice(from, to->prev, (struct sk_buff *)to);
8666a8973c3SBjoern A. Zeeb 	to->qlen += from->qlen;
8676a8973c3SBjoern A. Zeeb 	__skb_queue_head_init(from);
86849ed6e97SBjoern A. Zeeb }
86949ed6e97SBjoern A. Zeeb 
87049ed6e97SBjoern A. Zeeb static inline void
87149ed6e97SBjoern A. Zeeb skb_reset_transport_header(struct sk_buff *skb)
87249ed6e97SBjoern A. Zeeb {
87349ed6e97SBjoern A. Zeeb 
87449ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
87549ed6e97SBjoern A. Zeeb 	skb->l4hdroff = skb->data - skb->head;
87649ed6e97SBjoern A. Zeeb }
87749ed6e97SBjoern A. Zeeb 
87849ed6e97SBjoern A. Zeeb static inline uint8_t *
87949ed6e97SBjoern A. Zeeb skb_transport_header(struct sk_buff *skb)
88049ed6e97SBjoern A. Zeeb {
88149ed6e97SBjoern A. Zeeb 
88249ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
88349ed6e97SBjoern A. Zeeb         return (skb->head + skb->l4hdroff);
88449ed6e97SBjoern A. Zeeb }
88549ed6e97SBjoern A. Zeeb 
88649ed6e97SBjoern A. Zeeb static inline uint8_t *
88749ed6e97SBjoern A. Zeeb skb_network_header(struct sk_buff *skb)
88849ed6e97SBjoern A. Zeeb {
88949ed6e97SBjoern A. Zeeb 
89049ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
89149ed6e97SBjoern A. Zeeb         return (skb->head + skb->l3hdroff);
89249ed6e97SBjoern A. Zeeb }
89349ed6e97SBjoern A. Zeeb 
8945504bd59SBjoern A. Zeeb static inline bool
8955504bd59SBjoern A. Zeeb skb_is_nonlinear(struct sk_buff *skb)
8965504bd59SBjoern A. Zeeb {
8975504bd59SBjoern A. Zeeb 	SKB_TRACE(skb);
8985504bd59SBjoern A. Zeeb 	return ((skb->data_len > 0) ? true : false);
8995504bd59SBjoern A. Zeeb }
9005504bd59SBjoern A. Zeeb 
90149ed6e97SBjoern A. Zeeb static inline int
90249ed6e97SBjoern A. Zeeb __skb_linearize(struct sk_buff *skb)
90349ed6e97SBjoern A. Zeeb {
90449ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
90549ed6e97SBjoern A. Zeeb 	SKB_TODO();
90649ed6e97SBjoern A. Zeeb 	return (ENXIO);
90749ed6e97SBjoern A. Zeeb }
90849ed6e97SBjoern A. Zeeb 
9096baea331SBjoern A. Zeeb static inline int
9105504bd59SBjoern A. Zeeb skb_linearize(struct sk_buff *skb)
9115504bd59SBjoern A. Zeeb {
9125504bd59SBjoern A. Zeeb 
9135504bd59SBjoern A. Zeeb 	return (skb_is_nonlinear(skb) ? __skb_linearize(skb) : 0);
9145504bd59SBjoern A. Zeeb }
9155504bd59SBjoern A. Zeeb 
9165504bd59SBjoern A. Zeeb static inline int
91749ed6e97SBjoern A. Zeeb pskb_expand_head(struct sk_buff *skb, int x, int len, gfp_t gfp)
91849ed6e97SBjoern A. Zeeb {
91949ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
92049ed6e97SBjoern A. Zeeb 	SKB_TODO();
9216baea331SBjoern A. Zeeb 	return (-ENXIO);
92249ed6e97SBjoern A. Zeeb }
92349ed6e97SBjoern A. Zeeb 
92449ed6e97SBjoern A. Zeeb /* Not really seen this one but need it as symmetric accessor function. */
92549ed6e97SBjoern A. Zeeb static inline void
92649ed6e97SBjoern A. Zeeb skb_set_queue_mapping(struct sk_buff *skb, uint16_t qmap)
92749ed6e97SBjoern A. Zeeb {
92849ed6e97SBjoern A. Zeeb 
92949ed6e97SBjoern A. Zeeb 	SKB_TRACE_FMT(skb, "qmap %u", qmap);
93049ed6e97SBjoern A. Zeeb 	skb->qmap = qmap;
93149ed6e97SBjoern A. Zeeb }
93249ed6e97SBjoern A. Zeeb 
93349ed6e97SBjoern A. Zeeb static inline uint16_t
93449ed6e97SBjoern A. Zeeb skb_get_queue_mapping(struct sk_buff *skb)
93549ed6e97SBjoern A. Zeeb {
93649ed6e97SBjoern A. Zeeb 
93749ed6e97SBjoern A. Zeeb 	SKB_TRACE_FMT(skb, "qmap %u", skb->qmap);
93849ed6e97SBjoern A. Zeeb 	return (skb->qmap);
93949ed6e97SBjoern A. Zeeb }
94049ed6e97SBjoern A. Zeeb 
94149ed6e97SBjoern A. Zeeb static inline bool
94249ed6e97SBjoern A. Zeeb skb_header_cloned(struct sk_buff *skb)
94349ed6e97SBjoern A. Zeeb {
94449ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
94549ed6e97SBjoern A. Zeeb 	SKB_TODO();
94649ed6e97SBjoern A. Zeeb 	return (false);
94749ed6e97SBjoern A. Zeeb }
94849ed6e97SBjoern A. Zeeb 
94949ed6e97SBjoern A. Zeeb static inline uint8_t *
950262c5e81SBjoern A. Zeeb skb_mac_header(const struct sk_buff *skb)
951262c5e81SBjoern A. Zeeb {
952262c5e81SBjoern A. Zeeb 	SKB_TRACE(skb);
953262c5e81SBjoern A. Zeeb 	return (skb->head + skb->mac_header);
954262c5e81SBjoern A. Zeeb }
955f0e59b69SBjoern A. Zeeb 
956262c5e81SBjoern A. Zeeb static inline void
957262c5e81SBjoern A. Zeeb skb_reset_mac_header(struct sk_buff *skb)
958262c5e81SBjoern A. Zeeb {
959262c5e81SBjoern A. Zeeb 	SKB_TRACE(skb);
960262c5e81SBjoern A. Zeeb 	skb->mac_header = skb->data - skb->head;
961262c5e81SBjoern A. Zeeb }
962262c5e81SBjoern A. Zeeb 
963262c5e81SBjoern A. Zeeb static inline void
964262c5e81SBjoern A. Zeeb skb_set_mac_header(struct sk_buff *skb, const size_t len)
965262c5e81SBjoern A. Zeeb {
966262c5e81SBjoern A. Zeeb 	SKB_TRACE(skb);
967262c5e81SBjoern A. Zeeb 	skb_reset_mac_header(skb);
968262c5e81SBjoern A. Zeeb 	skb->mac_header += len;
969262c5e81SBjoern A. Zeeb }
970262c5e81SBjoern A. Zeeb 
971262c5e81SBjoern A. Zeeb static inline struct skb_shared_hwtstamps *
972262c5e81SBjoern A. Zeeb skb_hwtstamps(struct sk_buff *skb)
97349ed6e97SBjoern A. Zeeb {
97449ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
97549ed6e97SBjoern A. Zeeb 	SKB_TODO();
97649ed6e97SBjoern A. Zeeb 	return (NULL);
97749ed6e97SBjoern A. Zeeb }
97849ed6e97SBjoern A. Zeeb 
97949ed6e97SBjoern A. Zeeb static inline void
98049ed6e97SBjoern A. Zeeb skb_orphan(struct sk_buff *skb)
98149ed6e97SBjoern A. Zeeb {
98249ed6e97SBjoern A. Zeeb 	SKB_TRACE(skb);
98349ed6e97SBjoern A. Zeeb 	SKB_TODO();
98449ed6e97SBjoern A. Zeeb }
98549ed6e97SBjoern A. Zeeb 
98649ed6e97SBjoern A. Zeeb static inline __sum16
98749ed6e97SBjoern A. Zeeb csum_unfold(__sum16 sum)
98849ed6e97SBjoern A. Zeeb {
98949ed6e97SBjoern A. Zeeb 	SKB_TODO();
99049ed6e97SBjoern A. Zeeb 	return (sum);
99149ed6e97SBjoern A. Zeeb }
99249ed6e97SBjoern A. Zeeb 
993a3e07b6eSBjoern A. Zeeb static __inline void
994a3e07b6eSBjoern A. Zeeb skb_postpush_rcsum(struct sk_buff *skb, const void *data, size_t len)
995a3e07b6eSBjoern A. Zeeb {
996a3e07b6eSBjoern A. Zeeb 	SKB_TODO();
997a3e07b6eSBjoern A. Zeeb }
998a3e07b6eSBjoern A. Zeeb 
9996baea331SBjoern A. Zeeb static inline void
10006baea331SBjoern A. Zeeb skb_reset_tail_pointer(struct sk_buff *skb)
10016baea331SBjoern A. Zeeb {
10026baea331SBjoern A. Zeeb 
10036baea331SBjoern A. Zeeb 	SKB_TRACE(skb);
10045504bd59SBjoern A. Zeeb #ifdef SKB_DOING_OFFSETS_US_NOT
10056baea331SBjoern A. Zeeb 	skb->tail = (uint8_t *)(uintptr_t)(skb->data - skb->head);
10065504bd59SBjoern A. Zeeb #endif
10075504bd59SBjoern A. Zeeb 	skb->tail = skb->data;
10086baea331SBjoern A. Zeeb 	SKB_TRACE(skb);
10096baea331SBjoern A. Zeeb }
10106baea331SBjoern A. Zeeb 
10116baea331SBjoern A. Zeeb static inline struct sk_buff *
10126baea331SBjoern A. Zeeb skb_get(struct sk_buff *skb)
10136baea331SBjoern A. Zeeb {
10146baea331SBjoern A. Zeeb 
10156baea331SBjoern A. Zeeb 	SKB_TODO();	/* XXX refcnt? as in get/put_device? */
10166baea331SBjoern A. Zeeb 	return (skb);
10176baea331SBjoern A. Zeeb }
10186baea331SBjoern A. Zeeb 
10196baea331SBjoern A. Zeeb static inline struct sk_buff *
10206baea331SBjoern A. Zeeb skb_realloc_headroom(struct sk_buff *skb, unsigned int headroom)
10216baea331SBjoern A. Zeeb {
10226baea331SBjoern A. Zeeb 
10236baea331SBjoern A. Zeeb 	SKB_TODO();
10246baea331SBjoern A. Zeeb 	return (NULL);
10256baea331SBjoern A. Zeeb }
10266baea331SBjoern A. Zeeb 
10276baea331SBjoern A. Zeeb static inline void
10286baea331SBjoern A. Zeeb skb_copy_from_linear_data(const struct sk_buff *skb, void *dst, size_t len)
10296baea331SBjoern A. Zeeb {
10306baea331SBjoern A. Zeeb 
10316baea331SBjoern A. Zeeb 	SKB_TRACE(skb);
10326baea331SBjoern A. Zeeb 	/* Let us just hope the destination has len space ... */
10336baea331SBjoern A. Zeeb 	memcpy(dst, skb->data, len);
10346baea331SBjoern A. Zeeb }
10356baea331SBjoern A. Zeeb 
103689c32dafSBjoern A. Zeeb static inline int
103789c32dafSBjoern A. Zeeb skb_pad(struct sk_buff *skb, int pad)
103889c32dafSBjoern A. Zeeb {
103989c32dafSBjoern A. Zeeb 
104089c32dafSBjoern A. Zeeb 	SKB_TRACE(skb);
104189c32dafSBjoern A. Zeeb 	SKB_TODO();
104289c32dafSBjoern A. Zeeb 	return (-1);
104389c32dafSBjoern A. Zeeb }
104489c32dafSBjoern A. Zeeb 
104589c32dafSBjoern A. Zeeb static inline void
104689c32dafSBjoern A. Zeeb skb_list_del_init(struct sk_buff *skb)
104789c32dafSBjoern A. Zeeb {
104889c32dafSBjoern A. Zeeb 
104989c32dafSBjoern A. Zeeb 	SKB_TRACE(skb);
105089c32dafSBjoern A. Zeeb 	SKB_TODO();
105189c32dafSBjoern A. Zeeb }
105289c32dafSBjoern A. Zeeb 
105389c32dafSBjoern A. Zeeb static inline void
105489c32dafSBjoern A. Zeeb napi_consume_skb(struct sk_buff *skb, int budget)
105589c32dafSBjoern A. Zeeb {
105689c32dafSBjoern A. Zeeb 
105789c32dafSBjoern A. Zeeb 	SKB_TRACE(skb);
105889c32dafSBjoern A. Zeeb 	SKB_TODO();
105989c32dafSBjoern A. Zeeb }
106089c32dafSBjoern A. Zeeb 
10611213a6beSBjoern A. Zeeb static inline struct sk_buff *
10621213a6beSBjoern A. Zeeb napi_build_skb(void *data, size_t len)
10631213a6beSBjoern A. Zeeb {
10641213a6beSBjoern A. Zeeb 
10651213a6beSBjoern A. Zeeb 	SKB_TODO();
10661213a6beSBjoern A. Zeeb 	return (NULL);
10671213a6beSBjoern A. Zeeb }
10681213a6beSBjoern A. Zeeb 
1069369264acSBjoern A. Zeeb static inline uint32_t
1070369264acSBjoern A. Zeeb skb_get_hash(struct sk_buff *skb)
1071369264acSBjoern A. Zeeb {
1072369264acSBjoern A. Zeeb 	SKB_TRACE(skb);
1073369264acSBjoern A. Zeeb 	SKB_TODO();
1074369264acSBjoern A. Zeeb 	return (0);
1075369264acSBjoern A. Zeeb }
1076369264acSBjoern A. Zeeb 
10771213a6beSBjoern A. Zeeb static inline void
10781213a6beSBjoern A. Zeeb skb_mark_for_recycle(struct sk_buff *skb)
10791213a6beSBjoern A. Zeeb {
10801213a6beSBjoern A. Zeeb 	SKB_TRACE(skb);
10811213a6beSBjoern A. Zeeb 	SKB_TODO();
10821213a6beSBjoern A. Zeeb }
10831213a6beSBjoern A. Zeeb 
1084e039b38dSBjoern A. Zeeb static inline int
1085e039b38dSBjoern A. Zeeb skb_cow_head(struct sk_buff *skb, unsigned int headroom)
1086e039b38dSBjoern A. Zeeb {
1087e039b38dSBjoern A. Zeeb 	SKB_TRACE(skb);
1088e039b38dSBjoern A. Zeeb 	SKB_TODO();
1089e039b38dSBjoern A. Zeeb 	return (-1);
1090e039b38dSBjoern A. Zeeb }
1091e039b38dSBjoern A. Zeeb 
109289c32dafSBjoern A. Zeeb #define	SKB_WITH_OVERHEAD(_s)						\
109389c32dafSBjoern A. Zeeb 	(_s) - ALIGN(sizeof(struct skb_shared_info), CACHE_LINE_SIZE)
109489c32dafSBjoern A. Zeeb 
109549ed6e97SBjoern A. Zeeb #endif	/* _LINUXKPI_LINUX_SKBUFF_H */
1096