skb_data_move(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

πŸ’… skb_data_move(9) β€” like, the Kernel API Manual one, bestie

okay so real talk, this page is from the Kernel API Manual, and it's a little helper that does the "move my stuff" chore after you've already shoved data onto the front of a packet or yanked it off. and yes, it lives up in ./include/linux/skbuff.h land, iykyk πŸ¦‹

✨ NAME ✨

skb_data_move β€” moves the packet data and the metadata after a skb_push() or a skb_pull(). that's the whole vibe. πŸŽ€

✨ SYNOPSIS ✨

void skb_data_move (struct sk_buff *skb , const int len , const unsigned int n );

✨ ARGUMENTS ✨

  • skb β€” the packet you're operating on, the main character of this whole thing πŸ‘‘
  • len β€” how many bytes got pushed or pulled from sk_buff->data
  • n β€” how many bytes to memmove from the pre-push/pull sk_buff->data

🌸 DESCRIPTION 🌸

It moves n bytes of packet data β€” and yes, n is allowed to be zero, no drama β€” plus all the bytes of skb metadata. ngl, it's giving "I'll carry the bags and the vibes". 🫢

now the fine print, and this part matters:

It assumes the metadata is sitting immediately before sk_buff->data as it was prior to the push/pull, and it also assumes there's enough headroom to hold that metadata after an skb_push.

if those assumptions don't hold, bestie, the metadata gets cleared and you get a one-time warning. 😭 so like… pls make sure the setup is right.

and the sweetest advice on the whole page: prefer skb_postpull_data_move or skb_postpush_data_move over calling this helper directly. those are the iconic wrappers, this one is the lowkey backstage one. πŸ’…


🌈 SEE ALSO 🌈

Kernel file ./include/linux/skbuff.h and honestly… the entire extended universe. buckle up, this list is long and it ate:

skb checksums(9), skb_frag_size(9), skb_frag_size_set(9), skb_frag_size_add(9), skb_frag_size_sub(9), skb_frag_must_loop(9), skb_frag_foreach_page(9), struct skb_shared_hwtstamps(9), dataref and headerless skbs(9), Basic sk_buff geometry(9), struct sk_buff(9), skb_pfmemalloc(9), skb_dst(9), skb_dstref_steal(9), skb_dstref_restore(9), skb_dst_set(9), skb_dst_set_noref(9), skb_dst_is_noref(9), skb_napi_id(9), skb_unref(9), kfree_skb(9), alloc_skb(9), skb_fclone_busy(9), alloc_skb_fclone(9), skb_pad(9), skb_queue_empty(9), skb_queue_empty_lockless(9), skb_queue_is_last(9), skb_queue_is_first(9), skb_queue_next(9), skb_queue_prev(9), skb_get(9), skb_cloned(9), skb_header_cloned(9), __skb_header_release(9), skb_shared(9), skb_share_check(9), skb_unshare(9), skb_peek(9), __skb_peek(9), skb_peek_next(9), skb_peek_tail(9), skb_queue_len(9), skb_queue_len_lockless(9), __skb_queue_head_init(9), skb_queue_splice(9), skb_queue_splice_init(9), skb_queue_splice_tail(9), skb_queue_splice_tail_init(9), __skb_queue_after(9), __skb_queue_head(9), __skb_queue_tail(9), __skb_dequeue(9), __skb_dequeue_tail(9), skb_len_add(9), __skb_fill_netmem_desc(9), skb_fill_page_desc(9), skb_fill_page_desc_noacc(9), skb_headroom(9), skb_tailroom(9), skb_availroom(9), skb_reserve(9), skb_tailroom_reserve(9), skb_reset_transport_header_careful(9), skb_set_transport_header_careful(9), pskb_trim_unique(9), skb_orphan(9), skb_orphan_frags(9), __skb_queue_purge_reason(9), netdev_alloc_frag(9), netdev_alloc_skb(9), __dev_alloc_pages(9), __dev_alloc_page(9), dev_page_is_reusable(9), skb_propagate_pfmemalloc(9), skb_frag_off(9), skb_frag_off_add(9), skb_frag_off_set(9), skb_frag_off_copy(9), skb_frag_net_iov(9), skb_frag_page(9), skb_frag_netmem(9), skb_frag_address(9), skb_frag_address_safe(9), skb_frag_phys(9), skb_frag_page_copy(9), __skb_frag_dma_map(9), skb_clone_writable(9), skb_cow(9), skb_cow_head(9), skb_padto(9), __skb_put_padto(9), skb_put_padto(9), skb_linearize(9), skb_has_shared_frag(9), skb_linearize_cow(9), skb_postpull_rcsum(9), skb_postpush_rcsum(9), skb_push_rcsum(9), pskb_trim_rcsum(9), skb_needs_linearize(9), skb_get_timestamp(9), skb_postpull_data_move(9), skb_postpush_data_move(9), skb_complete_tx_timestamp(9), skb_tstamp_tx(9), skb_tx_timestamp(9), skb_complete_wifi_ack(9), skb_checksum_complete(9), struct skb_ext(9), skb_checksum_none_assert(9), skb_head_is_locked(9)


okay that's the whole page, go be a networking icon 🌟 and remember: this came out of ./include/linux, dated October 2026 β€” so like, future-core of the kernel docs, periodt. πŸ’œπŸŽ€

πŸ“¦ where this page comes from