Linux网络堆栈:使用LKM和dev_add_pack添加协议

And*_*w G 7 networking module protocols linux-kernel

我最近一直在努力熟悉Linux网络堆栈和设备驱动程序(两者都有类似名称的O'Reilly书籍),最终目标是卸载UDP.我已经在网卡上实现了UDP,但现在很难实现......

我没有在这个更大的目标上寻求帮助,而是希望有人可以为我澄清一个特定的片段,我发现它是LKM的一部分,它注册了一个新的协议(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);
Run Code Online (Sandbox Code Playgroud)

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

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

如果这令人困惑,我很抱歉 - 当涉及到改变内核堆栈功能的模块时,我在绕着更大的图片时遇到了一些麻烦.

谢谢

Con*_*ang 1

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

是的。您注册的包类型的 .func() 在设备的 rx 处理程序处理之前在 __netif_receive_skb() 中调用。