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

名称

ng_uninetgraph UNI ノードタイプ

書式

#include < netnatm/msg/unistruct.h>
#include < netnatm/sig/unidef.h>
#include < netgraph/atm/ng_uni.h>

解説

uni netgraph ノードタイプは、ATM フーラムシグナル処理 4.0 を実装します。

ノードの作成した後に、UNI インスタンスはノードに“enable”メッセージを送信することによって作成しなければなりません。ノードが有効にされるなら、 UNI パラメータは検索して、変更することができ、プロトコルは、開始することができます。

ノードは NGM_SHUTDOWN メッセージによって、またはすべてのフックが切断される時にシャットダウンされます。

フック

uni ノードには、固定された名前の 3 つのフックがあります:
lower
このフックは、ATM 制御水準のトランスポートレイヤ (層) への UNI プロトコルのインタフェースです。ノードは、このフックで ng_sscfu(4) によってエクスポートされたインタフェースを要求します。
upper
このフックは UNI プロトコルの“ユーザ”インタフェースです。現時点では、標準化されたインタフェースがないので、この実装は事実上、 ITU-T 勧告 Q.2931 と Q.2971 で SDL ダイヤグラムによって指定されたインタフェースに従います。通常は、 ng_ccatm(4) またはスイッチ CAC のいずれかはこのインタフェースでスタックされるはずです。 upper フックのメッセージ形式は以下に説明されます。 netgraph(4) が機能的であるので、それは、時々このフックを接続でのピアノードからキューイングモードに切り換えることに意味があります。

uni ノードの upper インタフェースは ITU-T シグナル処理規格で指定されたインタフェースにならって大まかにモデル化されます。しかしながら、これから 1 つの派生があります: 通常、4 種類のシグナルが存在しています: 要求 (request)、応答 (response)、指示 (indication)、確認 (confirmation)。これらのシグナルは、通常外部のイベント (メッセージの受信) または内部のイベント (タイマか別のシグナル) のいずれかによってトリガされます。このスキームは、エラーの取り扱いが考慮に入れられない場合に完全に非同期なユーザ API のために良く働きます。しかしながら、同期 API とエラーの取り扱いと共に、一つの問題があります。例えば、アプリケーションが接続をセットアップする要求を発行するなら、それは、 SETUP.request シグナルを UNI に送ることによって行われるかもしれません。通常、UNI スタックは SETUP メッセージを送信し、スイッチ (RELEASE、CONNECT、CALL PROCEEDING または ALERTING) からのメッセージを受信するか、または UNI スタックのタイマはタイムアウトします。これらの場合のいずれでも、UNI スタックは、アプリケーションに戻るイベントを報告することが想定され、アプリケーションは、イベントを (同期 API の場合に) アンブロックし、操作します。エラーが起こるとき問題は起こります。 SETUP メッセージを送信するためとタイマを開始するためのメモリがないと仮定してください。この場合、受信メッセージがなくタイマがそれを起こさないので、アプリケーションは、永久にブロックされます。この理由のために、この実装は追加メッセージを使用します: アプリケーションからスタックに送信された各シグナルに関しては、スタックは、エラーコードで応答します。このコードが 0 であるなら、スタックはシグナルを受け付け、アプリケーションはブロックするかもしれません。コードが 0 でないなら、事実上シグナルは無視され、コードは間違ったものを説明します。このシステムは、netgraph インタフェースに基づくメッセージ不足のインタフェースをブロックすることが非常に簡単になります。

upper インタフェースは、次の構造体を使用します:

struct uni_arg { 
 uint32_t sig; 
 uint32_t cookie; 
 u_char  data[]; 
};

sig フィールドは、ユーザから UNI へ、または UNI からユーザに送信される実際のシグナルを含んでいます。 cookie は、相互に関連があるイベントと応答を要求するユーザによって使用することができます。エラー応答、確認または指示が要求か応答でトリガされるなら、要求か応答からのクッキーはスタックからユーザへのメッセージで運び込まれます。 cookie フィールドの後ろにシグナルのための実際のデータが続きます。

シグナルは、次の 1 つです:

enum uni_sig { 
    UNIAPI_ERROR,   /* UNI -> API */ 
 
    UNIAPI_CALL_CREATED,  /* UNI -> API */ 
    UNIAPI_CALL_DESTROYED,  /* UNI -> API */ 
    UNIAPI_PARTY_CREATED,  /* UNI -> API */ 
    UNIAPI_PARTY_DESTROYED,  /* UNI -> API */ 
 
    UNIAPI_LINK_ESTABLISH_request, /* API -> UNI */ 
    UNIAPI_LINK_ESTABLISH_confirm, /* UNI -> API */ 
    UNIAPI_LINK_RELEASE_request, /* API -> UNI */ 
    UNIAPI_LINK_RELEASE_confirm, /* UNI -> API */ 
 
