__build_skb(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

πŸ’… __build_skb(9) β€” build a network buffer πŸ’…

okay bestie, you're in the Kernel API Manual and today's main character is __build_skb(9). It literally builds a network buffer, no cap. Let's get into it 🫢✨

🌸 NAME 🌸

__build_skb β€” build a network buffer πŸ’–

✨ SYNOPSIS ✨

struct sk_buff * __build_skb (void *data , unsigned int frag_size );

πŸŽ€ ARGUMENTS πŸŽ€

  • data β€” the data buffer provided by the caller, periodt.
  • frag_size β€” size of data (must not be 0) β€” yes, that part matters.

πŸ¦‹ DESCRIPTION πŸ¦‹

So this one allocates a new sk_buff, and you (the caller) provide the space that holds the head and skb_shared_info. The data you pass in must have been allocated from the page allocator or vmalloc β€” that's the vibe check it has to pass.

Also, lowkey important: a frag_size of 0 to indicate a kmalloc allocation is deprecated, and callers should use slab_build_skb instead. Don't do the old thing, bestie.

What you get back is the new skb buffer. On a failure, the return is NULL, and data is not freed β€” so don't assume it got cleaned up for you 😭.

πŸ”₯ NOTES πŸ”₯

The driver flow is giving very specific, so here's the tea:

  • Before IO, the driver allocates only the data buffer where the NIC puts the incoming frame.
  • The driver should add room at the head (NET_SKB_PAD) and MUST add room at the tail (SKB_DATA_ALIGN(skb_shared_info)).
  • After IO, the driver calls build_skb to allocate the sk_buff and populate it before giving the packet to the stack.
  • RX rings only contain data buffers, not full skbs. That's the whole point, iykyk πŸ’….

πŸ‘‘ SEE ALSO πŸ‘‘

Kernel file ./net/core/skbuff.c β€” and the whole extended skb fam in original order:

drop_reasons_register_subsys(9), drop_reasons_unregister_subsys(9), skb_panic(9), napi_skb_cache_get_bulk(9), build_skb_around(9), __napi_build_skb(9), napi_build_skb(9), __alloc_skb(9), __netdev_alloc_skb(9), napi_alloc_skb(9), skb_pp_cow_data(9), skb_pp_frag_ref(9), __kfree_skb(9), sk_skb_reason_drop(9), skb_tx_error(9), consume_skb(9), __consume_stateless_skb(9), napi_consume_skb(9), alloc_skb_for_msg(9), skb_morph(9), skb_copy_ubufs(9), skb_clone(9), skb_copy(9).

__pskb_copy_fclone(9), pskb_expand_head(9), skb_expand_head(9), skb_copy_expand(9), __skb_pad(9), pskb_put(9), skb_put(9), skb_push(9), skb_pull(9), skb_pull_data(9), skb_trim(9), __pskb_pull_tail(9), skb_copy_bits(9), skb_store_bits(9), skb_zerocopy(9), skb_dequeue(9), skb_dequeue_tail(9), skb_queue_purge_reason(9), skb_rbtree_purge(9), skb_queue_head(9), skb_queue_tail(9), skb_unlink(9), skb_append(9), skb_split(9), skb_shift(9).

skb_prepare_seq_read(9), skb_seq_read(9), skb_abort_seq_read(9), skb_copy_seq_read(9), skb_find_text(9), skb_pull_rcsum(9), skb_segment(9), skb_to_sgvec(9), skb_cow_data(9), skb_clone_sk(9), skb_partial_csum_set(9), skb_checksum_setup(9), skb_checksum_maybe_trim(9), skb_checksum_trimmed(9), skb_try_coalesce(9), skb_scrub_packet(9), skb_eth_pop(9), skb_eth_push(9), skb_mpls_push(9), skb_mpls_pop(9), skb_mpls_update_lse(9), skb_mpls_dec_ttl(9), alloc_skb_with_frags(9), skb_condense(9), __skb_ext_alloc(9), __skb_ext_set(9), skb_ext_add(9), skb_attempt_defer_free(9), skb_splice_from_iter(9).

xoxo from ./net/core πŸ’– β€” dated October 2026 βœ¨πŸ¦‹πŸŽ€

πŸ“¦ where this page comes from