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

名称

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

書式

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

解説

l2tp ノードタイプは、RFC 2661 で記述されるように L2TP プロトコルのカプセル化レイヤを実装します。これは、発信パケットのための L2TP パケットヘッダの追加と、着信パケットのための検査と削除を含んでいます。ノードは、L2TP シーケンス番号状態の保守、コントロールセッションパケット確認応答と再送信を操作します。

フック

l2tp ノードタイプは、次のフックをサポートします:
lower
L2TP フレーム。
ctrl
制御パケット。
session_hhhh
セッション 0xhhhh データパケット。

L2TP 制御とデータパケットは、 lower フックを通して L2TP ピア (相手) に送信されて、受信されます。通常、このフックは、L2TP オーバ UDP のための ng_ksocket(4) ノードの inet/dgram/udp フックに接続されるでしょう。

ctrl フックは、ローカル L2TP 管理エンティティ (実体) に接続します。 (L2TP ヘッダのない) L2TP コントロールメッセージは、このフックに送信し、受信します。このフックに書き込まれたメッセージは、信頼できるピアに順番に複写なしに、配達されることが保証されます。

ctrl フックに書き込まれたパケットは、(ネットワーク順に) フレームの先頭に追加された 2 バイトのセッション ID を含まなければなりません。このセッション ID は、発信 L2TP ヘッダにコピーされます。同様に、 ctrl フックから読み込まれたパケットは、受信されたセッション ID を先頭に追加します。

L2TP セッションがいったん作成されると、対応するセッションフックは、セッションのデータフレームを送受信するために使用することができます。セッション ID 0xabcd があるセッションのために、フックは、 session_abcd と名前がつけられます。

コントロールメッセージ

このノードタイプは、次を加えて、一般的なコントロールメッセージをサポートします:
NGM_L2TP_SET_CONFIG ( setconfig)
このコマンドは、ノードの設定を更新します。それは、引数として struct ng_l2tp_config を取ります:

/* ノードのための設定 */ 
struct ng_l2tp_config { 
    u_char      enabled;        /* トラフィックフロー有効 */ 
    u_char      match_id;       /* トンネル id は 'tunnel_id' に 
                                   一致しなければならない */ 
    uint16_t    tunnel_id;      /* ローカルトンネル id */ 
    uint16_t    peer_id;        /* ピアのトンネル id */ 
    uint16_t    peer_win;       /* ピアの最大受信ウィンドウ 
                                   サイズ */ 
    uint16_t    rexmit_max;     /* 失敗の前の最大再送信 */ 
    uint16_t    rexmit_max_to;  /* 再送信間の最大遅延 */ 
};

enabled フィールドは、パケット処理を有効にします。このフィールドは、0 に戻すたびに、シーケンス番号状態がリセットされます。このように、ノードの再利用は、可能です。

tunnel_id フィールドは、コントロール接続のためにローカルトンネル ID を設定します。 match_id フィールドは、 tunnel_id と異なったトンネル ID フィールドで着信 L2TP パケットがどのように扱われるかを決定します。 match_id が 0 でないなら、それらは、落とされます。そうでなければ、それらは、トンネル ID が 0 でない場合にだけ落とされます。それが知られていて、 match_id が SCCRP か SCCCN コントロールメッセージの受理の後に 0 以外に設定されるとすぐに、通常、 tunnel_id は、ローカルトンネル ID に設定されます。

ピアのトンネル ID は、一般的に SCCRQ か SCCRP コントロールメッセージを受け取りの後に学習するとすぐに peer_id で設定されるべきです。この値は、発信パケットのために L2TP ヘッダにコピーされます。

peer_win フィールドは、ピアから受信された“受信ウィンドウサイズ (Receive Window Size)” AVP から設定されるべきです。このフィールドのデフォルト値は、1 です。 0 は、無効の値です。 enabled が 0 でないということならば、この値は、減少できません。

rexmit_maxrexmit_max_to フィールドは、パケットの再送信を設定します。 rexmit_max_to は、秒単位のパケットの間の最大の再送信遅延です。再送信遅延は、小さい値で始まり、この制限まで指数関数的に増加します。パケットの最大の回数が設定された rexmit_max は、失敗状態が宣言される前に承認されないで再送信されます。失敗状態がいったん宣言されると、それぞれの追加した再送信は、 l2tp ノードに最後の NGM_L2TP_SET_CONFIG を送ったノードに戻る NGM_L2TP_ACK_FAILURE コントロールメッセージを送信させます。適切な動作は、制御接続をシャットダウンされるはずです。

