首页 kernel正文

在内核模块中直接发送数据到网卡

helight0 kernel 2010-04-08 76 5

      前几天去了一个公司再做什么音频会议系统,他们买了一个音频处理芯片,但是这个芯片和cpu的接口比较奇怪!atm的接口,但是却没有遵循atm的协议,atm的协议一包是53个字节,但它确实56个字节,而且不是简单的在53之上再加3个字节,是打乱的字节序列!这下没办法了,本来先使用atm的驱动模型来做就可以了!但是最终发现以我现有的技术行不通!而且他们需要在接收处理之后直接通过网络接口再发送出去。        没办法,那就另辟蹊径吧!!!所以做了这样一个测试:在内核中直接接收处理硬件发送来的数据!自己做协议处理!然后在发送到网络接口,这我也先到两种方法:       1。在接收到数据后直接用netlink传输到用户空间,让后处理处理完了使用socket接口再发送出去。        2.在内核接收到数据后直接通过内核的网络socket发送出去! 第一种方法是我以前经常做的方法,已经没有什么新鲜了,第二种方法我以前倒没有做过,感觉比较新鲜,但是以我对内核的了解,这种方法肯定是可以的!所以昨天做了一个小测试。晚上终于调试通过。 程序的执行步骤如下: 1.调用内核的sock接口创建sock 2.然后链接远程主机(这里是链接了一个web服务器主机,这个web服务器是我写的,我可很方便的查看是否有这个内核模块发送的请求)。 3.链接成功后我做了一个http的请求报文, 4.将这个报文发送到要请求的服务器! 5.我在服务器端看到报文完整接收了! (成功!) 一下是使用的关键内核函数: err = sock_create(AF_INET, SOCK_STREAM, 0, &knsock); err = kernel_connect(knsock, (struct sockaddr *)&knsadd, sizeof(struct sockaddr), 0); err = kernel_sendmsg(knsock, &msg, &iov, 1, iov.iov_len); sock_release(knsock);

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

评论

精彩评论
  • 2010-11-24 00:31:18

    hi:
    你服务器端也是在模块里面处理的么?还是作为用户态的?

  • 2011-12-27 08:15:02

    强人。请问下你:可以在用户空间发送数据到自己加载的内核模块吗?如何发送呢?希望不吝赐教阿。

  • 2012-02-02 08:28:47

    可以啊,copy_to_user和copy_from_user,就是最基本的内核和用户太程序交互的两个函数,另外现在目前最常用的是内核的netlink技术,你可以看看这方面的,netlink可以以socket的方式在用户态和内核之间传输大量数据。

  • 2012-04-15 01:08:36

    你好!想请问下这个发送会不会占用很多的cpu资源,是不是数据只要经过一次拷贝(从内核到网卡)?