[eBPF] sockops类型运行梳理
BPF_PROG_TYPE_SOCK_OPS程序类型
内核中socket事件(本质是各函数)中的埋点,能够在socket的生命周期每个节点执行BPF程序。
- 进入Linux内核的commit
- session定义:
SEC_DEF("sockops", SOCK_OPS, BPF_CGROUP_SOCK_OPS, SEC_ATTACHABLE_OPT) - 参数,由
BPF_PROG_TYPE(BPF_PROG_TYPE_SOCK_OPS, sock_ops, struct bpf_sock_ops, struct bpf_sock_ops_kern)可知:bpf程序的入参是bpf_sock_ops,对应内核中的上下文是bpf_sock_ops_kern。 - 使用场景:参考博客
示例代码
__section("sockops") // 加载到 ELF 中的 `sockops` 区域,有 socket operations 时触发执行
int bpf_sockmap(struct bpf_sock_ops *skops)
{
switch (skops->op) {
case BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB: // 被动建连
case BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB: // 主动建连
if (skops->family == 2) {
// AF_INET
bpf_sock_ops_ipv4(skops); // 将 socket 信息记录到到 sockmap
}
break;
default:
break;
}
return 0;
}
Hook位置梳理
- tcp_output.c,中核心函数
int tcp_connect(struct sock *sk)一开始就埋了点:
// https://elixir.bootlin.com/linux/v6.6.4/source/net/ipv4/tcp_output.c#L3946
/* Build a SYN and send it off. */
int tcp_connect(struct sock *sk)
{
struct tcp_sock *tp = tcp_sk(sk);
struct sk_buff *buff;
int err;

本文详细介绍了eBPF的sockops程序类型如何在Linux内核的socket事件中实现埋点,以及如何通过tcp_connect函数触发BPF程序执行,展示了从内核源码到实际应用的完整流程。
最低0.47元/天 解锁文章
39

被折叠的 条评论
为什么被折叠?



