2

dest-ip、source-ipなどの着信パケット情報を確認できるLinux2.6を書きたいと思います。その後、パケットが HOOK に到達するとすぐにこれらの情報を処理するアプリ(アプリ) にこれらの情報を渡します。netfilter moduleIPuser spaceSocket

私は2つの方法を試してみたい:

1. netfilterモジュール内でfifo構造体行を作成し、パケットが に到達するたびhookに、パケット情報を fifo に入れます。/proc/exampleそしてfilesystemの助けを借りて。ユーザー空間アプリがファイルを読み取るたびに/proc/example、FIFO ヘッドからパケット情報が取得されます。

私はkernelプログラムの初心者です。このプログラムは私のカーネルを数回クラッシュさせます。-_-! この方法は可能ですか?

2. netfilter モジュール内で char デバイスを作成し、ユーザー空間アプリがこの char デバイスからパケット情報を読み取ります。しかし、パケットをできるだけ早く確実に取得する方法はまだわかりません。パケットが netfilter フックに到達したときに、カーネルが何らかの信号をユーザー空間アプリに送信し、ユーザー空間アプリがパケット情報を選択しますか?

どうもありがとうございました。

4

4 に答える 4

3

これを行う私の方法: カーネル モジュールを作成して、ネットワーク アクティビティに夢中になるようにします。次に、カーネルからユーザー空間と通信できる Netlink を使用して、データ IPC を渡します。

于 2011-10-06T12:26:53.000 に答える
2

オプション 1 は可能であり、実行可能です。問題は何ですか? しかし、私は通常、 と を使用して通信するために使用user-spacekernel spaceますnetlink

netlink_kernel_create

netlink_kernel_release

nl_sk = netlink_kernel_create(&init_net, 17, 0, recv_cmd, NULL, THIS_MODULE);

netlink_kernel_release(nl_sk);

netlink_unicast
于 2013-02-28T22:03:40.657 に答える
1

最初のメソッドについてはよくわかりませんが、2番目のメソッドを使用すると、ユーザースペースアプリはcharデバイスを唯一のターゲットとしてselect()呼び出しを使用できます-select()が戻るとすぐに、読み取るデータがあります。1パケット分のデータを想定するだけでなく、必ずすべてを読んでください。

于 2009-08-17T16:19:44.650 に答える
1

できるだけ早く とはどういう意味ですか? 実際のハード/ソフト リアルタイム要件はありますか?

オプション 2 を選択すると、キャラクタ デバイスをノンブロッキングで開き、読み取り fd で select() を実行することで、新しいデータをかなり迅速に取得できるはずです。私は、カーネル レベルのソケットで同様のことを行いました。ソケット データは、キャラクター ドライバーを介してユーザー レベルのプロセスに提示されました。ソケットにタイムリーにサービスを提供している限り、待ち時間はほとんどありませんでした。ドライバは、ソフト リアルタイム要件のある環境で使用されましたが、ありふれたカーネル機能でこれらの要件を満たすことに問題はありませんでした。

Linux Device Drivers, 3rd Edition をご覧ください。

于 2009-08-17T17:53:55.707 に答える