iproute2 配布にある例
White Paper-QoS protocols and architectures and IP QoS Frequently Asked Questions both by Quality of Service Forum.
この章は Esteve Camps <esteve@hades.udg.es> が執筆しました。
まず最初に、このテーマについて書かれた RFC (RFC2474, RFC2475, RFC2597, RFC2598) を読むことを強くお奨めします。 これらは IETF DiffServ working Group web site および Werner Almesberger web site にあります (彼は Linux で Differentiated Services の機能をサポートするコードを書きました)。
実のところ、自分のローカルなドメインには自前の制限を適用できますが、 他の DS ドメインと接続する際には、 Service Level Agreements を考慮しなければなりません。
しかし、まず最初に、DSMARK qdisc のコマンドとパラメータを見てみましょう。
... dsmark indices INDICES [ default_index DEFAULT_INDEX ] [ set_tc_index ] |
indices: (mask,value) ペアからなるテーブルのサイズ。 最大値は 2^n (ただし n>=0) です。
Default_index: クラス選別器がまったくマッチを見つけられなかった場合のデフォルトとなる、 テーブルエントリのインデックス。
Set_tc_index: dsmark qdisc に、DS フィールドの値を取得して skb->tc_index へ保存するよう指示します。
qdisc コマンドで set_tc_index を宣言していた場合は、 DS フィールドが抽出されて skb->tc_index 変数に保存される。
New_Ds_field = ( Old_DS_field & mask ) | value |
よって新たな値は、 ds_field とマスク値の AND を取り、 続いてその結果を value パラメータと OR したものになる。 このプロセスを理解するには次の図を見てください。
skb->ihp->tos - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - > | | ^ | -- If you declare set_tc_index, we set DS | | <-----May change | value into skb->tc_index variable | |O DS field | A| |R +-|-+ +------+ +---+-+ Internal +-+ +---N|-----|----+ | | | | tc |--->| | |--> . . . -->| | | D| | | | | |----->|index |--->| | | Qdisc | |---->| v | | | | | |filter|--->| | | +---------------+ | ---->(mask,value) | -->| O | +------+ +-|-+--------------^----+ / | (. , .) | | | | ^ | | | | (. , .) | | | +----------|---------|----------------|-------|--+ (. , .) | | | sch_dsmark | | | | | +-|------------|---------|----------------|-------|------------------+ | | | <- tc_index -> | | | |(read) | may change | | <--------------Index to the | | | | | (mask,value) v | v v | pairs table - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -> skb->tc_index |
マーキングはどのように行うのでしょうか。 単に再マークしたいクラスのマスクと値を変えるだけです。 次のコードを見てください。
tc class change dev eth0 classid 1:1 dsmark mask 0x3 value 0xb8 |
これで、TC_INDEX フィルタの動作と、 これをどのように利用するかを説明しました。 なおまた、TC_INDEX フィルタは DS サービスに含まれているのとは 別の設定で用いることも可能です。
TC_INDEX フィルタを宣言する基本的なコマンドは次の通りです:
... tcindex [ hash SIZE ] [ mask MASK ] [ shift SHIFT ] [ pass_on | fall_through ] [ classid CLASSID ] [ police POLICE_SPEC ] |
次に、TC_INDEX の動作モードを説明する例を示します。 強調された単語に注意してください:
tc qdisc add dev eth0 handle 1:0 root dsmark indices 64 set_tc_index tc filter add dev eth0 parent 1:0 protocol ip prio 1 tcindex mask 0xfc shift 2 tc qdisc add dev eth0 parent 1:0 handle 2:0 cbq bandwidth 10Mbit cell 8 avpkt 1000 mpu 64 # EF トラフィッククラス tc class add dev eth0 parent 2:0 classid 2:1 cbq bandwidth 10Mbit rate 1500Kbit avpkt 1000 prio 1 bounded isolated allot 1514 weight 1 maxburst 10 # EF トラフック用の pfifo qdisc tc qdisc add dev eth0 parent 2:1 pfifo limit 5 tc filter add dev eth0 parent 2:0 protocol ip prio 1 handle 0x2e tcindex classid 2:1 pass_on |
TC INDEX FILTER +---+ +-------+ +---+-+ +------+ +-+ +-------+ | | | | | | | |FILTER| +-+ +-+ | | | | | |----->| MASK | -> | | | -> |HANDLE|->| | | | -> | | -> | | | | . | =0xfc | | | | |0x2E | | +----+ | | | | | | | . | | | | | +------+ +--------+ | | | | | | . | | | | | | | | | -->| | . | SHIFT | | | | | | | |--> | | . | =2 | | | +----------------------------+ | | | | | | | | | CBQ 2:0 | | | | | +-------+ +---+--------------------------------+ | | | | | | | +-------------------------------------------------------------+ | | DSMARK 1:0 | +-------------------------------------------------------------------------+ |
Value1 = skb->tc_index & MASK Key = Value1 >> SHIFT |
Value1 = 10111000 & 11111100 = 10111000 Key = 10111000 >> 2 = 00101110 -> 0x2E (16 進) |
最後に、TCINDEX の各パラメータに設定できる値を一覧しておきましょう:
TC Name Value Default ----------------------------------------------------------------- Hash 1...0x10000 Implementation dependent Mask 0...0xffff 0xffff Shift 0...15 0 Fall through / Pass_on Flag Fall_through Classid Major:minor None Police ..... None |