XDP杂语

参考教程:https://github.com/xdp-project/xdp-tutorial/

ebpf介绍:https://sysdig.com/blog/sysdig-and-falco-now-powered-by-ebpf/

包含路径

1
2
3
4
${workspaceFolder}/**
/usr/include
/usr/include/linux
/usr/lib/llvm-6.0/lib/clang/6.0.0/include

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

载入ebpfobj,根据是否重用已有map调用不同的API
load_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来进行计算)

文章目录
  1. 1. 包含路径
  2. 2. bpffs(bpf用文件系统)
  3. 3. loader读取数据(不用libbpf情况下的步骤):
  4. 4. 概念
  5. 5. XDP无关
  6. 6. TIPS
|