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

      前几天去了一个公司再做什么音频会议系统,他们买了一个音频处理芯片,但是这个芯片和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);

感觉有意思?来鼓励一下!
打赏黑光技术

5 thoughts on “在内核模块中直接发送数据到网卡

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

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

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

Leave a Reply

Your email address will not be published. Required fields are marked *