    UNIAPI_RESET_request,  /* API -> UNI */ 
    UNIAPI_RESET_confirm,  /* UNI -> API */ 
    UNIAPI_RESET_indication,  /* UNI -> API */ 
    UNIAPI_RESET_ERROR_indication, /* UNI -> API */ 
    UNIAPI_RESET_response,  /* API -> UNI */ 
    UNIAPI_RESET_ERROR_response, /* API -> UNI */ 
    UNIAPI_RESET_STATUS_indication, /* UNI -> API */ 
 
    UNIAPI_SETUP_request,  /* API -> UNI */ 
    UNIAPI_SETUP_indication,  /* UNI -> API */ 
    UNIAPI_SETUP_response,  /* API -> UNI */ 
    UNIAPI_SETUP_confirm,  /* UNI -> API */ 
    UNIAPI_SETUP_COMPLETE_indication, /* UNI -> API */ 
    UNIAPI_ALERTING_request,  /* API -> UNI */ 
    UNIAPI_ALERTING_indication,  /* UNI -> API */ 
    UNIAPI_PROCEEDING_request,  /* API -> UNI */ 
    UNIAPI_PROCEEDING_indication, /* UNI -> API */ 
    UNIAPI_RELEASE_request,  /* API -> UNI */ 
    UNIAPI_RELEASE_indication,  /* UNI -> API */ 
    UNIAPI_RELEASE_response,  /* API -> UNI */ 
    UNIAPI_RELEASE_confirm,  /* UNI -> API */ 
    UNIAPI_NOTIFY_request,  /* API -> UNI */ 
    UNIAPI_NOTIFY_indication,  /* UNI -> API */ 
    UNIAPI_STATUS_indication,  /* UNI -> API */ 
    UNIAPI_STATUS_ENQUIRY_request, /* API -> UNI */ 
 
    UNIAPI_ADD_PARTY_request,  /* API -> UNI */ 
    UNIAPI_ADD_PARTY_indication, /* UNI -> API */ 
    UNIAPI_PARTY_ALERTING_request, /* API -> UNI */ 
    UNIAPI_PARTY_ALERTING_indication, /* UNI -> API */ 
    UNIAPI_ADD_PARTY_ACK_request, /* API -> UNI */ 
    UNIAPI_ADD_PARTY_ACK_indication, /* UNI -> API */ 
    UNIAPI_ADD_PARTY_REJ_request, /* API -> UNI */ 
    UNIAPI_ADD_PARTY_REJ_indication, /* UNI -> API */ 
    UNIAPI_DROP_PARTY_request,  /* API -> UNI */ 
    UNIAPI_DROP_PARTY_indication, /* UNI -> API */ 
    UNIAPI_DROP_PARTY_ACK_request, /* API -> UNI */ 
    UNIAPI_DROP_PARTY_ACK_indication, /* UNI -> API */ 
 
    UNIAPI_ABORT_CALL_request,  /* API -> UNI */ 
 
    UNIAPI_MAXSIG 
};

シグナルのほとんどの意味は、ITU-T SDL から推定することができます。しかしながら、多くのシグナルは、この実装でユニークです:

UNIAPI_ERROR
これは、以前に言及されたエラー応答です。エラーコードをまたはシグナルがスタックで受け付けられたなら、0 を運びます。
UNIAPI_CALL_CREATED
UNI スタックは、着信 SETUP、または、発信 SETUP を要求するユーザのいずれかから呼び出しインスタンスを作成しました。これは、UNI スタックとユーザの間の呼び出しデータの作成と破壊を同期するために使用されるかもしれません。
UNIAPI_CALL_DESTROYED
呼び出しインスタンスは破壊され、そして、すべてのリソースは解放されました。
UNIAPI_PARTY_CREATED
新しいパーティは既存のポイントツーマルチポイント呼び出しのために作成されました。これは、UNI スタックとユーザの間のパーティデータの作成と破壊を同期するために使用されるかもしれません。
UNIAPI_PARTY_DESTROYED
パーティは、破壊され、そして、すべてのリソースは、解放されました。
UNIAPI_ABORT_CALL_request
これは、どんなメッセージもネットワークに送信しないで、呼び出しインスタンスを破壊して、すべてのリソースを解放するスタックを要求します。
UNIAPI_MAXSIG
これはシグナルではなく、むしろ定義されたシグナルの数を取得する定義です。

それぞれのシグナルの後には < netnatm/sig/unidef.h> で定義された固定サイズの構造体が続きます。

コントロールメッセージ

uni ノードは、次を加えて、標準のコントロールメッセージを理解します:
NGM_UNI_SETDEBUG ( setdebug)
デバッグ機能レベルを設定します。 UNI スタックはデバッグレベルに関連しているそれぞれ多くのデバッグ機能を定義します。デバッグレベルの機能が 0 でないなら、テキスト出力はコンソールに生成されます。メッセージは、次の構造体を使用します:

