问题遇到的现象和发生背景
环境:ubuntu22,libbpf-bootstrap
背景: 使用libbpf抓取tcp报文的源目IP地址,用kprobe插桩到tcp_v4_connect
问题相关代码,请勿粘贴截图
#include "vmlinux.h"
#include <bpf/bpf_helpers.h>
#include <bpf/bpf_tracing.h>
#include <bpf/bpf_core_read.h>
char LICENSE[] SEC("license") = "Dual BSD/GPL";
SEC("kprobe/tcp_v4_connect")
int BPF_KPROBE(tcp_v4_connect, struct sock *sk)
{
pid_t pid;
__be32 saddr;
pid = bpf_get_current_pid_tgid() >> 32;
saddr = BPF_CORE_READ(sk, __sk_common.skc_rcv_saddr);
bpf_printk("KPROBE ENTRY pid = %d, ip = %x \n", pid, saddr);
return 0;
}
SEC("kretprobe/tcp_v4_connect")
int BPF_KRETPROBE(tcp_v4_connect_exit, long ret)
{
pid_t pid;
pid = bpf_get_current_pid_tgid() >> 32;
bpf_printk("KPROBE EXIT: pid = %d, ret = %ld\n", pid, ret);
return 0;
}
运行结果及报错内容
运行完毕后,查看结果saddr一直等于0,数据不对。
我的解答思路和尝试过的方法
我尝试借鉴BCC的tcpconnect代码,使用saddr =&sk->__sk_common.skc_rcv_saddr和bpf_core_read(&saddr,sizeof(saddr),&sk->__sk_common.skc_rcv_saddr),其结果依然不对。
我想要达到的结果
有人可以帮忙解决一下吗?怎么使用libbpf的BPF_CORE_READ正确读取内核中的sock数据。