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

名称

ng_atmnetgraph ATM ノードタイプ

書式

#include < sys/types.h>
#include < net/if_atm.h>
#include < netgraph.h>
#include < netgraph/atm/ng_atm.h>

解説

atm netgraph ノードタイプによって natm(4) ATM ドライバは、 netgraph(4) ネットワークサブシステムに接続できます。 ng_atm モジュールがロードされるとき、ノードは、自動的にそれぞれの natm(4) ATM インタフェースに作成されます。ノードは、インタフェースと同じ名前に名前付けられます。また、 ng_atm がロードされた後に、ATM カードのためのドライバがロードされても、ノードは作成されます。

atm ノードは、永続的です。インタフェースが削除されるとき、それらは、削除されます。 NGM_SHUTDOWN メッセージは、ノードによって無視されます。

フック

固定の名前の 4 つの特別なフックとユーザが定義する名前の無制限な数のフックがサポートされます。 3 つの固定フックは、 natm(4) システムにおける情報フローで有利な点にアタッチされ、読み込みだけサポートされます。 4 番目の固定されたフックは、他のユーザフックと似た振る舞いをしますが、多くの管理メッセージは、フックに従って送信されます。他のフックは、 atm ノードへのコントロールメッセージを用いて動的に VCI にアタッチすることができ、書き込み、読み込みが可能です。

4 つの固定フックは、次の通りです:

input
これは、ネットワークからの生の入力ストリームへの接続です。このフックが接続されているなら、すべての着信パケットをこのフックの外に配信します。これがすべての入力の出力先を変更することに注意してください。 input が接続されているなら、 natm(4) もユーザフックもどんな入力も見ません。 atm_pseudohdr ( natm(4) 参照) は、実際のデータの先頭に追加されます。
output
これは、ネットワークデバイスへの生の出力ストリームへの接続です。このフックが接続されているなら、すべての発信パケットは、 netgraph システムに引き渡して、ATM ドライバに配信する代わりにフックに配信します。 atm_pseudohdr ( natm(4) 参照) は、実際のデータの先頭に追加されます。
orphans
このフックは、認識されていないすべてのパケットを受信します、すなわち、 natm(4) ソケット、 ng_atm VCI または natm(4) IP のいずれにも属していないものです。 ATM が指向性の接続であり、だれかがこの VCI を開始するときだけ、パケットは、与えられた VCI で受信されるので、パケットは、決して孤立されるべきではありません。しかしながら、1 つの例外があります: 利用者が LLC/SNAP カプセル化パケットがある natm(4) IP を使用するなら、パケットヘッダ中に示される IP プロトコルは、このフックの外に配信されます。 atm_pseudohdr ( natm(4) 参照) は、フックの外へ送信される実際のデータの先頭に追加されます。
manage
このフックは、他方のノードが管理メッセージを受信することを除いて、通常のユーザフック (以下参照) と全く同じように振る舞います。

動的に開始された VCI のためのフックは、名前が 3 つの事前に定義された名前の 1 つと衝突しない限り、 netgraph(4) によって許可されたどんな名前も持つことができます。

動的なフック上でパケットの送信と受信を開始するためには、 NGM_ATM_CPCS_INIT コントロールメッセージを発行しなければなりません。送信と受信を終了するためには、 NGM_ATM_CPCS_TERM メッセージ ( コントロールメッセージ 参照) を送信しなければなりません。これらのフック上で送信され受信されるデータには、追加ヘッダはありません。

コントロールメッセージ

このノードタイプは、次を加えて、一般的なコントロールメッセージをサポートします:
NGM_ATM_GET_IFNAME ( getifname)
ヌル文字 で終了した文字列としてインタフェースの名前を返します。通常、これは、ノードのものと同じ名前です。
NGM_ATM_GET_CONFIG ( getconfig)
インタフェースの設定を定義する構造体を返します:

