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

名称

ng_btsocketBluetooth ソケットレイヤ (層)

解説

ng_btsocket モジュールは、3 つの Netgraph ノードタイプを実装します。その動作における各タイプは、 PF_BLUETOOTH ドメインの中で 1 つのプロトコルを実装します。

BLUETOOTH_PROTO_HCI Sh プロトコル

SOCK_RAW Ss HCI ソケット

btsock_hci_raw Netgraph タイプによって実装されます。生の HCI ソケットは、 send(2) 呼び出しで指定された通信相手へのみ生の HCI コマンドデータグラムの送信できます。一般的に、生の HCI データグラム (HCI コマンド、エベントとデータ) は、その戻りアドレスで次のデータグラムを返す recvfrom(2) で受信されます。また、生の HCI ソケットは、HCI ノードを制御するために使用することができます。

Bluetooth の生の HCI ソケットアドレスは、次のように定義されます:

/* 生の HCI ソケットのための struct sockaddr の 
   Bluetooth バージョン */ 
struct sockaddr_hci { 
        u_char hci_len;      /* 合計長 */ 
        u_char hci_family;   /* アドレスファミリ */ 
 char hci_node[32]; /* アドレス (サイズ == NG_NODESIZ ) */ 
};

生の HCI ソケットは、次のような ioctl(2) 要求の数をサポートします。

SIOC_HCI_RAW_NODE_GET_STATE
HCI ノードのための現在の状態を返します。
SIOC_HCI_RAW_NODE_INIT
HCI ノードのための“初期化”ビットをオンにします。
SIOC_HCI_RAW_NODE_GET_DEBUG
HCI ノードのための現在のデバッグレベルを返します。
SIOC_HCI_RAW_NODE_SET_DEBUG
HCI ノードのために現在のデバッグレベルを設定します。
SIOC_HCI_RAW_NODE_GET_BUFFER
HCI ノードのためのデータバッフの現在の状態を返します。
SIOC_HCI_RAW_NODE_GET_BDADDR
HCI ノードのための BD_ADDR を返します。
SIOC_HCI_RAW_NODE_GET_FEATURES
HCI ノードのためのハードウェアによってサポートされた機能のリストを返します。
SIOC_HCI_RAW_NODE_GET_STAT
HCI ノードのための様々な統計値カウンタを返します。
SIOC_HCI_RAW_NODE_RESET_STAT
HCI ノードのためのすべての統計値を 0 にリセットします。
SIOC_HCI_RAW_NODE_FLUSH_NEIGHBOR_CACHE
HCI ノードのためのすべての隣接するキャッシュエントリを削除します。
SIOC_HCI_RAW_NODE_GET_NEIGHBOR_CACHE
HCI ノードのための隣接するキャッシュの内容を返します。
SIOC_HCI_RAW_NODE_GET_CON_LIST
HCI ノードのための活発なベースバンド接続 (すなわち、ACL と SCO リンク) のリストを返します。
SIOC_HCI_RAW_NODE_GET_LINK_POLICY_MASK
HCI ノードのための現在のリンクポリシ設定マスクを返します。
SIOC_HCI_RAW_NODE_SET_LINK_POLICY_MASK
HCI ノードのための現在のリンクポリシ設定マスクを設定します。
SIOC_HCI_RAW_NODE_GET_PACKET_MASK
HCI ノードのための現在のパケットマスクを返します。
SIOC_HCI_RAW_NODE_SET_PACKET_MASK
HCI ノードのための現在のパケットマスクを設定します。
SIOC_HCI_RAW_NODE_GET_ROLE_SWITCH
HCI ノードのための役割スイッチパラメータの現在の値を返します。
SIOC_HCI_RAW_NODE_SET_ROLE_SWITCH
HCI ノードのための役割スイッチパラメータの現在の値を設定します。

net.bluetooth.hci.sockets.raw.ioctl_timeout 変数は、生の HCI ソケットのための制御要求タイムアウト (秒単位) を制御する sysctl(8) を通して調査して設定することができます。

生の HCI ソケットは、フィルタをサポートします。アプリケーションは、特定の HCI データグラムタイプをフィルタすることができます。 HCI イベントデータグラムのために、アプリケーションは、追加フィルタを設定することができます。生の HCI ソケットフィルタは、次のように定義されます:

/* 
 * 生の HCI ソケットフィルタ。 
 * 
 * パケットマスク使用のために (1 << (HCI packet indicator - 1)) 
 * イベントマスク使用のために (1 << (Event - 1)) 
 */ 
 
struct ng_btsocket_hci_raw_filter { 
        bitstr_t bit_decl(packet_mask, 32); 
        bitstr_t bit_decl(event_mask, (NG_HCI_EVENT_MASK_SIZE * 8)); 
};

SOL_HCI_RAW レベルで定義された SO_HCI_RAW_FILTER オプションは、 getsockopt(2) を通して取得するために使用するか、または setsockopt(2) 生の HCI ソケットのフィルタを通して変更することができます。

BLUETOOTH_PROTO_L2CAP Sh プロトコル

Bluetooth L2CAP ソケットアドレスは、次のように定義されます:

/* L2CAP ソケットのための struct sockaddr の Bluetooth バージョン */ 
struct sockaddr_l2cap { 
        u_char    l2cap_len;    /* 合計長 */ 
        u_char    l2cap_family; /* アドレスファミリ */ 
        uint16_t  l2cap_psm;    /* プロトコル/サービス 
                                   マルチプレクサ */ 
        bdaddr_t  l2cap_bdaddr; /* アドレス */ 
};

SOCK_RAW Ss L2CAP ソケット

btsock_l2c_raw Netgraph タイプによって実装されます。生の L2CAP ソケットは、生の L2CAP データグラムへのアクセスを提供しません。これらのソケットは、 L2CAP ノードを制御するために、そして ECHO_REQUESTGET_INFO 要求のように特殊な L2CAP 要求を発行するために使用します。

生の L2CAP ソケットは、次のような ioctl(2) 要求の数をサポートします:

SIOC_L2CAP_NODE_GET_FLAGS
L2CAP ノードのための現在の状態を返します。
SIOC_L2CAP_NODE_GET_DEBUG
L2CAP ノードのための現在のデバッグレベルを返します。
SIOC_L2CAP_NODE_SET_DEBUG
L2CAP ノードのための現在のデバッグレベルを設定します。
SIOC_L2CAP_NODE_GET_CON_LIST
L2CAP ノードのための活発なベースバンド接続 (すなわち、ACL リンク) のリストを返します。
SIOC_L2CAP_NODE_GET_CHAN_LIST
L2CAP ノードのための活発なチャネルのリストを返します。
SIOC_L2CAP_NODE_GET_AUTO_DISCON_TIMO
L2CAP ノードのための自動切断タイムアウトの現在の値を返します。
SIOC_L2CAP_NODE_SET_AUTO_DISCON_TIMO
L2CAP ノードのための自動切断タイムアウトの現在の値を設定します。
SIOC_L2CAP_L2CA_PING
L2CAP ECHO_REQUEST を発行します。
SIOC_L2CAP_L2CA_GET_INFO
L2CAP GET_INFO 要求を発行します。

net.bluetooth.l2cap.sockets.raw.ioctl_timeout 変数は、生の L2CAP ソケットのための制御要求タイムアウト (秒単位) を制御する sysctl(8) を通して調査して設定することができます。

SOCK_SEQPACKET Ss L2CAP ソケット

btsock_l2c Netgraph タイプによって実装されます。 L2CAP ソケットは、“active” (アクティブ) または“passive” (パッシブ) のいずれかです。アクティブなソケットは、パッシブソケットに接続を開始します。デフォルトでは、 L2CAP ソケットは、アクティブで作成されます。パッシブのソケットを作成するためには、 bind(2) システムコールでソケットをバインドした後に、 listen(2) システムコールを使用しなければなりません。パッシブソケットだけが着信要求を受け付けるために accept(2) 呼び出しを使用できます。アクティブなソケットだけが接続を開始するために connect(2) 呼び出しを使用できます。

L2CAP ソケットは、“ワイルドカードアドレシング”をサポートします。この場合、ソケットは、 NG_HCI_BDADDR_ANY アドレスにバインドされなければなりません。 PSM (プロトコル/サービスマルチプレクサ) フィールドは、常に必要であることに注意してください。接続がいったん確立されると、ソケットのアドレスは、ピアのエンティティの位置によって固定されます。ソケットに割り当てられたアドレスは、送信され、受信されるパケットを通して Bluetooth デバイス、および PSM (プロトコル/サービスマルチプレクサ) に関連しているアドレスです。

