NG_ATM(4) | FreeBSD Kernel Interfaces Manual | NG_ATM(4) |
名称
ng_atm — netgraph 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 フラグが設定されるなら、 traffic と tparam は、重要な情報を含んでいます。
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 フィールドは、送受信が有効にされるべきであるフックの名前です。このフックは、既に接続されていなければなりません。 vpi と vci フィールドは、それぞれ ATM セルに使用する VPI と VCI 値です。それらは、 ng_atm_config 構造体の maxvpi と maxvci フィールドによって与えられた範囲内でなければなりません。 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_PASSED と NGM_LOW_WATER_PASSED メッセージを発生させるかもしれません。最初のものは、ハードウェアドライバがチャネルで出力を停止し、新しいパケットを落とすことを示し、 2 番目のものは、出力が再び有効にされたことを報告します。現在、構造体は、情報で満たされていません。シャットダウン
対応するインタフェースが存在している限り、ノードは、永続的です。 NGM_SHUTDOWN メッセージを受け付けるとき、すべてのフックは、切断され、ノードは、再初期化されます。 netgraph(4) を通してオープンされたすべての VCC は、クローズされます。 ATM インタフェースがアンロードされるとき、ノードは、見えなくなります。ノードが NGATM_DEBUG でコンパイルされるなら、 0 以外の値に設定されるとき、ノードをシャットダウンさせる sysctl net.graph.atm.allow_shutdown があります。これは、開発だけのためだけを対象としており、設定されるならカーネルパニックを導くかもしれないことに注意してください。作者
<harti@FreeBSD.org>November 2, 2012 | FreeBSD |