NGM_L2TP_GET_CONFIG ( getconfig)
struct ng_l2tp_config として現在の設定を返します。
NGM_L2TP_SET_SESS_CONFIG ( setsessconfig)
このコントロールメッセージは、1 つのデータセッションを設定します。対応するフックは、このコマンドを送る前に、既に接続されていなければなりません。引数は、 struct ng_l2tp_sess_config です:

/* セッションフックのための設定 */ 
struct ng_l2tp_sess_config { 
    uint16_t    session_id;     /* ローカルセッション id */ 
    uint16_t    peer_id;        /* ピアのセッション id */ 
    u_char      control_dseq;   /* データシーケンスを制御するか 
           どうか */ 
    u_char      enable_dseq;    /* データシーケンスを有効にするか 
                                   どうか */ 
    u_char      include_length; /* 長さフィールドを含んでいるか 
           どうか */ 
};

session_idpeer_id フィールドは、それぞれローカルとリモートのセッション ID を設定します。

control_dseqenable_dseq フィールドは、シーケンス番号が L2TP データパケットで使用されるかどうかで決定されます。 enable_dseq が 0 なら、シーケンス番号は、送信されず、着信シーケンス番号は、無視されます。そうでなければ、シーケンス番号は、発信パケットに含まれ、着信パケットでチェックされます。

control_dseq が 0 でなければ、 enable_dseq の設定は、別の NGM_L2TP_SET_SESS_CONFIG コントロールメッセージを除いて、決して変更しません。 control_dseq が 0 であるなら、ピアは、シーケンス番号が使用されるかどうかを制御します: 着信 L2TP データパケットがシーケンス番号を含むなら、 enable_dseq は、1 に設定され、反対に、着信 L2TP データパケットがシーケンス番号を含まないなら、 enable_dseq は、0 に設定されます。 enable_dseq の現在の値は、 NGM_L2TP_GET_SESS_CONFIG コントロールメッセージ (下記参照) を通して常にアクセス可能です。 LAC が control_dseq を 0 に設定している間に (Sequencing Required AVP が送信されなかったなら)、通常、LNS は、 control_dseq を 1 に設定します。したがって、データパケットシーケンスの制御を LNS に与えます。

include_length フィールドは、L2TP ヘッダ長フィールドが発信 L2TP データパケットに含まれているかどうか決定します。着信パケットに関して、L2TP 長さフィールドは、存在すれば、いつもチェックされます。

NGM_L2TP_GET_SESS_CONFIG ( getsessconfig)
このコマンドは、引数として 2 バイトのセッション ID を取り、 struct ng_l2tp_sess_config として対応するデータセッションのために現在の設定を返します。対応するセッションフックは、接続されなければなりません。
NGM_L2TP_GET_STATS ( getstats)
このコマンドは、L2TP トンネルの統計値を含む struct ng_l2tp_stats を返します。
NGM_L2TP_CLR_STATS ( clrstats)
このコマンドは、L2TP トンネルに統計値をクリアします。
NGM_L2TP_GETCLR_STATS ( getclrstats)
NGM_L2TP_GET_STATS と同様ですが、不可分に統計値をクリアします。
NGM_L2TP_GET_SESSION_STATS ( getsessstats)
このコマンドは、引数として 2 バイトのセッション ID を取り、対応するデータセッションのために統計値を含む struct ng_l2tp_session_stats を返します。対応するセッションフックは、接続されなければなりません。
NGM_L2TP_CLR_SESSION_STATS ( clrsessstats)
このコマンドは、引数として 2 バイトのセッション ID を取り、そのデータセッションのための統計値をクリアします。対応するセッションフックは、接続されなければなりません。
NGM_L2TP_GETCLR_SESSION_STATS ( getclrsessstats)
NGM_L2TP_GET_SESSION_STATS と同様ですが、不可分に統計値をクリアします。
NGM_L2TP_SET_SEQ ( setsequence)
このコマンドは、まだ有効にされていないノードのシーケンス番号を設定します。それは、引数として struct ng_l2tp_seq_config を取りますが、ここで xacknr は、それぞれ nsrack と同じでなければなりません。ユーザ空間で最初のパケット全体を受信して処理し、さらなる処理をノードに引き渡したいなら、このオプションは、特に役に立ちます。

シャットダウン

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

関連項目

netgraph(4), ng_ksocket(4), ng_ppp(4), ng_pptpgre(4), ngctl(8) W. Townsley, A. Valencia, A. Rubens, G. Pall, G. Zorn, and B. Palter, Layer Two Tunneling Protocol L2TP, RFC 2661.

歴史

l2tp ノードタイプは、Packet Design, LLC、 http://www.packetdesign.com/ で開発されました。

作者

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