L2CAP ソケットは、 setsockopt(2) で設定し、 getsockopt(2) でテストすることができる SOL_L2CAP レベルで定義された多くのオプションをサポートします:

SO_L2CAP_IMTU
ローカルソケットが受け付けることができる最大のペイロードサイズを取得 (設定) します。訳注: ペイロードは、ヘッダ部を除いたデータの本体。
SO_L2CAP_OMTU
リモートソケットが受け受け付けることができる最大のペイロードサイズを取得します。
SO_L2CAP_IFLOW
ソケットのための着信フロー指定を取得します。
実装されていません。
SO_L2CAP_OFLOW
ソケットのための発信フロー指定を取得 (設定) します。
実装されていません。
SO_L2CAP_FLUSH
フラッシュタイムアウトの値を取得 (設定) します。
実装されていません。

BLUETOOTH_PROTO_RFCOMM Sh プロトコル

Bluetooth RFCOMM ソケットアドレスは、次にように定義されます:

/* RFCOMM ソケットのための struct sockaddr の Bluetooth バージョン */ 
struct sockaddr_rfcomm { 
        u_char   rfcomm_len;     /* 合計長 */ 
        u_char   rfcomm_family;  /* アドレスファミリ */ 
        bdaddr_t rfcomm_bdaddr;  /* アドレス */ 
        uint8_t  rfcomm_channel; /* チャネル */ 
};

SOCK_STREAM Ss RFCOMM ソケット

RFCOMM ソケットは、Netgraph ノードタイプに関連していないことに注意してください。 RFCOMM ソケットは、L2CAP ソケットの先頭で追加レイヤ (層) として実装されます。 RFCOMM ソケットは、“active” (アクティブ) または“passive” (パッシブ) のいずれかです。アクティブなソケットは、パッシブソケットに接続を開始します。デフォルトでは、RFCOMM ソケットは、アクティブで作成されます。パッシブのソケットを作成するためには、 bind(2) システムコールでソケットをバインドした後に、 listen(2) システムコールを使用しなければなりません。パッシブソケットだけが着信要求を受け付けるために accept(2) 呼び出しを使用できます。アクティブなソケットだけが接続を開始するために connect(2) 呼び出しを使用できます。

RFCOMM ソケットは、“ワイルドカードアドレシング”をサポートします。この場合、ソケットは、 NG_HCI_BDADDR_ANY アドレスにバインドされなければなりません。 RFCOMM チャネルフィールドは、常に必要であることに注意してください。接続がいったん確立されると、ソケットのアドレスは、ピアのエンティティの位置によって固定されます。ソケットに割り当てられたアドレスは、送信され、受信されるパケットを通して Bluetooth デバイス、および RFCOMM チャネルに関連しているアドレスです。

getsockopt(2) でテストすることができる、次のオプションは、 RFCOMM ソケットのために SOL_RFCOMM レベルで定義されます:

SO_RFCOMM_MTU
基本的な RFCOMM チャネルのための最大の転送ユニットサイズ (バイト単位で) を返します。アプリケーションは、まだソケットに大きなチャンクを書き込むことができるか、またはソケットから大きなチャンクを読み込むむことができることに注意してください。
SO_RFCOMM_FC_INFO
基本的な RFCOMM チャネルのためのフロー制御情報を返します。

net.bluetooth.rfcomm.sockets.stream.timeout 変数は、RFCOMM ソケットのための接続タイムアウト (秒単位) を制御する sysctl(8) を通して調査して設定することができます。

フック

これらのノードタイプは、任意の名前 (それらがユニークである限り) でフックをサポートして、常にフック接続要求を受け付けます。

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

このノードタイプは、一般的なコントロールメッセージをサポートします:

シャットダウン

これらのノードは、永続的でシャットダウンすることができません。

歴史

ng_btsocket モジュールは、 FreeBSD 5.0 で実装されました。

作者

Maksim Yevmenkin <m_evmenkin@yahoo.com>

バグ

たぶんあります。見つけたなら報告してください。
November 13, 2012 FreeBSD