LightWeight CoolBPF reference
lwcb 参考手册
1. 使用说明
单行命令
lwcb -t 可以直接运行单条命令形式的 eBPF 程序,如:
lwcb -t 'kprobe:tcp_rcv_established {print("%s :triggerred by tcp_rcv_established\n", timestr(ns()));}'
lwcb 脚本
lwcb <脚本路径> 可以运行 lwcb 脚本
2. 语法说明
lwcb 的语法和 c 语言非常类似,
{ } : 是一个代码块
// :是注释
“string” :是字符串
-> 或 .:取结构体成员
`` if {} else {} ``:if 语句
return:返回语句[]:数组索引或者是 eBPF map 查找
3. 探测类型
目前支持的探测类型有:
k(ret)probe: BPF_PROG_TYPE_KPROBE
后续需要支持的探测类型有:
tracepoint: BPF_PROG_TYPE_TRACEPOINT
raw tracepoint:BPF_PROG_TYPE_RAW_TRACEPOINT
syscall: BPF_PROG_TYPE_SYSCALL
perf event:BPF_PROG_TYPE_PERF_EVENT
4. MAP 类型
目前支持的 eBPF map 类型有:
BPF_MAP_TYPE_PERF_EVENT_ARRAY
BPF_MAP_TYPE_HASH
后续需要支持的 eBPF map 类型有:
BPF_MAP_TYPE_ARRAY
BPF_MAP_TYPE_PERCPU_HASH
BPF_MAP_TYPE_PERCPU_ARRAY
BPF_MAP_TYPE_RINGBUF: 如果内核版本支持 ringbuffer 的话,我们应该用 ringbuffer 替代 perf buffer
5. 内置函数
print
语法: print(fmt, args)
iphdr
语法: iphdr(skb)
tcphdr
语法: tcphdr(skb)
ntop
语法: ntop(i32 addr)
bswap
语法: bswap(u8 | i8 | u16 | i16 | u32 | i32 | u64 | i64)
kstack
语法: kstack(i32 depth) | kstack()
ns
语法: ns()
pid
语法: pid()
tcpstate
语法: tcpstate(i32 tcpstate)
tcpflags
语法: tcpstate(i32 tcpflags)
timestr
语法: timestr(u64 ts)
ksym
语法: ksym(u64 kernel_address)
reg
语法: reg(string)
6. 内置常量
linux 内核包含了大量的宏常量,比如 #define IPPROTO_TCP 6 。 为此,lwcb 也提供了这些宏常量,使得
用户在写 lwcb 脚本代码时,能够用到内核常用的宏常量。目前已经支持的宏常量如下:
IPPROTO_IP
IPPROTO_TCP
IPPROTO_ICMP
IPPROTO_UDP
也欢迎大家贡献更多的宏常量,相关代码请参考:lwcb/src/cmacro.rs