idpf_rx_hsplit_wa(9)
π idpf_rx_hsplit_wa β handle header buffer overflows and split errors
okay so bestie, welcome to the kernel API manual (section 9) page for idpf_rx_hsplit_wa, and yes it's as niche as it sounds but we're gonna slay it together π«Ά
β¨ SYNOPSIS β¨
u32 idpf_rx_hsplit_wa (const struct libeth_fqe *hdr , struct libeth_fqe *buf , u32 data_len );
π ARGUMENTS π
hdrβ the Rx buffer that's holding the headers πbufβ the Rx buffer that's holding the payloaddata_lenβ how many bytes got received into the payload buffer
πΈ DESCRIPTION πΈ
So here's the vibe check: when a header buffer overflow happens, or the HW literally could not parse the packet type to do the header split, the whole frame ends up dumped into the payload buffer. Not ideal, but here we are π
And we can't build a valid skb around a payload buffer while the header split is active β because that buffer doesn't reserve any head- or tailroom. Zero. None. It's giving empty.
So in that case we copy either the whole frame (when it's short) or just the Ethernet header over to the header buffer, so we can actually build an skb, and then adjust the data offset in the payload buffer. IOW: we emulate the header split. Fake it till you make it, periodt π
π₯ RETURN π₯
The number of bytes copied to the header buffer. That's it, that's the whole return value π§
π SEE ALSO π
The kernel file this lives in, no cap:
./drivers/net/ethernet/intel/idpf/idpf_txrx.c
And now the iconic extended universe of siblings (they're all (9) pages, every single one, don't come for me):
idpf_chk_linearize(9)idpf_tx_timeout(9)idpf_tx_buf_rel_all(9)idpf_tx_desc_rel(9)idpf_compl_desc_rel(9)idpf_tx_desc_rel_all(9)idpf_tx_buf_alloc_all(9)idpf_tx_desc_alloc(9)idpf_compl_desc_alloc(9)idpf_tx_desc_alloc_all(9)idpf_rx_page_rel(9)idpf_rx_hdr_buf_rel_all(9)idpf_rx_buf_rel_bufq(9)idpf_rx_buf_rel_all(9)idpf_rx_desc_rel(9)idpf_rx_desc_rel_bufq(9)idpf_rx_desc_rel_all(9)idpf_rx_buf_hw_update(9)idpf_rx_hdr_buf_alloc_all(9)idpf_post_buf_refill(9)idpf_rx_post_buf_desc(9)idpf_rx_post_init_bufs(9)idpf_rx_buf_alloc_singleq(9)idpf_rx_bufs_init_singleq(9)idpf_rx_buf_alloc_all(9)idpf_rx_bufs_init(9)idpf_rx_bufs_init_all(9)idpf_rx_desc_alloc(9)idpf_bufq_desc_alloc(9)idpf_rx_desc_alloc_all(9)idpf_vector_to_queue_set(9)idpf_qp_switch(9)idpf_txq_group_rel(9)idpf_rxq_sw_queue_rel(9)idpf_rxq_group_rel(9)idpf_vport_queue_grp_rel_all(9)idpf_vport_queues_rel(9)idpf_vport_init_fast_path_txqs(9)idpf_vport_init_num_qs(9)idpf_vport_calc_num_q_desc(9)idpf_vport_calc_total_qs(9)idpf_vport_calc_num_q_groups(9)idpf_vport_calc_numq_per_grp(9)idpf_rxq_set_descids(9)idpf_txq_group_alloc(9)idpf_rxq_group_alloc(9)idpf_vport_queue_grp_alloc_all(9)idpf_vport_queues_alloc(9)idpf_tx_read_tstamp(9)idpf_tx_splitq_clean(9)idpf_tx_clean_bufs(9)idpf_tx_handle_rs_completion(9)idpf_tx_clean_complq(9)idpf_wait_for_sw_marker_completion(9)idpf_tx_splitq_build_ctb(9)idpf_tx_splitq_build_flow_desc(9)idpf_txq_has_room(9)idpf_tx_maybe_stop_splitq(9)idpf_tx_buf_hw_update(9)idpf_tx_res_count_required(9)idpf_tx_splitq_bump_ntu(9)idpf_tx_get_free_buf_id(9)idpf_tx_splitq_pkt_err_unmap(9)idpf_tx_splitq_map(9)idpf_tso(9)idpf_tx_splitq_get_ctx_desc(9)idpf_tx_drop_skb(9)idpf_tx_tstamp(9)idpf_tx_set_tstamp_desc(9)idpf_tx_splitq_need_re(9)idpf_tx_splitq_frame(9)idpf_tx_start(9)idpf_rx_hash(9)idpf_rx_csum(9)idpf_rx_splitq_extract_csum_bits(9)idpf_rx_rsc(9)idpf_rx_hwtstamp(9)__idpf_rx_process_skb_fields(9)idpf_rx_splitq_test_staterr(9)idpf_rx_splitq_is_eop(9)idpf_rx_splitq_clean(9)idpf_rx_update_bufq_desc(9)idpf_rx_clean_refillq(9)idpf_rx_clean_refillq_all(9)idpf_vport_intr_clean_queues(9)idpf_vport_intr_napi_del_all(9)idpf_vport_intr_napi_dis_all(9)idpf_vport_intr_rel(9)idpf_vport_intr_rel_irq(9)idpf_vport_intr_dis_irq_all(9)idpf_vport_intr_buildreg_itr(9)idpf_update_dim_sample(9)idpf_net_dim(9)idpf_vport_intr_update_itr_ena_irq(9)idpf_vport_intr_req_irq(9)idpf_vport_intr_write_itr(9)idpf_vport_intr_ena_irq_all(9)idpf_vport_intr_dis_dim_all(9)idpf_vport_intr_deinit(9)idpf_tx_dim_work(9)idpf_rx_dim_work(9)idpf_init_dim(9)idpf_vport_intr_napi_ena_all(9)idpf_tx_splitq_clean_all(9)idpf_rx_splitq_clean_all(9)idpf_vport_splitq_napi_poll(9)idpf_vport_intr_map_vector_to_qs(9)idpf_vport_intr_init_vec_idx(9)idpf_vport_intr_napi_add_all(9)idpf_vport_intr_alloc(9)idpf_vport_intr_init(9)idpf_config_rss(9)idpf_fill_dflt_rss_lut(9)idpf_init_rss_lut(9)idpf_deinit_rss_lut(9)
and that's the whole page, bestie β no gatekeeping π this one lives under ./drivers/net/ethernet/intel/idpf and it's dated October 2026, so go forth and emulate those header splits β¨π¦π
π¦ 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