Provided by: freebsd-manpages_9.2+1-1_all bug

NAME

     ng_hci — Netgraph node type that is also a Bluetooth Host Controller Interface (HCI) layer

SYNOPSIS

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

DESCRIPTION

     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.

INTRODUCTION TO BLUETOOTH

     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.

   Time Slots
     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.

   SCO Link
     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.

   ACL Link
     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.

HOST CONTROLLER INTERFACE (HCI)

     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.

   HCI Command Packet
           #define NG_HCI_CMD_PKT 0x01
           typedef struct {
                   u_int8_t  type;   /* MUST be 0x1 */
                   u_int16_t opcode; /* OpCode */
                   u_int8_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.

   HCI Event Packet
           #define NG_HCI_EVENT_PKT 0x04
           typedef struct {
                   u_int8_t type;   /* MUST be 0x4 */
                   u_int8_t event;  /* event */
                   u_int8_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.

   HCI ACL Data Packet
           #define NG_HCI_ACL_DATA_PKT 0x02
           typedef struct {
                   u_int8_t  type;       /* MUST be 0x2 */
                   u_int16_t con_handle; /* connection handle + PB + BC flags */
                   u_int16_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.

   HCI SCO Data Packet
           #define NG_HCI_SCO_DATA_PKT 0x03
           typedef struct {
                   u_int8_t  type;       /* MUST be 0x3 */
                   u_int16_t con_handle; /* connection handle + reserved bits */
                   u_int8_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.

HCI INITIALIZATION

     On initialization, HCI control application must issue the following HCI commands (in any
     order).

     Read_BD_ADDR
             To obtain BD_ADDR of the Bluetooth unit.

     Read_Local_Supported_Features
             To obtain the list of features supported by Bluetooth unit.

     Read_Buffer_Size
             To determine the maximum size of HCI ACL and SCO HCI data packets (excluding header)
             that can be sent from the Host to the Host Controller.  There are also two
             additional return parameters that specify the total number of HCI ACL and SCO data
             packets that the Host Controller can have waiting for transmission in its buffers.

     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 {
                   u_int16_t pkt_size; /* max. ACL/SCO packet size (w/o hdr) */
                   u_int16_t num_pkts; /* ACL/SCO packet queue size */
                   u_int16_t reserved; /* place holder */
                   bdaddr_t  bdaddr;   /* bdaddr */
           } ng_hci_node_up_ep;

HCI FLOW CONTROL

     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 {
                   u_int16_t con_handle; /* connection handle */
                   u_int16_t completed;  /* number of completed packets */
           } ng_hci_sync_con_queue_ep;

HOOKS

     This node type supports the following hooks:

     drv     Bluetooth Host Controller Transport Layer hook.  Single HCI packet contained in
             single mbuf structure.

     acl     Upper layer protocol/node is connected to the hook.  Single HCI ACL data packet
             contained in single mbuf structure.

     sco     Upper layer protocol/node is connected to the hook.  Single HCI SCO data packet
             contained in single mbuf structure.

     raw     Raw hook.  Every HCI frame (including HCI command frame) that goes in or out will be
             delivered to the hook.  Usually the Bluetooth raw HCI socket layer is connected to
             the hook.  Single HCI frame contained in single mbuf structure.

BLUETOOTH UPPER LAYER PROTOCOLS INTERFACE (LP CONTROL MESSAGES)

     NGM_HCI_LP_CON_REQ
             Requests the lower protocol to create a connection.  If a physical link to the
             remote device does not exist, this message must be sent to the lower protocol
             (baseband) to establish the physical connection.

     NGM_HCI_LP_DISCON_REQ
             Requests the lower protocol (baseband) to terminate a connection.

     NGM_HCI_LP_CON_CFM
             Confirms success or failure of the 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
             Indicates the lower protocol (baseband) has successfully established incoming
             connection.

     NGM_HCI_LP_CON_RSP
             A response accepting or rejecting the previous connection indication request.

     NGM_HCI_LP_DISCON_IND
             Indicates the lower protocol (baseband) has terminated connection.  This could be a
             response to NGM_HCI_LP_DISCON_REQ or a timeout event.

     NGM_HCI_LP_QOS_REQ
             Requests the lower protocol (baseband) to accommodate a particular QoS parameter
             set.

     NGM_HCI_LP_QOS_CFM
             Confirms success or failure of the request for a given quality of service.

     NGM_HCI_LP_QOS_IND
             Indicates the lower protocol (baseband) has detected a violation of the QoS
             agreement.

NETGRAPH CONTROL MESSAGES

     This node type supports the generic control messages, plus the following:

     NGM_HCI_NODE_GET_STATE
             Returns current state for the node.

     NGM_HCI_NODE_INIT
             Turn on “inited” bit for the node.

     NGM_HCI_NODE_GET_DEBUG
             Returns an integer containing the current debug level for the node.

     NGM_HCI_NODE_SET_DEBUG
             This command takes an integer argument and sets current debug level for the node.

     NGM_HCI_NODE_GET_BUFFER
             Returns current state of data buffers.

     NGM_HCI_NODE_GET_BDADDR
             Returns BD_ADDR as cached in the node.

     NGM_HCI_NODE_GET_FEATURES
             Returns the list of features supported by hardware (as cached by the node).

     NGM_HCI_NODE_GET_NEIGHBOR_CACHE
             Returns content of the neighbor cache.

     NGM_HCI_NODE_FLUSH_NEIGHBOR_CACHE
             Remove all neighbor cache entries.

     NGM_HCI_NODE_GET_CON_LIST
             Returns list of active baseband connections (i.e., ACL and SCO links).

     NGM_HCI_NODE_GET_STAT
             Returns various statistic counters.

     NGM_HCI_NODE_RESET_STAT
             Resets all statistic counters to zero.

     NGM_HCI_NODE_SET_LINK_POLICY_SETTINGS_MASK
             Sets current link policy settings mask.  After the new ACL connection is created the
             HCI node will try set link policy for the ACL connection.  By default, every
             supported Link Manager (LM) mode will be enabled.  User can override this by setting
             link policy settings mask which specifies LM modes to be enabled.

     NGM_HCI_NODE_GET_LINK_POLICY_SETTINGS_MASK
             Returns current link policy settings mask.

     NGM_HCI_NODE_SET_PACKET_MASK
             Sets current packet mask.  When new baseband (ACL or SCO) connection is created the
             HCI node will specify every packet type supported by the device.  User can override
             this by setting packet mask which specifies packet types to be used for new baseband
             connections.

     NGM_HCI_NODE_GET_PACKET_MASK
             Returns current packet mask.

     NGM_HCI_NODE_SET_ROLE_SWITCH
             Sets the value of the role switch.  Role switch is enabled when this value is not
             zero.  This is the default state.  Note that actual role switch at Bluetooth link
             level will only be performed if hardware supports role switch and it was enabled.

     NGM_HCI_NODE_GET_ROLE_SWITCH
             Returns the value of the role switch for the node.

SHUTDOWN

     This node shuts down upon receipt of a NGM_SHUTDOWN control message, or when all hooks have
     been disconnected.

SEE ALSO

     netgraph(4), hccontrol(8), ngctl(8)

HISTORY

     The hci node type was implemented in FreeBSD 5.0.

AUTHORS

     Maksim Yevmenkin <m_evmenkin@yahoo.com>

BUGS

     Most likely.  Please report if found.