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

名称

ng_hciBluetooth ホストコントローラインタフェース (Host Controller Interface (HCI)) レイヤ (層) でもある Netgraph ノードタイプ

書式

#include < sys/types.h>
#include < netgraph/bluetooth/include/ng_hci.h>

解説

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 で実装されました。

作者

Maksim Yevmenkin <m_evmenkin@yahoo.com>

バグ

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