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

名称

ng_pppPPP プロトコル netgraph ノードタイプ

書式

#include < sys/types.h>
#include < netgraph/ng_ppp.h>

解説

ppp ノードタイプは、PPP プロトコルのためのマルチプレクシング (多重化) を実行します。それは、データを含むパケットだけを扱って、プロトコル交渉と制御パケットを別々の制御エンティティ (例えば、ユーザランドデーモン) に転送します。このアプローチ (やり方) は、カーネル実装の速いディスパッチ (処理) とユーザランドの実装の設定の柔軟性を組み合わせます。 PPP ノードタイプは、マルチリンク PPP、Van Jacobson 圧縮、 PPP 圧縮、PPP 暗号化、IP、IPX、および AppleTalk プロトコルを直接サポートします。一つの PPP ノードは、1 つの PPP マルチリンクバンドル (束ばく) に対応します。

バンドル中のそれぞれの PPP リンクへの別々のフック、および直接サポートされたプロトコルに対応するいくつかのフックにあります。圧縮と暗号化において、別々の取り付けられたノードは、実際の仕事を行なう必要があります。使用されたタイプノードは、もちろん交渉されたアルゴリズムに依存します。また、ノードによって直接サポートされなかったどんなプロトコルも扱うために使用される bypass フックがあります。これは、制御プロトコルのすべてを含んでいます: LCP、IPCP、CCP など。通常、このノードは、 ng_socket(4) タイプノードによってユーザランドのデーモンに接続されます。

機能を有効にすること

一般的に、PPP ノードは、特定のリンクか次の機能を有効にします。 (a) それが有効な NGM_PPP_SET_CONFIG メッセージを受け取ったとき、 (b) 対応するフックが接続されているとき。制御エンティティは、ノードの振舞いを制御するために方法 (a) か (b) (または両方) を使用できるようにします。リンクが接続されているが無効にされているとき、トラフィックは、 bypass フック (下記参照) を通してリンク上にまだ流れることができます。

リンクフック

通常の操作の間に、個々の PPP リンクは、フック link0, link1 などに接続されます。 NG_PPP_MAX_LINKS リンクまでサポートされます。これらのデバイス独立のフックは、完全な PPP フレームを送受信します。それは、PPP プロトコル、アドレス、コントロールと情報フィールドを含んでいますが、チェックサムまたは他のどんなリンク特有のフィールドは、含んでいません。

発信フレームでは、プロトコル圧縮が有効にされて、プロトコル番号が圧縮に適しているとき、プロトコルフィールドは、圧縮されます (すなわち、2 バイトの代わりに 1 バイトとして送信します)。圧縮されたか展開されたプロトコルフィールドは、着信フレーム上で受け付けられます。同様に、アドレスと制御フィールドがリンクのために有効にされているなら、アドレスと制御フィールドは、 (規格によって要求される LCP フレームを除いて) 省略されます。着信フレームは、存在しているなら、自動的にアドレスと制御フィールドを取り除きます。

すべての交渉が PPP ノードの外側で扱われるので、リンクは、対応するリンクがネットワークフェーズに到達するまで、 (すなわち、LCP 交渉と認証が成功して完了した) 接続して有効にするべきではありません。そして、PPP ノードは、 NGM_PPP_LINK_CONFIG メッセージによってリンクパラメータに通知されます。

リンクが接続されているが無効にされているとき、すべての受信されたフレームは、 bypass フックに直接転送され、逆に、フレームは、 bypass フックを通して送信されるかもしれません。このモードは、リンク認証フェーズのために適切です。リンクが有効にされるとすぐに、PPP ノードは、リンク上で受信されたフレームを処理し始めます。

圧縮と暗号化

