1) 找到bpf_prog_load得到的bpf-prog fd(里面包含了bpf程序的内核进行jit编译后的指令集) 2) 初始化bpf_link_perf(bpf程序和bpf performance event之间的桥梁) 3) bpf_link_create将bpf程序注入到kprobe/uprobe异常处理函数会执行的prog_array中 4) 使能perf_event_open_probe得到的performance event 我们主要关...
link_create → bpf_tracing_prog_attach → bpf_trampoline_link_prog → bpf_trampoline_update → arch_prepare_bpf_trampoline 在bpf_tracing_prog_attach函数中,内核会尝试查找或者创建当前目标函数对应的bpf_trampoline实例,这个是在bpf_trampoline_get函数中实现的。所有的bpf_trampoline实例都存在在一个全局哈希表...
char**argv){//# createintfd =bpf_create_map(BPF_MAP_TYPE_HASH,sizeof(int),sizeof(int),100,0);if(fd <0) {printf("Failedto create map: %d (%s)n", fd,strerror(errno));return-1;
attr.link_create.target_fd = target_fd; attr.link_create.attach_type = attach_type; attr.link_create.flags = OPTS_GET(opts, flags, 0); if (iter_info_len) { attr.link_create.iter_info = ptr_to_u64(OPTS_GET(opts, iter_info, (void *)0)); attr.link_create.iter_info_len = it...
它遍历tcf_proto中的bpf prog link list, 对每一个bpf prog 执行BPF_PROG_RUN(prog->filter, skb) static int cls_bpf_classify(struct sk_buff *skb, const struct tcf_proto *tp, struct tcf_result *res) { struct cls_bpf_head *head = rcu_dereference_bh(tp->root); struct cls_bpf_prog *p...
和struct bpf_link类型的结构体成员名,在 selfuprobe.skel.h 文件中有体现 example/c/selfuprobe.c #include<stdio.h>#include<stdlib.h>#include<stdint.h>#include<string.h>#include<unistd.h>#include<sys/resource.h>#include<bpf/libbpf.h>#include"selfuprobe.skel.h"staticintlibbpf_output(enumlibb...
s->progs[0].link = &obj->links.handle_tp; s->data = minimal_bpf__elf_bytes(&s->data_sz); obj->skeleton = s; return0; err: bpf_object__destroy_skeleton(s); returnerr; } staticinlineconstvoid*minimal_bpf__elf_bytes(size_t*sz) ...
bpf_link__destroy(link); bpf_dctcp__destroy(dctcp_skel); } 详细流程解释如下: 在bpf_object__open 阶段,libbpf 将寻找 SEC(".struct_ops") 部分,并找出 struct_ops 所实现的 btf 类型。 需要注意的是,这里的 btf-type 指的是 bpf_prog.o 的 btf 中的一个类型。 "struct bpf_map" 像其他 map ...
本文翻译自 LPC 2021 的一篇分享:BPF datapath extensions for K8s workloads[1]。 作者Daniel Borkmann 和 Martynas Pumputis 都是 Cilium 的核心开发。翻译时补充了一些背景知识、代码片段和链接,以方便理解。 翻译已获得作者授权。 由于译者水平有限,本文不免存在遗漏或错误之处。如有疑问,请查阅原文。
(val)return -E2BIG;}size = sizeof(attr);}/* copy attributes from user space, may be less than sizeof(bpf_attr) */if (copy_from_user(&attr, uattr, size) != 0)return -EFAULT;switch (cmd) {case BPF_MAP_CREATE:err = map_create(&attr);break;case BPF_MAP_LOOKUP_ELEM:err = ...