【发布时间】:2022-02-22 15:43:50
【问题描述】:
我想打印由我正在测试的 XDP 程序解析的数据包的 IP 地址。我使用bpf_trace_printk() 打印有关由我的程序解析的数据包的详细信息。
如何使用bpf_trace_print() 打印 IP 地址?
我尝试使用this suggestion 打印IP,但尝试使用bpf_trace_printk() 时出现此错误
/virtual/main.c:99:52: warning: cannot use more than 3 conversion specifiers
bpf_trace_printk("\n- src_ip: %d.%d.%d.%d\n", src_ipaddr[3],src_ipaddr[2],src_ipaddr[1],src_ipaddr[0]);
^
6 warnings generated.
error: /virtual/main.c:111:59: in function filter i32 (%struct.xdp_md*): too many args to 0x5b6de28: i64 = Constant<6>
我不清楚为什么会收到此错误。
【问题讨论】:
-
只是猜测:
bpf_trace_printk不像像printk或printf那样通用。根据诊断,格式说明符的限制为 3,因此您只能拥有(例如)%d.%d.%d。我对 BPF 不太熟悉,但您可以 [可能] 循环以获得您想要的:bpf_trace_printk("\n- src_ip:"); for (int idx = 3; idx >= 0; --idx) bpf_trace_printk("%c%d",(idx == 0) ? ' ' : '.',src_ipaddr[idx]); bpf_trace_printk("\n"); -
src_ipaddr是 IPv6 还是 IPv4 地址? -
src_ipaddr 两者都不是,它是一个无符号字符指针数组。