skb_seq_read(9)
πΈ skb_seq_read (9) β Kernel API Manual, bestie edition πΈ
okay so picture this: you're in the <pink>Kernel API Manual</pink>, it's giving very much "I need to walk through an skb piece by piece" energy, and this lil function is literally your main character. let's get into it π
β¨ NAME β¨
skb_seq_read β read skb data sequentially, one block at a time, no cap π«Ά
β¨ SYNOPSIS β¨
unsigned int skb_seq_read (unsigned int consumed , const u8 **data ,
struct skb_seq_state *st );
β¨ ARGUMENTS β¨
consumedβ how many bytes you (the caller) have already eaten so far. yes it's a tracker. keep it honest πdataβ the destination pointer where the data to be returned gets dropped off. it's the delivery address, basically πstβ the state variable. the vibe holder. the memory of the whole operation β¨
β¨ DESCRIPTION β¨
So this function reads a block of skb data at consumed, measured relative to the lower offset that you specified to skb_prepare_seq_read. It assigns the head of the data block to data and returns the length of the block β or 0 if you've hit the end of the skb data or the upper offset has been reached. that 0 is your "we're done here, go home" signal π
Here's the cute part: the caller is not required to consume all of the data returned. like, consumed is typically set to the number of bytes already consumed, and the next call to skb_seq_read will hand you the remaining part of the block. so it's lowkey a "no pressure, take what you need, the rest will be here for you" situation π«Ά
Note 1: The size of each block of data returned can be arbitrary. that's not a bug, that's the price of admission β it's literally the cost for zerocopy sequential reads of potentially non linear data. iconic tradeoff, honestly π
Note 2: Fragment lists within fragments are not implemented at the moment. the manpage literally says state->root_skb could be replaced with a stack for this purpose. so like. future improvement noted, bestie π
β¨ SEE ALSO β¨
Related reading, aka the whole extended friend group of skbuff functions, all from the Kernel file ./net/core/skbuff.c:
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_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)
that's a whole friend group and you're invited to the group chat π§π
β¨ and that's the whole page, bestie β¨ this one ships out of ./net/core and the version stamp on it is October 2026 β so go forth, read your skb data sequentially, remember to keep consumed accurate, and 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