STRUCT LIBIE_CTLQ_MSG(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

πŸŽ€ struct libie_ctlq_msg(9) πŸŽ€

okay bestie, so this is the kernel API manual page for struct libie_ctlq_msg(9) β€” yes the section 9 one, and it's literally the control queue message data struct. like, the whole vibe of a control-queue message, all wrapped up in one little C struct. it's giving "backstage pass to the queue" ngl πŸ’…

✨ NAME ✨

struct libie_ctlq_msg β€” control queue message data πŸ¦‹

🌸 SYNOPSIS 🌸

ok so here's the whole thing, and yes you can copy it, go off:

struct libie_ctlq_msg {
    u16 flags;
    u16 opcode;
    u16 data_len;
    union {
      u16 func_id;
      u16 hw_retval;
    };
    u32 chnl_opcode;
    u32 chnl_retval;
    u32 param0;
    u16 sw_cookie;
    u16 virt_flags;
    u64 addr_param;
    union {
      struct kvec             recv_mem;
      struct libie_cp_dma_mem send_mem;
    };
 };

like… she's got unions inside her, she's got u16s and u32s and a u64, she's that girl πŸ’œ


πŸ‘‘ Members πŸ‘‘

okay so member by member, let's get into it 🫢

  • flags β€” refer to the 'Flags sub-structure' definitions ✨ (yes, with that exact capitalisation and quotes, iykyk)
  • opcode β€” infrastructure message opcode πŸ”₯
  • data_len β€” size of the payload, i.e. how much stuff is actually in there πŸ’–
  • {unnamed_union} β€” anonymous 😭 that's literally what it says. no name. she's mysterious like that.
    • func_id β€” queue id for mailbox selection, and it's 0 for the default mailbox (Tx) πŸ“¬
    • hw_retval β€” execution status from the HW (Rx) ⭐
  • chnl_opcode β€” virtchnl message opcode 🌈
  • chnl_retval β€” virtchnl return value πŸŽ€
  • param0 β€” indirect message raw parameter0 (yes, "raw parameter0", no space, that's the name bestie πŸ™ˆ)
  • sw_cookie β€” used to verify the response of the sent virtchnl message πŸ“ like a lil matching key so you know the reply is yours
  • virt_flags β€” virtchnl capability flags 🌸
  • addr_param β€” additional parameters in place of the address, given no buffer πŸ’€ (translation: when there's no buffer, the address slot gets repurposed)
  • {unnamed_union} β€” anonymous, again πŸ’… (there are two of these, keep both, don't merge them)
    • recv_mem β€” virtual address and size of the buffer that contains the indirect response πŸ“₯
    • send_mem β€” physical and virtual address of the DMA buffer, used for sending πŸ“€
fr fr, the two anonymous unions are separate things β€” the top one is func_id/hw_retval (Tx queue id vs Rx hw status), the bottom one is your recv buffer vs your send buffer. don't mix them up, that's the whole point of them being bare/nested like that. 🧚

πŸ¦‹ SEE ALSO πŸ¦‹

the whole friend group 🫢:

  • Kernel file ./include/linux/net/intel/libie/controlq.h enum
  • libie_ctlq_type(9)
  • struct libie_ctlq_ctx(9)
  • struct libie_ctlq_reg(9)
  • struct libie_cp_dma_mem(9)
  • struct libie_ctlq_create_info(9)
  • struct libie_ctlq_info(9)
  • struct libie_ctlq_desc(9)
  • struct libie_ctlq_clean_params(9)
  • libie_ctlq_release_rx_buf(9)
  • enum libie_ctlq_xn_state(9)
  • struct libie_ctlq_xn(9)
  • struct libie_ctlq_xn_manager(9)
  • struct libie_ctlq_xn_send_params(9)
  • libie_cp_can_send_onstack(9)
  • struct libie_ctlq_xn_recv_params(9)
  • struct libie_ctlq_xn_init_params(9)

aaaand that's the page πŸ’– this one lives in ./include/linux/net/intel/libie, dated October 2026, and it's the struct libie_ctlq_msg(9) page β€” slay, go read the header file, mwah πŸŽ€βœ¨

πŸ“¦ where this page comes from