2017-10-10 10 views
0

私はLinuxカーネルの初心者です。私はカーネルモジュールを書いています。このモジュールは複数のUDP音声ストリームを扱います。このモジュールでは、異なる音声ストリームの複数のUDPポートをKernelに登録して、他のUDPトラフィックでこれらのUDPポートを使用できないようにしたいとします。ソケットとバインディングを作成する私の理解ごとに1つの方法です。LinuxカーネルにUDPポートを登録する方法と、このポート範囲のフックを作成する方法

また、これらのUDP音声ポートのフック機能を作成して、受信した音声パケットがフック機能を呼び出すようにしたいと考えています。

私はいくつか質問があります。

  • は、ソケットを作成し、それを結合以外のLinuxカーネルでは複数のUDPポートを登録するための任意のより良い方法はありますか?
  • フック関数を作成し、登録されたこれらの複数のUDP音声ポートに対して呼び出す方法は?
+2

私は尋ねる必要があります - なぜあなたはカーネルでこれをやっていますか? –

+1

@ ShacharShemesh:もしあなたが尋ねなかったなら、私は持っていたでしょう。私にXYの問題のように見えます。 – Olaf

+0

特定の問題について特定の質問をする必要があります。スタックオーバーフローはあなたからの閉鎖理由を隠すので:*「適切な答えを特定するのに十分な詳細で特定の問題に制限するために質問を編集してください。質問。 "* – jww

答えて

1

短い答えはこれです:あなたが尋ねなければならないなら、あなたはそれをしてはいけません。

ここでは長いバージョンです:

TCP/IPプログラミングは、APIがそれを使用してユーザ空間向けですこれらの分野の一つです。その結果、カーネルからTCP/IP(UDPを含む)ソケットを簡単に作成する方法はありません。

あなたがそれを管理しても、あなたが持っているAPIが適切でないことがわかります。コードは、使用時にユーザー空間のメモリ、ユーザー空間の通知などを操作しようとします。

十分な経験を積んだカーネル開発者が、おそらくそれを取り除くことができます。しかし、スタックオーバーフローを開始しなければならない人は、おそらく十分な経験はありません。

これは元の質問に戻ります。どうしてこのようなコードをカーネルに書きたいのですか? Voice over IPは複雑なプロトコルです。カーネル内のコードをデバッグすることは、ユーザーのスペースコードをデバッグすることよりもかなり難しくなります。

パフォーマンスと待ち時間が絶対に必要なコードを作成している場合は、ソリューションを純粋なユーザー空間(つまり、カーネルなし)に基づいて見てみることをお勧めします。

このような解決策は、DPDKです。これにより、ネットワークパケットをユーザー空間バッファーに直接受け取ることができます。残念ながら、これは初心者のためのソリューションではありません。関与するカーネルがないため、DPDK専用にインターフェイスを使用する必要があります。これはまた、独自のUDPスタックを作成してサポートする必要があることを意味します。

DPDKは単純なツールではありませんが、絶対最小の待ち時間で絶対最大帯域幅が必要な場合は、最適な解決策です。カーネルにVoIPスタック全体を書くよりはるかに良いでしょう。それがあなたが必要としているものではない場合は、通常のソケットプログラミングツールを使用してください。

関連する問題