EN JA
NG_SOURCE(4)
NG_SOURCE(4) FreeBSD Kernel Interfaces Manual NG_SOURCE(4)

名称

ng_sourceトラフィック生成のための netgraph ノード

書式

#include < sys/types.h>
#include < netgraph/ng_source.h>

解説

source ノードは、コントロールメッセージと入力パケットを使用してパラメータの設定に従ったパケットのソースとして振る舞います。 ng_source ノードタイプは主としてテストとベンチマークに使用されます。

フック

source ノードには、2 つのフックがあります: inputoutput です。 output フックは、接続されたままでなければならず、切断はノードをシャットダウンします。

操作

ノードの操作は次の通りです。 input フックで受信されたパケットは内部のキューに入れられます。 output フックが接続されているとき、 ng_source ノードは、 ng_ether(4) ノードタイプには隣のノードがあると仮定します。隣はインタフェース名が問い合わされます。そして、 ng_source ノードは弊害目的のインタフェースのキューを使用します。また、 ng_source ノードは、隣の ng_ether(4) ノードで autosrc オプションを無効にします。インタフェース名が自動的に取得することができないなら、 NGM_SOURCE_SETIFACE コントロールメッセージで明らかにそれを設定するべきです、そして autosrcng_ether(4) ノードで手動でオフにされるべきです。

いったんインタフェースが設定されると、ノードが以前にキューに入れられたパケットを送信し始めるという NGM_SOURCE_START コントロールメッセージを受信次第、接続されたインタフェースと同じくらい速いクロック刻毎に output フックはそれらを使用します。アクティブの間に、クロック刻毎に、ノードは、インタフェースキューで利用可能な空間をチェックして、 output フックで多くのパケットを送信します。いったん開始メッセージで示されたパケットの数が送信されると、または NGM_SOURCE_STOP メッセージを受信次第、ノードは、データを送信するのを停止します。

コントロールメッセージ

このノードタイプは、 NGM_SOURCE_COOKIE がアタッチされている状態で、送信されなければならない、次と同様に一般的なコントロールメッセージをサポートします。
NGM_SOURCE_GET_STATS ( getstats)
次のフィールドを含んでいる構造体を返します。
outOctets
output フックが送出したオクテット/バイトの数。
outFrames
output フックが送出したフレーム/パケットの数。
queueOctets
input フックからキューに入れられたオクテットの数。
queueFrames
input フックからキューに入れられたフレームの数。
startTime
最後の開始メッセージが受信された時間。
endTime
最後の終了メッセージが受信された時間か、または出力パケットカウントが到達された時間。
elapsedTime
endTime - startTime または、現在の時間- startTime のいずれかです。
NGM_SOURCE_CLR_STATS ( clrstats)
getstats ( queueOctetsqueueFrames を除いて) によって返された統計値をクリアして、リセットします。
NGM_SOURCE_GETCLR_STATS ( getclrstats)
getstats と同じですが、同時に統計値をクリアします。
NGM_SOURCE_START ( start)
このメッセージは停止する前に送信するパケットの数である、一つの uint64_t パラメータを必要とします。ノードは、 output フックにキューに入れられたパッケットを送信し始めます。 output フックは、接続されなければなりません、そして、ノードは、インタフェースを設定しなければなりません。
NGM_SOURCE_STOP ( stop)
それがアクティブであるなら、ノードを停止します。
NGM_SOURCE_CLR_DATA ( clrdata)
input フックからキューに入れられたパケットをクリアします。
NGM_SOURCE_SETIFACE ( setiface)
このメッセージは、引数として設定されるインタフェースの名前を必要とします。
NGM_SOURCE_SETPPS ( setpps)
このメッセージは、1 秒ごとに送信されるパケットの量の上限を示す単一の uint32_t パラメータを必要とします。
NGM_SOURCE_SET_TIMESTAMP ( settimestamp)
このメッセージは、タイムスタンプ ( struct timeval の形式で) が転送されるパケットに挿入されるべきであることを指定します。このメッセージは、次のフィールドを含む構造を必要とします:
offset
タイムスタンプが挿入されるパケットの始まりからのオフセット。
flags
タイムスタンプを有効にするために 1 に設定します。
NGM_SOURCE_GET_TIMESTAMP ( gettimestamp)
上記に説明された構造体の形式で現在のタイムスタンプ設定を返します。
NGM_SOURCE_SET_COUNTER ( setcounter)
このメッセージは、カウンタが転送されたパケットに埋め込まれるべきであることを指定します。最大 4 つのカウンタが独立して設定されます。このメッセージは、次のフィールドを含む構造を必要とします:
offset
カウンタが挿入されるパケットの始まりからのオフセット。
flags
カウンタを有効にするために 1 に設定します。
width
カウンタのバイト幅。それは、1、2、または 4 を指定できます。
next_val
カウンタの次の挿入の値。
min_val
カウンタによって使用される最小の値。
max_val
カウンタによって使用される最大の値。
increment
それぞれの挿入の後にカウンタに追加される値。それは、負の値を指定できます。
index
0 から 3 までの設定されるカウンタ。
NGM_SOURCE_GET_COUNTER ( getcounter)
このメッセージは、問い合わせのためのカウンタを指定する単一の uint8_t パラメータを必要とします。上記で説明された構造の形式で現在のカウンタ設定を返します。

