STRUCT LIBETH_XDP_TX_BULK(9)
π struct libeth_xdp_tx_bulk(9) π
okay so bestie, welcome to the Kernel API Manual moment of your day β this is the page for struct libeth_xdp_tx_bulk, and it's literally the XDP Tx frame bulk for bulk sending. that's the whole vibe. π¦
β¨ NAME β¨
struct libeth_xdp_tx_bulk β XDP Tx frame bulk for bulk sending π
πΈ SYNOPSIS πΈ
struct libeth_xdp_tx_bulk {
const struct bpf_prog *prog;
struct net_device *dev;
void *xdpsq;
u32 act_mask;
u32 count;
struct libeth_xdp_tx_frame bulk[LIBETH_XDP_TX_BULK];
};
like, that's the whole struct, no cap. π
π Members π
progβ the currently active XDP program, bestie. it'sNULLfor.ndo_xdp_xmit, so don't come for it when it's not there. πdevβ thenet_devicethat the frames actually get transmitted on. main character energy, honestly. β¨xdpsqβ a lil shortcut to the corresponding driver-specific XDPSQ structure. iykyk. π₯act_maskβ Rx only, queen: the mask of all the XDP prog verdicts for that NAPI session. πcountβ the current number of frames chilling in the bulk rn. πbulkβ the array of queued frames for bulk Tx. this is where the girlies line up. π
π§ Description π§
so here's the tea β β all XDP Tx operations except XSk xmit queue each frame to the bulk first, and then flush it when count reaches the array end. that's the whole flow, periodt. π
the bulk is always placed on the stack for performance β like, she lives on the stack, that's her home, we don't move her. π
one bulk element contains all the data necessary for sending a frame and then freeing it on completion. so it's giving self-sufficient, iconic, does-it-all. β¨
and for XSk xmit? the Tx descriptor array from xsk_buff_pool is casted directly to libeth_xdp_tx_frame β because they're compatible, bestie π β and the bulk structure is not used in that case. nope, not invited to that party. π
π¦ SEE ALSO π¦
Kernel file ./include/net/libeth/xdp.h and honestly a whole friend group:
struct libeth_xdp_buff(9)__LIBETH_XDP_ONSTACK_BUFF(9)LIBETH_XDP_ONSTACK_BUFF(9)libeth_xdpsq_num(9)libeth_xdpsq_shared(9)libeth_xdpsq_id(9)libeth_xdpsq_get(9)libeth_xdpsq_put(9)libeth_xdpsq_lock(9)libeth_xdpsq_unlock(9)libeth_xdpsq_deinit_timer(9)libeth_xdpsq_queue_timer(9)libeth_xdpsq_run_timer(9)enum (anonymous)(9)enum (anonymous)(9)struct libeth_xdp_tx_frame(9)LIBETH_XDP_ONSTACK_BULK(9)struct libeth_xdpsq(9)struct libeth_xdp_tx_desc(9)libeth_xdp_ptr_to_priv(9)libeth_xdp_priv_to_ptr(9)libeth_xdp_tx_xmit_bulk(9)libeth_xdp_tx_queue_head(9)libeth_xdp_tx_queue_frag(9)libeth_xdp_tx_queue_bulk(9)libeth_xdp_tx_fill_stats(9)libeth_xdp_tx_fill_buf(9)__libeth_xdp_tx_flush_bulk(9)libeth_xdp_tx_flush_bulk(9)libeth_xdp_xmit_init_bulk(9)libeth_xdp_xmit_frame_dma(9)libeth_xdp_xmit_queue_head(9)libeth_xdp_xmit_queue_frag(9)libeth_xdp_xmit_queue_bulk(9)libeth_xdp_xmit_fill_buf(9)libeth_xdp_xmit_flush_bulk(9)__libeth_xdp_xmit_do_bulk(9)libeth_xdp_xmit_do_bulk(9)libeth_xdp_tx_init_bulk(9)libeth_xdp_init_buff(9)libeth_xdp_save_buff(9)libeth_xdp_return_stash(9)libeth_xdp_return_buff(9)libeth_xdp_prepare_buff(9)libeth_xdp_process_buff(9)libeth_xdp_buff_stats_frags(9)__libeth_xdp_run_prog(9)__libeth_xdp_run_flush(9)libeth_xdp_run_prog(9)__libeth_xdp_run_pass(9)libeth_xdp_run_pass(9)libeth_xdp_finalize_rx(9)LIBETH_XDP_DEFINE_TIMER(9)LIBETH_XDP_DEFINE_FLUSH_TX(9)LIBETH_XDP_DEFINE_FLUSH_XMIT(9)LIBETH_XDP_DEFINE_RUN_PROG(9)LIBETH_XDP_DEFINE_RUN_PASS(9)LIBETH_XDP_DEFINE_RUN(9)LIBETH_XDP_DEFINE_FINALIZE(9)libeth_xdp_buff_to_rq(9)libeth_xdpmo_rx_hash(9)__libeth_xdp_complete_tx(9)libeth_xdp_set_features(9)libeth_xdp_set_features_noredir(9)
ok that's the whole page bestie, go forth and bulk-send responsibly π«Ά
π sourced from ./include/net/libeth, dated October 2026, and yes this was struct libeth_xdp_tx_bulk(9) the whole time π
π¦ 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