linux - 如何防止内核将数据包传递到网络层?

标签 linux sockets

网卡接收到的帧将由驱动程序处理,然后由Linux内核传递给协议(protocol)栈的上层。

有没有一种简单的方法可以防止内核将数据包传递到网络层?这样我就可以从数据链路层接收帧并自己处理所有数据包(也许应用层程序会被重写)?

我认为重新编译内核是必要的,这应该通过修改 softirq 中的代码或 netif_rx 或每个 cpu 的列表队列中的函数来完成吗?

其实我和一些同学正在尝试在用户空间实现一个简化版的TCP/IP协议(protocol)栈来做练习,我们才刚刚开始。我正在阅读一些书籍,如 UNP、APUE2、TCP/IP 说明 v1、v2、Linux 网络体系结构、linux 源代码等。我还有一些其他问题,我需要再发一个问题吗?

最佳答案

如果你只想自己处理数据包,你可以使用内核模块 netfilter 并实现一些钩子(Hook)。您可以轻松找到一些代码示例。

在你不同的钩子(Hook)中,你可以选择处理数据包并将它还给内核或者丢弃它。它只是一个返回码来改变。

提供一些代码和主题解释的文章:http://www.linuxjournal.com/article/7184

此解决方案可行,实现起来也不太困难,但不确定它是否是解决您问题的自然方法。

关于linux - 如何防止内核将数据包传递到网络层?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14168032/

相关文章:

php - 安装 mqseries PHP 时出现问题 - Ubuntu

php二进制和系统时间戳奇怪的区别

java - python 无法从网络打印解压的 float

java - TableView内容不显示

sockets - 在执行 SSL_read 或 SSL_write 操作之前使用 SSL_want?

PHP 输入值传递给循环

linux - 我需要应用仅提取匹配的模式并使用数学文件进行一些操作

linux - 如何在 Linux 中获取给定语言环境的语言名称

c++ - 如果我不设置 EPOLLOUT 事件并直接调用 write() 函数会发生什么?

php - ReCaptcha - 无法打开套接字