我需要构建什么才能直接访问内核级别的以太网帧位?

时间:2015-11-03 12:11:01

标签: linux-kernel network-programming linux-device-driver ethernet

我想检查线路上所有以太网帧的以太网帧位,无论它们是否是我的机器的目的地(MAC级别)。

  

该逻辑必须在内核级别。

因此,为了实现这一点,我需要构建单独的内核模块以太网驱动程序以太网网络接口

注意:我刚刚开始为我的项目学习Linux内核模块开发。如果不是发布此问题的合适位置,我很抱歉。

3 个答案:

答案 0 :(得分:3)

要接收发往所有主机的帧,必须将网络接口设置为混杂模式。

要获得框架,您可以使用不同的替代方案:

  1. pcap API(库libpcap)
  2. 数据包套接字:http://man7.org/linux/man-pages/man7/packet.7.html
  3. 看看ebtables(我从未使用过它,所以我不确定这一点):http://linux.die.net/man/8/ebtables
  4. 此处建议使用netfilter:How to capture network frames in a kernel module
  5. 如果您仍想破解内核,则无需创建新的以太网设备驱动程序,只需编写一个内核模块,该模块可以注册以接收从以太网设备驱动程序接收的帧。查看内核文件http://lxr.free-electrons.com/source/net/core/dev.c,您可以从函数开始:

    int netif_rx(struct sk_buff *skb)
    

    这是从设备驱动程序接收帧的那个。

答案 1 :(得分:2)

有很好的工具可用于捕获和检索以太网帧。这个工具是tcpdump和wireshark。 Tcpdump是命令行实用程序,其中wireshark是基于GUI的实用程序。您可以使用它们,无论哪种方式都适合您。有关此工具的更多信息,请参阅以下链接:

http://www.tcpdump.org/tcpdump_man.html

https://www.wireshark.org/docs/wsug_html_chunked/

答案 2 :(得分:0)

这取决于Linux内核的版本以及正在使用的处理器。

通常,您可能需要在网络驱动程序的中断处理程序级别进行一些更改。通常,只要收到数据包,驱动程序就会被相应的接收中断中断。一旦确定了接收中断,就不会在中断处理程序本身中完全处理该数据包。相反,处理程序将触发下半部分,该下半部分将对数据包进行进一步处理,这是您可能需要确定数据包类型并根据您的要求处理它的地方。 另外,请注意,某些NIC会直接将数据DMA格式化为sk_buff,并将其发送到堆栈。在这种情况下,sk_buff一旦从DMA获取就可以被提取供你使用(sk_buff保存数据包信息,如数据,标题)。

Netfilter是尝试的好选择之一。它是一个数据包过滤框架(一组挂钩),当数据包遍历相应的挂钩时,会调用回调函数。这反过来可以使您根据您的要求对数据包进行分类/处理。

另外,请注意,某些处理器具有基于硬件的数据包处理/加速器模块,可配置为仅通过配置相应的输入端口来过滤感兴趣的数据包类型/协议。某些硬件模块还可以提取有效负载的元数据,并根据某些已配置的提取/解析规则将其放在缓冲区中,而无需用户进行任何干预。

这些是关于检索的高级别观点。处理以太网帧并注意它与您的系统架构/设计/驱动程序密切相关。