NG_SSCOP(4) | FreeBSD Kernel Interfaces Manual | NG_SSCOP(4) |
名称
ng_sscop — netgraph SSCOP ノードタイプ解説
sscop netgraph ノードタイプは、ITU-T 規格 Q.2110 を実装します。この規格は、プライベートとパブリック UNI とパブリック NNI 上のシグナル処理メッセージを運ぶために使用される、いわゆる Service Specific Connection Oriented Protocol (SSCOP) について説明します。このプロトコルは、選択的な承認がある転送プロトコルであり、環境に調整することができます。この実装は、その規格の完全な実装です。ノードの作成した後に、SSCOP インスタンスは、ノードに“enable”メッセージを送信することによって作成しなければなりません。ノードが有効にされるなら、SSCOP パラメータは、検索して、変更することができ、プロトコルは、開始することができます。
ノードは、 NGM_SHUTDOWN メッセージによって、またはすべてのフックが切断される時にシャットダウンされます。
フック
各 sscop ノードには、固定された名前の 3 つのフックがあります:- lower
- このフックは、リモートピアノードとの往復のパケットの転送を確保するノードに接続しなければなりません。通常、これは、AAL5 フックがある ng_atm(4) ノードですが、 sscop ノードは、例えば、IP や UDP のように、どんなパケット転送レイヤ (層) でも仕事をすることができます。ノードは、このフック上で受信されるフロー制御メッセージを取り扱います: NGM_HIGH_WATER_PASSED メッセージを受信するなら、それは、“下位レイヤビシー (lower layer busy)”状態を宣言します。 NGM_LOW_WATER_PASSED メッセージが受信されているなら、ビジー状態は、クリアされます。ノードがこれらのフロー制御メッセージのメッセージ内容を見ないことに注意してください。
- upper
-
これは、SSCOP ユーザへのインタフェースです。このインタフェースは、次のメッセージフォーマットを使用します:
struct sscop_arg { uint32_t sig; uint32_t arg; /* opt. シーケンス番号または クリアバッファ */ u_char data[]; };
sig フィールドは、規格で定義されたシグナルの 1 つです:
enum sscop_aasig { SSCOP_ESTABLISH_request, /* <- UU, BR */ SSCOP_ESTABLISH_indication, /* -> UU */ SSCOP_ESTABLISH_response, /* <- UU, BR */ SSCOP_ESTABLISH_confirm, /* -> UU */ SSCOP_RELEASE_request, /* <- UU */ SSCOP_RELEASE_indication, /* -> UU, SRC */ SSCOP_RELEASE_confirm, /* -> */ SSCOP_DATA_request, /* <- MU */ SSCOP_DATA_indication, /* -> MU, SN */ SSCOP_UDATA_request, /* <- MU */ SSCOP_UDATA_indication, /* -> MU */ SSCOP_RECOVER_indication, /* -> */ SSCOP_RECOVER_response, /* <- */ SSCOP_RESYNC_request, /* <- UU */ SSCOP_RESYNC_indication, /* -> UU */ SSCOP_RESYNC_response, /* <- */ SSCOP_RESYNC_confirm, /* -> */ SSCOP_RETRIEVE_request, /* <- RN */ SSCOP_RETRIEVE_indication, /* -> MU */ SSCOP_RETRIEVE_COMPL_indication,/* -> */ };
コメント中の矢印は、ノードから送られるシグナル (‘
->
’) か、またはノードユーザからノードによって送信される (‘<-
’) かどうかのシグナルの方向を示します。 arg フィールドは、いくつかのシグナルへの引数を含んでいます: それは、PDU シーケンス番号または CLEAR-BUFFER フラグのいずれかです。いくつかの操作のための多くの特別なシーケンス番号があります:- SSCOP_MAXSEQNO
- 最大の正当なシーケンス番号
- SSCOP_RETRIEVE_UNKNOWN
- 転送キューを検索
- SSCOP_RETRIEVE_TOTAL
- 転送バッファとキューを検索
(例えば、 SSCOP_DATA_request のような) ユーザデータを伝えるシグナルに関しては、これらの 2 つのフィールドの後ろに可変サイズのユーザデータが続きます。
upper フックが切断されて、SSCOP インスタンスがアイドル状態でなく、 lower フックは、まだ接続されているなら、 SSCOP_RELEASE_request が、SSCOP 接続を解放するために実行されます。
- manage
-
これは、規格で定義された管理インタフェースです。ここで使用されるデータ構造は、次の通りです:
struct sscop_marg { uint32_t sig; u_char data[]; };
ここで sig は、次の 1 つです
enum sscop_maasig { SSCOP_MDATA_request, /* <- MU */ SSCOP_MDATA_indication, /* -> MU */ SSCOP_MERROR_indication, /* -> CODE, CNT */ };
SSCOP_MDATA シグナルの後に実際の管理データが続きます。ここで、 SSCOP_MERROR シグナルは、次の形式です:
struct sscop_merr { uint32_t sig; uint32_t err; /* エラーコード */ uint32_t cnt; /* エラーカウント */ };
コントロールメッセージ
sscop ノードは、次を加えて、一般的なコントロールメッセージを理解します:- NGM_SSCOP_SETPARAM ( setparam)
-
SSCOP インスタンスの操作パラメータを設定して、次の構造体を取ります:
struct ng_sscop_setparam { uint32_t mask; struct sscop_param param; };
サブ構造体 param は、設定するパラメータを含んでいます、そして、 mask フィールドは、パラメータのどれを設定するか、そして、どれを無視するかを伝えるビットマスクを含んでいます。ビットが設定されるなら、対応するパラメータが設定されます。パラメータは、次の通りです:
struct sscop_param { uint32_t timer_cc; /* ミリ秒単位の timer_cc */ uint32_t timer_poll; /* ミリ秒単位の timer_poll */ uint32_t timer_keep_alive; /* ミリ秒単位の timer_keep_alive */ uint32_t timer_no_response; /* ミリ秒単位の timer_no_response */ uint32_t timer_idle; /* ミリ秒単位の timer_idle */ uint32_t maxk; /* バイト単位の最大ユーザデータ */ uint32_t maxj; /* バイト単位の最大 u-u 情報 */ uint32_t maxcc; /* 制御パケットのための最大再転送 */ uint32_t maxpd; /* 送信 poll の前の最大 vt(pd) */ uint32_t maxstat; /* stat リスト中の最大要素数 */ uint32_t mr; /* 初期ウィンドウ */ uint32_t flags; /* フラグ */ };
flags フィールドは、SSCOP 操作に影響を及ぼす次のフラグを含んでいます:
- SSCOP_ROBUST
- atmf/97-0216 堅牢性の増強を有効にします
- SSCOP_POLLREX
- 各再転送の後に POLL を送信します
ビットマップには、次のビットがあります:
- SSCOP_SET_TCC
- timer_cc 設定
- SSCOP_SET_TPOLL
- timer_poll 設定
- SSCOP_SET_TKA
- timer_keep_alive 設定
- SSCOP_SET_TNR
- timer_no_response 設定
- SSCOP_SET_TIDLE
- timer_idle 設定
- SSCOP_SET_MAXK
- maxk 設定
- SSCOP_SET_MAXJ
- maxj 設定
- SSCOP_SET_MAXCC
- maxcc 設定
- SSCOP_SET_MAXPD
- maxpd 設定
- SSCOP_SET_MAXSTAT
- maxstat 設定
- SSCOP_SET_MR
- 初期ウィンドウを設定
- SSCOP_SET_ROBUST
- SSCOP_ROBUST を設定またはクリア
- SSCOP_SET_POLLREX
- SSCOP_POLLREX を設定またはクリア
ノードは、次の応答で NGM_SSCOP_SETPARAM メッセージに応答します:
struct ng_sscop_setparam_resp { uint32_t mask; int32_t error; };
ここで、 mask は、ユーザが設定することを要求するけれども、設定することができなかったパラメータのビットマスクを含んでいます、そして error は、なぜパラメータが設定されないかを説明する errno(2) コードが設定されます。
- NGM_SSCOP_GETPARAM ( getparam)
- このメッセージは、 sscop_param 構造体の SSCOP インスタンスの現在の操作上のパラメータを返します。
- NGM_SSCOP_ENABLE ( enable)
- このメッセージは、実際の SSCOP インスタンスを作成して、それを初期化します。これが完了するまで、パラメータは、検索も設定もされません、そして、任意のフックで受信されたすべてのメッセージは、破棄されます。
- NGM_SSCOP_DISABLE ( disable)
- SSCOP インスタンスを破壊します。この後、任意のフックのすべてのメッセージも破棄されます。
- NGM_SSCOP_SETDEBUG ( setdebug)
- デバッグフラグを設定します。引数は、 uint32_t です。
- NGM_SSCOP_GETDEBUG ( getdebug)
- 実際のデバッグフラグを検索します。引数は、必要がなく、 uint32_t で応答します。
- NGM_SSCOP_GETSTATE ( getstate)
- uint32_t の SSCOP インスタンスの現在の状態で応答します。ノードが有効にされないなら、検索された状態は、0 です。
フロー制御
フロー制御は、上位と下位のレイヤインタフェースで動作します。下位レイヤインタフェースでは、2 つのメッセージ NGM_HIGH_WATER_PASSED と NGM_LOW_WATER_PASSED は、プロトコルの“下位レイヤビシー (lower layer busy)”状態を宣言するか、クリアするために使用されます。上位のレイヤインタフェースでは、 sscop ノードは、次のフロー制御メッセージ 3 つのタイプを取り扱います:
- NGM_HIGH_WATER_PASSED
- このメッセージが受信されるなら、SSCOP は、受信ウィンドウの動きを停止します。データメッセージが上位レイヤに引き渡されるたびに、受信ウィンドウは、1 つのメッセージで動かされます。これらのアップデートを停止することは、ウィンドウがクローズし始めることを意味し、ピアが現在のウィンドウによって許可されたすべてのメッセージを送信したなら、それは、転送を停止します。これは、上位レイヤがまだ完全なウィンドウのメッセージの量を受信することができなければならないことを意味します。
- NGM_LOW_WATER_PASSED
- これは、自動ウィンドウ更新を再び有効にし、そして、メッセージで示された空間が現在のウィンドウより大きいなら、ウィンドウは、その量によってオープンされます。空間は、 max_queuelen_packets と ngm_queue_state 構造体の current のメンバの違いとして計算されます。
- NGM_SYNC_QUEUE_STATE
- current によって示されるような上位レイヤバッファフィリング (充てん) 状態が high_watermark より等しいか大きいなら、メッセージは、無視されます。これが当てはまらない場合、受信側の空間の量は、 max_queuelen_packets と、自動ウィンドウ更新が high_water_mark と自動ウィンドウ更新が無効である場合の current の違いとして、現在許可されている場合の current の違いとして計算されます。結果の値が現在のウィンドウより大きいなら、現在のウィンドウは、この値までオープンされます。それらが無能にされたなら、自動ウィンドウ更新は、有効にされます。
作者
<harti@FreeBSD.org>October 24, 2003 | FreeBSD |