AF_XDP 是 XDP 生态中的用户态套接字协议族,它允许用户态程序通过 UMEM(User Memory) 共享内存区域直接与网卡驱动交互,绕过内核协议栈实现零拷贝收发包,单核可达数百万 PPS。
一、AF_XDP 套接字创建与 UMEM 注册
c
#include <linux/if_xdp.h>
#include <sys/socket.h>
int xsk_fd = socket(AF_XDP, SOCK_RAW, 0);
struct xdp_umem_reg mr = {
.addr = (unsigned long)umem_area,
.len = UMEM_SIZE,
.chunk_size = 2048,
.headroom = 0,
};
setsockopt(xsk_fd, SOL_XDP, XDP_UMEM_REG, &mr, sizeof(mr));
// 绑定到指定网卡队列
struct sockaddr_xdp sxdp = {
.sxdp_family = AF_XDP,
.sxdp_ifindex = if_nametoindex("eth0"),
.sxdp_queue_id = 0,
.sxdp_flags = XDP_ZEROCOPY, // 零拷贝模式
};
bind(xsk_fd, (struct sockaddr *)&sxdp, sizeof(sxdp));