2012-07-06 100 views
-1

我正在通过网络发送数据的Linux内核编写驱动程序。现在假设我要发送的数据(缓冲区)位于内核空间中。如何在不创建套接字的情况下发送数据(首先,这是一个好主意?)。我在代码中寻找性能而不是简单的编码。我如何设计接收端?没有套接字连接,我可以获取并查看接收端上的数据(如何)?如果缓冲区在用户空间中,将会改变所有这些变化(包括性能)(如果有:-),我会从用户那里复制)?通过网络内的网络发送数据

+0

它是什么类型的设备?什么样的网络? – 2012-07-07 06:22:42

+0

好吧,我想实现一个适用于所有网络设备的通用驱动程序。那么我读过太多篇禁止我在内核空间编写网络代码的文章。想要看看笏发生如果我这样做 – Malice 2012-07-09 18:10:20

+0

今天我遇到了一个新的想法。如果我在用户空间中创建套接字描述符并在模块插入驱动程序期间传递它并在卸载它之前使用套接字描述符,它会有意义吗>它仍然可以帮助我节省上下文切换的时间。只是一个随机的想法需要知道这是否比我原来的问题更好 – Malice 2012-07-10 18:30:37

回答

0

如果您希望在没有套接字的情况下在网络上发送数据,您需要挂接到网络驱动程序并通过它们发送原始数据包,并过滤它们的传入数据包以获取您要劫持的数据包。我不认为性能优势足够大以保证这一点。

我甚至没有想过在网络驱动程序中有这样的挂钩,我在过去做了一些相关的实现防火墙。你可以想象使用netfilter挂钩来做类似的事情,以便从网络驱动程序附加到接收端。

+0

嗯。那么现在我开始不喜欢从内核内部通过网络发送数据的想法。可能是我可以创建一个时间套接字描述符并将其传递给内核并永久使用它。看到我上面写的评论 – Malice 2012-07-10 18:33:57

0

您应该使用netlink,如果您想真正与远程主机通信(例如通过TCP/IPv6),请使用用户级代理应用程序。 (所以内核模块使用netlink到你的应用程序代理,它可以使用TCP,甚至可以通过ssh或HTTP远程发送数据,或将它存储在磁盘上...)。

我不认为有一个内核模块直接跟一个遥远的主机是有道理的,否则(如安全问题,过滤,路由,iptables ...)

而真正的瓶颈是几乎总是(物理)网络本身。 1Gbit以太网几乎总是比内核模块或应用程序可持续产生的速度慢得多(以及延迟问题)。

+0

Netlink?我没有创建用户空间应用程序来支持此设备。整个设备位于内核空间。 – Malice 2012-07-07 05:57:18