NG_BTSOCKET(4) | FreeBSD Kernel Interfaces Manual | NG_BTSOCKET(4) |
名称
ng_btsocket — Bluetooth ソケットレイヤ (層)書式
#include < sys/types.h>#include < sys/socket.h>
#include < sys/bitstring.h>
#include < netgraph/bluetooth/include/ng_hci.h>
#include < netgraph/bluetooth/include/ng_l2cap.h>
#include < netgraph/bluetooth/include/ng_btsocket.h>
解説
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_REQUEST と GET_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 コントロールメッセージ
このノードタイプは、一般的なコントロールメッセージをサポートします:シャットダウン
これらのノードは、永続的でシャットダウンすることができません。関連項目
btsockstat(1), socket(2), netgraph(4), ng_bluetooth(4), ng_hci(4), ng_l2cap(4), ngctl(8), sysctl(8)歴史
ng_btsocket モジュールは、 FreeBSD 5.0 で実装されました。作者
<m_evmenkin@yahoo.com>バグ
たぶんあります。見つけたなら報告してください。November 13, 2012 | FreeBSD |