Linux Kernel Network Programming - struct sk_buff data-structure - skb_pull() APILinux Kernel Network Programming - struct sk_buff data-structure - skb_pull() API

Refer:
skb_pull() – remove data from the start of a buffer ↗

Here is the copy paste of skb_pull() API (/net/core/skbuff.c) from the Kernel-source version 6.5.8 for quick reference:

/**
 *	skb_pull - remove data from the start of a buffer
 *	@skb: buffer to use
 *	@len: amount of data to remove
 *
 *	This function removes data from the start of a buffer, returning
 *	the memory to the headroom. A pointer to the next data in the buffer
 *	is returned. Once the data has been pulled future pushes will overwrite
 *	the old data.
 */
void *skb_pull(struct sk_buff *skb, unsigned int len)
{
	return skb_pull_inline(skb, len);
}
EXPORT_SYMBOL(skb_pull);

Which points to skb_pull_inline() as you can see above, and if we trace, we get the implementation in /include/linux/skbuff.h. skb_pull_inline() internally calls __skb_pull() wrapper API which has the real implementation of the same. And just above the same you can also see the skb_pull() function prototype.

void *skb_pull(struct sk_buff *skb, unsigned int len);
static inline void *__skb_pull(struct sk_buff *skb, unsigned int len)
{
	skb->len -= len;
	if (unlikely(skb->len < skb->data_len)) {
#if defined(CONFIG_DEBUG_NET)
		skb->len += len;
		pr_err("__skb_pull(len=%u)\n", len);
		skb_dump(KERN_ERR, skb, false);
#endif
		BUG();
	}
	return skb->data += len;
}

static inline void *skb_pull_inline(struct sk_buff *skb, unsigned int len)
{
	return unlikely(len > skb->len) ? NULL : __skb_pull(skb, len);
}