NG_HCI(4) | FreeBSD Kernel Interfaces Manual | NG_HCI(4) |
名称
ng_hci — Bluetooth ホストコントローラインタフェース (Host Controller Interface (HCI)) レイヤ (層) でもある Netgraph ノードタイプ解説
hci ノードタイプは、Bluetooth Specification Book v1.1 の章 H1 に従って Bluetooth ホストコントローラインタフェース (Host Controller Interface (HCI)) レイヤ (層) を実装する Netgraph ノードタイプです。BLUETOOTH の紹介
Bluetooth は、携帯用 (で/または) 固定された電子デバイスを接続するケーブルを置き換えることを目的としている短距離用のラジオリンクです。 Bluetooth は、免許が必要ない ISM バンドで 2.4 GHz (ギガヘルツ) で動作します。 Bluetooth プロトコルは、サーキットとパケット交換の組み合わせを使用します。 Bluetooth は、非同期データチャネル、最大 3 個の同時の同期音声チャネル、または同時に非同期データと同期音声をサポートするチャネルをサポートすることができます。各音声チャネルは、各方向に 64 kb/s 同期 (音声) チャネルをサポートします。非同期チャネルは、最大 723.2 kb/s 非対称 (そして、さらに返り方向へ最大 57.6kb/s)、または 433.9 kb/s 対称をサポートすることができます。Bluetooth システムは、(2 つの Bluetooth ユニットを伴う場合のみ) ポイントツーポイント接続、またはポイントツーマルチポイント接続を提供します。ポイントツーマルチポイント接続では、チャネルは、いくつかの Bluetooth ユニットで共有されます。同じチャネルを共有する 2 つ以上のユニットは、“piconet”を形成します。 1 つの Bluetooth ユニットは、piconet のマスタの役割を果たし、他の複数のユニットは、複数のスレーブとして機能します。最大 7 つのスレーブが piconet でアクティブとなることができます。さらに、さらに多くのスレーブがいわゆるパーク (駐車) された状態でマスタにロックされたままで残ることができます。これらのパークされたスレーブは、チャネルでアクティブになることはできませんが、マスタに同期したままで残ります。アクティブおよびパークされたスレーブの両方に関して、チャネルアクセスは、マスタによって制御されます。
受信可能な領域がオーバラップした複数の piconet は、“scatternet”を形成します。各 piconet は、単一のマスタのみを持つことができます。しかしながら、スレーブは、時分割多重ベースで異なった piconet に参加することができます。さらに、1 つの piconet のマスタは、別の piconet のスレーブとなることができます。 piconet は、周波数同期とならないでしょう。各 piconet には、それ自体のホッピングチャネルがあります。
時間スロット
チャネルは、各 625 ナノ秒の長さの時間スロットに分割されます。訳注: 原文は、625 usec となっており 625 nsec の誤りと思われる。時間スロットは、piconet マスタの Bluetooth クロックに従って番号付けされます。スロットの番号付けは、0 から 2^27 -1 の範囲であり、2^27 の周期の循環です。時間スロットでは、マスタとスレーブは、パケットを転送することができます。SCO リング
SCO リンクは、マスタと特定のスレーブとの間の対称なポイントツーポイントのリンクです。 SCO リンクは、スロットを予約し、したがって、マスタとスレーブの間の回路交換方式の接続であるとみなすことができます。 SCO リンクは、一般的に音声のように期限を定めた情報をサポートします。マスタは、同じスレーブ、または異なったスレーブとの最大 3 つの SCO リンクをサポートすることができます。スレーブは、同じマスタから最大 3 つの SCO リンク、またはリンクが異なったマスタから始まるなら、2 つの SCO リンクをサポートすることができます。 SCO パケットは、決して再転送されません。ACL リング
SCO リンクのために予約されなかったスロットでは、マスタは、スロットベース毎に任意のスレーブとともにパケットを交換することができます。 ACL リンクは、マスタと piconet に参加するすべてのアクティブなスレーブとの間でパケット交換方式の接続を提供します。非同期とアイソクロナスサービスの両方がサポートされます。マスタとスレーブの間では、単一の ACL リンクだけが存在できます。ほとんどの ACL パケットに関しては、パケット再転送は、データの整合性を保証するために適用されます。ホストコントローラインタフェース (HOST CONTROLLER INTERFACE (HCI))
HCI は、コマンドは、ベースバンドコントローラとリンクマネージャとのインタフェースコマンド、ハードウェア状態と制御レジスタへのアクセスを提供します。このインタフェースは、Bluetooth ベースバンドケーパビリティにアクセスする均一の方法を提供します。ホスト上で HCI レイヤ (層) は、Bluetooth ハードウェアの HCI ファームウェアでデータとコマンドを交換します。ホストコントローラインタフェースレイヤ (すなわち、物理的なバス) ドライバは、互いに情報交換する能力で両方の HCI レイヤを提供します。
ホストは、ホストコントローラインタフェースレイヤが使用されている HCI イベントに依存しない非同期な通知を受け付けます。 HCI イベントは、何かが起こるとき、ホストに通知するために使用されます。ホストがイベントが起こったことを発見するとき、どのイベントが起こったかを決定するために受信されたイベントパケットを解析します。次のセクションは、HCI パケット形式を明記しています。
HCI コマンドパケット
#define NG_HCI_CMD_PKT 0x01 typedef struct { uint8_t type; /* 必ず 0x1 */ uint16_t opcode; /* オペコード */ uint8_t length; /* 複数のパラメータのバイト長 */ } __attribute__ ((packed)) ng_hci_cmd_pkt_t;
HCI コマンドパケットは、コマンドをホストからホストコントローラに送信するために使用されます。ホストコントローラがコマンドの大部分を終了するとき、 Command Complete (コマンド完了) イベントがホストに送信されます。いくつかのコマンドは、それらが完了したとき、 Command Complete イベントを受信しません。代わりに、ホストコントローラがこれらのコマンドの 1 つを受信するとき、ホストコントローラは、コマンドを実行し始めたとき、 Command Status (コマンド状態) イベントをホストに送り返します。後で、コマンドに関連している動作が終わったとき、送られたコマンドに関連しているイベントは、ホストコントローラによってホストに送信されます。
HCI イベントパケット
#define NG_HCI_EVENT_PKT 0x04 typedef struct { uint8_t type; /* 必ず 0x4 */ uint8_t event; /* イベント */ uint8_t length; /* 複数のパラメータのバイト長 */ } __attribute__ ((packed)) ng_hci_event_pkt_t;
HCI イベントパケットは、イベントが起こるとき、ホストに通知するためにホストコントローラによって使用されます。
HCI ACL データパケット
#define NG_HCI_ACL_DATA_PKT 0x02 typedef struct { uint8_t type; /* 必ず 0x2 */ uint16_t con_handle; /* 接続ハンドル + PB + BC フラグ */ uint16_t length; /* ペイロードのバイト長 */ } __attribute__ ((packed)) ng_hci_acldata_pkt_t;
HCI ACL データパケットは、ホストとホストコントローラの間で ACL データを交換するために使用されます。
HCI SCO データパケット
#define NG_HCI_SCO_DATA_PKT 0x03 typedef struct { uint8_t type; /* 必ず 0x3 */ uint16_t con_handle; /* 接続ハンドル + 予約ビット */ uint8_t length; /* ペイロードのバイト長 */ } __attribute__ ((packed)) ng_hci_scodata_pkt_t;
HCI SCO データパケットは、ホストとホストコントローラの間で SCO データを交換するために使用されます。
HCI 初期化
初期化のときに、HCI 制御アプリケーションは、(順不同で) 次の HCI コマンドを発行しなければなりません。- Read_BD_ADDR
- Bluetooth ユニットの BD_ADDR を取得するために。
- Read_Local_Supported_Features
- Bluetooth ユニットによってサポートされた機能のリストを取得するために。
- Read_Buffer_Size
- ホストからホストコントローラに送信することができる、 HCI ACL と SCO HCI データパケット (ヘッダを除いた) の最大サイズを決定するために。また、ホストコントローラがバッファ中の転送を待つことができる HCI ACL と SCO データパケットの総数を指定する 2 つの追加返りパラメータがあります。
HCI 初期化の実行が成功するとすぐに、HCI 制御アプリケーションは、ノードのための“初期化”ビットをオンにしなければなりません。 HCI ノードがいったん初期化されると、すべての upstream フックは、次の通りに定義された NGM_HCI_NODE_UP Netgraph メッセージを受け取ります。
#define NGM_HCI_NODE_UP 112 /* HCI -> Upper */ typedef struct { uint16_t pkt_size; /* 最大 ACL/SCO パケットサイズ (ヘッダなし) */ uint16_t num_pkts; /* ACL/SCO パケットキューサイズ */ uint16_t reserved; /* 代替物 */ bdaddr_t bdaddr; /* bdaddr */ } ng_hci_node_up_ep;
HCI フロー制御
HCI レイヤは、ベースバンド接続ベース (すなわち、ACL と SCO リンク) でフロー制御を実行します。各ベースバンド接続には、発信データパケットの“接続ハンドル”とキューがあります。上位レイヤプロトコルは、一度に ( num_pkts - pending) パケットを送ることができます。 HCI レイヤは、各接続ハンドルのための現在のキュー状態について上位レイヤに通知するために NGM_HCI_SYNC_CON_QUEUE Netgraph メッセージを送信します。 NGM_HCI_SYNC_CON_QUEUE Netgraph メッセージは、次のように定義されます。
#define NGM_HCI_SYNC_CON_QUEUE 113 /* HCI -> Upper */ typedef struct { uint16_t con_handle; /* 接続ハンドル */ uint16_t completed; /* 完了したパケットの数 */ } ng_hci_sync_con_queue_ep;
フック
このノードタイプは、次のフックをサポートします:- drv
- Bluetooth ホストコントローラ転送レイヤ (層) フックです。単一の mbuf 構造体に含まれた単一の HCI パケットです。
- acl
- upper レイヤ (層) プロトコル/ノードは、フックに接続されます。単一の mbuf 構造体に含まれた単一の HCI ACL データパケットです。
- sco
- upper レイヤ (層) プロトコル/ノードは、フックに接続されます。単一の mbuf 構造体に含まれた単一の HCI SCO データパケットです。
- raw
- 生のフックです。着信か発信するあらゆる HCI フレーム (HCI コマンドフレームを含む) は、フックに配信されます。通常、Bluetooth の生の HCI ソケットレイヤ (層) は、フックに接続されます。単一の mbuf 構造体に含まれた単一の HCI フレームです。
BLUETOOTH UPPER レイヤ (層) プロトコルインタフェース (LP 制御メッセージ)
- NGM_HCI_LP_CON_REQ
- 接続を作成する下位プロトコルを要求します。リモートデバイスへの物理的なリンクが存在していないなら、このメッセージは、物理的接続を確立するために下位プロトコル (ベースバンド) に送信しななければなりません。
- NGM_HCI_LP_DISCON_REQ
- 接続を終了する下位プロトコル (ベースバンド) を要求します。
- NGM_HCI_LP_CON_CFM
- 下位レイヤ (ベースバンド) 接続を確立するために NGM_HCI_LP_CON_REQ 要求の成否を確認します。これは、認証が物理的なリンクを確立するために必要であるなら、認証チャレンジのパスを含んでいます。
- NGM_HCI_LP_CON_IND
- 下位プロトコル (ベースバンド) が着信接続の確立が成功したことを示します。
- NGM_HCI_LP_CON_RSP
- 前の接続指示要求を受け付けるか拒絶する応答です。
- NGM_HCI_LP_DISCON_IND
- 下位プロトコル (ベースバンド) が接続を終了したことを示します。これは、 NGM_HCI_LP_DISCON_REQ か、またはタイムアウトイベントの応答であるかもしれません。
- NGM_HCI_LP_QOS_REQ
- 特定の QoS パラメータ設定を調整する下位プロトコル (ベースバンド) を要求します。
- NGM_HCI_LP_QOS_CFM
- 与えられたサービスの品質のための要求の成否を確認します。
- NGM_HCI_LP_QOS_IND
- 下位プロトコル (ベースバンド) が QoS 協定の違反を検出したことを示します。
NETGRAPH コントロールメッセージ
このノードタイプは、次を加えて、一般的なコントロールメッセージをサポートします:- NGM_HCI_NODE_GET_STATE
- ノードのための現在の状態を返します。
- NGM_HCI_NODE_INIT
- ノードのための“初期化”ビットをオンにします。
- NGM_HCI_NODE_GET_DEBUG
- ノードのための現在のデバッグレベルを含む整数を返します。
- NGM_HCI_NODE_SET_DEBUG
- このコマンドは、整数引数を取り、ノードに現在のデバッグレベルを設定します。
- NGM_HCI_NODE_GET_BUFFER
- データバッファの現在の状態を返します。
- NGM_HCI_NODE_GET_BDADDR
- ノードでキャッシュされる BD_ADDR を返します。
- NGM_HCI_NODE_GET_FEATURES
- (ノードによってキャッシュされた) ハードウェアによってサポートされた機能のリストを返します。
- NGM_HCI_NODE_GET_NEIGHBOR_CACHE
- 隣接するキャッシュの内容を返します。
- NGM_HCI_NODE_FLUSH_NEIGHBOR_CACHE
- すべての隣接するキャッシュエントリを削除します。
- NGM_HCI_NODE_GET_CON_LIST
- 活発なベースバンド接続 (すなわち、ACL と SCO リンク) のリストを返します。
- NGM_HCI_NODE_GET_STAT
- 様々な統計値カウンタを返します。
- NGM_HCI_NODE_RESET_STAT
- すべての統計値を 0 にリセットします。
- NGM_HCI_NODE_SET_LINK_POLICY_SETTINGS_MASK
- 現在のリンクポリシ設定マスクを設定します。新しい ACL 接続が作成された後に、HCI ノードは、ACL 接続のためにセットリンクポリシを試みます。デフォルトで、すべてのサポートされたリンクマネージャ (Link Manager (LM)) モードは、有効にされます。有効にされた LM モードを指定するリンクポリシ設定マスクを設定することによってユーザは、これを上書きすることができます。
- NGM_HCI_NODE_GET_LINK_POLICY_SETTINGS_MASK
- 現在のリンクポリシ設定マスクが返されます。
- NGM_HCI_NODE_SET_PACKET_MASK
- 現在のパケットマスクを設定します。新しいベースバンド (ACL か SCO) 接続が作成されるとき、HCI ノードは、デバイスによってサポートされたすべてのパケットタイプを指定します。新しいベースバンド接続に使用されるパケットタイプを指定するパケットマスクを設定することによって、ユーザは、これを上書きすることができます。
- NGM_HCI_NODE_GET_PACKET_MASK
- 現在のパケットマスクを返します。
- NGM_HCI_NODE_SET_ROLE_SWITCH
- 役割スイッチの値を設定します。この値が 0 でないときに、役割スイッチは、有効にされます。これは、デフォルト状態です。ハードウェアが役割スイッチをサポートして、それが有効にされている場合のみ、 Bluetooth リンクレベルの実際の役割スイッチが実行されることに注意してください。
- NGM_HCI_NODE_GET_ROLE_SWITCH
- ノードのための役割スイッチの値を返します。
シャットダウン
このノードは、 NGM_SHUTDOWN コントロールメッセージを受け取るか、すべてのフックが切断されている時、シャットダウンします。歴史
hci ノードタイプは、 FreeBSD 5.0 で実装されました。作者
<m_evmenkin@yahoo.com>バグ
たぶんあります。見つけたなら報告してください。June 25, 2002 | FreeBSD |