圧縮は、2 つのフック、 compressdecompress によってサポートされます。ノード設定構造の enableCompressionenableDecompression フィールドを切り換えることによって、圧縮 (compression) と展開 (decompression) を有効にすることができます。 (下記を参照してください。) enableCompressionNG_PPP_COMPRESS_SIMPLE に設定されるなら、すべての発信フレームは、 compress フックに送信され、このフックで受信されるすべてのパケットは、圧縮されていると予想されるので、無条件に COMPD タグをそれらに置きます。 enableCompressionNG_PPP_COMPRESS_FULL に設定されるなら、 compress フックで受信されるパケットは、そのまま、再送信されます。コンプレッサ (compressor) ノードは、パケットが圧縮されるなら、タグを置くべきです。 enableDecompressionNG_PPP_DECOMPRESS_SIMPLE に設定されるなら、 COMPD タグでマークされる、それらのフレームのみ、ノードは、 decompress フックに送信します。 enableDecompressionNG_PPP_DECOMPRESS_FULL に設定されるなら、ノードは、すべての着信パケットを decompress フックに送信します。 enableCompressionenableDecompression フィルードをそれぞれ、 NG_PPP_COMPRESS_NONENG_PPP_DECOMPRESS_NONE に設定することによって、圧縮 (compression) と展開 (decompression) を完全に無効にすることができます。

暗号化は、 encryptdecrypt ノードを通して同じように正確に動作します。データは、常に暗号化される前に圧縮され、展開される前に復号化されます。

操作レベル圧縮と暗号化だけが直接サポートされます。リンクレベル圧縮と暗号化は、downstream (下流) ノードによって透過的に扱うことができます。

VAN JACOBSON 圧縮

vjc_ip, vjc_vjcomp, vjc_vjuncomp, vjc_vjip フックのすべてが接続されていて、対応する設定フラグが有効にされるとき、 Van Jacobson 圧縮、そして/または、展開は、アクティブになります。通常、これらのフックは、一つの ng_vjc(4) ノードの対応するフックに接続します。 PPP ノードは、 ng_vjc(4) ノードタイプの“パススルー (pass through)”モードと互換性があります。

バイパスフック

サポートされないプロトコル、または無効にされたか対応するフックが接続されないプロトコルでリンク上でフレームが受け取られるとき、 PPP ノードは、4 バイトの接頭語を先頭に追加された bypass フックでフレームを転送します。接頭語のこの最初の 2 バイトは、フレームが受信された (ネットワーク順で) リンク番号を示します。バンドル (すなわち、マルチリンクプロトコルでカプセル化された) 上で受信されたそのようなフレームに関しては、特別なリンク番号 NG_PPP_BUNDLE_LINKNUM が使用されます。 2 バイトのリンク番号の後は、2 バイトの PPP は、プロトコル番号 (ネットワーク順で) です。 PPP プロトコル番号は、オリジナルのフレームが圧縮されたプロトコルであったとしても 2 バイト長です。

逆に、 bypass フックに書き込まれたどんなデータもこの同じ形式になると仮定されます。 4 バイトのヘッダは、取り除かれ、 PPP プロトコル番号が (たぶん圧縮されて) 先頭に追加されます。そして、フレームは、目的とするリンクの上に配送されます。リンク番号が NG_PPP_BUNDLE_LINKNUM であるなら、フレームをマルチリンクバンドル上に配送します。または、マルチリンクが無効であるなら、(単一の) PPP リンク上に配送します。

通常、制御エンティティが bypass フック上で予期されないパケットを受信するとき、それは、(プロトコルの準備ができていないなら) フレームを落とすか、 (プロトコルを認識しないか、または予想しないなら) LCP プロトコルを拒絶するかのいずれかで応答します。

マルチリンク操作

マルチリンク PPP を有効にするために、対応する設定フラグは、設定し、少なくとも 1 つのリンクを接続しなければなりません。 PPP ノードは、マルチリンクが有効にされないと、接続される 1 つ以上のリンクを許容しないし、マルチリンク操作が活発である間に (例えば、短いシーケンス番号ヘッダ形式)、それは、特定のマルチリンク設定が変えられるのを許容しません。

