You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

以太网驱动为igc,新手求教eBPF-XDP程序获取网卡RX时间戳方法

基于igc驱动的XDP获取网卡RX时间戳分步指导

一、确认环境支持

  • 内核版本需≥5.10(igc驱动对XDP时间戳的完善支持从该版本开始)
  • 验证igc驱动硬件时间戳能力:执行 ethtool -T <你的网卡名>,确保输出中包含rx-filter: hardware,说明硬件支持RX时间戳捕获

二、编写XDP时间戳程序

创建xdp_timestamp.c文件,内容如下:

#include <linux/bpf.h>
#include <bpf/bpf_helpers.h>

SEC("xdp")
int xdp_get_rx_ts(struct xdp_md *ctx) {
    // 调用内核helper函数获取网卡RX时间戳(单位:纳秒)
    __u64 rx_ts = bpf_skb_get_tstamp(ctx);
    
    // 将时间戳输出到内核trace缓冲区,用于验证
    bpf_printk("RX timestamp (ns): %llu", rx_ts);
    
    return XDP_PASS;
}

// 必须声明许可证,内核才会加载该BPF程序
char _license[] SEC("license") = "GPL";

说明:bpf_skb_get_tstamp()是内核提供的原生helper,无需额外依赖库,直接从网卡硬件获取时间戳。

三、正确配置Makefile

之前的-l链接标志无效,是因为混淆了BPF内核程序和用户态程序的编译逻辑。BPF程序需编译为内核字节码,无需链接用户态库。创建Makefile:

CLANG ?= clang
BPFTOOL ?= bpftool

# BPF目标文件
BPF_OBJ = xdp_timestamp.bpf.o

# 编译BPF程序
$(BPF_OBJ): xdp_timestamp.c
	$(CLANG) -target bpf \
		-D__TARGET_ARCH_x86_64 \
		-I/usr/include/$(shell uname -m)-linux-gnu \
		-O2 -c $< -o $@

# 清理编译产物
clean:
	rm -f $(BPF_OBJ)

四、编译与加载程序

  1. 编译BPF字节码:
    make
    
  2. 加载到igc网卡(替换<你的网卡名>为实际名称,如eth0):
    sudo bpftool net attach xdp obj $(BPF_OBJ) sec xdp dev <你的网卡名>
    
  3. 查看时间戳输出:
    sudo cat /sys/kernel/debug/tracing/trace_pipe
    
    此时会看到每个接收数据包的RX时间戳(纳秒级)。

五、常见问题排查

  • 如果加载失败,先检查内核版本是否达标,再用dmesg查看内核报错信息
  • 若trace_pipe无输出,确认网卡有流量输入(比如ping该网卡IP)
  • 之前的-l链接标志仅适用于用户态加载程序(如需自己写用户态代码读取BPF map中的时间戳),此时编译用户态程序需加-lbpf -lelf -lz

内容的提问来源于stack exchange,提问作者Sumon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 17:41:24