#![allow(unused_imports, dead_code)]
pub use libc::AF_XDP; pub use libc::SOL_XDP;
pub use libc::XDP_MMAP_OFFSETS; pub use libc::XDP_RX_RING; pub use libc::XDP_STATISTICS;
pub use libc::XDP_TX_RING; pub use libc::XDP_UMEM_COMPLETION_RING; pub use libc::XDP_UMEM_FILL_RING; pub use libc::XDP_UMEM_REG;
pub use libc::XDP_PGOFF_RX_RING; pub use libc::XDP_PGOFF_TX_RING; pub use libc::XDP_UMEM_PGOFF_COMPLETION_RING; pub use libc::XDP_UMEM_PGOFF_FILL_RING;
pub use libc::XDP_COPY; pub use libc::XDP_SHARED_UMEM; pub use libc::XDP_USE_NEED_WAKEUP; pub use libc::XDP_ZEROCOPY;
pub use libc::sockaddr_xdp; pub use libc::xdp_desc; pub use libc::xdp_mmap_offsets; pub use libc::xdp_ring_offset; pub use libc::xdp_statistics;
pub use libc::xdp_umem_reg;
pub const XDP_RING_NEED_WAKEUP: u32 = 1;
pub const SIOCETHTOOL: libc::c_ulong = 0x8946;
pub const ETHTOOL_GCHANNELS: u32 = 0x0000_003c;
#[repr(C)]
#[derive(Debug, Default, Clone, Copy)]
pub struct ethtool_channels {
pub cmd: u32,
pub max_rx: u32,
pub max_tx: u32,
pub max_other: u32,
pub max_combined: u32,
pub rx_count: u32,
pub tx_count: u32,
pub other_count: u32,
pub combined_count: u32,
}
#[repr(C)]
pub struct ethtool_ifreq {
pub ifr_name: [libc::c_char; libc::IFNAMSIZ],
pub ifr_data: *mut libc::c_void,
}
pub const ETHTOOL_GRSSH: u32 = 0x0000_0046;
pub const ETHTOOL_SRSSH: u32 = 0x0000_0047;
pub const RXH_XFRM_SYM_XOR: u8 = 1 << 0;
pub const RXH_XFRM_NO_CHANGE: u8 = 0xff;
pub const ETH_RSS_HASH_NO_CHANGE: u8 = 0;
pub const ETH_RXFH_INDIR_NO_CHANGE: u32 = 0xffff_ffff;
#[repr(C)]
#[derive(Debug, Default, Clone, Copy)]
pub struct ethtool_rxfh {
pub cmd: u32,
pub rss_context: u32,
pub indir_size: u32,
pub key_size: u32,
pub hfunc: u8,
pub input_xfrm: u8,
pub rsvd8: [u8; 2],
pub rsvd32: u32,
}
pub const ETHTOOL_GRXCLSRLCNT: u32 = 0x0000_002e;
pub const ETHTOOL_GRXCLSRLALL: u32 = 0x0000_0030;
pub const ETHTOOL_SRXCLSRLDEL: u32 = 0x0000_0031;
pub const ETHTOOL_SRXCLSRLINS: u32 = 0x0000_0032;
pub const TCP_V4_FLOW: u32 = 0x01;
pub const UDP_V4_FLOW: u32 = 0x02;
pub const SCTP_V4_FLOW: u32 = 0x03;
pub const TCP_V6_FLOW: u32 = 0x05;
pub const UDP_V6_FLOW: u32 = 0x06;
pub const SCTP_V6_FLOW: u32 = 0x07;
pub const RX_CLS_LOC_ANY: u32 = 0xffff_ffff;
pub const RX_CLS_FLOW_DISC: u64 = 0xffff_ffff_ffff_ffff;
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct ethtool_rx_flow_spec {
pub flow_type: u32,
pub h_u: [u8; 52],
pub h_ext: [u8; 20],
pub m_u: [u8; 52],
pub m_ext: [u8; 20],
pub ring_cookie: u64,
pub location: u32,
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct ethtool_rxnfc {
pub cmd: u32,
pub flow_type: u32,
pub data: u64,
pub fs: ethtool_rx_flow_spec,
pub rule_cnt: u32,
}
#[cfg(test)]
mod tests {
use super::*;
use std::mem::size_of;
#[test]
fn constant_values() {
assert_eq!(AF_XDP, 44);
assert_eq!(SOL_XDP, 283);
assert_eq!(XDP_MMAP_OFFSETS, 1);
assert_eq!(XDP_RX_RING, 2);
assert_eq!(XDP_TX_RING, 3);
assert_eq!(XDP_UMEM_REG, 4);
assert_eq!(XDP_UMEM_FILL_RING, 5);
assert_eq!(XDP_UMEM_COMPLETION_RING, 6);
assert_eq!(XDP_STATISTICS, 7);
}
#[test]
fn struct_sizes() {
assert_eq!(size_of::<xdp_umem_reg>(), 32);
assert_eq!(size_of::<sockaddr_xdp>(), 16);
assert_eq!(size_of::<xdp_desc>(), 16);
assert_eq!(size_of::<xdp_mmap_offsets>(), 128);
assert_eq!(size_of::<xdp_ring_offset>(), 32);
}
#[test]
fn rxnfc_layout_matches_kernel() {
use std::mem::offset_of;
assert_eq!(size_of::<ethtool_rx_flow_spec>(), 168);
assert_eq!(offset_of!(ethtool_rx_flow_spec, h_u), 4);
assert_eq!(offset_of!(ethtool_rx_flow_spec, h_ext), 56);
assert_eq!(offset_of!(ethtool_rx_flow_spec, m_u), 76);
assert_eq!(offset_of!(ethtool_rx_flow_spec, m_ext), 128);
assert_eq!(offset_of!(ethtool_rx_flow_spec, ring_cookie), 152);
assert_eq!(offset_of!(ethtool_rx_flow_spec, location), 160);
assert_eq!(size_of::<ethtool_rxnfc>(), 192);
assert_eq!(offset_of!(ethtool_rxnfc, fs), 16);
assert_eq!(offset_of!(ethtool_rxnfc, rule_cnt), 184);
}
#[test]
fn bind_flag_values() {
assert_eq!(XDP_SHARED_UMEM, 1);
assert_eq!(XDP_COPY, 2);
assert_eq!(XDP_ZEROCOPY, 4);
assert_eq!(XDP_USE_NEED_WAKEUP, 8);
}
#[test]
fn ring_need_wakeup() {
assert_eq!(XDP_RING_NEED_WAKEUP, 1);
}
}