パケットは、複数の個々のリンクにわたって断片として送信されるので、リンクが PPP ノードをダウンするとき、 NGM_PPP_SET_CONFIG コントロールメッセージによって対応するフックかリンクを無効にするかのいずれかによって、それが直ちに通知されることは、重要です。

各リンクは、レイテンシ (ミリ秒で指定される) と帯域幅 (1 秒あたり 10 バイトで指定される) のための設定パラメータがあります。 PPP ノードは、 ラウンドロビン (round-robin) または 最適化 (optimized) パケット配送のために設定することができます。

ラウンドロビン (round-robin) 配送が設定されると、レイテンシと帯域幅の値は、無視され、PPP ノードは、バンドル中のすべてのリンクにわたるフレームの代わりに、ただ 1 つの断片として単に各フレームを送信します。このスキームは、1 つのリンクが黙って失敗しても、いくつかのパケットがまだ通っているという利点があります。異なった帯域幅のリンクが同じバンドルで存在しているとき、対話的な応答時間では重要なサブ最適の総合的なバンドルレイテンシとサブ最適の総合的なバンドル帯域幅の不利な点があります。

最適化 (optimal) 配送が設定されると、 PPP ノードは、遠くの端で受信された完成したパケットにかかる時間を最小にする方法でリンクを越えてパケットを配信します。これは、各リンクのレイテンシ、帯域幅、と現在のキューの長さを考慮に入れることに関係しています。したがって、これらの数値は、できるだけ正確に設定されるべきです。アルゴリズムは、何らかの計算を必要とするので、非常に遅いマシン、そして/または、非常に速いリンクでは、適切でないかもしれません。

特別な場合として、すべてのリンクに同じレイテンシと帯域幅があるなら、上記のアルゴリズムは、(それが不要であるので) 無効にされ、 PPP ノードは、リンクのすべてにわたってフレームを等しいサイズの部分に断片化します。

フック

このノードタイプは、次のフックをサポートします:
link<N>
個々の PPP リンク番号 <N>
compress
圧縮エンジンと接続
decompress
非圧縮エンジンと接続
encrypt
暗号化エンジンと接続
decrypt
復号化エンジンと接続
vjc_ip
ng_vjc(4) ip フックと接続
vjc_vjcomp
ng_vjc(4) vjcomp フックと接続
vjc_vjuncomp
ng_vjc(4) vjuncomp フックと接続
vjc_vjip
ng_vjc(4) vjip フックと接続
inet
IP パケットデータ
ipv6
IPv6 パケットデータ
atalk
AppleTalk パケットデータ
ipx
IPX パケットデータ
bypass
フックを迂回させます。フレームは、リンク番号と PPP プロトコル番号から成る 4 バイトのヘッダがあります

コントロールメッセージ

このノードタイプは、次を加えて、一般的なコントロールメッセージをサポートします:
NGM_PPP_SET_CONFIG ( setconfig)
このコマンドは、多目的なノードを設定します。これは、マルチリンク PPP、暗号化、圧縮、Van Jacobson 圧縮、IP、IPv6、 AppleTalk と IPX パケット配信を有効にすることを含んでいます。それは、1 リンクごとの設定を含み、リンクを有効にすること、レイテンシ (待ち時間) と帯域幅パラメータの設定、プロトコルフィード圧縮を有効にすることを含んでいます。また、対応するフックが接続されるまでリンクや機能もアクティブでないことに注意してください。このコマンドは、引数として struct ng_ppp_node_conf を取ります:

/* リンクあたりの設定構造体 */ 
struct ng_ppp_link_conf { 
  u_char    enableLink;     /* このリンクを有効 */ 
  u_char    enableProtoComp;/* プロトコルフィールド圧縮を有効 */ 
  u_char    enableACFComp;  /* addr/ctrl フィールド圧縮を有効 */ 
  uint16_t  mru;            /* ピア MRU */ 
  uint32_t  latency;        /* リンクレイテンシ (ミリ秒単位) */ 
  uint32_t  bandwidth;      /* リンク帯域幅 (バイト/秒/10 単位) */ 
}; 
 
