1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
//! # xdpsock //! //! A rust interface for AF_XDP sockets using libbpf. //! ``` //! use xdpsock::{ //! socket::{BindFlags, SocketConfig, SocketConfigBuilder, XdpFlags}, //! umem::{UmemConfig, UmemConfigBuilder}, //! xsk::Xsk2, //! }; //! //! // Configuration //! let umem_config = UmemConfigBuilder::new() //! .frame_count(8192) //! .comp_queue_size(4096) //! .fill_queue_size(4096) //! .build() //! .unwrap(); //! //! let socket_config = SocketConfigBuilder::new() //! .tx_queue_size(4096) //! .rx_queue_size(4096) //! .bind_flags(BindFlags::XDP_COPY) // Check your driver to see if you can use ZERO_COPY //! .xdp_flags(XdpFlags::XDP_FLAGS_SKB_MODE) // Check your driver to see if you can use DRV_MODE //! .build() //! .unwrap(); //! //! let n_tx_frames = umem_config.frame_count() / 2; //! //! let ifname = "veth0"; //! let mut xsk = Xsk2::new(&ifname, 0, umem_config, socket_config, n_tx_frames as usize); //! //! // Sending a packet //! let pkt: Vec<u8> = vec![]; //! xsk.send(&pkt); //! //! // Receiving a packet //! let (recvd_pkt, len) = xsk.recv().expect("failed to recv"); //! ``` #[cfg(all(target_pointer_width = "64", target_family = "unix"))] pub mod socket; #[cfg(all(target_pointer_width = "64", target_family = "unix"))] pub mod umem; #[cfg(all(target_pointer_width = "64", target_family = "unix"))] pub mod xsk; #[cfg(all(target_pointer_width = "64", target_family = "unix"))] mod util; #[cfg(all(target_pointer_width = "64", target_family = "unix"))] pub use socket::{ BindFlags, LibbpfFlags, RxQueue, Socket, SocketConfig, SocketConfigBuilder, TxQueue, XdpFlags, }; #[cfg(all(target_pointer_width = "64", target_family = "unix"))] pub use umem::{ AccessError, CompQueue, DataError, FillQueue, Frame, Umem, UmemBuilder, UmemConfig, UmemConfigBuilder, WriteError, }; #[cfg(test)] mod tests { use std::mem; #[test] fn ensure_usize_and_u64_are_same_size() { assert_eq!(mem::size_of::<usize>(), mem::size_of::<u64>()); } }