0

水中音響モデム用の Linux ドライバーを開発するのに苦労しています。私のプロジェクトの一般的なアイデアは、水中ネットワークに IPv6 を導入することです。期待される結果は、水中センサー ネットワークが一般的なインターネット デバイスからアクセスできるようになることです。目標を達成して実装するには、Linux カーネルが提供するルーティング プロトコルを使用できるように、モデムにドライバーを提供する必要があります。ただし、水中通信と一般的な RF 通信の違いにより、フラグメント化、ヘッダー圧縮、メッシュ ルーティングなど、パケットに対していくつかの処理を行う必要があります。ただし、これらのプロセスはすべて透過的である必要があり、モデムは他のネットワーク インターフェイスとして使用する必要があります。

モデムは、シリアル ポートを備えたコンピュータと通信できます。しかし、それを接続するには、pl2303 USB - シリアル コンバーターを使用する必要があります。また、モデムを駆動するデバイスはコンピュータだけでなく、Gumstix と呼ばれる組み込み Linux システムでもあります。私はそれを行うためにいくつかの異なる方法を試しましたが、最終的な目標を達成することはできません.

最初の解決策は、純粋なユーザー モード ドライバーを作成することです。扱いは簡単ですが、eth0 のようなインターフェイスを作成できず、ping も通せません。さらに悪いことに、すべての IPv6 標準を自分で実装する必要があり、実際には時間の無駄だと思います。

2 番目の解決策は、純粋なカーネル モード ドライバーを作成することです。利点は、既存のコードを利用して IPv6 および上位レベルのものを処理できることと、美しいインターフェイスを使用できることです。ただし、シリアル ポートをカーネル モードでファイルとして開くことはお勧めしません。私はそうしようとしましたが、常にガベージバイトを受け取ります。

後で私は3番目の解決策を試しました。シリアルポートから送受信するデーモンプログラムを作成し、ネットリンクソケットを使用してカーネル内のドライバーと通信します。そうしているドライバーがいるのだろうか。ただし、ユーザーが私のドライバーを使用したい場合は、デバイス用にコンパイルして手動で起動する必要があります。さらに、プロセス間通信は信頼できず、カーネルがパケットを受信したかどうかわかりません。

4

1 に答える 1

2

最初の解決策として、「タップ」ドライバーの使用を検討できます。詳細についてDocumentation/networking/tuntap.txtは、カーネル ソースを参照してください。ただし、基本的な考え方は、「タップ」ネットワーク インターフェイスを作成し、カーネル スタックがそのインターフェイスを介して送信するイーサネット パケットを実際にユーザー空間プロセスに配信することです。同様に、ユーザー空間プロセスはタップ インターフェイスにパケットを挿入でき、カーネルはそれらをネットワーク スタックによって受信されたものとして扱います。これにより、ユーザー空間ネットワークの実装をメインのカーネル スタックに接着できるという問題が解決されます。

ただし、カーネルにすべてを実装することも可能です。これは基本的に、PPP または SLIP 実装が行うことです。これらは、シリアル インターフェイスを介して実行されるネットワーク インターフェイスを作成します。ここでの重要な概念は「回線規則」です。カーネル ドライバーでシリアル インターフェイスを開こうとするのではなく、回線規則を開いてから設定するユーザー空間制御が必要です。メインライン カーネルの PPP や IrDA などでこれをモデル化できるはずです (Web で「Linux ライン ディシプリン」を検索すると、記述に関するドキュメントが得られると思います)。

于 2013-02-06T03:54:01.143 に答える