参考教程:https://github.com/xdp-project/xdp-tutorial/
ebpf介绍:https://sysdig.com/blog/sysdig-and-falco-now-powered-by-ebpf/
包含路径
1 | ${workspaceFolder}/** |
bpffs(bpf用文件系统)
map常用路径:/sys/fs/bpf
创建:mount -t bpf bpf /sys/fs/bpf/
loader读取数据(不用libbpf情况下的步骤):
参考:https://github.com/xdp-project/xdp-tutorial/blob/master/common/common_user_bpf_xdp.c
载入ebpf
的obj
,根据是否重用已有map调用不同的APIload_bpf_object_file_reuse_maps / load_bpf_object_file
通过title找到ebpf
中的特定程序(函数),title是自己在编译前指定的bpf_object__find_program_by_title
(没有title的单函数obj
也可以通过bpf_program__next
来得到第一个)
获取程序的文件描述符,用于后续载入bpf_program__fd
根据类型的不同,将文件描述符传入以载入程序xdp_link_attach
(XDP类型下)
[可选,libbpf下函数(不用libbpf会相对复杂)]共享/解除共享BPF map,使得多个bpf程序可以共用(在bpf文件系统中可见/不可见,不确定有没有持久化功能)bpf_object__pin_maps / bpf_object__unpin_maps
读取ebpf程序存入map的数据bpf_map_lookup_elem
概念
ifindex(接口索引):物理或逻辑接口的唯一识别索引
参考:https://www.cisco.com/c/zh_cn/support/docs/ip/simple-network-management-protocol-snmp/28420-ifIndex-Persistence.html
BTF(Bpf Type Format):map中key-value对只关注数据类型的字节占用大小,没有语义信息。而BTF为map在debug时提供有结构的语义信息。
参考:https://github.com/torvalds/linux/blob/master/Documentation/bpf/btf.rst
(xdp_md ctx): 上下文数据结构
其内部结构的__u32不是真正的结构,只是为了确定数据位数,需要手动转化为long
一个包的长度可以通过内部的data_end - data
运算得到
参考:https://elixir.bootlin.com/linux/v5.0/ident/xdp_md
XDP无关
指令ethtool可显示配置网卡硬件
参考:https://man.linuxde.net/ethtool
RTNETLINK允许对内核路由表进行读和更改,它用于内核与各个子系统之间(路由子系统、IP地址、链接参数等)的通信,
参考:https://www.cnblogs.com/wenqiang/p/6634447.html
TIPS
利用PER_CPU类型的map来避免同步带来的开销(只利用特定的CPU来进行计算)