Я пытаюсь проверить функцию tcp_synack_timer в специальной программе BPF, например в книге BPF Performance Tools - PullRequest
0 голосов
/ 09 мая 2020

Я хочу использовать вышеупомянутую функцию, потому что хочу использовать структуры request_sock_queue и struct listen_sock. Есть ли способ их использовать (возможно, другую функцию)?

Сначала я попытался создать программу BPF, которая использует 'tcp_synack_timer' (net / ipv4 / tcp_timer.h) и переходит к другой функции-> 'int_csk_reqsk_queue_prune '(net / ipv4 / inet_connection_sock. c), ни один из них не работал (я также искал эти функции в / sys / kernel / debug / tracing / available_filtered_functions), чтобы получить' struct listen_sock ', и оттуда я наконец получил' qlen '(struct listen_sock, которая находится в' include / net / request_sock.h '.

!/usr/local/bin/bpftrace

kprobe:tcp_synack_timer
{
        printf("-------------------\n");
        printf("\n");
        printf("tcp_synack_timer: %s pid: %d\n", comm, pid);
        printf("\n");
        printf("--------------------\n");
}

и другая функция, которую я пробовал:

!/usr/local/bin/bpftrace

#include <net/sock.h>
#include <net/inet_connection_sock.h>
#include <net/request_sock.h>

kprobe:inet_csk_reqsk_queue_prune
{

    $sk = (struct sock *)arg0;
    $inet = (struct inet_connection_sock *)$sk;
    $rsq = (struct request_sock_queue *)$inet;
    $ls = (struct listen_sock *)$rsq;

    printf("-------------------\n");
    printf("\n");
    printf("net_csk_reqsk_queue_prune: %s pid: %d\n", comm, pid);
    printf("\n");
    printf("listen_sock: %d\n", $ls->qlen);
    printf("--------------------\n");
}
...