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

| 2010年4月8日

前几天去了一个公司再做什么音频会议系统,他们买了一个音频处理芯片,但是这个芯片和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); 
看完本文有收获?请分享给更多人

关注「黑光技术」,关注大数据+微服务