NG_HCI(4) | Device Drivers Manual | NG_HCI(4) |
ng_hci
— Netgraph
node type that is also a Bluetooth Host Controller Interface (HCI)
layer
#include
<sys/types.h>
#include
<netgraph/bluetooth/include/ng_hci.h>
The hci
node type is a Netgraph node type
that implements Bluetooth Host Controller Interface (HCI) layer as per
chapter H1 of the Bluetooth Specification Book v1.1.
Bluetooth is a short-range radio link intended to replace the cable(s) connecting portable and/or fixed electronic devices. Bluetooth operates in the unlicensed ISM band at 2.4 GHz. The Bluetooth protocol uses a combination of circuit and packet switching. Bluetooth can support an asynchronous data channel, up to three simultaneous synchronous voice channels, or a channel which simultaneously supports asynchronous data and synchronous voice. Each voice channel supports a 64 kb/s synchronous (voice) channel in each direction. The asynchronous channel can support maximal 723.2 kb/s asymmetric (and still up to 57.6 kb/s in the return direction), or 433.9 kb/s symmetric.
The Bluetooth system provides a point-to-point connection (only two Bluetooth units involved), or a point-to-multipoint connection. In the point-to-multipoint connection, the channel is shared among several Bluetooth units. Two or more units sharing the same channel form a “piconet”. One Bluetooth unit acts as the master of the piconet, whereas the other unit(s) acts as slave(s). Up to seven slaves can be active in the piconet. In addition, many more slaves can remain locked to the master in a so-called parked state. These parked slaves cannot be active on the channel, but remain synchronized to the master. Both for active and parked slaves, the channel access is controlled by the master.
Multiple piconets with overlapping coverage areas form a “scatternet”. Each piconet can only have a single master. However, slaves can participate in different piconets on a time-division multiplex basis. In addition, a master in one piconet can be a slave in another piconet. The piconets shall not be frequency-synchronized. Each piconet has its own hopping channel.
The channel is divided into time slots, each 625 usec in length. The time slots are numbered according to the Bluetooth clock of the piconet master. The slot numbering ranges from 0 to 2^27 -1 and is cyclic with a cycle length of 2^27. In the time slots, master and slave can transmit packets.
The SCO link is a symmetric, point-to-point link between the master and a specific slave. The SCO link reserves slots and can therefore be considered as a circuit-switched connection between the master and the slave. The SCO link typically supports time-bounded information like voice. The master can support up to three SCO links to the same slave or to different slaves. A slave can support up to three SCO links from the same master, or two SCO links if the links originate from different masters. SCO packets are never retransmitted.
In the slots not reserved for SCO links, the master can exchange packets with any slave on a per-slot basis. The ACL link provides a packet-switched connection between the master and all active slaves participating in the piconet. Both asynchronous and isochronous services are supported. Between a master and a slave only a single ACL link can exist. For most ACL packets, packet retransmission is applied to assure data integrity.
The HCI provides a command interface to the baseband controller and link manager, and access to hardware status and control registers. This interface provides a uniform method of accessing the Bluetooth baseband capabilities.
The HCI layer on the Host exchanges data and commands with the HCI firmware on the Bluetooth hardware. The Host Controller Transport Layer (i.e., physical bus) driver provides both HCI layers with the ability to exchange information with each other.
The Host will receive asynchronous notifications of HCI events independent of which Host Controller Transport Layer is used. HCI events are used for notifying the Host when something occurs. When the Host discovers that an event has occurred it will then parse the received event packet to determine which event occurred. The next sections specify the HCI packet formats.
#define NG_HCI_CMD_PKT 0x01 typedef struct { uint8_t type; /* MUST be 0x1 */ uint16_t opcode; /* OpCode */ uint8_t length; /* parameter(s) length in bytes */ } __attribute__ ((packed)) ng_hci_cmd_pkt_t;
The HCI command packet is used to send commands to the Host Controller from the Host. When the Host Controller completes most of the commands, a Command Complete event is sent to the Host. Some commands do not receive a Command Complete event when they have been completed. Instead, when the Host Controller receives one of these commands the Host Controller sends a Command Status event back to the Host when it has begun to execute the command. Later on, when the actions associated with the command have finished, an event that is associated with the sent command will be sent by the Host Controller to the Host.
#define NG_HCI_EVENT_PKT 0x04 typedef struct { uint8_t type; /* MUST be 0x4 */ uint8_t event; /* event */ uint8_t length; /* parameter(s) length in bytes */ } __attribute__ ((packed)) ng_hci_event_pkt_t;
The HCI event packet is used by the Host Controller to notify the Host when events occur.
#define NG_HCI_ACL_DATA_PKT 0x02 typedef struct { uint8_t type; /* MUST be 0x2 */ uint16_t con_handle; /* connection handle + PB + BC flags */ uint16_t length; /* payload length in bytes */ } __attribute__ ((packed)) ng_hci_acldata_pkt_t;
HCI ACL data packets are used to exchange ACL data between the Host and Host Controller.
#define NG_HCI_SCO_DATA_PKT 0x03 typedef struct { uint8_t type; /* MUST be 0x3 */ uint16_t con_handle; /* connection handle + reserved bits */ uint8_t length; /* payload length in bytes */ } __attribute__ ((packed)) ng_hci_scodata_pkt_t;
HCI SCO data packets are used to exchange SCO data between the Host and Host Controller.
On initialization, HCI control application must issue the following HCI commands (in any order).
Read_BD_ADDR
Read_Local_Supported_Features
Read_Buffer_Size
As soon as HCI initialization has been successfully performed, HCI
control application must turn on “inited” bit for the node.
Once HCI node has been initialized all upstream hooks will receive a
NGM_HCI_NODE_UP
Netgraph message defined as
follows.
#define NGM_HCI_NODE_UP 112 /* HCI -> Upper */ typedef struct { uint16_t pkt_size; /* max. ACL/SCO packet size (w/o hdr) */ uint16_t num_pkts; /* ACL/SCO packet queue size */ uint16_t reserved; /* place holder */ bdaddr_t bdaddr; /* bdaddr */ } ng_hci_node_up_ep;
HCI layer performs flow control on baseband connection basis
(i.e., ACL and SCO link). Each baseband connection has “connection
handle” and queue of outgoing data packets. Upper layers protocols
are allowed to send up to (num_pkts
-
pending
) packets at one time. HCI layer will send
NGM_HCI_SYNC_CON_QUEUE
Netgraph messages to inform
upper layers about current queue state for each connection handle. The
NGM_HCI_SYNC_CON_QUEUE
Netgraph message is defined
as follows.
#define NGM_HCI_SYNC_CON_QUEUE 113 /* HCI -> Upper */ typedef struct { uint16_t con_handle; /* connection handle */ uint16_t completed; /* number of completed packets */ } ng_hci_sync_con_queue_ep;
This node type supports the following hooks:
NGM_HCI_LP_CON_REQ
NGM_HCI_LP_DISCON_REQ
NGM_HCI_LP_CON_CFM
NGM_HCI_LP_CON_REQ
request to establish a lower
layer (baseband) connection. This includes passing the authentication
challenge if authentication is required to establish the physical
link.NGM_HCI_LP_CON_IND
NGM_HCI_LP_CON_RSP
NGM_HCI_LP_DISCON_IND
NGM_HCI_LP_DISCON_REQ
or a
timeout event.NGM_HCI_LP_QOS_REQ
NGM_HCI_LP_QOS_CFM
NGM_HCI_LP_QOS_IND
This node type supports the generic control messages, plus the following:
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
NGM_HCI_NODE_GET_FEATURES
NGM_HCI_NODE_GET_NEIGHBOR_CACHE
NGM_HCI_NODE_FLUSH_NEIGHBOR_CACHE
NGM_HCI_NODE_GET_CON_LIST
NGM_HCI_NODE_GET_STAT
NGM_HCI_NODE_RESET_STAT
This node shuts down upon receipt of a
NGM_SHUTDOWN
control message, or when all hooks have
been disconnected.
The hci
node type was implemented in
FreeBSD 5.0.
Maksim Yevmenkin <m_evmenkin@yahoo.com>
Most likely. Please report if found.
June 25, 2002 | Debian |