NG_L2TP(4) | FreeBSD Kernel Interfaces Manual | NG_L2TP(4) |
名称
ng_l2tp — L2TP プロトコル netgraph ノードタイプ解説
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_max と rexmit_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_id と peer_id フィールドは、それぞれローカルとリモートのセッション ID を設定します。
control_dseq と enable_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 を取りますが、ここで xack と nr は、それぞれ ns と rack と同じでなければなりません。ユーザ空間で最初のパケット全体を受信して処理し、さらなる処理をノードに引き渡したいなら、このオプションは、特に役に立ちます。
シャットダウン
このノードは、 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@packetdesign.com>November 13, 2012 | FreeBSD |