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

名称

ng_l2capBluetooth 論理リンク制御とアダプテーションプロトコル (Logical Link Control and Adaptation Protocol (L2CAP)) を実装する Netgraph ノードタイプ

解説

l2cap ノードタイプは、Bluetooth 仕様本 v1.1 の章 D に従って Bluetooth 論理リンク制御とアダプテーションプロトコル (Logical Link Control and Adaptation Protocol) を実装する Netgraph ノードタイプです。

L2CAP は、プロトコル多重化ケーパビリティで上位プロトコルへの接続指向でコネクションレスデータサービス、セグメンテーション (分割) と再構築操作、グループ抽象化を提供します。 L2CAP は、高位レベルプロトコルでアプリケーションが L2CAP データパケットで最大 64 キロバイトまでの長さを送受信することを可能にします。

L2CAP のアサンプション (前提)

  1. 2 つのユニットの間の ACL リンクがセットアップされます。 Baseband は、個々のパケットの不正と複写があるかもしれませんが、データパケットの規則的な配信を提供します。任意の 2 つのデバイスの間に、わずか 1 つの ACL リンクが存在します。
  2. Baseband は、常に全二重通信チャネルを提供します。これは、すべての L2CAP 通信が双方向であることを意味しません。マルチキャストと単方向のトラフィック (例えば、ビデオ) は、二重のチャネルを必要としません。
  3. L2CAP は、Baseband レイヤ (層) で利用可能なメカニズムを使用して信頼性のあるチャネルを提供します。 Baseband は、要求されるとき常にデータ整合性チェックを実行し、肯定応答が成功するか、またはタイムアウトが起こるまで、データを再送します。肯定応答が失われるかもしれないので、データの送信が成功した後でも、タイムアウトが起こるかもしれません。

L2CAP の一般的な操作

論理リンク制御とアダプテーションプロトコル (Logical Link Control and Adaptation Protocol) (L2CAP) は、“チャネル”の概念に基づいています。各チャネルは、多対一の方法で単一のプロトコルにバインドされます。複数のチャネルは、同じプロトコルにバインドできますが、チャネルは、複数のプロトコルにバインドすることはできません。チャネルで受信された各 L2CAP パケットは、適切な高いレベルのプロトコルを対象としています。

L2CAP チャネルのエンドポイントの各々は、チャネル識別子によって参照されます。チャネル識別子 (CID) は、デバイスで論理チャネルエンドポイントを表すローカル名です。 0x0001 から 0x003F までの識別子は、特定の L2CAP 関数のために予約されています。 null 識別子 (0x0000) は、不正な識別子と定義されていて、宛先 (終点) エンドポイントとして決して使用してはいけません。すべての L2CAP シグナル処理コマンドは、CID 0x0001 に送信されます。 CID 0x0002 は、グループ指向のチャネルのために予約されています。同じ CID は、ローカルデバイスとあるリモートデバイスの間の複数の同時 L2CAP チャネルのためのローカル L2CAP チャネルエンドポイントとして再利用してはいけません。

CID 割り当ては、特定のデバイスに関連しています、そして、デバイスは、他のデバイスから独自に CID を割り当てることができます。したがって、たとえ同じ CID 値が、単一のローカルデバイスに接続されたいくつかのリモートデバイスによって (リモート) チャネルエンドポイントに割り当てられたとしても、ローカルデバイスは、まだ唯一異なったデバイスでそれぞれのリモート CID に関連づけることができます。

チャネル操作状態

