7
Apr

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

      前几天去了一个公司再做什么音频会议系统,他们买了一个音频处理芯片,但是这个芯片和cpu的接口比较奇怪!atm的接口,但是却没有遵循atm的协议,atm的协议一包是53个字节,但它确实56个字节,而且不是简单的在53之上再加3个字节,是打乱的字节序列!这下没办法了,本来先使用atm的驱动模型来做就可以了!但是最终发现以我现有的技术行不通!而且他们需要在接收处理之后直接通过网络接口再发送出去。
       没办法,那就另辟蹊径吧!!!所以做了这样一个测试:在内核中直接接收处理硬件发送来的数据!自己做协议处理!然后在发送到网络接口,这我也先到两种方法:
      1。在接收到数据后直接用netlink传输到用户空间,让后处理处理完了使用socket接口再发送出去。
       2.在内核接收到数据后直接通过内核的网络socket发送出去!
第一种方法是我以前经常做的方法,已经没有什么新鲜了,第二种方法我以前倒没有做过,感觉比较新鲜,但是以我对内核的了解,这种方法肯定是可以的!所以昨天做了一个小测试。晚上终于调试通过。

程序的执行步骤如下:

1.调用内核的sock接口创建sock

2.然后链接远程主机(这里是链接了一个web服务器主机,这个web服务器是我写的,我可很方便的查看是否有这个内核模块发送的请求)。

3.链接成功后我做了一个http的请求报文,

4.将这个报文发送到要请求的服务器!

5.我在服务器端看到报文完整接收了! (成功!)

一下是使用的关键内核函数:

  1. err = sock_create(AF_INET, SOCK_STREAM, 0, &knsock);
  2.  
  3. err = kernel_connect(knsock, (struct sockaddr *)&knsadd, sizeof(struct sockaddr), 0);
  4.  
  5. err = kernel_sendmsg(knsock, &msg, &iov, 1, iov.iov_len);
  6.  
  7. sock_release(knsock);

标签:

迄今为止 还没有评论 ↓

  • 现在暂时没有评论... 在下面的表格里写点什么吧!

发布评论