首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我需要构建什么来直接访问内核级的以太网帧位?

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

Stack Overflow用户
提问于 2015-11-03 12:11:00
回答 3查看 1.3K关注 0票数 2

我想检索所有以太网帧的以太网帧位,不管它们是否是我的机器的目标(MAC级)。

这方面的逻辑必须在内核级别。

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-11-03 21:11:53

要接收发送到所有主机的帧,必须以混杂模式设置网络接口。

对于获取帧,您可以使用不同的替代方案:

  1. pcap API (库libpcap)
  2. 数据包套接字:http://man7.org/linux/man-pages/man7/packet.7.html
  3. 看看退潮(我从来没有用过它,所以在这一点上我不确定):http://linux.die.net/man/8/ebtables
  4. 这里提出了netfilter:How to capture network frames in a kernel module

如果您仍然想黑内核,您不需要创建新的以太网设备驱动程序,只需编写一个注册接收来自以太网设备驱动程序的帧的内核模块即可。查看内核文件http://lxr.free-electrons.com/source/net/core/dev.c,您可以从函数开始:

代码语言:javascript
复制
int netif_rx(struct sk_buff *skb)

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

票数 3
EN

Stack Overflow用户

发布于 2015-11-04 06:48:15

有非常好的工具可用于捕获和检索以太网帧。这个工具是tcpdump和wireshark。Tcpdump是命令行实用程序,因为wireshark是基于GUI的实用程序。你可以用你觉得舒服的。有关此工具的更多信息,请参见以下链接:

man.html

chunked/

票数 2
EN

Stack Overflow用户

发布于 2015-11-05 18:34:03

这取决于linux内核的版本,也取决于正在使用的处理器。

通常,您可能需要在网络驱动程序的中断处理程序级别上进行一些更改。通常情况下,一旦接收到数据包,驱动程序就会被中断,相应的接收中断也会被中断。一旦确定接收中断,数据包不应在中断处理程序本身中被完全处理。相反,处理程序将触发一个下半部,它将完成数据包的进一步处理,这是您可能需要确定数据包类型并根据您的要求处理它的地方。另外,请注意,一些NIC将数据直接DMA从sk_buff发送到堆栈。在这种情况下,一旦从DMA获得sk_buff,就可以获取它供您使用(sk_buff持有数据包信息,如数据、报头)。

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

另外,请注意,一些处理器具有基于硬件的分组处理/加速模块,这些模块可以通过配置各自的输入端口来过滤感兴趣的数据包类型/协议。一些硬件模块还可以提取有效载荷的元数据,并按照特定配置的提取/解析规则将其放入缓冲区,而无需用户进行任何干预。

这些是关于以太网帧的检索和处理的几个高级视图,请注意,它与您的系统架构/设计/驱动程序密切相关。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33498803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档