UNIX 中的自定义链路层协议

UNIX 中的自定义链路层协议

我想知道是否有人有关于如何实现使用 GPIO 的链路层 portocol 的信息(例如在 Raspberry Pi 中)。

这个想法是实现一个点对点的自定义接口(类似于 eth0),当通过该接口发送消息而不是调用以太网模块时,将调用我的新内核模块(设备驱动程序),这将使用 GPIO 发送数据包。

我想了解一些事情:

  • 有谁知道有什么书/论文/...有类似的例子或我需要知道的信息吗?我在内核模块上找到了很多东西,但没有找到关于将新接口与内核模块“连接”的信息。

  • 如果我希望它显示为新接口,是否需要使用 TCP/IP 来实现? (我想答案是肯定的)

我的研究引导我访问了一些有趣的网页:

但当涉及到接口实现部分以及如何将其“连接”到驱动程序时,我仍然很迷失。因此,当我使用ping新接口时,它会将 IP 数据包发送到我的设备驱动程序,因此我应该封装它并通过我的硬件发送它。

谢谢,希望能得到一些答案!

答案1

假设您的协议足以通过用户空间控制 GPIO 引脚/sys/class/gpio/,最简单的方法是编写用户空间tap驱动程序。来自内核文档linux/Documentation/networking/tuntap.txt

TUN/TAP为用户空间程序提供数据包接收和发送。它可以被看作是一个简单的点对点或以太网设备,它不是从物理介质接收数据包,而是从用户空间程序接收数据包,而不是通过物理介质发送数据包,而是将它们写入用户空间程序。

为了使用驱动程序,程序必须打开/dev/net/tun并发出相应的 ioctl() 来向内核注册网络设备。网络设备将显示为tunXXtapXX,取决于所选选项。当程序关闭文件描述符时,网络设备和所有相应的路由都会消失。

根据所选设备的类型,用户空间程序必须读取/写入 IP 数据包(使用 tun)或以太网帧(使用 tap)。使用哪一个取决于 ioctl() 给出的标志。

包裹来自http://vtun.sourceforge.net/tun包含两个关于如何使用 tun 和 tap 设备的简单示例。这两个程序都像两个网络接口之间的桥梁一样工作。

  • br_select.c- 基于选择系统调用的桥接。
  • br_sigio.c - 基于异步io和SIGIO信号的桥接。

然而,最好的例子是VTunhttp://vtun.sourceforge.net:))

您还可以在 google 上搜索大量教程(尽管大多数教程可能是关于tun接口的,即 IP 数据包而不是以太网帧)。

即使最终产品需要是内核模块,我仍然会从tap驱动程序开始,因为它们更容易调试。当它的大部分已经可以工作后,你仍然可以将它变成一个内核模块。

相关内容