pskb_expand_head(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

πŸ’– pskb_expand_head β€” like, the Kernel API Manual page for it πŸŽ€

okay bestie, welcome to the pskb_expand_head(9) glow-up πŸ’… this is the kernel API manual and we're gonna get you so comfy with it. no cap, it's giving "tiny function, huge consequences." ✨


✨ NAME ✨

pskb_expand_head β€” reallocate header of &sk_buff πŸ¦‹

like, literally, it reallocates the header of a &sk_buff. that's the whole vibe. 🫢


🌸 SYNOPSIS 🌸

int pskb_expand_head (struct sk_buff *skb , int nhead , int ntail ,
gfp_t gfp_mask );

πŸ’œ ARGUMENTS πŸ’œ

  • skb β€” the buffer you're reallocating, bestie. that's the one.
  • nhead β€” how much room to add at head πŸ“
  • ntail β€” how much room to add at tail πŸ“
  • gfp_mask β€” the allocation priority, i.e. how hard you're allowed to try to get that memory πŸ‘‘

πŸ”₯ DESCRIPTION πŸ”₯

so what it does: it expands the header of skb β€” or, if nhead and ntail are both zero, it just creates an identical copy. either way, the header situation gets reallocated. πŸ’«

sk_buff itself is not changed. important. main character rule incoming:

sk_buff MUST have reference count of 1. not 2, not 3, not "eh, probably 1." 1. πŸ™ˆ

it returns zero in the case of success or error, if expansion failed. 😭 and in that last case β€” if it failed β€” sk_buff is not changed. so nothing got wrecked, she just said no.

and here's the part everyone forgets, so write it on your hand: all the pointers pointing into the skb header may change and must be reloaded after the call to this function. every single one. don't be out here holding stale pointers, that's not the move. πŸ’€


⭐ NOTE ⭐

if you skb_push the start of the buffer after reallocating the header, call skb_postpush_data_move first to move the metadata out of the way before writing to sk_buff->data. 🧚 like, please. for me. πŸ₯Ί

seriously though β€” metadata first, then write. order matters and this is a whole warning for a reason. πŸ’…

🌈 SEE ALSO 🌈

okay this list is long bestie, buckle up, we're going through the whole friend group πŸŽ€ and the kernel file ./net/core/skbuff.c is the hangout spot:

drop_reasons_register_subsys(9), drop_reasons_unregister_subsys(9), skb_panic(9), napi_skb_cache_get_bulk(9), __build_skb(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), 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)

like I said. whole friend group. iykyk 🫢


and that's the page, bestie!! πŸŽ€ this lil gem lives in ./net/core and it's dated October 2026 β€” so yeah, future vibes, iconic behavior, periodt. πŸ’– go reload your pointers ✨

πŸ“¦ where this page comes from