BPF_SOCK_OPS_TCP_CONNECT_CB 表示TCP client active connect BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB 表示server passive connection established. BPF_PROG_TYPE_CGROUP_SOCK_ADDR attach_type_to_prog_type(enum bpf_attach_type attach_type) { case BPF_CGROUP_INET4_BIND: case BPF_CGROUP_INET6_BIND: case ...
要在BPF中追踪TCP套接字的状态,你可以使用bpf_sock_ops结构体来获取套接字的相关信息。以下是一个简单的BPF程序示例,它将输出新建连接的五元组信息: #include <linux/bpf.h> #include <bpf/bpf_helpers.h> #include <bpf/bpf_tracing.h> char LICENSE[] SEC("license") = "Dual BSD/GPL"; SEC("sock...
二、 BPF入门 BPF 最早在 1992 年被提出,当时叫伯克利包过滤器(Berkely Packet Filter,一般称为cBPF),号称比当时最先进的数据包过滤技术快 20 倍,主要应用场景在 tcpdump、seccomp。2014年,Alexei Starovoitov 对 BPF 进行彻底地改造,提出 Extended Berkeley Packet Filter (eBPF)。eBPF 指令更接近硬件的 ...
SEC("struct_ops/dctcp_init")void BPF_PROG(dctcp_init, struct sock *sk){const struct tcp_sock *tp = tcp_sk(sk);struct dctcp *ca = inet_csk_ca(sk);ca->prior_rcv_nxt = tp->rcv_nxt;ca->dctcp_alpha = min(dctcp_alpha_on_init, DCTCP_MAX_ALPHA);ca->loss_cwnd = 0;ca->ce_sta...
有些结构体(如 tcp_sock)会看到 preserve_access_index 属性表示 eBPF 字节码在载入的时候,会对这个结构体里的字段进行重定向,满足当前内核版本的同名结构体字段的偏移。 其中需要注意的是在 BPF 程序中定义的 tcp_congestion_ops 结构(也被称为 bpf-prg btf 类型),该类型可以与内核中定义的结构体完全一致(被...
struct tcp_sock *s = ...;/* with direct reads */bool is_cwnd_limited = BPF_CORE_READ_BITFIELD(s, is_cwnd_limited);/* with bpf_probe_read()-based reads */u64 is_cwnd_limited;BPF_CORE_READ_BITFIELD_PROBED(s, is_cwnd_limited, &is_cwnd_limited); ...
Currently, bpf_skc_to_mptcp_sock() can only be used with sockets that are MPTCP subflows: TCP sockets with tp->is_mptcp, created by the kernel from an MPTCP socket (IPPROTO_MPTCP). Typically used with BPF sock_ops operators. Here, this helper is extended to support MPTCP sockets, the...
__tcp_close+678 tcp_close+37 inet_release+69 __sock_release+63 sock_close+21 __fput+156 ___fput+14 task_work_run+106 exit_to_user_mode_loop+343 exit_to_user_mode_prepare+160 syscall_exit_to_user_mode+39 do_syscall_64+105 entry...
int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb, int segs); struct sock的定义在这里,它包含了我们所需要的信息。这是一个庞大且复杂的结构体,而且对于kprobe来说,我们只能使用寄存器以及偏移来输出其值。 要知道这个结构体中每个字段的真实偏移,我们需要内核的符号表,使用GDB来确定其值: ...
static struct sock_filter filter[6] = { { OP_LDH, 0, 0, 12 }, // ldh [12] { OP_JEQ, 0, 2, ETH_P_IP }, // jeq #0x800, L2, L5 { OP_LDB, 0, 0, 23 }, // ldb [23] { OP_JEQ, 0, 1, IPPROTO_TCP }, // jeq #0x6, L4, L5 ...