皇月 2022-08-01 11:43 采纳率: 0%
浏览 23
已结题

libbpf-bootsrap读取sock失败

问题遇到的现象和发生背景

环境: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数据。

  • 写回答

1条回答 默认 最新

  • ilmss 2022-08-01 15:52
    关注
    获得2.50元问题酬金

    数据封装时出现了问题,正确的封装关键代码如下:

    //bpf_probe_read(&ipv4_key.saddr, sizeof(ipv4_key.saddr), &sk->__sk_common.skc_rcv_saddr);
    struct ipv4_key_t ipv4_key = {.pid = pid};
    ipv4_key.saddr = sk->__sk_common.skc_rcv_saddr;
    ipv4_key.daddr = sk->__sk_common.skc_daddr;
    ipv4_key.lport = sk->__sk_common.skc_num;
    dport = sk->__sk_common.skc_dport;
    ipv4_key.dport = ntohs(dport);
    ipv4_send_bytes.increment(ipv4_key, size);
    
    
    

    将获取到的流量、地址和端口信息,通过bpf中的map.increment()这样一个方法进行封装在BPF_HASH中

    评论

报告相同问题?

问题事件

  • 系统已结题 8月9日
  • 创建了问题 8月1日

悬赏问题

  • ¥15 Python turtle 画图
  • ¥15 关于大棚监测的pcb板设计
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用
  • ¥15 C++ yoloV5改写遇到的问题
  • ¥20 win11修改中文用户名路径
  • ¥15 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计