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

名称

ng_sscopnetgraph SSCOP ノードタイプ

書式

#include < netnatm/saal/sscopdef.h>
#include < netgraph/atm/ng_sscop.h>

解説

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_PASSEDNGM_LOW_WATER_PASSED は、プロトコルの“下位レイヤビシー (lower layer busy)”状態を宣言するか、クリアするために使用されます。

上位のレイヤインタフェースでは、 sscop ノードは、次のフロー制御メッセージ 3 つのタイプを取り扱います:

NGM_HIGH_WATER_PASSED
このメッセージが受信されるなら、SSCOP は、受信ウィンドウの動きを停止します。データメッセージが上位レイヤに引き渡されるたびに、受信ウィンドウは、1 つのメッセージで動かされます。これらのアップデートを停止することは、ウィンドウがクローズし始めることを意味し、ピアが現在のウィンドウによって許可されたすべてのメッセージを送信したなら、それは、転送を停止します。これは、上位レイヤがまだ完全なウィンドウのメッセージの量を受信することができなければならないことを意味します。
NGM_LOW_WATER_PASSED
これは、自動ウィンドウ更新を再び有効にし、そして、メッセージで示された空間が現在のウィンドウより大きいなら、ウィンドウは、その量によってオープンされます。空間は、 max_queuelen_packetsngm_queue_state 構造体の current のメンバの違いとして計算されます。
NGM_SYNC_QUEUE_STATE
current によって示されるような上位レイヤバッファフィリング (充てん) 状態が high_watermark より等しいか大きいなら、メッセージは、無視されます。これが当てはまらない場合、受信側の空間の量は、 max_queuelen_packets と、自動ウィンドウ更新が high_water_mark と自動ウィンドウ更新が無効である場合の current の違いとして、現在許可されている場合の current の違いとして計算されます。結果の値が現在のウィンドウより大きいなら、現在のウィンドウは、この値までオープンされます。それらが無能にされたなら、自動ウィンドウ更新は、有効にされます。

作者

Harti Brandt <harti@FreeBSD.org>
October 24, 2003 FreeBSD