私は、パケット注入機能とモニタモードを備えたWiFiカードで動作するカスタムワイヤレスシステム/ドライバを作成しました。私のプログラムはlibpcapに基づいており、pcap_inject
ワイヤレスデバイスを介してパケットを送信するために使用されます。
着信トラフィックの量に関係なく、1秒あたり1〜2個のパケット発信パケット(ICMP ping)で動作します。しかし、問題は、より速く転送しようとすると(1秒あたり25以上のパケットを処理するためのより有用なプロトコルであるTCP)、バッファが非常に早く不足しているように見え、プログラムにエラーが発生することですFailed to inject packet: send: Resource temporarily unavailable
。
これは私には意味がありません。私のワイヤレスカードが500 Mb / s以上の速度でTCPを処理するのに十分速く転送されることがわかっているので(したがってデバイスのTXリングバッファが飽和しない)、問題は他の場所にあるようです。ドライバ/ファームウェアでのパケット注入はあまり最適化されていませんか? libpcapは一種の重要なバッファを回避し、自分自身を転送しようとしますか?
ベストアンサー1
これは実際には問題ではなく、libpcap
無線エンジニアリングの問題です。私が作業しているチャンネルはすでにかなり騒々しいのですが、これは監督されていないメッシュなので(誰もRTS / CTSと調整しないことを意味します)、モニタモードのWi-Fiカードは「聞いて静かになるまで待つ」に戻ることにしましたしました。この方法は確かに遅く、エラーが発生しやすい。つまり、TXバッファがすぐにいっぱいになり、エラーが発生しますResource temporarily unavailable
。その結果、指数バックオフが発生します。
アイドルチャンネル(2秒に1個のパケットのみ)に切り替えたところ、突然毎秒1,000個を超えるパケットの速度でデータを送信できるようになり、はるかに良くなりました。私の転送速度はまだ非常に良くありませんが(最大約600 KB / s)、少なくとも私にとっては十分に高速です。このブログ投稿は一部のカードはそれほど速く充電できません。
残念ながら、私のワイヤレスカードとそのドライバは非常に控えめな転送動作を無効にする簡単な方法はありません。一部のドライバではバックオフパラメータを操作できます。他の人は、Atherosカードがある場合はCCAを実際に無効にすることができます。