ฉันติด tcp_cleanup_rbuf() และฉันพยายามดึงข้อมูล IP และพอร์ตออกจากคิว skb แต่ดูเหมือนว่าจะว่างเปล่า ถูกต้องหรือไม่? ณ จุดนั้นมันเป็นอิสระแล้วหรือยัง?
นี่คือเชลล์สคริปต์ที่ฉันกำลังทดสอบด้วย แก้ไขพาธไปยังซอร์สไดเร็กทอรีเคอร์เนลของคุณ เรียกใช้และเรียกใช้ ncat --keep-open --listen 0.0.0.0 5555
และ ก ncat <เซิร์ฟเวอร์ IP> 5555
.
ชัดเจน && bpftrace -e '
#include "/usr/src/kernels/3.10.0-957.el7.x86_64/include/net/sock.h"
#include "/usr/src/kernels/3.10.0-957.el7.x86_64/include/net/tcp.h"
#include "/usr/src/kernels/3.10.0-957.el7.x86_64/include/net/ip.h"
#include "/usr/src/kernels/3.10.0-957.el7.x86_64/include/linux/skbuff.h"
// โมฆะคงที่ tcp_cleanup_rbuf (struct ถุงเท้า * sk, คัดลอก int)
// https://elixir.bootlin.com/linux/v4.9/source/net/ipv4/tcp.c#L1416
//
kprobe:tcp_cleanup_rbuf / com == "ncat" /
{
$sock = (struct ถุงเท้า *) arg0;
$skb = (struct sk_buff *) $sock->sk_receive_queue.next;
$queue = (struct sk_buff_head *)$sock->sk_receive_queue;
printf("%p \t", $คิว);
printf("%p \n", (struct sk_buff *) $sock->sk_receive_queue);
printf("%p \n", $queue->ถัดไป);
printf("%p \n", $queue->prev);
printf("%u %u\n", $queue->qlen, arg1);
ถ้า(1)
{
$iph = (struct iphdr *)($skb->head + $skb->network_header); // https://elixir.bootlin.com/linux/v4.9/source/include/uapi/linux/ip.h#L85
$th = (struct tcphdr *)($skb->head + $skb->transport_header); // https://elixir.bootlin.com/linux/v4.9/source/include/uapi/linux/tcp.h#L24
$proto = $iph->โปรโตคอล; // 6 - TCP 17 - UDP https://en.wikipedia.org/wiki/List_of_IP_protocol_numbers
$ipv = $iph->เวอร์ชั่น; // 4 - IPv4 6 - IPv6
$size = (($iph->tot_len >> 8) | (($iph->tot_len & 0xff) << 8)) - ($th->doff * 4) - ($iph->ihl * 4) ;
printf("%s\t%u\t",
การสื่อสาร,
ปิด
);
printf("%s:%u\t>\t%s:%u\t%u\n",
ntop($iph->saddr)
(uint16)($th->แหล่งที่มา << 8) | ($th->ที่มา >> 8),
ntop($iph->daddr)
(uint16)($th->ปลายทาง << 8) | ($th->ปลายทาง >> 8),
ขนาด $
);
}
}'
ถ้าใครรู้ว่าฉันทำอะไรผิดหรือฟังก์ชั่นที่ดีกว่าในการขอฉันจะขอบคุณมาก