現在の実装では、パケットの選別は ipfw プログラムの ``パイプ'' ルールにより行われます。 dummynet の パイプ においては、帯域幅、遅延、キューサイズ、損失率を設定できます。 これらの設定は ipfw プログラムで行います。 パイプには 1 から 65534 までの番号がつけられます。また、パケットは ipfw の設定によっては複数のパイプを介して送出する事が可能です。
dummynet は IP レベルで動作しますが、ブリッジ拡張機能を有効にすることに より、ブリッジされるパケットをパイプを介して送出できます。
ipfw add pipe NNN ....
また、パイプの設定は下記のコマンドにより行います。
ipfw pipe NNN config bw B delay D queue Q plr P
ただし、帯域幅 B は、bit/s, Kbit/s, Mbit/s, Bytes/s, KBytes/s, MBytes/s で表すことができます。 delay はミリ秒単位で、また、キューサイズはパケット数かバイト数 により指定します。 また、plr はパケットがランダムに失われる割合です。
ipfw を正しく動作させることは簡単ではありません。システムが ルータやブリッジとして機能している場合はなおさらです。
ルータとして機能する場合は、ルーティングされるパケットの入力経路、および、 出力経路に同じルールセットが適用されますので、パケットが同じパイプを 二度通らないように注意してください (本当にそうしたい場合は別です)。
ブリッジとして機能する時は、ブリッジされるパケットに対して、 ipfw フィルタは、入力経路で一度だけ起動されます。
同様に、真の全二重チャネルをシミュレートする場合には、方向の違う 2 つのパイプを用いるようにしてください。 例えば、非対象な双方向のリンクをシミュレートする場合のルールセットは 次のようになるでしょう。
ipfw add pipe 1 ip from A to B out ipfw add pipe 2 ip from B to A in ipfw pipe 1 config bw 1Mbit/s delay 80ms ipfw pipe 2 config bw 128Kbit/s delay 300ms
選別されたパケットは、まず割り当てられたサイズのキューに蓄えられます。
キューに蓄えられたパケットは、プログラムされた速さで取り出され、遅延を
シミュレートするための 2 番目のキューに移されます。
2 番目のキューから取り出される際に、パケットが送られてきたのと同じ
プロトコルスタックに入れられます(例えば ip_input(), ip_output(),
bdg_forward() など)。
これは sysctl の
sys.net.inet.ipfw.one_pass
の設定値に依存します。
パイプから出力されたパケットは、パケットの宛先に転送されるか、
マッチしたルールの後に記述された
ipfw
のルールに再び渡されます。
dummynet はタイマの 1 tick 毎に処理を行います。つまり、処理の周期はカーネル オプションの
options HZ
によって制御されます。デフォルト値 (100) は 10ms 周期を意味します。 高いデータ速度で正確なシミュレーションを行うためには、タイマ 周期を 1ms 以下に設定する必要があるかもしれません。 しかし、プログラムによる I/O (programmed I/O) を用いているインタフェースの中には、 パケットを出力するのにかなりの時間を要するものがあることに注意して ください。つまり、タイマ周期を小さくし過ぎると、タイマの周期に処理が 追い付かず、処理の精度を損なってしまうおそれがあります。
IPFIREWALL - ipfirewall を有効化 (dummynet 使用には必須)。 IPFIREWALL_VERBOSE - ファイアウォールの詳細出力を有効化。 IPFIREWALL_VERBOSE_LIMIT - ファイアウォールの詳細出力を制限。 DUMMYNET - dummynet の処理を有効化。 NMBCLUSTER - ネットワークパケットバッファの大きさを設定。 HZ - タイマの周期を設定。
通常、下記のオプションは必須です。
options IPFIREWALL options DUMMYNET
加えて、設定したすべてのパイプの、帯域幅と遅延時間の積と、キューサイズ の合計によっては、mbuf クラスタ (ネットワークパケットを蓄えておくために使われます) の数を増やす方が良いかもしれません。
net.inet.ip.fw.one_pass
パケットがファイアウォールのコードを一度のみ通るようにしたい場合、 1 に設定します。
net.link.ether.bridge_ipfw
ブリッジされるパケットをファイアウォールのコードに渡したい場合にセットします。
IP_DUMMYNET_CONFIGURE は、パイプの設定を更新します。(または新しい パイプを作成します。)
IP_DUMMYNET_DEL は、マッチするルール番号が存在するすべてのパイプを 削除します。
IP_DUMMYNET_GET は、指定した番号にマッチするパイプを返します。
IP_FW_FLUSH 指定した番号にマッチするパイプをフラッシュします。
カーネルセキュリティレベルが 2 より大きい場合は、 IP_DUMMYNET_GET のみが使用可能です。