从174a7的linux git log,我知道判决流程如下
我想知道只有 msg_verdict 程序时流程是怎样的。
跟踪 tcp_bpf_sendmsg(),我可以看到套接字被解析,但是它是如何传递到判决部分的?
tcp_bpf_sendmsg
tcp_bpf_send_verdict
sk_psock_msg_verdict
...
prog = READ_ONCE(psock->progs.msg_parser)
...
ret = bpf_prog_run_pin_on_cpu(prog, msg)
这个
progs.msg_parser
BPF 程序实际上是您附加到 BPF_SK_MSG_VERDICT
的程序,即将返回判决的程序(例如 __SK_PASS
)。
这可以通过查看用于查找和更新附加到 sockmap 的程序的内核代码来观察:
static int sock_map_prog_lookup(struct bpf_map *map, struct bpf_prog ***pprog,
u32 which)
{
struct sk_psock_progs *progs = sock_map_progs(map);
...
switch (which) {
case BPF_SK_MSG_VERDICT:
*pprog = &progs->msg_parser;
break;
虽然这看起来可能令人惊讶,但文档证实了这一点:https://docs.kernel.org/bpf/map_sockmap.html(搜索BPF_SK_MSG_VERDICT
)。