Linux

UNIX 中的自定義鏈路層協議

  • February 19, 2017

我想知道是否有人知道如何實現使用 GPIO 的鏈路層埠(例如在 Raspberry Pi 中)。

這個想法是實現一個自定義介面(類似於 eth0),它是點對點的,當通過該介面發送消息而不是呼叫乙太網模組時,我的新核心模組(設備驅動程序)將被呼叫,這將使用 GPIO 發送數據包。

我想知道一些事情:

  • 有誰知道任何書/論文/…有類似的例子或我需要知道的資訊?我在核心模組上發現了很多東西,但沒有關於“連接”新介面與核心模組的內容。
  • 如果我希望它顯示為新介面,是否需要使用 TCP/IP 實現?(我想答案是肯定的)

我的研究使我找到了一些有趣的網頁:

但是當涉及到介面實現部分以及如何將其“連接”到驅動程序時,我仍然很迷茫。因此,當我ping使用新介面時,它會將 IP 數據包發送到我的設備驅動程序,因此我應該將其封裝並通過我的硬體發送。

謝謝,希望得到一些答案!

假設您的協議足以通過 控制使用者空間的 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 信號的橋接器。

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

你也可以在Google上搜尋很多教程(儘管大多數可能是關於tun介面的,即 IP 數據包而不是乙太網幀)。

即使最終產品需要是核心模組,我仍然會從tap驅動程序開始,因為它們更容易調試。在大部分已經工作之後,您仍然可以將其轉換為核心模組。

引用自:https://unix.stackexchange.com/questions/346141