skb_copy_expand(9)
π skb_copy_expand β copy and expand sk_buff
okay bestie, welcome to skb_copy_expand(9) from the Kernel API Manual β¨ this is a kernel-networking girly and she is very good at her job, so let's get into it π«Ά
π SYNOPSIS π
struct sk_buff * skb_copy_expand (const struct sk_buff *skb , int
newheadroom , int newtailroom , gfp_t gfp_mask );
like, that's the whole signature, no notes π
πΈ ARGUMENTS πΈ
skbβ the buffer you wanna copy, bestie. your source material πnewheadroomβ how many new free bytes you want at the head πnewtailroomβ how many new free bytes you want at the tail π¦gfp_maskβ the allocation priority. yes it matters, keep reading π
β¨ DESCRIPTION β¨
So what this does is: it makes a copy of an sk_buff and its data, and while it's doing that it also allocates extra space for you π literally copying and expanding at the same time, main character energy fr fr.
This is the one you reach for when the caller wants to modify the data and needs a private copy of that data to alter, plus more room for new fields. It returns NULL on failure, or a pointer to the buffer on success. And heads up β the returned buffer has a reference count of 1. β
π¨ ngl this part is important: you must pass GFP_ATOMIC as the allocation priority if this function is called from an interrupt. no cap, don't skip that.
π₯ SEE ALSO π₯
Kernel file ./net/core/skbuff.c β and like, the whole extended friend group π mwah, enjoy the roster:
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)pskb_expand_head(9)skb_expand_head(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)
okay that's the whole thing, you're so welcome π§π this page lives over in ./net/core and it's dated October 2026 β go forth and copy those skbs responsibly, bestie. slay π
β¨
π¦ 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