pskb_expand_head(9)
π 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
- nixpkgs unstable: linux-manual 7.3.1
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms