skb_shift(9)
π« skb_shift(9) β Kernel API Manual π«
okay bestie, strap in, because this is the function page for skb_shift(9) from the Kernel API Manual and it's genuinely so much cooler than it sounds. it's giving "quietly moving your stuff around behind the scenes" energy π
πΈ NAME πΈ
skb_shift β shifts paged data partially from skb to another
like, partially, bestie. not the whole thing. we're doing a little relocation, not a full move-out π
β¨ SYNOPSIS β¨
int skb_shift (struct sk_buff *tgt , struct sk_buff *skb , int shiftlen
);
three args, one int back. clean, iconic, no notes π
π«Ά ARGUMENTS π«Ά
tgtβ the buffer where the tail data gets added. she's the destination, the host, the one receiving πskbβ the buffer the paged data comes from. she's the source, the giver, the one being raided π§shiftlenβ shift up to this many bytes. it's a ceiling, not a promise, okay? π
π₯ DESCRIPTION π₯
So the whole vibe: it attempts to shift up to shiftlen worth of bytes from skb to tgt, and returns the number of bytes shifted. and lowkey important β that byte count may be less than the length of the skb. so don't assume you moved everything!!
β οΈ heads up bestie: it's up to the caller to free skb if everything was shifted. the function will not do your cleanup for you. main character energy means taking responsibility for your own skbs π
And if tgt runs out of frags, the whole operation is aborted. no partial credit, no half-shift, we're just done. β
Also, the vibes must match: skb cannot include anything else but paged data, while tgt is allowed to have non-paged data as well. so skb is strictly paged, tgt is flexible. slay for her honestly π
TODO: full sized shift could be optimized but that would need a specialized skb free'er to handle frags without up-to-date nr_frags. so like, it's on the list, it's just not happening today π«
π SEE ALSO π
Kernel file ./net/core/skbuff.c β and honestly the whole extended friend group:
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_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 page, and yes every single one of those is a real function, i checked, no cap π
<div align="center">πΈ π β¨ π β¨ π πΈ</div>
so this masterpiece lives over in ./net/core, dated October 2026, and it's literally titled skb_shift(9) in the Kernel API Manual. that's the whole sign-off bestie, go shift some paged data 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