シャットダウン

このノードは NGM_SHUTDOWN コントロールメッセージを受け取るか、すべてのフックが切断されているときか、または output フックが切断されているとき、シャットダウンします。

使用例

ノードをインタフェースのための ng_ether(4) ノードにアタッチします。 ng_ether がまだロードされていないなら、利用者は、そうする必要があります。例えば、これらのコマンドは、 ng_ether モジュールをロードして、新しい source ノードの output フックを bge0:orphans フックにアタッチします: ng_ether ノード。

kldload ng_ether 
ngctl mkpeer bge0: source orphans output

この時点で、新しいノードは“ bge0:orphans”として参照することができます。このようにそれ自体の名前をノードに与えることができます:

ngctl name bge0:orphans src0

src0:”として参照できる後、

いったん作成すると、生のバイナリデータとしてパケットをノードに送信することができます。各パケットは、別々の netgraph メッセージで配信されなければなりません。

次の例は、ICMP パケットの 16 進法表現をバイナリに変換して、 nghook(8) を通して source ノードの input フックへ配信するするために短い Perl スクリプトを使用します:

perl -pe 's/(..)[ \t\n]*/chr(hex($1))/ge' <<EOF | nghook src0: input 
ff ff ff ff ff ff 00 00 00 00 00 00 08 00 45 00 
00 54 cb 13 00 00 40 01 b9 87 c0 a8 2b 65 0a 00 
00 01 08 00 f8 d0 c9 76 00 00 45 37 01 73 00 01 
04 0a 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 
16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 
26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 
36 37 
EOF

ノードがキューに入れられたこれらのパケットかあるかチェックするために、利用者はノードの統計を得ることができます:

ngctl msg bge0:orphans getstats 
Args:   { queueOctets=64 queueFrames=1 }

要求に応じて多くのパケットを output フックに送信します:

ngctl msg bge0:orphans start 16

(望まれているなら定期的に状態をとって来て) それらが送信されるのを待つか、または停止メッセージを送信します:

ngctl msg bge0:orphans stop

統計 (ここで、私たちはまた、統計をクリアするために getclrstats を使用する) をチェックします:

ngctl msg bge0:orphans getclrstats 
Args:   { outOctets=1024 outFrames=16 queueOctets=64 queueFrames=1 
startTime={ tv_sec=1035305880 tv_usec=758036 } endTime={ tv_sec=1035305880 
tv_usec=759041 } elapsedTime={ tv_usec=1005 } }

時間は struct timeval にあり、 tv_sec フィールドは、基準時点 (Epoch) 以来の秒であり、 TCL の [クロック形式] か date(1) コマンドを通して日付の文字列に変換することができます:

date -r 1035305880 
Tue Oct 22 12:58:00 EDT 2002

歴史

ng_source ノードタイプは、 FreeBSD 4.8 で実装されました。

作者

Dave Chapeskie
March 1, 2007 FreeBSD