较短的版本
如何使 Linux 上的网络接口从正在运行的进程而不是网络设备驱动程序发送和接收数据包?
加长版
作为我的学士论文,我计划在几个 USRP N210(Ettus 制造的软件定义无线电)之上构建一个自定义无线自组织网络(不是 802.11,而是使用 IP 协议栈),以便在两台计算机之间进行通信。这个想法是在 GNURadio 上实现链路层,使用 USRP 发送和接收无线电信号。
理想情况下,我希望整个通信系统是透明的到主机,就像它只是连接到某个接口(如 eth0 等)的另一个网络一样。所以我一直想知道是否有任何方法可以创建网络接口(图中的 virt0)在 Linux 上,并使其与 GNURadio(使用 Python 和 C++)而不是网络设备驱动程序进行通信。这样做的目的是,GNURadio 环境可以访问需要发送的数据包,并通过 USRP 转发它们(经过一些处理)以供其他主机接收。既然是进程间通信,管道可以吗?
这是我实现我所说的透明度的第一个想法。我还考虑过编写一个虚拟网络驱动程序来与 GNURadio 交互,但鉴于我缺乏设备驱动程序方面的经验,我想避免这种情况。如果您有任何其他想法,将受到欢迎。
答案1
您可以使用以下命令创建可以发送和接收某些程序支持的数据包的网络接口(在您的情况下,该程序将以某种方式连接到 GNU Radio)屯/水龙头界面。
引用Documentation/networking/tuntap.txt
内核源码:
TUN/TAP为用户空间程序提供数据包接收和发送。它可以被看作是一个简单的点对点或以太网设备,它不是从物理介质接收数据包,而是从用户空间程序接收数据包,而不是通过物理介质发送数据包,而是将它们写入用户空间程序。
为了使用驱动程序,程序必须打开
/dev/net/tun
并发出相应的 ioctl() 来向内核注册网络设备。网络设备将显示为tunXX
或tapXX
,具体取决于所选的选项。当程序关闭文件描述符时,网络设备和所有相应的路由都会消失。根据所选设备的类型,用户空间程序必须读取/写入 IP 数据包(使用 tun)或以太网帧(使用 tap)。使用哪一个取决于 ioctl() 给出的标志。
包裹来自http://vtun.sourceforge.net/tun包含两个关于如何使用 tun 和 tap 设备的简单示例。这两个程序都像两个网络接口之间的桥梁一样工作。
br_select.c
- 基于选择系统调用的桥接。
br_sigio.c
- 基于异步io和SIGIO信号的桥接。然而,最好的例子是VTunhttp://vtun.sourceforge.net
另请参阅这堆栈溢出问题。用google可以找到很多教程。