我想检查线路上所有以太网帧的以太网帧位,无论它们是否是我的机器的目的地(MAC级别)。
该逻辑必须在内核级别。
因此,为了实现这一点,我需要构建单独的内核模块或以太网驱动程序或以太网网络接口
注意:我刚刚开始为我的项目学习Linux内核模块开发。如果不是发布此问题的合适位置,我很抱歉。
答案 0 :(得分:3)
要接收发往所有主机的帧,必须将网络接口设置为混杂模式。
要获得框架,您可以使用不同的替代方案:
如果您仍想破解内核,则无需创建新的以太网设备驱动程序,只需编写一个内核模块,该模块可以注册以接收从以太网设备驱动程序接收的帧。查看内核文件http://lxr.free-electrons.com/source/net/core/dev.c,您可以从函数开始:
int netif_rx(struct sk_buff *skb)
这是从设备驱动程序接收帧的那个。
答案 1 :(得分:2)
有很好的工具可用于捕获和检索以太网帧。这个工具是tcpdump和wireshark。 Tcpdump是命令行实用程序,其中wireshark是基于GUI的实用程序。您可以使用它们,无论哪种方式都适合您。有关此工具的更多信息,请参阅以下链接:
答案 2 :(得分:0)
这取决于Linux内核的版本以及正在使用的处理器。
通常,您可能需要在网络驱动程序的中断处理程序级别进行一些更改。通常,只要收到数据包,驱动程序就会被相应的接收中断中断。一旦确定了接收中断,就不会在中断处理程序本身中完全处理该数据包。相反,处理程序将触发下半部分,该下半部分将对数据包进行进一步处理,这是您可能需要确定数据包类型并根据您的要求处理它的地方。 另外,请注意,某些NIC会直接将数据DMA格式化为sk_buff,并将其发送到堆栈。在这种情况下,sk_buff一旦从DMA获取就可以被提取供你使用(sk_buff保存数据包信息,如数据,标题)。
Netfilter是尝试的好选择之一。它是一个数据包过滤框架(一组挂钩),当数据包遍历相应的挂钩时,会调用回调函数。这反过来可以使您根据您的要求对数据包进行分类/处理。
另外,请注意,某些处理器具有基于硬件的数据包处理/加速器模块,可配置为仅通过配置相应的输入端口来过滤感兴趣的数据包类型/协议。某些硬件模块还可以提取有效负载的元数据,并根据某些已配置的提取/解析规则将其放在缓冲区中,而无需用户进行任何干预。
这些是关于检索的高级别观点。处理以太网帧并注意它与您的系统架构/设计/驱动程序密切相关。