欢迎访问 内存溢出 —— 独立后端与系统工程技术博客

专注于分布式系统、Linux内核、数据库存储与后端工程实践

Linux 内核态网络加速:AF_XDP 零拷贝套接字与用户态收包

发表于:|最后更新:|分类:Linux与网络|阅读:4441 次

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));