2012-04-02 19 views
1

私はnetfilterを使ってパケットをフィルタリングしています。今、これらのパケットデータをファイルに配置する必要があります。カーネルからファイルを直接読み書きすることはできないことを知っていますが、私はスプライスを使ってこれを行うことができます。カーネルスペースにパケットを書き込む方法

以前はすべてのパケットをユーザー空間にコピーしてファイルにダンプしようとしましたが、動作が非常に遅く、パケットが欠落していました。私はnetlinkを使ってみましたが、標準のudpソケットを使ってカーネル空間からユーザ空間にコピーしようとしました。私は非常に高いパケットレートを持っているので、この方法では良い結果が得られません。

カーネルスペース内のファイルにパケットを書き込むための良い方法を提案してください。スプライスを使用するアイデアや例があれば、非常に感謝しています。 thnx。

+0

私はあなたがこの[リンク](http://stackoverflow.com/questions/1184274/how-toをチェックすべきだと思いますLinuxカーネルモジュール内の-read-write-files-a-linux-kernel-module) – Raj

答えて

0

あなたはrawソケットを使用してソケットの優先度を上げようとしましたか?これは一般的に、より速いソケット操作が必要なときにトリックを行います。私はまだカーネル空間からファイルを書くのは悪い考えです。特に、パケットデータをファイルにダンプする必要がある場合にはそうです。

あなたが思っているのであれば、copy_to_userの遅延は遅延を引き起こしています(理想的にはそうすべきではありませんが、極端な場合はyes)、カーネルからメモリのチャンクを割り当ててユーザー空間に割り当てます。このプールからskbuffの割り当てを行います。そして、通常のソケットやネットリンクをドアベルにしてください。その後、ユーザスペースから、このエリアからパケットに直接アクセスすることができます。そのいくつかの仕事が、極端な状況で助ける必要があります。

あなたはとにかくそれをしたい場合はしかし、ここで素晴らしい記事です - http://www.linuxjournal.com/node/8110/print

関連する問題