gpt4 book ai didi

networking - Linux 网络堆栈 : adding protocols with an LKM and dev_add_pack

转载 作者:行者123 更新时间:2023-12-04 12:43:56 25 4
gpt4 key购买 nike

我最近一直在尝试让自己熟悉 Linux 网络堆栈和设备驱动程序(都有类似命名的 O'Reilly 书籍),最终目标是卸载 UDP。我已经在 NIC 上实现了 UDP,但现在最难的部分......

与其在这个更大的目标上寻求帮助,我希望有人能为我澄清一个我发现的特定片段,它是 LKM 的一部分,它注册了一个新协议(protocol) (OTP),充当设备驱动程序和网络堆栈之间的过滤器。

http://www.phrack.org/archives/55/p55_0x0c_Building%20Into%20The%20Linux%20Network%20Layer_by_lifeline%20&%20kossak.txt

(注意:这篇 Phrack 文章包含三个不同的模块,OTP 的代码在页面底部)

在他的示例的 init 函数中,他有:

    otp_proto.type = htons(ETH_P_ALL); 
otp_proto.func = otp_func;
dev_add_pack(&otp_proto);

其中(如果我理解正确的话)应该将 otp_proto 注册为数据包嗅探器并将其放入 ptype_all 数据结构中。我的问题是关于 dev_add_pack 的。

注册为过滤器的协议(protocol)是否总是放置在 L2 和设备驱动程序之间的这一层?或者,例如,我可以使用相同的进程在应用程序层和传输层(分析套接字参数)之间进行这样的过滤吗?

如果这令人困惑,我深表歉意 - 当涉及到模块更改内核堆栈功能时,我在理解更大的图景时遇到了一些麻烦。

谢谢

最佳答案

当您使用 dev_add_pack 注册协议(protocol)处理程序时,将在数据包到达时调用处理程序回调函数。这就是 IP 协议(protocol)处理程序的工作方式。从 inet_init :

static int __init inet_init(void)
{
...
rc = proto_register(&tcp_prot, 1);
...
rc = proto_register(&udp_prot, 1);
...
dev_add_pack(&ip_packet_type);
....

当 NIC 为到达的数据包引发中断时,NIC 中断处理程序将运行,最终调用 netif_rx(或 __napi_schedule),这将引发 softirq net_rx_action。这将最终为每个注册的协议(protocol)处理程序调用deliver_skb。来自 __netif_receive_skb_core
static int __netif_receive_skb_core(struct sk_buff *skb, bool pfmemalloc)
{
...
list_for_each_entry_rcu(ptype, &ptype_all, list) {
if (pt_prev)
ret = deliver_skb(skb, pt_prev, orig_dev);
pt_prev = ptype;
}

所以是的,您的协议(protocol)处理程序回调函数将在 L2 上调用,以及用于 IP 协议(protocol)处理程序的 ip_rcv。

如果您想在该层调用,您可以使用“proto_register”在 L3 注册协议(protocol)处理程序。

关于networking - Linux 网络堆栈 : adding protocols with an LKM and dev_add_pack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2822398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com