struct ngm_uni_debug { 
 uint32_t level[UNI_MAXFACILITY]; 
};
NGM_UNI_GETDEBUG ( getdebug)
デバッグ機能レベルを取得します。これは、 ngm_uni_debug 構造体を返します。
NGM_UNI_GET_CONFIG ( get_config)
UNI インスタンスの現在の設定を検索します。このメッセージは、 uni_config 構造体を返します:

struct uni_config { 
 uint32_t proto;  /* どのプロトコル */ 
 uint32_t popt;  /* プロトコルオプション */ 
 uint32_t option; /* 他のオプション */ 
 uint32_t timer301; /* T301 */ 
 uint32_t timer303; /* T303 */ 
 uint32_t init303; /* T303 再転送カウント */ 
 uint32_t timer308; /* T308 */ 
 uint32_t init308; /* T308 再転送カウント */ 
 uint32_t timer309; /* T309 */ 
 uint32_t timer310; /* T310 */ 
 uint32_t timer313; /* T313 */ 
 uint32_t timer316; /* T316 */ 
 uint32_t init316; /* T316 再転送カウント */ 
 uint32_t timer317; /* T317 */ 
 uint32_t timer322; /* T322 */ 
 uint32_t init322; /* T322 再転送カウント */ 
 uint32_t timer397; /* T397 */ 
 uint32_t timer398; /* T398 */ 
 uint32_t timer399; /* T399 */ 
};

フィールド proto は、次のプロトコルの 1 つを指定します:

enum uni_proto { 
 UNIPROTO_UNI40U, /* UNI4.0 ユーザ側 */ 
 UNIPROTO_UNI40N, /* UNI4.0 ネットワーク側 */ 
 UNIPROTO_PNNI10, /* PNNI1.0 */ 
};

いくつかのプロトコルには、 popt に設定することができるオプションがあります:

enum uni_popt { 
 UNIPROTO_GFP,  /* GFP 有効 */ 
};

option フィールドは、メッセージの解析とチェックを制御します:

enum uni_option { 
 UNIOPT_GIT_HARD, /* GIT IE のより強力なチェック */ 
 UNIOPT_BEARER_HARD, /* BEARER IE のより強力な 
       チェック */ 
 UNIOPT_CAUSE_HARD, /* CAUSE IE のより強力なチェック */ 
};

すべてのタイマ値は、ミリ秒で与えられます。しかしながら、タイマの実際の分解能はシステム設定 ( timeout(9) 参照) によって決まることに注意してください。

NGM_UNI_SET_CONFIG ( set_config)
UNI 設定を変更します。これは、次を取ります

struct ngm_uni_set_config { 
 struct uni_config  config; 
 struct ngm_uni_config_mask mask; 
}; 
struct ngm_uni_config_mask { 
 uint32_t mask; 
 uint32_t popt_mask; 
 uint32_t option_mask; 
};

ngm_uni_config_mask のフィールドは、変更する設定パラメータを指定します。 mask フィールドは、すべてのタイマ、再転送カウンタと proto フィールド、変更されるプロトコルオプションを選択する popt_mask のためビット定義を含んでいます、そして option_mask は変更されるべきであるオプションを指定します。次のビットは、次の通りに定義されます:

enum uni_config_mask { 
 UNICFG_PROTO, 
 UNICFG_TIMER301, 
 UNICFG_TIMER303, 
 UNICFG_INIT303, 
 UNICFG_TIMER308, 
 UNICFG_INIT308, 
 UNICFG_TIMER309, 
 UNICFG_TIMER310, 
 UNICFG_TIMER313, 
 UNICFG_TIMER316, 
 UNICFG_INIT316, 
 UNICFG_TIMER317, 
 UNICFG_TIMER322, 
 UNICFG_INIT322, 
 UNICFG_TIMER397, 
 UNICFG_TIMER398, 
 UNICFG_TIMER399, 
};

popt_maskoption_mask のためには、 enum uni_poptenum uni_option の定義が使用されるべきです。

NGM_UNI_ENABLE ( enable)
UNI インスタンスを作成し、処理を有効にします。 UNI が有効にされる前には、パラメータを検索するか設定することはできません。
NGM_UNI_DISABLE ( disable)
UNI インスタンスを破壊し、すべてのリソースを解放します。その接続は、解放されないことに注意してください。

作者

uni netgraph ノードとこのマニュアルページは、 Harti Brandt <harti@FreeBSD.org>によって書かれました。

バグ

  • LIJ ((leaf-initiated-join) リーフ開始された結合) は、まだ実装されていません。
  • GFP (一般的な関数プロトコル、Q.2932.1) は、まだ実装されていません。
  • より多くのテストが必要です。
  • PNNI は、まだ実装されていません。
  • 接続変更と Q.2931 修正案を実装することが必要です。
October 6, 2003 FreeBSD