/* バンドル設定構造体 */ 
struct ng_ppp_bund_conf { 
  uint16_t  mrru;                   /* マルチリンクピア MRRU */ 
  u_char    enableMultilink;        /* マルチリンクを有効 */ 
  u_char    recvShortSeq;           /* 受信マルチリンク short seq # */ 
  u_char    xmitShortSeq;           /* 送信マルチリンク short seq # */ 
  u_char    enableRoundRobin;       /* 送信全体パケット */ 
  u_char    enableIP;               /* IP データフローを有効 */ 
  u_char    enableIPv6;             /* IPv6 データフローを有効 */ 
  u_char    enableAtalk;            /* AppleTalk データフローを有効 */ 
  u_char    enableIPX;              /* IPX データフローを有効 */ 
  u_char    enableCompression;      /* PPP 圧縮を有効 */ 
  u_char    enableDecompression;    /* PPP 展開を有効 */ 
  u_char    enableEncryption;       /* PPP 暗号化を有効 */ 
  u_char    enableDecryption;       /* PPP 復号化を有効 */ 
  u_char    enableVJCompression;    /* VJ 圧縮を有効 */ 
  u_char    enableVJDecompression;  /* VJ 展開を有効 */ 
}; 
 
struct ng_ppp_node_conf { 
  struct ng_ppp_bund_conf   bund; 
  struct ng_ppp_link_conf   links[NG_PPP_MAX_LINKS]; 
};
NGM_PPP_GET_CONFIG ( getconfig)
struct ng_ppp_node_conf として現在の設定を返します。
NGM_PPP_GET_LINK_STATS ( getstats)
このコマンドは、引数として 2 バイトのリンク番号を取り、対応するリンクのための統計値を含む struct ng_ppp_link_stat を返します。ここで、 NG_PPP_BUNDLE_LINKNUM は、マルチリンクバンドルに対応する有効なリンク番号です。
NGM_PPP_GET_LINK_STATS64 ( getstats64)
NGM_PPP_GET_LINK_STATS と同じですが、64 ビットカウンタを含む struct ng_ppp_link_stat64 を返します。
NGM_PPP_CLR_LINK_STATS ( clrstats)
このコマンドは、引数として 2 バイトのリンク番号を取り、そのリンクのための統計値をクリアします。
NGM_PPP_GETCLR_LINK_STATS ( getclrstats)
NGM_PPP_GET_LINK_STATS と同様ですが、不可分に統計値をクリアします。
NGM_PPP_GETCLR_LINK_STATS64 ( getclrstats64)
NGM_PPP_GETCLR_LINK_STATS と同じですが、64 ビットカウンタを含む struct ng_ppp_link_stat64 を返します。

このノードタイプは、また ng_vjc(4) ノードタイプによって受け付けられたコントロールメッセージを受け付けます。受け付けるとき、これらのメッセージは、もしあれば近くの ng_vjc(4) ノードに単に転送します。個々の PPP リンクが NGM_VJC_RECV_ERROR メッセージ (説明については、 ng_vjc(4) を参照してください) を発生させることができるとき、これは、特に役に立ちます。

シャットダウン

このノードは、 NGM_SHUTDOWN コントロールメッセージを受け取るか、すべてのフックが切断されている時、シャットダウンします。

関連項目

netgraph(4), ng_async(4), ng_iface(4), ng_mppc(4), ng_pppoe(4), ng_vjc(4), ngctl(8) W. Simpson, The Point-to-Point Protocol (PPP), RFC 1661. K. Sklower, B. Lloyd, G. McGregor, D. Carr, and T. Coradetti, The PPP Multilink Protocol (MP), RFC 1990.

歴史

ng_ppp ノードタイプは、 FreeBSD 4.0 で実装されました。

作者

Archie Cobbs <archie@FreeBSD.org>
November 13, 2012 FreeBSD