struct ngm_atm_config { 
 uint32_t pcr;  /* ピークセルレート */ 
 uint32_t vpi_bits; /* 活発な VPI ビットの数 */ 
 uint32_t vci_bits; /* 活発な VCI ビットの数 */ 
 uint32_t max_vpcs; /* 最大 VPC 数 */ 
 uint32_t max_vccs; /* 最大 VCC 数 */ 
};
NGM_ATM_GET_VCCS ( getvccs)
ドライバからオープンしている VCC のテーブルを返します。このテーブルは、ヘッダとエントリの可変サイズの配列から成ります。それぞれオープンしている VCC の 1 つは、次の通りです:

struct atmio_vcctable { 
 uint32_t count;  /* vccs の数 */ 
 struct atmio_vcc vccs[0]; /* VCC の配列 */ 
}; 
struct atmio_vcc { 
 uint16_t flags;  /* フラグ */ 
 uint16_t vpi;  /* VPI */ 
 uint16_t vci;  /* VCI */ 
 uint16_t rmtu;  /* 受信最大 CPCS サイズ */ 
 uint16_t tmtu;  /* 送信最大 CPCS サイズ */ 
 uint8_t  aal;  /* aal タイプ */ 
 uint8_t  traffic; /* トラフィックタイプ */ 
 struct atmio_tparam tparam; /* トラフィックパラメータ */ 
}; 
struct atmio_tparam { 
 uint32_t pcr; /* 24bit: ピークセルレート */ 
 uint32_t scr; /* 24bit: VBR 持続可能セルレート */ 
 uint32_t mbs; /* 24bit: VBR 最大バーストサイズ */ 
 uint32_t mcr; /* 24bit: ABR/VBR/UBR+MCR MCR */ 
 uint32_t icr; /* 24bit: ABR ICR */ 
 uint32_t tbe; /* 24bit: ABR TBE (1...2^24-1) */ 
 uint8_t  nrm; /*  3bit: ABR Nrm */ 
 uint8_t  trm; /*  3bit: ABR Trm */ 
 uint16_t adtf; /* 10bit: ABR ADTF */ 
 uint8_t  rif; /*  4bit: ABR RIF */ 
 uint8_t  rdf; /*  4bit: ABR RDF */ 
 uint8_t  cdf; /*  3bit: ABR CDF */ 
};

また、 natm(4) ソケットを通してオープンされたすべての VCC と IP が表示されるので、これがドライバのテーブルであることに注意してください。しかしながら、それらは、それらのフラグによって識別することができます。 flags フィールドは、次のフラグを含んでいます:

ATM_PH_AAL5
AAL0 の代わりに AAL5 を使用します
ATM_PH_LLCSNAP
AAL5 なら LLC SNAP カプセル化を使用します
ATM_FLAG_NG
これは、netgraph VCC です
ATM_FLAG_HARP
これは、HARP VCC です
ATM_FLAG_NORX
VCC だけを転送します
ATM_FLAG_NOTX
受信専用 VCC
ATMIO_FLAG_PVC
PVC としてチャネルを扱います

ATM_FLAG_NG フラグが設定されるなら、 traffictparam は、重要な情報を含んでいます。

aal フィールドは、次の値の 1 つを含んでいます:

ATMIO_AAL_0
AAL 0 (生のセル)
ATMIO_AAL_34
AAL 3 か AAL 4
ATMIO_AAL_5
AAL 5
ATMIO_AAL_RAW
デバイス特有の生のセル

traffic フィールドは、次の値の 1 つを持つことができます (しかしながら、すべてのドライバがすべてのトラフィックタイプをサポートしません):

ATMIO_TRAFFIC_UBR
ATMIO_TRAFFIC_CBR
ATMIO_TRAFFIC_ABR
ATMIO_TRAFFIC_VBR
NGM_ATM_CPCS_INIT ( cpcsinit)
送受信のための VCC を初期化します。引数は、次の構造体です:

struct ngm_atm_cpcs_init { 
 char  name[NG_HOOKSIZ]; 
 uint32_t flags;  /* フラグ. (if_atm.h) */ 
 uint16_t vci;  /* オープンする VCI */ 
 uint16_t vpi;  /* オープンする VPI */ 
 uint16_t rmtu;  /* 受信最大  PDU */ 
 uint16_t tmtu;  /* 送信最大  PDU */ 
 uint8_t  aal;  /* AAL タイプ (if_atm.h) */ 
 uint8_t  traffic; /* トラフィックタイプ (if_atm.h) */ 
 uint32_t pcr;  /* ピークセルレート */ 
 uint32_t scr;  /* VBR: 持続可能セルレート */ 
 uint32_t mbs;  /* VBR: 最大バーストサイズ */ 
 uint32_t mcr;  /* UBR+: 最小セルレート */ 
 uint32_t icr;  /* ABR: 初期セルレート */ 
 uint32_t tbe;  /* ABR: 転送バッファ露出 */ 
 uint8_t  nrm;  /* ABR: Nrm */ 
 uint8_t  trm;  /* ABR: Trm */ 
 uint16_t adtf;  /* ABR: ADTF */ 
 uint8_t  rif;  /* ABR: RIF */ 
 uint8_t  rdf;  /* ABR: RDF */ 
 uint8_t  cdf;  /* ABR: CDF */ 
};

name フィールドは、送受信が有効にされるべきであるフックの名前です。このフックは、既に接続されていなければなりません。 vpivci フィールドは、それぞれ ATM セルに使用する VPI と VCI 値です。それらは、 ng_atm_config 構造体の maxvpimaxvci フィールドによって与えられた範囲内でなければなりません。 flags フィールドは、フラグ (上記参照) とトラフィックのタイプを説明した他のフィールドを含んでいます。

NGM_ATM_CPCS_TERM ( cpcsterm)
指示されたフック上の送受信を停止します。引数は、次の通りです

struct ngm_atm_cpcs_term { 
 char  name[NG_HOOKSIZ]; 
};
NGM_ATM_GET_STATS ( getstats)
このコマンドは、ノードの統計を含んでいるメッセージを返します。メッセージの構造は、次の通りです:

struct ngm_atm_stats { 
 uint64_t        in_packets; 
 uint64_t        in_errors; 
 uint64_t        out_packets; 
 uint64_t        out_errors; 
};

管理メッセージ

manage フックが接続されているなら、特定のメッセージは、フックに従って送信されます。それらは、 NG_ATM_COOKIE のクッキーがあるピアノードによって受信されます。
NGM_ATM_VCC_CHANGE ( vcc_change)
永続的な VCC は、追加されるか、削除されるか、または変更されます。これは、適切な ILMI トラップ発生させるために ilmid(8) によって使用されます。メッセージの構造体は、次の通りです:

struct ngm_atm_vcc_change { 
 uint32_t node; 
 uint16_t vci; 
 uint8_t  vpi; 
 uint8_t  state; 
};

ここで state は、PVC が削除されたなら 0 で、追加されたか、または変更されたなら 1 です。

フロー制御

ハードウェアドライバがそれをサポートするなら、ノードは、ユーザフックに従ってフロー制御メッセージを発行することができます。これらのメッセージの形式は、 < netgraph/ng_message.h> で説明されています。 atm ノードは、 NGM_HIGH_WATER_PASSEDNGM_LOW_WATER_PASSED メッセージを発生させるかもしれません。最初のものは、ハードウェアドライバがチャネルで出力を停止し、新しいパケットを落とすことを示し、 2 番目のものは、出力が再び有効にされたことを報告します。現在、構造体は、情報で満たされていません。

シャットダウン

対応するインタフェースが存在している限り、ノードは、永続的です。 NGM_SHUTDOWN メッセージを受け付けるとき、すべてのフックは、切断され、ノードは、再初期化されます。 netgraph(4) を通してオープンされたすべての VCC は、クローズされます。 ATM インタフェースがアンロードされるとき、ノードは、見えなくなります。ノードが NGATM_DEBUG でコンパイルされるなら、 0 以外の値に設定されるとき、ノードをシャットダウンさせる sysctl net.graph.atm.allow_shutdown があります。これは、開発だけのためだけを対象としており、設定されるならカーネルパニックを導くかもしれないことに注意してください。

作者

Harti Brandt <harti@FreeBSD.org>
November 2, 2012 FreeBSD