eBPF msg_verdict 程序的内核入口点在哪里?

问题描述 投票:0回答:1

174a7的linux git log,我知道判决流程如下

  • recv_sock -> str_parser (parse_prog) -> verdict_prog -> skb_send_sock

我想知道只有 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)
ebpf bpf xdp-bpf
1个回答
0
投票

这个

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

)。

© www.soinside.com 2019 - 2024. All rights reserved.