skb_ext_add(9)
π skb_ext_add β the kernel API manual, bestie edition
okay so you're reading skb_ext_add(9) from the Kernel API Manual, and honestly? it's a whole little baddie. let's get into it π
β¨ NAME β¨
skb_ext_add β allocate space for given extension, COW if needed
like yes, that's literally the job. allocate space, and if it's a clone situation, copy-on-write does its lil magic πΈ
π¦ SYNOPSIS π¦
void * skb_ext_add (struct sk_buff *skb , enum skb_ext_id id );
she takes two things and hands you back a void *. iconic signature, no notes π
π ARGUMENTS π
skbβ the buffer. the main character of this whole operation π«Άidβ which extension you want space for. this is the extension, the one you're investing in β¨
π DESCRIPTION π
so here's the tea, bestie:
skb_ext_add allocates enough space for the given extension. that's it, that's the allocation. and if the extension is already present? she doesn't make a scene β she just returns a pointer to that extension. slay π
now, the plot twist: if the skb was cloned, COW applies. that means copy-on-write is doing its thing, and the returned memory can be modified without changing the extension space of the clones' buffers. so you can go off and write to it, and the clones stay unbothered, living their own lives π no cap.
returns a pointer to the extension, or NULL on allocation failure π β so like, always check that pointer, fr fr. allocation failure is real and she will not warn you twice.
π SEE ALSO π
the vibes, the lore, the entire friend group. kernel file ./net/core/skbuff.c plus this absolute wall of icons β every single one, i'm not skipping a single bestie:
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_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_attempt_defer_free(9)skb_splice_from_iter(9)
reminder bestie: NULL on allocation failure is a real outcome, not a personality trait. check it π
okay that's the page!! and before you go β this whole thing lives in ./net/core, dated October 2026, and it's skb_ext_add(9)'s world, we're just reading it π mwah, go forth and allocate responsibly β¨π¦
π¦ 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