1 个不稳定版本
0.1.0 | 2021 年 5 月 1 日 |
---|
#928 in Unix API
用于 xdpsock-ffi
85KB
2K SLoC
xdpsock
Linux AF_XDP 地址族的 Rust 接口。
更多信息请参见 网络文档 或更详细的概述 。
此包基于 xsk-rs 的出色工作。
基本用法
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 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");
示例
一些示例可以在 examples
目录中找到。
示例 dev2_to_dev1.rs
使用指定的接口发送/接收 udp 数据包。要运行此示例
# Compile
cargo build --release --examples
# Add the veth pair
sudo ip link add veth0 type veth peer name veth1
# Get the MAC addresses of the veth pair
ip link show
11: veth1@veth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
link/ether 82:ff:40:35:17:a2 brd ff:ff:ff:ff:ff:ff
12: veth0@veth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
link/ether 9e:4f:30:9e:e1:31 brd ff:ff:ff:ff:ff:ff
# Start the receiver
sudo ./target/release/examples/dev2_to_dev1 --n-pkts=1000000 --src-ip "192.168.69.1" --src-port 1234 --dest-ip "192.168.69.2" --dest-port 4321 --dev veth1 --dest-mac "82:ff:40:35:17:a2" --src-mac "9e:4f:30:9e:e1:31" rx
# In another terminal, start the sender
sudo ./target/release/examples/dev2_to_dev1 --n-pkts=1000000 --src-ip "192.168.69.1" --src-port 1234 --dest-ip "192.168.69.2" --dest-port 4321 --dev veth0 --dest-mac "82:ff:40:35:17:a2" --src-mac "9e:4f:30:9e:e1:31" tx
示例 synacker.rs
监听指定的接口,并使用 SYNACK 对匹配给定筛选器的 TCP syn 数据包进行响应。
sudo ./target/release/examples/synacker --src-ip "192.168.69.1" --dev "veth1"
运行测试
集成测试使用 veth-util-rs 运行,该工具创建一对虚拟以太网接口。默认情况下,创建虚拟以太网接口需要 root 权限。为了避免在 root
下运行 cargo,最好首先构建测试/示例,然后直接运行二进制文件。
# tests
cargo build --tests
sudo run_all_tests.sh
兼容性
Linux 内核版本 5.11.0。
依赖项
~11MB
~238K SLoC