NG_L2CAP_CLOSED
この状態では、この CID に関連しているチャネルはありません。これは、リンクレベル接続 (ベースバンド) が存在しないときの唯一の状態です。リンクの切断は、他のすべての状態を強制的に NG_L2CAP_CLOSED 状態にします。
NG_L2CAP_W4_L2CAP_CON_RSP
この状態では、CID は、ローカルエンドポイントを表し、 L2CAP 接続要求メッセージがこの参照エンドポイントに送信され、そして、現在、対応する L2CAP 接続要求メッセージを待っています。
NG_L2CAP_W4_L2CA_CON_RSP
この状態では、リモートエンドポイントが存在し、 L2CAP 接続要求は、ローカル L2CAP エンティティによって受信されます。 L2CA 接続指示は、上位レイヤ (層) に送信されました、そして、受信された L2CAP 接続要求を処理するローカル L2CAP エンティティの部分は、対応する応答を待っています。応答は、セキュリティチェックを実行することを必要とするかもしれません。
NG_L2CAP_CONFIG
この状態では、接続は確立されましたが、両側は、まだチャネルパラメータをネゴシエートしています。また、チャネルパラメータが再ネゴシエートされているとき、設定状態に入るかもしれません。 NG_L2CAP_CONFIG 状態に入る前に、データトラフィックのトラフィックパラメータが再ネゴシエートされるので、すべての発信データトラフィックは、サスペンドされます。着信データトラフィックは、リモートチャネルエンドポイントが NG_L2CAP_CONFIG 状態に入るまで、受け付けられます。 NG_L2CAP_CONFIG 状態では、デフォルトだけが使用されているなら、両側は、 L2CAP 設定要求メッセージを発行して、null メッセージが送信されます。大量のパラメータがネゴシエートされる必要があるなら、任意の MTU 制限とネゴシエートが増加するのを避けるために複数のメッセージが送信されます。 NG_L2CAP_CONFIG 状態から NG_L2CAP_OPEN 状態に移行することは、両側が準備ができていることを必要とします。最終的な要求への肯定応答を受信し、リモートデバイスから最終的な要求に肯定的に応答したとき、 L2CAP エンティティは、準備ができています。
NG_L2CAP_OPEN
この状態では、接続は、確立されて設定されています、そして、データフローは、続行されます。
NG_L2CAP_W4_L2CAP_DISCON_RSP
この状態では、接続は、シャットダウンされ、L2CAP 切断要求メッセージが送信されました。この状態は、現在、対応する応答を待っています。
NG_L2CAP_W4_L2CA_DISCON_RSP
この状態では、リモートエンドポイントおける接続は、シャットダウンしてています、そして、L2CAP 切断要求メッセージが受信されました。 L2CA 切断指示は、リモートエンドポイントがクローズされている CID の所有者に通知するために上位レイヤ (層) に送信されました。この状態は、現在、リモートエンドポイントに応答する前に、上位レイヤ (層) から対応する応答を待っています。

プロトコル多重化

Baseband プロトコルがそれの上に多重化される高位レイヤ (層) プロトコルを識別するどんな“type”フィールドもサポートしないので、L2CAP は、プロトコル多重化をサポートします。 L2CAP は、Service 発見プロトコル、RFCOMM や Telephony 制御などの上位レイヤ (層) プロトコルを識別することができます。

分割 (セグメンテーション) と再構築

Baseband プロトコルによって定義されたデータパケットは、サイズが制限されています。大きい L2CAP パケットは、無線でそれらを転送する前に、複数のより小さい Baseband パケットに分割 (セグメント化) しなければなりません。同様に、複数の受信された Baseband パケットは、単一の大きな L2CAP パケットに組み立て直すことができます。

サービスの品質

L2CAP 接続が確立したプロセスは、2 つの Bluetooth ユニットの間で期待されたサービスの質 (QoS) に関する情報の交換することができます。

グループ

Baseband プロトコルは、piconet の概念、共に同じクロックを使用する同期ポッピングデバイスのグループをサポートします。 L2CAP グループ抽象化は、効率的にプロトコルグループを piconets にマップするための実装を許します。

次の機能は、L2CAP の責任の範囲の外です:

  • L2CAP は、SCO リンクに指定されたオーディオを転送しません。
  • L2CAP は、信頼性のあるチャネルまたはデータの整合性を保証することをしません。すなわち、L2CAP は、再転送もチェックサム計算も実行しません。
  • L2CAP は、信頼性のあるマルチキャストチャネルをサポートしません。
  • L2CAP は、グローバルなグループ名の概念をサポートしません。

フック

このノードタイプは、次のフックをサポートします:
hci
Bluetooth ホストコントローラインタフェースの downstream (下流) フックです。
l2c
上位レイヤ (層) プロトコルの upstream (上流) フックです。通常、 Bluetooth L2CAP ソケットレイヤは、フックに接続されます。
ctl
制御フックです。通常、Bluetooth の生の L2CAP ソケットレイヤは、フックに接続されます。

上位レイヤプロトコルとのインタフェース (L2CA コントロールメッセージ)

