【问题标题】:How do I print IP addresses with bpf_trace_printk()?如何使用 bpf_trace_printk() 打印 IP 地址?
【发布时间】: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不像printkprintf 那样通用。根据诊断,格式说明符的限制为 3,因此您只能拥有(例如)%d.%d.%d。我对 BPF 不太熟悉,但您可以 [可能] 循环以获得您想要的:bpf_trace_printk("\n- src_ip:"); for (int idx = 3; idx &gt;= 0; --idx) bpf_trace_printk("%c%d",(idx == 0) ? ' ' : '.',src_ipaddr[idx]); bpf_trace_printk("\n");
  • src_ipaddr 是 IPv6 还是 IPv4 地址?
  • src_ipaddr 两者都不是,它是一个无符号字符指针数组。

标签: c printing ip trace bpf


【解决方案1】:

Linux 内核提供 BPF 助手 bpf_trace_printk(),定义如下:

long bpf_trace_printk(const char *fmt, __u32 fmt_size, ...);

所以你需要在参数之前定义格式字符串的大小。

一个硬性限制是bpf_trace_printk() 总共只能接受最多 5 个输入参数。您必须定义 fmtfmt_size,这意味着您只能使用 3 个其他参数。所以格式字符串中不允许有 4 个说明符。这通常非常有限,您可能需要使用多个 bpf_trace_printk() 调用来记录所有数据。

for(int i=0; i<4; i++)
   bpf_trace_printk("IP section %d [%d]", strlen("IP section %d [%d]"),i,src_ipaddr[i]);

或使用@craig-estey 方法

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

我不确定,但你可以使用 sprintf

char part1Ip[32] = {0};
char part2Ip[32] = {0};
char wholeIp[32] = {0};
sprintf(part1Ip, "%d.%d", src_ipaddr[3],src_ipaddr[2]);
sprintf(part2Ip, "%d.%d", src_ipaddr[1],src_ipaddr[0]);
sprintf(wholeIp, "%s.%s", part1Ip,part2Ip);

bpf_trace_printk("\n- src_ip: %s\n", wholeIp);

有关更多信息,请参阅BPF tips & tricks

【讨论】:

    猜你喜欢
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 2018-07-04
    • 2020-09-20
    • 2014-01-25
    • 1970-01-01
    相关资源
    最近更新 更多