0.1. ebpf如何访问skb 的fileds
- 转换: 所有skb的fields都转换成相对skb结构体头部的偏移量
- 根据偏移量重新校验 bpf指令
- Skb的地址在skb是作为ctx寄存器传递给bfp run函数的。
0.2. BPF CTX与SKB
这里以tcpdump(PF_PACKET)为例,结合函数调用关系说明,
skb是如何被当做ctx参数传递给bpf程序的
注: 内核版本v6.6
0.2.1. 函数调用关系
1 2 3 4 5 6 7 8 9 10 11 12
| --> packet_rcv --> --> run_filter(skb, sk, snaplen) --> --> --> bpf_prog_run_clear_cb --> --> --> --> bpf_prog_run_pin_on_cpu(prog, skb); <== !!! skb作为第二个参数ctx传递 --> --> --> --> --> bpf_prog_run(prog, ctx); --> --> --> --> --> --> __bpf_prog_run(prog, ctx, bpf_dispatcher_nop_func); --> --> --> --> --> --> --> dfunc(ctx, prog->insnsi, prog->bpf_func); dfun是__bpf_prog_run被调用时候的参数,相当于 bpf_dispatcher_nop_func(ctx, prog->insnsi, prog->bpf_func); --> --> --> --> --> --> --> --> bpf_func(ctx, insnsi); bpf_func是bpf_dispatcher_nop_func被调用时候最后一个参数,相当于 prog->bpf_func(ctx, prog->insnsi)
|
0.2.1.1. 函数定义