Bluetooth 仕様では、その L2CA 要求は、応答が準備ができるまで、ブロックしなければならないとなっています。 L2CAP ノードは、L2CA 要求と応答に一致するために Netgraph メッセージヘッダから token フィールドを使用します。上位レイヤ (層) プロトコルは、 token を投入しなければなりません。 L2CAP ノードは、要求をキューに入れて、処理を開始します。その後、応答の準備ができているか、またはタイムアウトが起こったとき、 L2CAP ノードは、新しい Netgraph メッセージを作成して、 tokenNFG_RESP フラグを設定して、メッセージを上位レイヤ (層) に送信します。 L2CA 指示メッセージが token を投入しないか、または NGF_RESP フラグを設定しないことに注意してください。それらは、ただの通知であり、承認を必要としないので、この訳はありません。
NGM_L2CAP_L2CA_CON
論理的な接続から物理アドレスを表すチャネルの作成を要求します。入力パラメータは、ターゲットプロトコル (PSM) とリモートデバイスの 48 ビットのアドレス (BD_ADDR) です。出力パラメータは、ローカル L2CAP 実体と要求の結果 (Result) によって割り付けられた、ローカル CID (LCID) です。結果 (Result) が未定の通知を示すなら、状態 (Status) 値は、どのような処理が接続の確立を遅らせるかに関する詳しい情報を含んでいます。
NGM_L2CAP_L2CA_CON_IND
このメッセージは、接続要求を発行したリモートデバイス、要求されるチャネルを表すローカル CID、要求に含まれた識別子 (Identifier)、および要求のターゲットとなる PSM 値のアドレスのためのパラメータを含んでいます。
NGM_L2CAP_L2CA_CON_RSP
接続要求イベント指示への応答を発行します。入力パラメータは、リモートデバイスの 48 ビットのアドレス、要求で送信された識別子 (Identifier)、ローカル CID、応答 (Response) コードと応答 (Response) コードに添付された状態 (Status) です。出力パラメータは、サービス要求の結果 (Result) です。このプリミティブは、指示を受信した後にたった一度だけ呼び出されなければなりません。
NGM_L2CAP_L2CA_CFG
新しい 1 組のチャネルパラメータにチャネルの初期の設定 (または、再設定) を要求します。入力パラメータは、ローカル CID エンドポイント、新しい着信受信可能な MTU (InMTU)、新しい発信フロー仕様とタイムアウトのフラッシュとリンクです。出力パラメータは、結果 (Result)、受け付けられた着信 MTU (InMTU)、リモート側フロー要求とタイムアウトのフラッシュとリンクです。
NGM_L2CAP_L2CA_CFG_IND
このメッセージは、要求が送信されたチャネルのローカル CID、発信 MTU サイズ (チャネルの向こう側に送信することができる最大のパケット)、と着信データの特性について説明する flowspec を示すパラメータを含んでいます。他のすべてのチャネルパラメータは、リモートデバイスによって提供されないなら、それらのデフォルト値に設定されます。
NGM_L2CAP_L2CA_CFG_RSP
設定要求イベント指示への応答を発行します。入力パラメータは、設定されているエンドポイントのローカル CID、発信転送 MTU (それは、設定指示イベントにおける OutMTU パラメータ以下であるかもしれません) と着信トラフィックのために受け付けられた flowspec を含んでいます。出力パラメータは、結果 (Result) 値です。
NGM_L2CAP_L2CA_QOS_IND
このメッセージは、QoS 契約に違反しているリモート Bluetooth デバイスのアドレスを示すパラメータを含んでいます。
NGM_L2CAP_L2CA_DISCON
チャネルの切断を要求します。入力パラメータは、ローカルチャネルを表す CID です。出力パラメータは、結果 (Result) です。 L2CAP 切断要求が受け付けられるなら結果 (Result) は、0 です、そうでなければ、0 以外の値が返されます。一旦、切断が要求されたことがあれば、プロセスは、CID から成功して読み込みまたは、書き込みすることができません。
NGM_L2CAP_L2CA_DISCON_IND
このメッセージは、要求が送信されたローカル CID を示すパラメータを含んでいます。
NGM_L2CAP_L2CA_WRITE
データ要求の転送へ応答します。実際のデータを適切な upstream (上流) フックから受信されなければならなくて、次のように定義されるヘッダが先頭に追加されなければなりません。

