GPIO(Raspberry Piなど)を使用してリンクレイヤのポートコールを実装する方法についての情報がある人がいるかどうか疑問に思います。
アイデアは、ポイントツーポイントカスタムインターフェイス(eth0に似ています)を実装することです。イーサネットモジュールを呼び出すのではなく、このインターフェイスを介してメッセージを送信すると、新しいカーネルモジュール(デバイスドライバ)が呼び出されます。 GPIOを使用するパケット。
私はいくつか知りたいです:
私が知る必要がある同様の例や情報を持つ本/論文/...を知っている人はいますか?私はカーネルモジュールで多くを見つけましたが、新しいインターフェイスをカーネルモジュールと「接続」することについては何も見つかりませんでした。
新しいインターフェイスとして表示するにはTCP / IPを使用する必要がありますか? (私の考えに答えは「はい」です)
私が調査した結果、次のような興味深いWebページが表示されました。
デバイスドライバの実装はいRaspberry Pi(GPIO制御)の場合。
しかし、インターフェイス実装の部分とそれをドライバに「接続」する方法についてはまだわかりません。したがって、新しいインターフェイスを使用すると、ping
IPパケットがデバイスドライバに送信されるため、それをカプセル化してハードウェアで送信する必要があります。
ありがとうございます。答えを得ることを願っています!
答え1
プロトコルがユーザースペースを介してGPIOピンを制御するのに十分であると仮定すると、/sys/class/gpio/
最も簡単な方法はユーザースペースドライバーを作成することですtap
。カーネル文書からlinux/Documentation/networking/tuntap.txt
:
TUN / TAPは、ユーザー空間プログラムのパケット受信と送信を提供します。物理媒体からパケットを受信する代わりに、ユーザ空間プログラムからパケットを受信し、物理媒体を介してパケットを送信するのではなく、ユーザに記録する簡単なポイントツーポイントまたはイーサネットデバイスと考えることができる。宇宙プログラム。
ドライバを使用するには、プログラムが
/dev/net/tun
適切なioctl()を開き、実行してネットワークデバイスをカーネルに登録する必要があります。ネットワークデバイスは選択したオプションに従ってtunXX
表示されます。tapXX,
プログラムがファイル記述子を閉じると、ネットワークデバイスとそのパスの両方が消えます。選択したデバイスタイプに応じて、ユーザースペースプログラムはIPパケット(tunを使用)またはイーサネットフレーム(tapを使用)を読み書きする必要があります。どちらが使用されるかは、ioctl()が提供するフラグによって異なります。
パッケージは以下で提供されます。http://vtun.sourceforge.net/tunチューニングとタップデバイスの使用方法の2つの簡単な例が含まれています。両方のプログラムは両方のネットワークインターフェイス間のブリッジのように動作します。
br_select.c
- 選択されたシステムコールに基づくブリッジング。br_sigio.c
- 非同期ioおよびSIGIO信号に基づくブリッジ。しかし、最良の例はVTunです。http://vtun.sourceforge.net:))
また、Googleで多数のチュートリアルを閲覧することもできます(ほとんどは、tun
イーサネットフレームではなくIPパケットなどのインターフェースに関するものかもしれません)。
最終製品がカーネルモジュールである必要がありますが、tap
デバッグが簡単なのでドライバから始めましょう。ほとんどが機能してもカーネルモジュールに切り替えることができます。