请教怎样直接取以太网帧数据
各位好!
我是个linux新手,毕业设计需要在linux操作系统下用PC机与一个开发板通讯,为了实时性,从数据链路层直接映射到应用层(ASN.1),也就是能直接越过IP和TCP。
我看了一阵子网络编程,又看了些网卡驱动及其相关的代码,感觉很难懂。所以对怎样直接取以太网帧数据没有明确的方法!
敬请各位前辈指点! 谢谢!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
你可以看看linux设备驱动里边网络部分,会对网卡驱动有一些了解
你说的我觉得可以:1、通过修改网卡驱动,可以把本来收到套接字缓冲区skb中的数据直接拷贝到用户空间
2、或者修改网卡驱动,收到网卡ram中的数据直接拷贝到用户空间,而不创建套接字缓冲区。
可能有点错误,就是给你的建议,呵呵
感谢6,7楼的两位提供这么好的思路!
有两种方案可以实现你的需求,其一是使用raw_socket,这在网上可以找到很多资料;其二是你可以自己编写一个内核模块,在该模块中,你可以直接调用网卡驱动的函数进行报文发送,然后你可以注册网络报文的filter函数,来接收从网卡上来的报文,我想这样比较有难度,但是你一旦做好了,也就对Linux底层的网络报文处理很了解了。
直接用PF_PACKET的 raw socket, 或者 netfilter的stolen功能,就可以把链路层帧(包括以太网帧)直接收到用户空间处理,然后在用户空间自己分析。我曾经做过这样的小东西,内核的网络栈可以替换掉。发送的时候也是直接放到底层驱动。不用经过内核的协议栈。
内核不需要作任何变动。
[ 本帖最后由 xiaozhaoz 于 2006-3-30 08:39 编辑 ]
谢谢两位高手提供思路!
这需要你自己动手改写网卡驱动程序。
patrick007说得对
下面这篇论文也许对你有帮助。
http://www.nsfocus.net/index.php ... _id=880&keyword
[ 本帖最后由 jeffshia 于 2006-3-29 19:53 编辑 ]
直接读网卡寄存器,轮询,中断随便,中断好些,网卡没有不支持中断的吧
在没有使用mmu保护的地方,直接干就可以了,
有mmu的情况,我不太清楚,你查下资料
或者参考一下网卡驱动
不好意思,我把问题说清楚些。我的问题是这样的:
在linux系统下,
1. 通过自编的程序能否实现对以太网帧进行直接收发,中间不经过传输层和网络层.
2. 如果可以,需要怎样做?
请各位高手指点!
问题描述的不是很清楚
另,请到google上搜 “零拷贝”,或许有帮助