LINUX.ORG.RU

libbpf событие на закрытие соединения.

 ,


0

2

Добрый день, я захватываю данные системные вызовы :

SEC("kretprobe/tcp_v4_connect")
int BPF_KRETPROBE(tcp_v4_connect_ret, int ret)
{
	return handle_kernel_event(ctx, ret, AF_INET, EVENT_CONNECT);
}

SEC("kretprobe/tcp_v6_connect")
int BPF_KRETPROBE(tcp_v6_connect_ret, int ret)
{
    return handle_kernel_event(ctx, ret, AF_INET6, EVENT_CONNECT);
}

SEC("kretprobe/inet_bind")
int BPF_KRETPROBE(ipv4_bind_exit, int ret)
{
    return handle_kernel_event(ctx, ret, AF_INET, EVENT_BIND);
}

SEC("kretprobe/inet6_bind")
int BPF_KRETPROBE(ipv6_bind_exit, int ret)
{
    return handle_kernel_event(ctx, ret, AF_INET6, EVENT_BIND);
}

Я бы хотел также отлавливать событие закрытия сокета. Т.е. для

sock_bind = bind(22222); 
close(sock_bind);
sock = connect('127.0.0.1', 22222);
close(sock);

По логике это событие должно генерироваться на close() сокета. Как правильно и легко поймать это событие? Искал вот здесь пример, но не нашел. https://github.com/iovisor/bcc/tree/master/libbpf-tools.

P.S с другой стороны соедиенение может быть закрыто с remote и помойму close тогда не произойдет(ошибаюсь?), а мне нужно именно событие окончания соедиения. Эта помарка не для bind() событий.



Последнее исправление: xionovermazes (всего исправлений: 2)

Ну тут есть несколько вариантов:

  • tcp_close()
  • tcp_disconnect()
  • tcp_done()
  • tcp_abort()
vel ★★★★★
()

Я думаю, что вы слегка не по назначению используете kprobe. За состоянием сокетов я бы следил с помощью программы типа BPF_PROG_TYPE_SOCK_OPS.

i586 ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.