2013-02-05 121 views
0

我在为水下声学调制解调器开发Linux驱动程序时遇到了一些麻烦。我的项目的总体思路是将IPv6引入水下网络。预期的结果是水下传感器网络将可以从任何典型的互联网设备访问。为了实现和实现我的目标,我必须为调制解调器提供一个驱动程序,以便我可以使用Linux内核提供的路由协议。但是,由于水下通信和典型RF通信的不同,我必须对数据包进行一些处理,包括分段,报头压缩和网格路由。但是所有这些过程都应该是透明的,调制解调器应该被用作其他网络接口。linux网络驱动程序的问题

调制解调器可以通过串口与计算机通讯。但我必须使用pl2303 USB到串行转换器来连接它。另外驱动调制解调器的设备不仅是计算机,而且还是一个名为Gumstix的嵌入式Linux系统。我尝试了几种不同的方式来做到这一点,但我无法实现我的最终目标。

第一个解决方案是制作纯粹的用户模式驱动程序。它可以很容易处理,但我不能创建一个像eth0这样的接口,但我无法通过它。更糟的是,我必须自己实施所有的IPv6标准,我认为这实际上是浪费时间。

第二个解决方案是制作一个纯粹的内核模式驱动程序。优点是我可以利用现有的代码来处理IPv6和更高级别的东西,并且我可以拥有一个漂亮的界面。但不建议在内核模式下将串口作为文件打开。虽然我试图这样做,但我总是收到一些垃圾字节。

后来我尝试了第三种解决方案。我制作了一个守护程序,用于发送和接收来自串行端口的数据,并使用网络链接套接字与内核中的驱动程序进行通信。我想知道有没有司机这样做。但是,如果任何用户想要使用我的驱动程序,他们必须编译他们的设备并手动启动它。而且,进程间通信是不可靠的,我不知道内核是否收到我的数据包。

+0

不好意思,但是这里有什么问题? – cha0site

+0

我只想问任何关于这项工作的建议。专家将如何解决这个问题。 –

回答

2

对于您的第一个解决方案,您可以使用“tap”驱动程序进行研究。有关详细信息,请参阅内核源代码中的Documentation/networking/tuntap.txt,但其基本思想是创建一个“tap”网络接口,并且内核堆栈想要通过该接口发送的任何以太网数据包实际上都会传送到您的用户空间进程;类似地,您的用户空间进程可以将数据包注入到分接界面,内核会将其视为由网络堆栈接收。这将解决您能够将用户空间网络实现粘合到主内核堆栈中的问题。

但是,在内核中实现所有内容也应该是可行的。毕竟,这基本上是PPP或SLIP实现的功能:它们创建一个通过串行接口运行的网络接口。这里的关键概念是“line discipline” - 而不是试图打开你的内核驱动程序中的串行接口,你想要一些用户空间控制,它打开然后设置行纪律。你应该能够在主线内核中对PPP或IrDA这样的东西进行建模(我相信在Web上搜索“linux line discipline”会给出一些关于编写它的文档)。

+0

谢谢,tap和tun是非常好的起点。我会考虑他们。 –

+0

没问题,我只是注意到我在提交答案之前意外删除了一些线条规则文本,希望现在更有意义。 – Roland