/* L2CA データパケットヘッダ */ 
typedef struct { 
        uint32_t token;  /* L2CAP_L2CA_WRITE で使用される 
                            トークン */ 
        uint16_t length; /* データの長さ */ 
        uint16_t lcid;   /* ローカルチャネル ID */ 
} __attribute__ ((packed)) ng_l2cap_l2ca_hdr_t;

出力パラメータは、書き込まれたデータの結果 (Result) と長さ (Length) です。

NGM_L2CAP_L2CA_GRP_CREATE
論理的な接続から複数のデバイスを表すための CID の作成を要求します。入力パラメータは、ラベルが付けられた発信コネクションレストラフィックである PSM 値と着信トラフィックに使用されるフィルタです。出力パラメータは、ローカルエンドポイントを表す CID です。作成時に、グループは、空ですが、PSM 値に向けられた着信トラフィックは、読み込み可能です。
この要求は、実装されていません。
NGM_L2CAP_L2CA_GRP_CLOSE
このメッセージの使用は、グループ (Group) を閉鎖します。
この要求は、実装されていません。
NGM_L2CAP_L2CA_GRP_ADD_MEMBER
グループへのメンバの追加を要求します。入力パラメータは、グループを表す CID と加えられるためのグループのメンバの BD_ADDR を含んでいます。出力パラメータ結果 (Result) は、要求の成功か失敗を確認します。
この要求は、実装されていません。
NGM_L2CAP_L2CA_GRP_REM_MEMBER
グループからメンバを取り除くことを要求します。入力パラメータは、グループを表す CID と取り除くためのグループメンバの BD_ADDR を含んでいます。出力パラメータ結果 (Result) は、要求の成功か失敗を確認します。
この要求は、実装されていません。
NGM_L2CAP_L2CA_GRP_MEMBERSHIP
グループのメンバの報告を要求します。入力パラメータ CID は、問い合わせされているグループを表します。出力パラメータ結果 (Result) は、要求の成功か失敗を確認します。結果 (Result) が成功すれば、 BD_ADDR_Lst は、グループの N メンバの Bluetooth アドレスのリストです。
この要求は、実装されていません。
NGM_L2CAP_L2CA_PING
L2CA Echo Request メッセージと対応する L2CAP Echo Response メッセージの受信を初期化します。入力パラメータは、リモート Bluetooth デバイスの BD_ADDR と、 Echo Data とエコーデータの長さ (Length) です。出力パラメータは、結果 (Result)、Echo Data とエコーデータの長さ (Length) です。
NGM_L2CAP_L2CA_GET_INFO
L2CA Information Request メッセージと対応する L2CAP Info Response メッセージの受信を初期化します。入力パラメータは、リモート Bluetooth デバイスの BD_ADDR と情報タイプ (Information Type) です。出力パラメータは、結果 (Result)、情報データ (Information Data) と情報データの長さ (Length) です。
NGM_L2CAP_L2CA_ENABLE_CLT
コネクションレスのパケットの受信の無効 (有効) を要求します。入力パラメータは、ブロック (アンブロック) されるべきであるサービスを示す PSM 値とと有効 (Enable) フラグです。

NETGRAPH コントロールメッセージ

このノードタイプは、次を加えて、一般的なコントロールメッセージをサポートします:
NGM_L2CAP_NODE_GET_FLAGS
ノードのための現在の状態を返します。
NGM_L2CAP_NODE_GET_DEBUG
ノードのための現在のデバッグレベルを含む整数を返します。
NGM_L2CAP_NODE_SET_DEBUG
このコマンドは、整数引数を取り、ノードに現在のデバッグレベルを設定します。
NGM_L2CAP_NODE_GET_CON_LIST
活発なベースバンド接続 (すなわち、ACL リンク) のリストを返します。
NGM_L2CAP_NODE_GET_CHAN_LIST
活発な L2CAP チャネルのリストを返します。
NGM_L2CAP_NODE_GET_AUTO_DISCON_TIMO
自動切断タイムアウト (秒単位) の現在の値を含む整数を返します。
NGM_L2CAP_NODE_SET_AUTO_DISCON_TIMO
このコマンドは、整数を受け付けて、自動切断タイムアウト (秒単位) の値を設定します。特別な値 0 (ゼロ) は、自動切断タイムアウトを無効にします。

シャットダウン

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

歴史

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

作者

Maksim Yevmenkin <m_evmenkin@yahoo.com>

バグ

たぶんあります。見つけたなら報告してください。
July 4, 2002 FreeBSD