Bluetooth Management API
*************************

Copyright (C) 2008-2009  Marcel Holtmann <marcel@holtmann.org>


Overview
========

This document describes the format of data used for communicating with
the kernel using a so-called Bluetooth Management sockets. These sockets
are available starting with Linux kernel version 3.4

The following kernel versions introduced new commands, new events or
important fixes to the Bluetooth Management API:

Linux kernel v3.4	Version 1.0
Linux kernel v3.5	Version 1.1
Linux kernel v3.7	Version 1.2
Linux kernel v3.9	Version 1.3
Linux kernel v3.13	Version 1.4
Linux kernel v3.15	Version 1.5
Linux kernel v3.16	Version 1.6
Linux kernel v3.17	Version 1.7
Linux kernel v3.19	Version 1.8
Linux kernel v4.1	Version 1.9

Version 1.1 introduces Set Device ID command.

Version 1.2 introduces Passkey Notify event.

Version 1.3 does not introduce any new command or event.

Version 1.4 introduces Set Advertising, Set BR/EDR, Set Static Address
and Set Scan Parameters commands. The existing Set Discoverable command
gained an extra setting for limited discoverable mode. The device name
is now provided in the scan response data for Low Energy.

Version 1.5 introduces Set Secure Connections, Set Debug Keys, Set Privacy
and Load Identity Resolving Keys commands. It also introduces New Identity
Resolving Key and New Signature Resolving Key events.

Version 1.6 introduces Get Connection Information command. It also updates
the Device Found event to combine advertising data and scan response data
into a single event.

Version 1.7 introduces Get Clock Information, Add Device, Remove Device,
Load Connection Parameters, Read Unconfigured Index List, Read Controller
Configuration Information, Set External Configuration and Set Public Address
commands. It also introduces Device Added, Device Removed, New Connection
Parameter, Unconfigured Index Added, Unconfigured Index Removed and New
Configuration Options events. The existing Set Debug Keys command gained
an extra setting for enabling SSP debug mode.

Version 1.8 introduces Start Service Discovery command. It also adds new
Long Term Key types for LE Secure Connection feature.

Version 1.9 introduces Read Local Out Of Band Extended, Data, Read Extended
Controller Index List, Read Advertising Features, Add Advertising and Remove
Advertising commands. It also introduces Extended Index Added, Extended Index
Removed, Local Out Of Band Extended Data Updated, Advertising Added and
Advertising Removed events. The existing Set Advertising command gained an
extra setting for enabling undirected connectable advertising. It provides
support for a new static address setting and allows the usage of Set Fast
Connectable when controller is powered off.

Version 1.10 does not introduce any new command or event. It extends the
advertising feature to support 5 parallel advertising instances.


Example
=======

The Bluetooth management sockets can be created by setting the hci_channel
member of struct sockaddr_hci to HCI_CHANNEL_CONTROL (3) when creating a
raw HCI socket. In C the needed code would look something like the following:

int mgmt_create(void)
{
	struct sockaddr_hci addr;
	int fd;

	fd = socket(PF_BLUETOOTH, SOCK_RAW | SOCK_CLOEXEC | SOCK_NONBLOCK,
                                                                BTPROTO_HCI);
	if (fd < 0)
		return -errno;

	memset(&addr, 0, sizeof(addr));
	addr.hci_family = AF_BLUETOOTH;
	addr.hci_dev = HCI_DEV_NONE;
	addr.hci_channel = HCI_CHANNEL_CONTROL;

	if (bind(fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
		int err = -errno;
		close(fd);
		return err;
	}

	return fd;
}

The process creating the mgmt socket is required to have the
CAP_NET_ADMIN capability (e.g. root would have this).


Packet Structures
=================

	Commands:

	0    4    8   12   16   22   24   28   31   35   39   43   47
	+-------------------+-------------------+-------------------+
	|  Command Code     |  Controller Index |  Parameter Length |
	+-------------------+-------------------+-------------------+
	|                                                           |

	Events:

	0    4    8   12   16   22   24   28   31   35   39   43   47
	+-------------------+-------------------+-------------------+
	|  Event Code       |  Controller Index |  Parameter Length |
	+-------------------+-------------------+-------------------+
	|                                                           |

All fields are in little-endian byte order (least significant byte first).

Controller Index can have a special value <non-controller> to indicate that
command or event is not related to any controller. Possible values:

	<controller id>		0x0000 to 0xFFFE
	<non-controller>	0xFFFF


Error Codes
===========

The following values have been defined for use with the Command Status
and Command Complete events:

0x00	Success
0x01	Unknown Command
0x02	Not Connected
0x03	Failed
0x04	Connect Failed
0x05	Authentication Failed
0x06	Not Paired
0x07	No Resources
0x08	Timeout
0x09	Already Connected
0x0A	Busy
0x0B	Rejected
0x0C	Not Supported
0x0D	Invalid Parameters
0x0E	Disconnected
0x0F	Not Powered
0x10	Cancelled
0x11	Invalid Index
0x12	RFKilled
0x13	Already Paired
0x14	Permission Denied

As a general rule all commands generate the events as specified below,
however invalid lengths or unknown commands will always generate a
Command Status response (with Unknown Command or Invalid Parameters
status). Sending a command with an invalid Controller Index value will
also always generate a Command Status event with the Invalid Index
status code.


Read Management Version Information Command
===========================================

	Command Code:		0x0001
	Controller Index:	<non-controller>
	Command Parameters:
	Return Parameters:	Version (1 Octets)
				Revision (2 Octets)

	This command returns the Management version and revision.
	Besides, being informational the information can be used to
	determine whether certain behavior has changed or bugs fixed
	when interacting with the kernel.

	This command generates a Command Complete event on success or
	a Command Status event on failure.


Read Management Supported Commands Command
==========================================

	Command Code:		0x0002
	Controller Index:	<non-controller>
	Command Parameters:
	Return Parameters:	Num_Of_Commands (2 Octets)
				Num_Of_Events (2 Octets)
				Command1 (2 Octets)
				Command2 (2 Octets)
				...
				Event1 (2 Octets)
				Event2 (2 Octets)
				...

	This command returns the list of supported Management commands
	and events.

	The commands Read Management Version Information and Read
	management Supported Commands are not included in this list.
	Both commands are always supported and mandatory.

	The events Command Status and Command Complete are not included
	in this list. Both are implicit and mandatory.

	This command generates a Command Complete event on success or
	a Command Status event on failure.


Read Controller Index List Command
==================================

	Command Code:		0x0003
	Controller Index:	<non-controller>
	Command Parameters:
	Return Parameters:	Num_Controllers (2 Octets)
				Controller_Index[i] (2 Octets)

	This command returns the list of currently known controllers.
	Controllers added or removed after calling this command can be
	monitored using the Index Added and Index Removed events.

	This command generates a Command Complete event on success or
	a Command Status event on failure.


Read Controller Information Command
===================================

	Command Code:		0x0004
	Controller Index:	<controller id>
	Command Parameters:
	Return Parameters:	Address (6 Octets)
				Bluetooth_Version (1 Octet)
				Manufacturer (2 Octets)
				Supported_Settings (4 Octets)
				Current_Settings (4 Octets)
				Class_Of_Device (3 Octets)
				Name (249 Octets)
				Short_Name (11 Octets)

	This command is used to retreive the current state and basic
	information of a controller. It is typically used right after
	getting the response to the Read Controller Index List command
	or an Index Added event.

	The Address parameter describes the controllers public address
	and it can be expected that it is set. However in case of single
	mode Low Energy only controllers it can be 00:00:00:00:00:00. To
	power on the controller in this case, it is required to configure
	a static address using Set Static Address command first.

	If the public address is set, then it will be used as identity
	address for the controller. If no public address is available,
	then the configured static address will be used as identity
	address.

	In the case of a dual-mode controller with public address that
	is configured as Low Energy only device (BR/EDR switched off),
	the static address is used when set and public address otherwise.

	If no short name is set the Short_Name parameter will be empty
	(begin with a nul byte).

	Current_Settings and Supported_Settings is a bitmask with
	currently the following available bits:

		0	Powered
		1	Connectable
		2	Fast Connectable
		3	Discoverable
		4	Bondable
		5	Link Level Security (Sec. mode 3)
		6	Secure Simple Pairing
		7	Basic Rate/Enhanced Data Rate
		8	High Speed
		9	Low Energy
		10	Advertising
		11	Secure Connections
		12	Debug Keys
		13	Privacy
		14	Controller Configuration
		15	Static Address

	This command generates a Command Complete event on success or
	a Command Status event on failure.

	Possible errors:	Invalid Parameters
				Invalid Index


Set Powered Command
===================

	Command Code:		0x0005
	Controller Index:	<controller id>
	Command Parameters:	Powered (1 Octet)
	Return Parameters:	Current_Settings (4 Octets)

	This command is used to power on or off a controller. The
	allowed Powered command parameter values are 0x00 and 0x01. All
	other values will return Invalid Parameters.

	If discoverable setting is activated with a timeout, then
	switching the controller off will expire this timeout and
	disable discoverable.

	Settings programmed via Set Advertising and Add/Remove
	Advertising while the controller was powered off will be activated
	when powering the controller on.

	Switching the controller off will permanently cancel and remove
	all advertising instances with a timeout set, i.e. time limited
	advertising instances are not being remembered across power cycles.
	Advertising Removed events will be issued accordingly.

	This command generates a Command Complete event on success or
	a Command Status event on failure.

	Possible errors:	Busy
				Invalid Parameters
				Invalid Index


Set Discoverable Command
========================

	Command Code:		0x0006
	Controller Index:	<controller id>
	Command Parameters:	Discoverable (1 Octet)
				Timeout (2 Octets)
	Return Parameters:	Current_Settings (4 Octets)

	This command is used to set the discoverable property of a
	controller. The allowed Discoverable command parameter values
	are 0x00, 0x01 and 0x02. All other values will return Invalid
	Parameters.

	Timeout is the time in seconds and is only meaningful when
	Discoverable is set to 0x01 or 0x02. Providing a timeout
	with 0x00 return Invalid Parameters. For 0x02, the timeout
	value is required.

	The value 0x00 disables discoverable, the value 0x01 enables
	general discoverable and the value 0x02 enables limited
	discoverable.

	This command is only available for BR/EDR capable controllers
	(e.g. not for single-mode LE ones). It will return Not Supported
	otherwise.

	This command can be used when the controller is not powered and
	all settings will be programmed once powered.

	However using a timeout when the controller is not powered will
	return Not Powered error.

	When switching discoverable on and the connectable setting is
	off it will return Rejected error.

	This command generates a Command Complete event on success or
	a Command Status event on failure.

	Possible errors:	Busy
				Rejected
				Not Supported
				Invalid Parameters
				Not Powered
				Invalid Index


Set Connectable Command
=======================

	Command Code:		0x0007
	Controller Index:	<controller id>
	Command Parameters:	Connectable (1 Octet)
	Return Parameters:	Current_Settings (4 Octets)

	This command is used to set the connectable property of a
	controller. The allowed Connectable command parameter values are
	0x00 and 0x01. All other values will return Invalid Parameters.

	This command is available for BR/EDR, LE-only and also dual
	mode controllers. For BR/EDR is changes the page scan setting
	and for LE controllers it changes the advertising type. For
	dual mode controllers it affects both settings.

	For LE capable controllers the connectable setting takes effect
	when advertising is enabled (peripheral) or when directed
	advertising events are received (central).

	This command can be used when the controller is not powered and
	all settings will be programmed once powered.

	When switching connectable off, it will also switch off the
	discoverable setting. Switching connectable back on will not
	restore a previous discoverable. It will stay off and needs
	to be manually switched back on.

	When switching connectable off, it will expire a discoverable
	setting with a timeout.

	This setting does not affect known devices from Add Device
	command. These devices are always allowed to connect.

	This command generates a Command Complete event on success or
	a Command Status event on failure.

	Possible errors:	Busy
				Not Supported
				Invalid Parameters
				Invalid Index


Set Fast Connectable Command
============================

	Command Code:		0x0008
	Controller Index:	<controller id>
	Command Parameters:	Enable (1 Octet)
	Return Parameters:	Current_Settings (4 Octets)

	This command is used to set the controller into a connectable
	state where the page scan parameters have been set in a way to
	favor faster connect times with the expense of higher power
	consumption.

	The allowed values of the Enable command parameter are 0x00 and
	0x01. All other values will return Invalid Parameters.

	This command is only available for BR/EDR capable controllers
	(e.g. not for single-mode LE ones). It will return Not Supported
	otherwise.

	This command can be used when the controller is not powered and
	all settings will be programmed once powered.

	The setting will be remembered during power down/up toggles.

	This command generates a Command Complete event on success or
	a Command Status event on failure.

	Possible errors:	Failed
				Busy
				Not Supported
				Invalid Parameters
				Invalid Index


Set Bondable Command
====================

	Command Code:		0x0009
	Controller Index:	<controller id>
	Command Parameters:	Bondable (1 Octet)
	Return Parameters:	Current_Settings (4 Octets)

	This command is used to set the bondable property of an
	controller. The allowed values for the Bondable command
	parameter are 0x00 and 0x01. All other values will return
	Invalid Parameters.

	This command can be used when the controller is not powered and
	all settings will be programmed once powered.

	Turning bondable on will not automatically switch the controller
	into connectable mode. That needs to be done separately.

	The setting will be remembered during power down/up toggles.

	This command generates a Command Complete event on success or
	a Command Status event on failure.

	Possible errors:	Invalid Parameters
				Invalid Index


Set Link Security Command
=========================

	Command Code:		0x000A
	Controller Index:	<controller id>
	Command Parameters:	Link_Security (1 Octet)
	Return Parameters:	Current_Settings (4 Octets)

	This command is used to either enable or disable link level
	security for an controller (also known as Security Mode 3). The
	allowed values for the Link_Security command parameter are 0x00
	and 0x01. All other values will return Invalid Parameters.

	This command is only available for BR/EDR capable controllers
	(e.g. not for single-mode LE ones). It will return Not Supported
	otherwise.

	This command can be used when the controller is not powered and
	all settings will be programmed once powered.

	This command generates a Command Complete event on success or
	a Command Status event on failure.

	Possible errors:	Busy
				Not Supported
				Invalid Parameters
				Invalid Index


Set Secure Simple Pairing Command
=================================

	Command Code:		0x000B
	Controller Index:	<controller id>
	Command Parameters:	Secure_Simple_Pairing (1 Octet)
	Return Parameters:	Current_Settings (4 Octets)

	This command is used to enable/disable Secure Simple Pairing
	support for a controller. The allowed values for the
	Secure_Simple_Pairing command parameter are 0x00 and 0x01. All
	other values will return Invalid Parameters.

	This command is only available for BR/EDR capable controllers
	supporting the core specification version 2.1 or greater
	(e.g. not for single-mode LE controllers or pre-2.1 ones).

	This command can be used when the controller is not powered and
	all settings will be programmed once powered.

	In case the controller does not support Secure Simple Pairing,
	the command will fail regardless with Not Supported error.

	This command generates a Command Complete event on success or
	a Command Status event on failure.

	Possible errors:	Busy
				Not Supported
				Invalid Parameters
				Invalid Index

Set High Speed Command
======================

	Command Code:		0x000C
	Controller Index:	<controller id>
	Command Parameters:	High_Speed (1 Octet)
	Return Parameters:	Current_Settings (4 Octets)

	This command is used to enable/disable Bluetooth High Speed
	support for a controller. The allowed values for the High_Speed
	command parameter are 0x00 and 0x01. All other values will
	return Invalid Parameters.

	This command is only available for BR/EDR capable controllers
	(e.g. not for single-mode LE ones).

	This command can be used when the controller is not powered and
	all settings will be programmed once powered.

	To enable High Speed support, it is required that Secure Simple
	Pairing support is enabled first. High Speed support is not
	possible for connections without Secure Simple Pairing.

	When switching Secure Simple Pairing off, the support for High
	Speed will be switched off as well. Switching Secure Simple
	Pairing back on, will not re-enable High Speed support. That
	needs to be done manually.

	This command generates a Command Complete event on success or
	a Command Status event on failure.

	Possible errors:	Not Supported
				Invalid Parameters
				Invalid Index


Set Low Energy Command
======================

	Command Code:		0x000D
	Controller Index:	<controller id>
	Command Parameters:	Low_Energy (1 Octet)
	Return Parameters:	Current_Settings (4 Octets)

	This command is used to enable/disable Low Energy support for a
	controller. The allowed values of the Low_Energy command
	parameter are 0x00 and 0x01. All other values will return
	Invalid Parameters.

	This command is only available for LE capable controllers and
	will yield in a Not Supported error otherwise.

	This command can be used when the controller is not powered and
	all settings will be programmed once powered.

	In case the kernel subsystem does not support Low Energy or the
	controller does not either, the command will fail regardless.

	Disabling LE support will permanently disable and remove all
	advertising instances configured with the Add Advertising
	command. Advertising Removed events will be issued accordingly.

	This command generates a Command Complete event on success or
	a Command Status event on failure.

	Possible errors:	Busy
				Not Supported
				Invalid Parameters
				Invalid Index


Set Device Class
================

	Command Code:		0x000E
	Controller Index:	<controller id>
	Command Parameters:	Major_Class (1 Octet)
				Minor_Class (1 Octet)
	Return Parameters:	Class_Of_Device (3 Octets)

	This command is used to set the major and minor device class for
	BR/EDR capable controllers.

	This command will also implicitly disable caching of pending CoD
	and EIR updates.

	This command is only available for BR/EDR capable controllers
	(e.g. not for single-mode LE ones).

	This command can be used when the controller is not powered and
	all settings will be programmed once powered.

	In case the controller is powered off, 0x000000 will be returned
	for the class of device parameter. And after power on the new
	value will be announced via class of device changed event.

	This command generates a Command Complete event on success or
	a Command Status event on failure.

	Possible errors:	Busy
				Not Supported
				Invalid Parameters
				Invalid Index


Set Local Name Command
======================

	Command Code:		0x000F
	Controller Index:	<controller id>
	Command Parameters:	Name (249 Octets)
				Short_Name (11 Octets)
	Return Parameters:	Name (249 Octets)
				Short_Name (11 Octets)

	This command is used to set the local name of a controller. The
	command parameters also include a short name which will be used
	in case the full name doesn't fit within EIR/AD data.

	The name parameters need to always end with a null byte (failure
	to do so will cause the command to fail).

	This command can be used when the controller is not powered and
	all settings will be programmed once powered.

	The values of name and short name will be remembered when
	switching the controller off and back on again. So the name
	and short name only have to be set once when a new controller
	is found and will stay until removed.

	This command generates a Command Complete event on success or
	a Command Status event on failure.

	Possible errors:	Invalid Parameters
				Invalid Index


Add UUID Command
================

	Command Code:		0x0010
	Controller Index:	<controller id>
	Command Parameters:	UUID (16 Octets)
				SVC_Hint (1 Octet)
	Return Parameters:	Class_Of_Device (3 Octets)

	This command is used to add a UUID to be published in EIR data.
	The accompanied SVC_Hint parameter is used to tell the kernel
	whether the service class bits of the Class of Device value need
	modifying due to this UUID.

	This command can be used when the controller is not powered and
	all settings will be programmed once powered.

	In case the controller is powered off, 0x000000 will be returned
	for the class of device parameter. And after power on the new
	value will be announced via class of device changed event.

	This command generates a Command Complete event on success or
	a Command Status event on failure.

	Possible errors:	Busy
				Invalid Parameters
				Invalid Index


Remove UUID Command
===================

	Command Code:		0x0011
	Controller Index:	<controller id>
	Command Parameters:	UUID (16 Octets)
	Return Parameters:	Class_Of_Device (3 Octets)

	This command is used to remove a UUID previously added using the
	Add UUID command.

	When the UUID parameter is an empty UUID (16 x 0x00), then all
	previously loaded UUIDs will be removed.

	This command can be used when the controller is not powered and
	all settings will be programmed once powered.

	In case the controller is powered off, 0x000000 will be returned
	for the class of device parameter. And after power on the new
	value will be announced via class of device changed event.

	This command generates a Command Complete event on success or
	a Command Status event on failure.

	Possible errors:	Busy
				Invalid Parameters
				Invalid Index


Load Link Keys Command
======================

	Command Code:		0x0012
	Controller Index:	<controller id>
	Command Parameters:	Debug_Keys (1 Octet)
				Key_Count (2 Octets)
				Key1 {
					Address (6 Octets)
					Address_Type (1 Octet)
					Key_Type (1 Octet)
					Value (16 Octets)
					PIN_Length (1 Octet)
				}
				Key2 { }
				...
	Return Parameters:

	This command is used to feed the kernel with currently known
	link keys. The command does not need to be called again upon the
	receiption of New Link Key events since the kernel updates its
	list automatically.

	The Debug_Keys parameter is used to tell the kernel whether to
	accept the usage of debug keys or not. The allowed values for
	this parameter are 0x00 and 0x01. All other values will return
	an Invalid Parameters response.

	Usage of the Debug_Keys parameter is deprecated and has been
	replaced with the Set Debug Keys command. When setting the
	Debug_Keys option via Load Link Keys command it has the same
	affect as setting it via Set Debug Keys and applies to all
	keys in the system.

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	Reserved (not in use)
		2	Reserved (not in use)

	Public and random LE addresses are not valid and will be rejected.

	Currently defined Key_Type values are:

		0x00	Combination key
		0x01	Local Unit key
		0x02	Remote Unit key
		0x03	Debug Combination key
		0x04	Unauthenticated Combination key from P-192
		0x05	Authenticated Combination key from P-192
		0x06	Changed Combination key
		0x07	Unauthenticated Combination key from P-256
		0x08	Authenticated Combination key from P-256

	This command can be used when the controller is not powered.

	This command generates a Command Complete event on success or
	a Command Status event on failure.

	Possible errors:	Invalid Parameters
				Invalid Index


Load Long Term Keys Command
===========================

	Command Code:		0x0013
	Controller Index:	<controller id>
	Command Parameters:	Key_Count (2 Octets)
				Key1 {
					Address (6 Octets)
					Address_Type (1 Octet)
					Key_Type (1 Octet)
					Master (1 Octet)
					Encryption_Size (1 Octet)
					Encryption_Diversifier (2 Octets)
					Random_Number (8 Octets)
					Value (16 Octets)
				}
				Key2 {  }
				...
	Return Parameters:

	This command is used to feed the kernel with currently known
	(SMP) Long Term Keys. The command does not need to be called
	again upon the receiption of New Long Term Key events since the
	kernel updates its list automatically.

	Possible values for the Address_Type parameter:
		0	Reserved (not in use)
		1	LE Public
		2	LE Random

	The provided Address and Address_Type are the identity of
	a device. So either its public address or static random address.

	Unresolvable random addresses and resolvable random addresses are
	not valid and will be rejected.

	Currently defined Key_Type values are:

		0x00	Unauthenticated key
		0x01	Authenticated key

	This command can be used when the controller is not powered.

	This command generates a Command Complete event on success or
	a Command Status event on failure.

	Possible errors:	Invalid Parameters
				Invalid Index


Disconnect Command
==================

	Command Code:		0x0014
	Controller Index:	<controller id>
	Command Parameters:	Address (6 Octets)
				Address_Type (1 Octet)
	Return Parameters:	Address (6 Octets)
				Address_Type (1 Octet)

	This command is used to force the disconnection of a currently
	connected device.

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	LE Public
		2	LE Random

	This command can only be used when the controller is powered.

	This command generates a Command Complete event on success
	or failure.

	Possible errors:	Not Connected
				Busy
				Invalid Parameters
				Not Powered
				Invalid Index


Get Connections Command
=======================

	Command Code:		0x0015
	Controller Index:	<controller id>
	Command Parameters:
	Return Parameters:	Connection_Count (2 Octets)
				Address1 {
					Address (6 Octets)
					Address_Type (1 Octet)
				}
				Address2 { }
				...

	This command is used to retrieve a list of currently connected
	devices.

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	LE Public
		2	LE Random

	For devices using resolvable random addresses with a known
	identity resolving key, the Address and Address_Type will
	contain the identity information.

	This command can only be used when the controller is powered.

	This command generates a Command Complete event on success or
	a Command Status event on failure.

	Possible errors:	Invalid Parameters
				Not Powered
				Invalid Index


PIN Code Reply Command
=======================

	Command Code:		0x0016
	Controller Index:	<controller id>
	Command Parameters:	Address (6 Octets)
				Address_Type (1 Octet)
				PIN_Length (1 Octet)
				PIN_Code (16 Octets)
	Return Parameters:	Address (6 Octets)
				Address_Type (1 Octet)

	This command is used to respond to a PIN Code request event.

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	LE Public
		2	LE Random

	This command can only be used when the controller is powered.

	This command generates a Command Complete event on success
	or failure.

	Possible errors:	Not Connected
				Invalid Parameters
				Not Powered
				Invalid Index


PIN Code Negative Reply Command
===============================

	Command Code:		0x0017
	Controller Index:	<controller id>
	Command Parameters:	Address (6 Octets)
				Address_Type (1 Octet)
	Return Parameters:	Address (6 Octets)
				Address_Type (1 Octet)

	This command is used to return a negative response to a PIN Code
	Request event.

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	LE Public
		2	LE Random

	This command can only be used when the controller is powered.

	This command generates a Command Complete event on success
	or failure.

	Possible errors:	Not Connected
				Invalid Parameters
				Not Powered
				Invalid Index


Set IO Capability Command
=========================

	Command Code:		0x0018
	Controller Index:	<controller id>
	Command Parameters:	IO_Capability (1 Octet)
	Return Parameters:

	This command is used to set the IO Capability used for pairing.
	The command accepts both SSP and SMP values.

	Possible values for the IO_Capability parameter:
		0	DisplayOnly
		1	DisplayYesNo
		2	KeyboardOnly
		3	NoInputNoOutput
		4	KeyboardDisplay

	Passing a value 4 (KeyboardDisplay) will cause the kernel to
	convert it to 1 (DisplayYesNo) in the case of a BR/EDR
	connection (as KeyboardDisplay is specific to SMP).

	This command can be used when the controller is not powered.

	This command generates a Command Complete event on success or
	a Command Status event on failure.

	Possible errors:	Invalid Parameters
				Invalid Index


Pair Device Command
===================

	Command Code:		0x0019
	Controller Index:	<controller id>
	Command Parameters:	Address (6 Octets)
				Address_Type (1 Octet)
				IO_Capability (1 Octet)
	Return Parameters:	Address (6 Octets)
				Address_Type (1 Octet)

	This command is used to trigger pairing with a remote device.
	The IO_Capability command parameter is used to temporarily (for
	this pairing event only) override the global IO Capaility (set
	using the Set IO Capability command).

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	LE Public
		2	LE Random

	Possible values for the IO_Capability parameter:
		0	DisplayOnly
		1	DisplayYesNo
		2	KeyboardOnly
		3	NoInputNoOutput
		4	KeyboardDisplay

	Passing a value 4 (KeyboardDisplay) will cause the kernel to
	convert it to 1 (DisplayYesNo) in the case of a BR/EDR
	connection (as KeyboardDisplay is specific to SMP).

	The Address and Address_Type of the return parameters will
	return the identity address if known. In case of resolvable
	random address given as command parameters and the remote
	provides an identity resolving key, the return parameters
	will provide the resolved address.

	To allow tracking of which resolvable random address changed
	into which identity address, the New Identity Resolving Key
	event will be sent before receiving Command Complete event
	for this command.

	This command can only be used when the controller is powered.

	This command generates a Command Complete event on success
	or failure.

	Reject status is used when requested transport is not enabled.

	Not Supported status is used if controller is not capable with
	requested transport.

	Possible errors:	Rejected
				Not Supported
				Connect Failed
				Busy
				Invalid Parameters
				Not Powered
				Invalid Index
				Already Paired


Cancel Pair Device Command
==========================

	Command Code:		0x001A
	Controller Index:	<controller id>
	Command Parameters:	Address (6 Octets)
				Address_Type (1 Octet)
	Return Parameters:	Address (6 Octets)
				Address_Type (1 Octet)

	The Address and Address_Type parameters should match what was
	given to a preceding Pair Device command.

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	LE Public
		2	LE Random

	This command can only be used when the controller is powered.

	This command generates a Command Complete event on success
	or failure.

	Possible errors:	Invalid Parameters
				Not Powered
				Invalid Index


Unpair Device Command
=====================

	Command Code:		0x001B
	Controller Index:	<controller id>
	Command Parameters:	Address (6 Octets)
				Address_Type (1 Octet)
				Disconnect (1 Octet)
	Return Parameters:	Address (6 Octets)
				Address_Type (1 Octet)

	Removes all keys associated with the remote device.

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	LE Public
		2	LE Random

	The Disconnect parameter tells the kernel whether to forcefully
	disconnect any existing connections to the device. It should in
	practice always be 1 except for some special GAP qualification
	test-cases where a key removal without disconnecting is needed.

	When unpairing a device its link key, long term key and if
	provided identity resolving key will be purged.

	For devices using resolvable random addresses where the identity
	resolving key was available, after this command they will now no
	longer be resolved. The device will essentially become private
	again.

	This command can only be used when the controller is powered.

	This command generates a Command Complete event on success
	or failure.

	Possible errors:	Not Paired
				Invalid Parameters
				Not Powered
				Invalid Index


User Confirmation Reply Command
===============================

	Command Code:		0x001C
	Controller Index:	<controller id>
	Command Parameters:	Address (6 Octets)
				Address_Type (1 Octet)
	Return Parameters:	Address (6 Octets)
				Address_Type (1 Octet)

	This command is used to respond to a User Confirmation Request
	event.

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	LE Public
		2	LE Random

	This command can only be used when the controller is powered.

	This command generates a Command Complete event on success
	or failure.

	Possible errors:	Not Connected
				Invalid Parameters
				Not Powered
				Invalid Index


User Confirmation Negative Reply Command
========================================

	Command Code:		0x001D
	Controller Index:	<controller id>
	Command Parameters:	Address (6 Octets)
				Address_Type (1 Octet)
	Return Parameters:	Address (6 Octets)
				Address_Type (1 Octet)

	This command is used to return a negative response to a User
	Confirmation Request event.

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	LE Public
		2	LE Random

	This command can only be used when the controller is powered.

	This command generates a Command Complete event on success
	or failure.

	Possible errors:	Not Connected
				Invalid Parameters
				Not Powered
				Invalid Index


User Passkey Reply Command
==========================

	Command Code:		0x001E
	Controller Index:	<controller id>
	Command Parameters:	Address (6 Octets)
				Address_Type (1 Octet)
				Passkey (4 Octets)
	Return Parameters:	Address (6 Octets)
				Address_Type (1 Octet)

	This command is used to respond to a User Confirmation Passkey
	Request event.

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	LE Public
		2	LE Random

	This command can only be used when the controller is powered.

	This command generates a Command Complete event on success
	or failure.

	Possible errors:	Not Connected
				Invalid Parameters
				Not Powered
				Invalid Index


User Passkey Negative Reply Command
===================================

	Command Code:		0x001F
	Controller Index:	<controller id>
	Command Parameters:	Address (6 Octets)
				Address_Type (1 Octet)
	Return Parameters:	Address (6 Octets)
				Address_Type (1 Octet)

	This command is used to return a negative response to a User
	Passkey Request event.

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	LE Public
		2	LE Random

	This command can only be used when the controller is powered.

	This command generates a Command Complete event on success
	or failure.

	Possible errors:	Not Connected
				Invalid Parameters
				Not Powered
				Invalid Index


Read Local Out Of Band Data Command
===================================

	Command Code:		0x0020
	Controller Index:	<controller id>
	Command Parameters:
	Return Parameters:	Hash_192 (16 Octets)
				Randomizer_192 (16 Octets)
				Hash_256 (16 Octets, Optional)
				Randomizer_256 (16 Octets, Optional)

	This command is used to read the local Out of Band data.

	This command can only be used when the controller is powered.

	If Secure Connections support is enabled, then this command
	will return P-192 versions of hash and randomizer as well as
	P-256 versions of both.

	Values returned by this command become invalid when the controller
	is powered down. After each power-cycle it is required to call
	this command again to get updated values.

	This command generates a Command Complete event on success or
	a Command Status event on failure.

	Possible errors:	Not Supported
				Busy
				Invalid Parameters
				Not Powered
				Invalid Index


Add Remote Out Of Band Data Command
===================================

	Command Code:		0x0021
	Controller Index:	<controller id>
	Command Parameters:	Address (6 Octets)
				Address_Type (1 Octet)
				Hash_192 (16 Octets)
				Randomizer_192 (16 Octets)
				Hash_256 (16 Octets, Optional)
				Randomizer_256 (16 Octets, Optional)
	Return Parameters:	Address (6 Octets)
				Address_Type (1 Octet)

	This command is used to provide Out of Band data for a remote
	device.

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	LE Public
		2	LE Random

	Provided Out Of Band data is persistent over power down/up toggles.

	This command also accept optional P-256 versions of hash and
	randomizer. If they are not provided, then they are set to
	zero value.

	The P-256 versions of both can also be provided when the
	support for Secure Connections is not enabled. However in
	that case they will never be used.

	To only provide the P-256 versions of hash and randomizer,
	it is valid to leave both P-192 fields as zero values. If
	Secure Connections is disabled, then of course this is the
	same as not providing any data at all.

	When providing data for remote LE devices, then the Hash_192 and
	and Randomizer_192 fields are not used and shell be set to zero.

	The Hash_256 and Randomizer_256 fields can be used for LE secure
	connections Out Of Band data. If only LE secure connections data
	is provided the Hash_P192 and Randomizer_P192 fields can be set
	to zero. Currently there is no support for providing the Security
	Manager TK Value for LE legacy pairing.

	If Secure Connections Only mode has been enabled, then providing
	Hash_P192 and Randomizer_P192 is not allowed. They are required
	to be set to zero values.

	This command can be used when the controller is not powered and
	all settings will be programmed once powered.

	This command generates a Command Complete event on success
	or failure.

	Possible errors:	Failed
				Invalid Parameters
				Not Powered
				Invalid Index


Remove Remote Out Of Band Data Command
======================================

	Command Code:		0x0022
	Controller Index:	<controller id>
	Command Parameters:	Address (6 Octets)
				Address_Type (1 Octet)
	Return Parameters:	Address (6 Octets)
				Address_Type (1 Octet)

	This command is used to remove data added using the Add Remote
	Out Of Band Data command.

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	LE Public
		2	LE Random

	When the Address parameter is 00:00:00:00:00:00, then all
	previously added data will be removed.

	This command can be used when the controller is not powered and
	all settings will be programmed once powered.

	This command generates a Command Complete event on success
	or failure.

	Possible errors:	Invalid Parameters
				Not Powered
				Invalid Index


Start Discovery Command
=======================

	Command Code:		0x0023
	Controller Index:	<controller id>
	Command Parameters:	Address_Type (1 Octet)
	Return Parameters:	Address_Type (1 Octet)

	This command is used to start the process of discovering remote
	devices. A Device Found event will be sent for each discovered
	device.

	Possible values for the Address_Type parameter are a bit-wise or
	of the following bits:

		0	BR/EDR
		1	LE Public
		2	LE Random

	By combining these e.g. the following values are possible:

		1	BR/EDR
		6	LE (public & random)
		7	BR/EDR/LE (interleaved discovery)

	This command can only be used when the controller is powered.

	This command generates a Command Complete event on success
	or failure.

	Possible errors:	Busy
				Not Supported
				Invalid Parameters
				Not Powered
				Invalid Index


Stop Discovery Command
======================

	Command Code:		0x0024
	Controller Index:	<controller id>
	Command Parameters:	Address_Type (1 Octet)
	Return Parameters:	Address_Type (1 Octet)

	This command is used to stop the discovery process started using
	the Start Discovery command.

	This command can only be used when the controller is powered.

	This command generates a Command Complete event on success
	or failure.

	Possible errors:	Rejected
				Invalid Parameters
				Invalid Index


Confirm Name Command
====================

	Command Code:		0x0025
	Controller Index:	<controller id>
	Command Parameters:	Address (6 Octets)
				Address_Type (1 Octet)
				Name_Known (1 Octet)
	Return Parameters:	Address (6 Octets)
				Address_Type (1 Octet)

	This command is only valid during device discovery and is
	expected for each Device Found event with the Confirm Name
	flag set.

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	LE Public
		2	LE Random

	The Name_Known parameter should be set to 0x01 if user space
	knows the name for the device and 0x00 if it doesn't. If set to
	0x00 the kernel will perform a name resolving procedure for the
	device in question.

	This command can only be used when the controller is powered.

	This command generates a Command Complete event on success
	or failure.

	Possible errors:	Failed
				Invalid Parameters
				Invalid Index


Block Device Command
====================

	Command Code:		0x0026
	Controller Index:	<controller id>
	Command Parameters:	Address (6 Octets)
				Address_Type (1 Octet)
	Return Parameters:	Address (6 Octets)
				Address_Type (1 Octet)

	This command is used to add a device to the list of devices
	which should be blocked from being connected to the local
	controller.

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	LE Public
		2	LE Random

	For Low Energy devices, the blocking of a device takes precedence
	over auto-connection actions provided by Add Device. Blocked
	devices will not be auto-connected or even reported when found
	during background scanning. If the controller is connectable
	direct advertising from blocked devices will also be ignored.

	Connections created from advertising of the controller will
	be dropped if the device is blocked.

	This command can be used when the controller is not powered.

	This command generates a Command Complete event on success
	or failure.

	Possible errors:	Failed
				Invalid Parameters
				Invalid Index


Unblock Device Command
======================

	Command Code:		0x0027
	Controller Index:	<controller id>
	Command Parameters:	Address (6 Octets)
				Address_Type (1 Octet)
	Return Parameters:	Address (6 Octets)
				Address_Type (1 Octet)

	This command is used to remove a device from the list of blocked
	devices (where it was added to using the Block Device command).

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	LE Public
		2	LE Random

	When the Address parameter is 00:00:00:00:00:00, then all
	previously blocked devices will be unblocked.

	This command can be used when the controller is not powered.

	This command generates a Command Complete event on success
	or failure.

	Possible errors:	Invalid Parameters
				Invalid Index


Set Device ID Command
=====================

	Command Code:		0x0028
	Controller Index:	<controller id>
	Command Parameters:	Source (2 Octets)
				Vendor (2 Octets)
				Product (2 Octets)
				Version (2 Octets)
	Return Parameters:

	This command can be used when the controller is not powered and
	all settings will be programmed once powered.

	The Source parameter selects the organization that assigned the
	Vendor parameter:

		0x0000	Disable Device ID
		0x0001	Bluetooth SIG
		0x0002	USB Implementer’s Forum

	The information is put into the EIR data. If the controller does
	not support EIR or if SSP is disabled, this command will still
	succeed. The information is stored for later use and will survive
	toggling SSP on and off.

	This command generates a Command Complete event on success or
	a Command Status event on failure.

	Possible errors:	Invalid Parameters
				Invalid Index


Set Advertising Command
=======================

	Command Code:		0x0029
	Controller Index:	<controller id>
	Command Parameters:	Advertising (1 Octet)
	Return Parameters:	Current_Settings (4 Octets)

	This command is used to enable LE advertising on a controller
	that supports it. The allowed values for the Advertising command
	parameter are 0x00, 0x01 and 0x02. All other values will return
	Invalid Parameters.

	The value 0x00 disables advertising, the value 0x01 enables
	advertising with considering of connectable setting and the
	value 0x02 enables advertising in connectable mode.

	Using value 0x01 means that when connectable setting is disabled,
	the advertising happens with undirected non-connectable advertising
	packets and a non-resovable random address is used. If connectable
	setting is enabled, then undirected connectable advertising packets
	and the identity address or resolvable private address are used.

	LE Devices configured via Add Device command with Action 0x01
	have no effect when using Advertising value 0x01 since only the
	connectable setting is taken into account.

	To utilize undirected connectable advertising without changing the
	connectable setting, the value 0x02 can be utilized. It makes the
	device connectable via LE without the requirement for being
	connectable on BR/EDR (and/or LE).

	The value 0x02 should be the preferred mode of operation when
	implementing peripheral mode.

	Using this command will temporarily deactivate any configuration
	made by the Add Advertising command. This command takes precedence.
	Once a Set Advertising command with value 0x00 is issued any
	previously made configurations via Add/Remove Advertising, including
	such changes made while Set Advertising was active, will be re-
	enabled.

	A pre-requisite is that LE is already enabled, otherwise this
	command will return a "rejected" response.

	This command generates a Command Complete event on success or a
	Command Status event on failure.

	Possible errors:	Busy
				Rejected
				Not Supported
				Invalid Parameters
				Invalid Index


Set BR/EDR Command
==================

	Command Code:		0x002A
	Controller Index:	<controller id>
	Command Parameters:	BR/EDR (1 Octet)
	Return Parameters:	Current_Settings (4 Octets)

	This command is used to enable or disable BR/EDR support
	on a dual-mode controller. The allowed values for the Advertising
	command parameter are 0x00 and 0x01. All other values will
	return Invalid Parameters.

	A pre-requisite is that LE is already enabled, otherwise
	this command will return a "rejected" response. Enabling BR/EDR
	can be done both when powered on and powered off, however
	disabling it can only be done when powered off (otherwise the
	command will again return "rejected"). Disabling BR/EDR will
	automatically disable all other BR/EDR related settings.

	This command generates a Command Complete event on success or a
	Command Status event on failure.

	Possible errors:	Busy
				Rejected
				Not Supported
				Invalid Parameters
				Invalid Index


Set Static Address Command
==========================

	Command Code:		0x002B
	Controller Index:	<controller id>
	Command Parameters:	Address (6 Octets)
	Return Parameters:	Current_Settings (4 Octets)

	This command allows for setting the static random address. It is
	only supported on controllers with LE support. The static random
	address is suppose to be valid for the lifetime of the
	controller or at least until the next power cycle. To ensure
	such behavior, setting of the address is limited to when the
	controller is powered off.

	The special BDADDR_ANY address (00:00:00:00:00:00) can be used
	to disable the static address.

	When a controller has a public address (which is required for
	all dual-mode controllers), this address is not used. If a dual-mode
	controller is configured as Low Energy only devices (BR/EDR has
	been switched off), then the static address is used. Only when
	the controller information reports BDADDR_ANY (00:00:00:00:00:00),
	it is required to configure a static address first.

	If privacy mode is enabled and the controller is single mode
	LE only without a public address, the static random address is
	used as identity address.

	The Static Address flag from the current settings can also be used
	to determine if the configured static address is in use or not.

	This command generates a Command Complete event on success or a
	Command Status event on failure.

	Possible errors:	Rejected
				Not Supported
				Invalid Parameters
				Invalid Index


Set Scan Parameters Command
===========================

	Command Code:		0x002C
	Controller Index:	<controller id>
	Command Parameters:	Interval (2 Octets)
				Window (2 Octets)
	Return Parameters:

	This command allows for setting the Low Energy scan parameters
	used for connection establishment and passive scanning. It is
	only supported on controllers with LE support.

	This command generates a Command Complete event on success or a
	Command Status event on failure.

	Possible errors:	Rejected
				Not Supported
				Invalid Parameters
				Invalid Index


Set Secure Connections Command
==============================

	Command Code:		0x002D
	Controller Index:	<controller id>
	Command Parameters:	Secure_Connections (1 Octet)
	Return Parameters:	Current_Settings (4 Octets)

	This command is used to enable/disable Secure Connections
	support for a controller. The allowed values for the
	Secure_Connections command parameter are 0x00, 0x01 and 0x02.
	All other values will return Invalid Parameters.

	The value 0x00 disables Secure Connections, the value 0x01
	enables Secure Connections and the value 0x02 enables Secure
	Connections Only mode.

	This command is only available for LE capable controllers as
	well as controllers supporting the core specification version
	4.1 or greater.

	This command can be used when the controller is not powered and
	all settings will be programmed once powered.

	In case the controller does not support Secure Connections
	the command will fail regardless with Not Supported error.

	This command generates a Command Complete event on success or
	a Command Status event on failure.

	Possible errors:	Busy
				Not Supported
				Invalid Parameters
				Invalid Index


Set Debug Keys Command
======================

	Command Code:		0x002E
	Controller Index:	<controller id>
	Command Parameters:	Debug_Keys (1 Octet)
	Return Parameters:	Current_Settings (4 Octets)

	This command is used to tell the kernel whether to accept the
	usage of debug keys or not. The allowed values for this parameter
	are 0x00, 0x01 and 0x02. All other values will return an Invalid
	Parameters response.

	With a value of 0x00 any generated debug key will be discarded
	as soon as the connection terminates.

	With a value of 0x01 generated debug keys will be kept and can
	be used for future connections. However debug keys are always
	marked as non persistent and should not be stored. This means
	a reboot or changing the value back to 0x00 will delete them.

	With a value of 0x02 generated debug keys will be kept and can
	be used for future connections. This has the same affect as
	with value 0x01. However in addition this value will also
	enter the controller mode to generate debug keys for each
	new pairing. Changing the value back to 0x01 or 0x00 will
	disable the controller mode for generating debug keys.

	This command generates a Command Complete event on success or
	a Command Status event on failure.

	Possible errors:	Busy
				Not Supported
				Invalid Parameters
				Invalid Index


Set Privacy Command
===================

	Command Code:		0x002F
	Controller Index:	<controller id>
	Command Parameters:	Privacy (1 Octet)
				Identity_Resolving_Key (16 Octets)
	Return Parameters:	Current_Settings (4 Octets)

	This command is used to enable Low Energy Privacy feature using
	resolvable private addresses.

	The value 0x00 disables privacy mode, the values 0x01 and 0x02
	enable privacy mode.

	With value 0x01 the kernel will always use the privacy mode. This
	means resolvable private address is used when the controller is
	discoverable and also when pairing is initiated.

	With value 0x02 the kernel will use privacy mode with resolvable
	private address. In case the conroller is bondable and discoverable
	the identity address is used. Also when pairing is initiated, the
	connection will be established with the identity address.

	Exposing the identity address when bondable and discoverable or
	during initated pairing can be a privacy issue. For dual-mode
	controllers this can be neglected since its public address will
	be exposed over BR/EDR anyway. The benefit of exposing the
	identity address for pairing purposes is that it makes matching
	up devices with dual-mode topology during device discovery now
	possible.

	If the privacy value 0x02 is used, then also the GATT database
	should expose the Privacy Characteristic so that remote devices
	can determine if the privacy feature is in use or not.

	When the controller has a public address (mandatory for dual-mode
	controllers) it is used as identity address. In case the controller
	is single mode LE only without a public address, it is required
	to configure a static random andress first. The privacy mode can
	only be enabled when an identity address is available.

	The Identity_Resolving_Key is the local key assigned for the local
	resolvable private address.

	Possible errors:	Busy
				Not Supported
				Invalid Parameters
				Invalid Index


Load Identity Resolving Keys Command
====================================

	Command Code:		0x0030
	Controller Index:	<controller id>
	Command Parameters:	Key_Count (2 Octets)
				Key1 {
					Address (6 Octets)
					Address_Type (1 Octet)
					Value (16 Octets)
				}
				Key2 {  }
				...
	Return Parameters:

	This command is used to feed the kernel with currently known
	identity resolving keys. The command does not need to be called
	again upon the receiption of New Identity Resolving Key events
	since the kernel updates its list automatically.

	Possible values for the Address_Type parameter:
		0	Reserved (not in use)
		1	LE Public
		2	LE Random

	The provided Address and Address_Type are the identity of
	a device. So either its public address or static random address.

	Unresolvable random addresses and resolvable random addresses are
	not valid and will be rejected.

	This command can be used when the controller is not powered.

	This command generates a Command Complete event on success or
	a Command Status event on failure.

	Possible errors:	Invalid Parameters
				Invalid Index


Get Connection Information Command
==================================

	Command Code:		0x0031
	Controller Index:	<controller id>
	Command Parameters:	Address (6 Octets)
				Address_Type (1 Octet)
	Return Parameters:	Address (6 Octets)
				Address_Type (1 Octet)
				RSSI (1 Octet)
				TX_Power (1 Octet)
				Max_TX_Power (1 Octet)

	This command is used to get connection information.

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	LE Public
		2	LE Random

	TX_Power and Max_TX_Power can be set to 127 if values are invalid or
	unknown. A value of 127 for RSSI indicates that it is not available.

	This command generates a Command Complete event on success and
	on failure. In case of failure only Address and Address_Type fields
	are valid and values of remaining parameters are considered invalid
	and shall be ignored.

	Possible errors:	Not Connected
				Not Powered
				Invalid Parameters
				Invalid Index


Get Clock Information Command
=============================

	Command Code:		0x0032
	Controller Index:	<controller id>
	Command Parameters:	Address (6 Octets)
				Address_Type (1 Octet)
	Return Parameters:	Address (6 Octets)
				Address_Type (1 Octet)
				Local_Clock (4 Octets)
				Piconet_Clock (4 Octets)
				Accuracy (2 Octets)

	This command is used to get local and piconet clock information.

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	Reserved (not in use)
		2	Reserved (not in use)

	The Accuracy can be set to 0xffff which means the value is unknown.

	If the Address is set to 00:00:00:00:00:00, then only the
	Local_Clock field has a valid value. The Piconet_Clock and
	Accuracy fields are invalid and shall be ignored.

	This command generates a Command Complete event on success and
	on failure. In case of failure only Address and Address_Type fields
	are valid and values of remaining parameters are considered invalid
	and shall be ignored.

	Possible errors:	Not Connected
				Not Powered
				Invalid Parameters
				Invalid Index


Add Device Command
==================

	Command Code:		0x0033
	Controller Index:	<controller id>
	Command Parameters:	Address (6 Octets)
				Address_Type (1 Octet)
				Action (1 Octet)
	Return Parameters:	Address (6 Octets)
				Address_Type (1 Octet)

	This command is used to add a device to the action list. The
	action list allows scanning for devices and enables incoming
	connections from known devices.

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	LE Public
		2	LE Random

	Possible values for the Action parameter:
		0	Background scan for device
		1	Allow incoming connection
		2	Auto-connect remote device

	With the Action 0, when the device is found, a new Device Found
	event will be sent indicating this device is available. This
	action is only valid for LE Public and LE Random address types.

	With the Action 1, the device is allowed to connect. For BR/EDR
	address type this means an incoming connection. For LE Public
	and LE Random address types, a connection will be established
	to devices using directed advertising. If successful a Device
	Connected event will be sent.

	With the Action 2, when the device is found, it will be connected
	and if successful a Device Connected event will be sent. This
	action is only valid for LE Public and LE Random address types.

	When a device is blocked using Block Device command, then it is
	valid to add the device here, but all actions will be ignored
	until the device is unblocked.

	Devices added with Action 1 are allowed to connect even if the
	connectable setting is off. This acts as list of known trusted
	devices.

	This command can be used when the controller is not powered and
	all settings will be programmed once powered.

	This command generates a Command Complete event on success
	or failure.

	Possible errors:	Failed
				Invalid Parameters
				Invalid Index


Remove Device Command
=====================

	Command Code:		0x0034
	Controller Index:	<controller id>
	Command Parameters:	Address (6 Octets)
				Address_Type (1 Octet)
	Return Parameters:	Address (6 Octets)
				Address_Type (1 Octet)

	This command is used to remove a device from the action list
	previously added by using the Add Device command.

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	LE Public
		2	LE Random

	When the Address parameter is 00:00:00:00:00:00, then all
	previously added devices will be removed.

	This command can be used when the controller is not powered and
	all settings will be programmed once powered.

	This command generates a Command Complete event on success
	or failure.

	Possible errors:	Invalid Parameters
				Invalid Index


Load Connection Parameters Command
==================================

	Command Code:		0x0035
	Controller Index:	<controller id>
	Command Parameters:	Param_Count (2 Octets)
				Param1 {
					Address (6 Octets)
					Address_Type (1 Octet)
					Min_Connection_Interval (2 Octets)
					Max_Connection_Interval (2 Octes)
					Connection_Latency (2 Octets)
					Supervision_Timeout (2 Octets)
				}
				Param2 {  }
				...
	Return Parameters:

	This command is used to load connection parameters from several
	devices into kernel. Currently this is only supported on controllers
	with Low Energy support.

	Possible values for the Address_Type parameter:
		0	Reserved (not in use)
		1	LE Public
		2	LE Random

	The provided Address and Address_Type are the identity of
	a device. So either its public address or static random address.

	The Min_Connection_Interval, Max_Connection_Interval,
	Connection_Latency and Supervision_Timeout parameters should
	be configured as described in Core 4.1 spec, Vol 2, 7.8.12.

	This command can be used when the controller is not powered.

	This command generates a Command Complete event on success or
	a Command Status event on failure.

	Possible errors:	Invalid Parameters
				Invalid Index
				Not Supported


Read Unconfigured Controller Index List Command
===============================================

	Command Code:		0x0036
	Controller Index:	<non-controller>
	Command Parameters:
	Return Parameters:	Num_Controllers (2 Octets)
				Controller_Index[i] (2 Octets)

	This command returns the list of currently unconfigured controllers.
	Unconfigured controllers added after calling this command can be
	monitored using the Unconfigured Index Added event.

	An unconfigured controller can either move to a configured state
	by indicating Unconfigured Index Removed event followed by an
	Index Added event; or it can be removed from the system which
	would be indicated by the Unconfigured Index Removed event.

	Only controllers that require configuration will be listed with
	this command. A controller that is fully configured will not
	be listed even if it supports configuration changes.

	This command generates a Command Complete event on success or
	a Command Status event on failure.


Read Controller Configuration Information Command
=================================================

	Command Code:		0x0037
	Controller Index:	<controller id>
	Command Parameters:
	Return Parameters:	Manufacturer (2 Octets)
				Supported_Options (4 Octets)
				Missing_Options (4 Octets)

	This command is used to retreive the supported configuration
	options of a controller and the missing configuration options.

	The missing options are required to be configured before the
	controller is considered fully configured and ready for standard
	operation. The command is typically used right after getting the
	response to Read Unconfigured Controller Index List command or
	Unconfigured Index Added event.

	Supported_Options and Missing_Options is a bitmask with currently
	the following available bits:

		0	External configuration
		1	Bluetooth public address configuration

	It is valid to call this command on controllers that do not
	require any configuration. It is possible that a fully configured
	controller offers additional support for configuration.

	For example a controller may contain a valid Bluetooth public
	device address, but also allows to configure it from the host
	stack. In this case the general support for configurations will
	be indicated by the Controller Configuration settings. For
	controllers where no configuration options are available that
	setting option will not be present.

	When all configurations have been completed and as a result the
	Missing_Options mask would become empty, then the now ready
	controller will be announced via Index Added event.

	This command generates a Command Complete event on success or
	a Command Status event on failure.

	Possible errors:	Invalid Parameters
				Invalid Index


Set External Configuration Command
==================================

	Command Code:		0x0038
	Controller Index:	<controller id>
	Command Parameters:	Configuration (1 Octet)
	Return Parameters:	Missing_Options (4 Octets)

	This command allows to change external configuration option to
	indicate that a controller is now configured or unconfigured.

	The value 0x00 sets unconfigured state and the value 0x01 sets
	configured state of the controller.

	It is not mandatory that this configuration option is provided
	by a controller. If it is provided, the configuration has to
	happen externally using user channel operation or via vendor
	specific methods.

	Setting this option and when Missing_Options returns zero, this
	means that the controller will switch to configured state and it
	can be expected that it will be announced via Index Added event.

	Wrongly configured controllers might still cause an error when
	trying to power them via Set Powered commmand.

	This command generates a Command Complete event on success or a
	Command Status event on failure.

	Possible errors:	Rejected
				Not Supported
				Invalid Parameters
				Invalid Index


Set Public Address Command
==========================

	Command Code:		0x0039
	Controller Index:	<controller id>
	Command Parameters:	Address (6 Octets)
	Return Parameters:	Missing_Options (4 Octets)

	This command allows configuration of public address. Since a vendor
	specific procedure is required, this command might not be supported
	by all controllers. Actually most likely only a handful embedded
	controllers will offer support for this command.

	When the support for Bluetooth public address configuration is
	indicated in the supported options mask, then this command
	can be used to configure the public address.

	It is only possible to configure the public address when the
	controller is powered off.

	For an unconfigured controller and when Missing_Options returns
	an empty mask, this means that a Index Added event for the now
	fully configured controller can be expected.

	For a fully configured controller, the current controller index
	will become invalid and an Unconfigured Index Removed event will
	be sent. Once the address has been successfully changed an Index
	Added event will be sent. There is no guarantee that the controller
	index stays the same.

	All previous configured parameters and settings are lost when
	this command succeeds. The controller has to be treated as new
	one. Use this command for a fully configured controller only when
	you really know what you are doing.

	This command generates a Command Complete event on success or a
	Command Status event on failure.

	Possible errors:	Rejected
				Not Supported
				Invalid Parameters
				Invalid Index


Start Service Discovery Command
===============================

	Command Code:		0x003a
	Controller Index:	<controller id>
	Command Parameters:	Address_Type (1 Octet)
				RSSI_Threshold (1 Octet)
				UUID_Count (1 Octet)
				UUID[i] (16 Octets)
	Return Parameters:	Address_Type (1 Octet)

	This command is used to start the process of discovering remote
	devices with a specific UUID. A Device Found event will be sent
	for each discovered device.

	Possible values for the Address_Type parameter are a bit-wise or
	of the following bits:

		0	BR/EDR
		1	LE Public
		2	LE Random

	By combining these e.g. the following values are possible:

		1	BR/EDR
		6	LE (public & random)
		7	BR/EDR/LE (interleaved discovery)

	The service discovery uses active scanning for Low Energy scanning
	and will search for UUID in both advertising data and scan response
	data.

	Found devices that have a RSSI value smaller than RSSI_Threshold
	are not reported via DeviceFound event. Setting a value of 127
	will cause all devices to be reported.

	The list of UUIDs identifies a logical OR. Only one of the UUIDs
	have to match to cause a DeviceFound event. Providing an empty
	list of UUIDs with Num_UUID set to 0 which means that DeviceFound
	events are send out for all devices above the RSSI_Threshold.

	In case RSSI_Threshold is set to 127 and UUID_Count is 0, then
	this command behaves exactly the same as Start Discovery.

	When the discovery procedure starts the Discovery event will
	notify this similar to Start Discovery.

	This command can only be used when the controller is powered.

	This command generates a Command Complete event on success
	or failure.

	Possible errors:	Busy
				Not Supported
				Invalid Parameters
				Not Powered
				Invalid Index


Read Local Out Of Band Extended Data Command
============================================

	Command Code:		0x003b
	Controller Index:	<controller id>
	Command Parameters:	Address_Type (1 Octet)
	Return Parameters:	Address_Type (1 Octet)
				EIR_Data_Length (2 Octets)
				EIR_Data (0-65535 Octets)

	This command is used to read the local Out of Band data
	information and provide them encoded as extended inquiry
	response information or advertising data.

	Possible values for the Address_Type parameter are a bit-wise or
	of the following bits:

		0	BR/EDR
		1	LE Public
		2	LE Random

	By combining these e.g. the following values are possible:

		1	BR/EDR
		6	LE (public & random)
		7	Reserved (not in use)

	For BR/EDR controller (Address_Type 1) the returned information
	will contain the following information:

		Class of Device
		Simple Pairing Hash C-192 (optional)
		Simple Pairing Randomizer R-192 (optional)
		Simple Pairing Hash C-256 (optional)
		Simple Pairing Randomizer R-256 (optional)
		Service Class UUID (optional)
		Bluetooth Local Name (optional)

	The Simple Pairing Hash C-256 and Simple Pairing Randomizer R-256
	fields are only included when secure connections has been enabled.

	The Device Address (BD_ADDR) is not included in the EIR_Data and
	needs to be taken from controller information.

	For LE controller (Address_Type 6) the returned information
	will contain the following information:

		LE Bluetooth Device Address
		LE Role
		LE Secure Connections Confirmation Value (optional)
		LE Secure Connections Random Value (optional)
		Appearance (optional)
		Local Name (optional)
		Flags

	The LE Secure Connections Confirmation Value and LE Secure Connections
	Random Value fields are only included when secure connections has been
	enabled.

	The Security Manager TK Value from the Bluetooth specification can
	not be provided by this command. The Out Of Band information here are
	for asymmetric exchanges based on Diffie-Hellman key exchange. The
	Security Manager TK Value is a symmetric random number that has to
	be acquired and agreed upon differently.

	The returned information from BR/EDR controller and LE controller
	types are not related to each other. Once they have been used
	over an Out Of Band link, a new set of information shall be
	requested.

	When Secure Connections Only mode has been enabled, then the fields
	for Simple Pairing Hash C-192 and Simple Pairing Randomizer R-192
	are not returned. Only the fields for the strong secure connections
	pairing are included.

	This command can only be used when the controller is powered.

	Values returned by this command become invalid when the controller
	is powered down. After each power-cycle it is required to call
	this command again to get updated information.

	This command generates a Command Complete event on success or
	a Command Status event on failure.

	Possible errors:	Not Supported
				Busy
				Invalid Parameters
				Not Powered
				Invalid Index


Read Extended Controller Index List Command
===========================================

	Command Code:		0x003c
	Controller Index:	<non-controller>
	Command Parameters:
	Return Parameters:	Num_Controllers (2 Octets)
				Controller_Index[i] (2 Octets)
				Controller_Type[i] (1 Octet)
				Controller_Bus[i] (1 Octet)

	This command returns the list of currently known controllers. It
	includes configured, unconfigured and alternate controllers.

	Controllers added or removed after calling this command can be
	be monitored using the Extended Index Added and Extended Index
	Removed events.

	The existing Index Added, Index Removed, Unconfigured Index Added
	and Unconfigured Index Removed are no longer sent after this command
	has been used at least once.

	Instead of calling Read Controller Index List and Read Unconfigured
	Controller Index List, this command combines all the information
	and can be used to retrieve the controller list.

	The Controller_Type parameter has these values:

		0x00	Primary Controller (BR/EDR and/or LE)
		0x01	Unconfigured Controller (BR/EDR and/or LE)
		0x02	Alternate MAC/PHY Controller (AMP)

	The 0x00 and 0x01 types indiciate a primary BR/EDR and/or LE
	controller. The difference is just if they need extra configuration
	or if they are fully configured.

	Controllers in configured state will be listed as 0x00 and controllers
	in unconfigured state will be listed as 0x01. A controller that is
	fully configured and supports configuration changes will be listed
	as 0x00.

	Alternate MAC/PHY controllers will be listed as 0x02. They do not
	support the difference between configured and unconfigured state.

	The Controller_Bus parameter has these values:

		0x00	Virtual
		0x01	USB
		0x02	PCMCIA
		0x03	UART
		0x04	RS232
		0x05	PCI
		0x06	SDIO

	Controllers marked as RAW only operation are currently not listed
	by this command.

	This command generates a Command Complete event on success or
	a Command Status event on failure.


Read Advertising Features Command
=================================

	Command Code:		0x003d
	Controller Index:	<controller id>
	Command Parameters:
	Return Parameters:	Supported_Flags (4 Octets)
				Max_Adv_Data_Len (1 Octet)
				Max_Scan_Rsp_Len (1 Octet)
				Max_Instances (1 Octet)
				Num_Instances (1 Octet)
				Instance[i] (1 Octet)

	This command is used to read the advertising features supported
	by the controller and stack.

	With the Supported_Flags field the possible values for the Flags
	field in Add Advertising command provided:

		0	Switch into Connectable mode
		1	Advertise as Discoverable
		2	Advertise as Limited Discoverable
		3	Add Flags field to Adv_Data
		4	Add TX Power field to Adv_Data
		5	Add Appearance field to Scan_Rsp
		6	Add Local Name in Scan_Rsp

	The Flags bit 0 indicates support for connectable advertising
	and for switching to connectable advertising independent of the
	connectable global setting. When this flag is not supported, then
	the global connectable setting determines if undirected connectable,
	undirected scannable or undirected non-connectable advertising is
	used. It also determines the use of non-resolvable random address
	versus identity address or resolvable private address.

	The Flags bit 1 indicates support for advertising with discoverable
	mode enabled. Users of this flag will decrease the Max_Adv_Data_Len
	by 3 octets. In this case the advertising data flags are managed
	and added in front of the provided advertising data.

	The Flags bit 2 indicates support for advertising with limited
	discoverable mode enabled. Users of this flag will decrease the
	Max_Adv_Data_Len by 3 octets. In this case the advertising data
	flags are managed and added in front of the provided advertising
	data.

	The Flags bit 3 indicates support for automatically keeping the
	Flags field of the advertising data updated. Users of this flag
	will decrease the Max_Adv_Data_Len by 3 octets and need to keep
	that in mind. The Flags field will be added in front of the
	advertising data provided by the user. Note that with Flags bit 1
	and Flags bit 2, this one will be implicitly used even if it is
	not marked as supported.

	The Flags bit 4 indicates support for automatically adding the
	TX Power value to the advertising data. Users of this flag will
	decrease the Max_Adv_Data_Len by 3 octets. The TX Power field will
	be added at the end of the user provided advertising data. If the
	controller does not support TX Power information, then this bit will
	not be set.

	The Flags bit 5 indicates support for automatically adding the
	Apperance value to the scan response data. Users of this flag
	will decrease the Max_Scan_Rsp_len by 4 octets. The Appearance
	field will be added in front of the scan response data provided
	by the user. If the appearance value is not supported, then this
	bit will not be set.

	The Flags bit 6 indicates support for automatically adding the
	Local Name value to the scan response data. This flag indicates
	an opportunistic approach for the Local Name. If enough space
	in the scan response data is available, it will be added. If the
	space is limited a short version or no name information. The
	Local Name will be added at the end of the scan response data.

	The valid range for Instance identifiers is 1-254. The value 0
	is reserved for internal use and the value 255 is reserved for
	future extensions. However the Max_Instances value for indicating
	the number of supported Instances can be also 0 if the controller
	does not support any advertising.

	The Max_Adv_Data_Len and Max_Scan_Rsp_Len provides extra
	information about the maximum length of the data fields. For
	now this will always return the value 31. Different flags
	however might decrease the actual available length in these
	data fields.

	With Num_Instances and Instance array the currently occupied
	Instance identifiers can be retrieved.

	This command generates a Command Complete event on success or
	a Command Status event on failure.

	Possible errors:	Invalid Parameters
				Invalid Index


Add Advertising Command
=======================

	Command Code:		0x003e
	Controller Index:	<controller id>
	Command Parameters:	Instance (1 Octet)
				Flags (4 Octets)
				Duration (2 Octets)
				Timeout (2 Octets)
				Adv_Data_Len (1 Octet)
				Scan_Rsp_len (1 Octet)
				Adv_Data (0-255 Octets)
				Scan_Rsp (0-255 Octets)
	Return Parameters:	Instance (1 Octet)

	This command is used to configure an advertising instance that
	can be used to switch a Bluetooth Low Energy controller into
	advertising mode.

	Added advertising information with this command will not be visible
	immediately if advertising is enabled via the Set Advertising
	command. The usage of the Set Advertising command takes precedence
	over this command. Instance information is stored and will be
	advertised once advertising via Set Advertising has been disabled.

	The Instance identifier is a value between 1 and the number of
	supported instances. The value 0 is reserved.

	With the Flags value the type of advertising is controlled and
	the following flags are defined:

		0	Switch into Connectable mode
		1	Advertise as Discoverable
		2	Advertise as Limited Discoverable
		3	Add Flags field to Adv_Data
		4	Add TX Power field to Adv_Data
		5	Add Appearance field to Scan_Rsp
		6	Add Local Name in Scan_Rsp

	When the connectable flag is set, then the controller will use
	undirected connectable advertising. The value of the connectable
	setting can be overwritten this way. This is useful to switch a
	controller into connectable mode only for LE operation. This is
	similar to the mode 0x02 from the Set Advertising command.

	When the connectable flag is not set, then the controller will
	use advertising based on the connectable setting. When using
	non-connectable or scannable advertising, the controller will
	be programmed with a non-resolvable random address. When the
	system is connectable, then the identity address or resolvable
	private address will be used.

	Using the connectable flag is useful for peripheral mode support
	where BR/EDR (and/or LE) is controlled by Add Device. This allows
	making the peripheral connectable without having to interfere
	with the global connectable setting.

	If Scan_Rsp_Len is zero and connectable flag is not set and
	the global connectable setting is off, then non-connectable
	advertising is used. If Scan_Rsp_Len is larger than zero and
	connectable flag is not set and the global advertising is off,
	then scannable advertising is used. This small difference is
	supported to provide less air traffic for devices implementing
	broadcaster role.

	The Duration parameter configures the length of an Instance. The
	value is in seconds.

	A value of 0 indicates a default value is chosen for the
	Duration. The default is 2 seconds.

	If only one advertising Instance has been added, then the Duration
	value will be ignored. It only applies for the case where multiple
	Instances are configured. In that case every Instance will be
	available for the Duration time and after that it switches to
	the next one. This is a simple round-robin based approach.

	The Timeout parameter configures the life-time of an Instance. In
	case the value 0 is used it indicates no expiration time. If a
	timeout value is provided, then the advertising Instance will be
	automatically removed when the timeout passes. The value for the
	timeout is in seconds. Powering down a controller will invalidate
	all advertising Instances and it is not possible to add a new
	Instance with a timeout when the controller is powered down.

	When a Timeout is provided, then the Duration subtracts from
	the actual Timeout value of that Instance. For example an Instance
	with Timeout of 5 and Duration of 2 will be scheduled exactly 3
	times, twice with 2 seconds and once with one second. Other
	Instances have no influence on the Timeout.

	Re-adding an already existing instance (i.e. issuing the Add
	Advertising command with an Instance identifier of an existing
	instance) will update that instance's configuration.

	An instance being added or changed while another instance is
	being advertised will not be visible immediately but only when
	the new/changed instance is being scheduled by the round robin
	advertising algorithm.

	Changes to an instance that is currently being advertised will
	cancel that instance and switch to the next instance. The changes
	will be visible the next time the instance is scheduled for
	advertising. In case a single instance is active, this means
	that changes will be visible right away.

	A pre-requisite is that LE is already enabled, otherwise this
	command will return a "rejected" response.

	This command can be used when the controller is not powered and
	all settings will be programmed once powered.

	This command generates a Command Complete event on success or a
	Command Status event on failure.

	Possible errors:	Failed
				Rejected
				Not Supported
				Invalid Parameters
				Invalid Index


Remove Advertising Command
==========================

	Command Code:		0x003f
	Controller Index:	<controller id>
	Command Parameters:	Instance (1 Octet)
	Return Parameters:	Instance (1 Octet)

	This command is used to remove an advertising instance that
	can be used to switch a Bluetooth Low Energy controller into
	advertising mode.

	When the Instance parameter is zero, then all previously added
	advertising Instances will be removed.

	Removing advertising information with this command will not be
	visible as long as advertising is enabled via the Set Advertising
	command. The usage of the Set Advertising command takes precedence
	over this command. Changes to Instance information are stored and
	will be advertised once advertising via Set Advertising has been
	disabled.

	Removing an instance while it is being advertised will immediately
	cancel the instance, even when it has been advertised less then its
	configured Timeout or Duration.

	This command can be used when the controller is not powered and
	all settings will be programmed once powered.

	This command generates a Command Complete event on success or
	a Command Status event on failure.

	Possible errors:	Invalid Parameters
				Invalid Index


Start Limited Discovery Command
===============================

	Command Code:		0x0040
	Controller Index:	<controller id>
	Command Parameters:	Address_Type (1 Octet)
	Return Parameters:	Address_Type (1 Octet)

	This command is used to start the process of discovering remote
	devices using the limited discovery procedure. A Device Found event
	will be sent for each discovered device.

	Possible values for the Address_Type parameter are a bit-wise or
	of the following bits:

		0	BR/EDR
		1	LE Public
		2	LE Random

	By combining these e.g. the following values are possible:

		1	BR/EDR
		6	LE (public & random)
		7	BR/EDR/LE (interleaved discovery)

	The limited discovery uses active scanning for Low Energy scanning
	and will search for devices with the limited discoverabilty flag
	configured. On BR/EDR it uses LIAC and filters on the limited
	discoverabilty flag of the class of device.

	When the discovery procedure starts the Discovery event will
	notify this similar to Start Discovery.

	This command can only be used when the controller is powered.

	This command generates a Command Complete event on success
	or failure.

	Possible errors:	Busy
				Not Supported
				Invalid Parameters
				Not Powered
				Invalid Index


Command Complete Event
======================

	Event Code:		0x0001
	Controller Index:	<controller id> or <non-controller>
	Event Parameters:	Command_Opcode (2 Octets)
				Status (1 Octet)
				Return_Parameters

	This event is an indication that a command has completed. The
	fixed set of parameters includes the opcode to identify the
	command that completed as well as a status value to indicate
	success or failure. The rest of the parameters are command
	specific and documented in the section for each command
	separately.


Command Status Event
====================

	Event Code:		0x0002
	Controller Index:	<controller id> or <non-controller>
	Event Parameters:	Command_Opcode (2 Octets)
				Status (1 Octet)

	The command status event is used to indicate an early status for
	a pending command. In the case that the status indicates failure
	(anything else except success status) this also means that the
	command has finished executing.


Controller Error Event
======================

	Event Code:		0x0003
	Controller Index:	<controller id>
	Event Parameters:	Error_Code (1 Octet)

	This event maps straight to the HCI Hardware Error event and is
	used to indicate something wrong with the controller hardware.


Index Added Event
=================

	Event Code:		0x0004
	Controller Index:	<controller id>
	Event Parameters:

	This event indicates that a new controller has been added to the
	system. It is usually followed by a Read Controller Information
	command.

	Once the Read Extended Controller Index List command has been
	used at least once, the Extended Index Added event will be
	send instead of this one.


Index Removed Event
===================

	Event Code:		0x0005
	Controller Index:	<controller id>
	Event Parameters:

	This event indicates that a controller has been removed from the
	system.

	Once the Read Extended Controller Index List command has been
	used at least once, the Extended Index Removed event will be
	send instead of this one.


New Settings Event
==================

	Event Code:		0x0006
	Controller Index:	<controller id>
	Event Parameters:	Current_Settings (4 Octets)

	This event indicates that one or more of the settings for a
	controller has changed.


Class Of Device Changed Event
=============================

	Event Code:		0x0007
	Controller Index:	<controller id>
	Event Parameters:	Class_Of_Device (3 Octets)

	This event indicates that the Class of Device value for the
	controller has changed. When the controller is powered off the
	Class of Device value will always be reported as zero.


Local Name Changed Event
========================

	Event Code:		0x0008
	Controller Index:	<controller id>
	Event Parameters:	Name (249 Octets)
				Short_Name (11 Octets)

	This event indicates that the local name of the controller has
	changed.


New Link Key Event
==================

	Event Code:		0x0009
	Controller Index:	<controller id>
	Event Parameters:	Store_Hint (1 Octet)
				Key {
					Address (6 Octets)
					Address_Type (1 Octet)
					Key_Type (1 Octet)
					Value (16 Octets)
					PIN_Length (1 Octet)
				}

	This event indicates that a new link key has bee generated for a
	remote device.

	The Store_Hint parameter indicates whether the host is expected
	to store the key persistently or not (e.g. this would not be set
	if the authentication requirement was "No Bonding").

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	Reserved (not in use)
		2	Reserved (not in use)

	Public and random LE addresses are not valid and will be rejected.

	Currently defined Key_Type values are:

		0x00	Combination key
		0x01	Local Unit key
		0x02	Remote Unit key
		0x03	Debug Combination key
		0x04	Unauthenticated Combination key from P-192
		0x05	Authenticated Combination key from P-192
		0x06	Changed Combination key
		0x07	Unauthenticated Combination key from P-256
		0x08	Authenticated Combination key from P-256

	Receiving this event indicates that a pairing procecure has
	been completed.


New Long Term Key Event
=======================

	Event Code:		0x000A
	Controller Index:	<controller id>
	Event Parameters:	Store_Hint (1 Octet)
				Key {
					Address (6 Octets)
					Address_Type (1 Octet)
					Key_Type (1 Octet)
					Master (1 Octet)
					Encryption Size (1 Octet)
					Enc. Diversifier (2 Octets)
					Random Number (8 Octets)
					Value (16 Octets)
				}

	This event indicates that a new long term key has been generated
	for a remote device.

	The Store_Hint parameter indicates whether the host is expected
	to store the key persistently or not (e.g. this would not be set
	if the authentication requirement was "No Bonding").

	Possible values for the Address_Type parameter:
		0	Reserved (not in use)
		1	LE Public
		2	LE Random

	The provided Address and Address_Type are the identity of
	a device. So either its public address or static random address.

	For unresolvable random addresses and resolvable random addresses
	without identity information and identity resolving key, the
	Store_Hint will be set to not store the long term key.

	Currently defined Key_Type values are:

		0x00	Unauthenticated legacy key
		0x01	Authenticated legacy key
		0x02	Unauthenticated key from P-256
		0x03	Authenticated key from P-256
		0x04	Debug key from P-256

	Receiving this event indicates that a pairing procecure has
	been completed.


Device Connected Event
======================

	Event Code:		0x000B
	Controller Index:	<controller id>
	Event Parameters:	Address (6 Octets)
				Address_Type (1 Octet)
				Flags (4 Octets)
				EIR_Data_Length (2 Octets)
				EIR_Data (0-65535 Octets)

	This event indicates that a successful baseband connection has
	been created to the remote device.

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	LE Public
		2	LE Random

	For devices using resolvable random addresses with a known
	identity resolving key, the Address and Address_Type will
	contain the identity information.

	It is possible that devices get connected via its resolvable
	random address and after New Identity Resolving Key event
	start using its identity.

	The following bits are defined for the Flags parameter:
		0	Reserved (not in use)
		1	Legacy Pairing
		2	Reserved (not in use)


Device Disconnected Event
=========================

	Event Code:		0x000C
	Controller Index:	<controller id>
	Event Parameters:	Address (6 Octets)
				Address_Type (1 Octet)
				Reason (1 Octet)

	This event indicates that the baseband connection was lost to a
	remote device.

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	LE Public
		2	LE Random

	For devices using resolvable random addresses with a known
	identity resolving key, the Address and Address_Type will
	contain the identity information.

	Possible values for the Reason parameter:
		0	Unspecified
		1	Connection timeout
		2	Connection terminated by local host
		3	Connection terminated by remote host

	Note that the local/remote distinction just determines which side
	terminated the low-level connection, regardless of the
	disconnection of the higher-level profiles.

	This can sometimes be misleading and thus must be used with care.
	For example, some hardware combinations would report a locally
	initiated disconnection even if the user turned Bluetooth off in
	the remote side.


Connect Failed Event
====================

	Event Code:		0x000D
	Controller Index:	<controller id>
	Event Parameters:	Address (6 Octets)
				Address_Type (1 Octet)
				Status (1 Octet)

	This event indicates that a connection attempt failed to a
	remote device.

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	LE Public
		2	LE Random

	For devices using resolvable random addresses with a known
	identity resolving key, the Address and Address_Type will
	contain the identity information.


PIN Code Request Event
======================

	Event Code:		0x000E
	Controller Index:	<controller id>
	Event Parameters:	Address (6 Octets)
				Address_Type (1 Octet)
				Secure (1 Octet)

	This event is used to request a PIN Code reply from user space.
	The reply should either be returned using the PIN Code Reply or
	the PIN Code Negative Reply command.

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	LE Public
		2	LE Random

	Secure: 0x01  secure PIN code required
		0x00  secure PIN code not required


User Confirmation Request Event
===============================

	Event Code:		0x000F
	Controller Index:	<controller id>
	Event Parameters:	Address (6 Octets)
				Address_Type (1 Octet)
				Confirm_Hint (1 Octet)
				Value (4 Octets)

	This event is used to request a user confirmation request from
	user space.

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	LE Public
		2	LE Random

	If the Confirm_Hint parameter value is 0x01 this means that
	a simple "Yes/No" confirmation should be presented to the user
	instead of a full numerical confirmation (in which case the
	parameter value will be 0x00).

	User space should respond to this command either using the User
	Confirmation Reply or the User Confirmation Negative Reply
	command.


User Passkey Request Event
==========================

	Event Code:		0x0010
	Controller Index:	<controller id>
	Event Parameters:	Address (6 Octets)
				Address_Type (1 Octet)

	This event is used to request a passkey from user space. The
	response to this event should either be the User Passkey Reply
	command or the User Passkey Negative Reply command.

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	LE Public
		2	LE Random


Authentication Failed Event
===========================

	Event Code:		0x0011
	Controller Index:	<controller id>
	Event Parameters:	Address (6 Octets)
				Address_Type (1 Octet)
				Status (1 Octet)

	This event indicates that there was an authentication failure
	with a remote device.

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	LE Public
		2	LE Random


Device Found Event
==================

	Event Code:		0x0012
	Controller Index:	<controller id>
	Event Parameters:	Address (6 Octets)
				Address_Type (1 Octet)
				RSSI (1 Octet)
				Flags (4 Octets)
				EIR_Data_Length (2 Octets)
				EIR_Data (0-65535 Octets)

	This event indicates that a device was found during device
	discovery.

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	LE Public
		2	LE Random

	The following bits are defined for the Flags parameter:
		0	Confirm name
		1	Legacy Pairing
		2	Not Connectable

	For the RSSI field a value of 127 indicates that the RSSI is
	not available. That can happen with Bluetooth 1.1 and earlier
	controllers or with bad radio conditions.

	The Confirm name flag indicates that the kernel wants to know
	whether user space knows the name for this device or not. If
	this flag is set user space should respond to it using the
	Confirm Name command.

	The Legacy Pairing flag indicates that Legacy Pairing is likely
	to occur when pairing with this device. An application could use
	this information to optimize the pairing process by locally
	pre-generating a PIN code and thereby eliminate the risk of
	local input timeout when pairing. Note that there is a risk of
	false-positives for this flag so user space should be able to
	handle getting something else as a PIN Request when pairing.

	The Not Connectable flag indicates that the device will not
	accept any connections. This can be indicated by Low Energy
	devices that are in broadcaster role.


Discovering Event
=================

	Event Code:		0x0013
	Controller Index:	<controller id>
	Event Parameters:	Address_Type (1 Octet)
				Discovering (1 Octet)

	This event indicates that the controller has started discovering
	devices. This discovering state can come and go multiple times
	between a Start Discovery and a Stop Discovery commands.

	The Start Service Discovery command will also trigger this event.

	The valid values for the Discovering parameter are 0x01
	(enabled) and 0x00 (disabled).


Device Blocked Event
====================

	Event Code:		0x0014
	Controller Index:	<controller id>
	Event Parameters:	Address (6 Octets)
				Address_Type (1 Octet)

	This event indicates that a device has been blocked using the
	Block Device command.

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	LE Public
		2	LE Random

	The event will only be sent to Management sockets other than the
	one through which the command was sent.


Device Unblocked Event
======================

	Event Code:		0x0015
	Controller Index:	<controller id>
	Event Parameters:	Address (6 Octets)
				Address_Type (1 Octet)

	This event indicates that a device has been unblocked using the
	Unblock Device command.

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	LE Public
		2	LE Random

	The event will only be sent to Management sockets other than the
	one through which the command was sent.


Device Unpaired Event
=====================

	Event Code:		0x0016
	Controller Index:	<controller id>
	Event Parameters:	Address (6 Octets)
				Address_Type (1 Octet)

	This event indicates that a device has been unpaired (i.e. all
	its keys have been removed from the kernel) using the Unpair
	Device command.

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	LE Public
		2	LE Random

	For devices using resolvable random addresses with a known
	identity resolving key, the event paramters will contain
	the identity. After receiving this event, the device will
	become essentially private again.

	The event will only be sent to Management sockets other than the
	one through which the Unpair Device command was sent.


Passkey Notify Event
====================

	Event Code:		0x0017
	Controller Index:	<controller id>
	Event Parameters:	Address (6 Octets)
				Address_Type (1 Octet)
				Passkey (4 Octets)
				Entered (1 Octet)

	This event is used to request passkey notification to the user.
	Unlike the other authentication events it does not need
	responding to using any Management command.

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	LE Public
		2	LE Random

	The Passkey parameter indicates the passkey to be shown to the
	user whereas the Entered parameter indicates how many characters
	the user has entered on the remote side.


New Identity Resolving Key Event
================================

	Event Code:		0x0018
	Controller Index:	<controller id>
	Event Parameters:	Store_Hint (1 Octet)
				Random_Address (6 Octets)
				Key {
					Address (6 Octets)
					Address_Type (1 Octet)
					Value (16 Octets)
				}

	This event indicates that a new identity resolving key has been
	generated for a remote device.

	The Store_Hint parameter indicates whether the host is expected
	to store the key persistently or not.

	The Random_Address provides the resolvable random address that
	was resolved into an identity. A value of 00:00:00:00:00:00
	indicates that the identity resolving key was provided for
	a public address or static random address.

	Once this event has been send for a resolvable random address,
	all further events mapping this device will send out using the
	identity address information.

	This event also indicates that now the identity address should
	be used for commands instead of the resolvable random address.

	It is possible that some devices allow discovering via its
	identity address, but after pairing using resolvable private
	address only. In such a case Store_Hint will be 0x00 and the
	Random_Address will indicate 00:00:00:00:00:00. For these devices,
	the Privacy Characteristic of the remote GATT database should
	be consulted to decide if the identity resolving key must be
	stored persistently or not.

	Devices using Set Privacy command with the option 0x02 would
	be such type of device.

	Possible values for the Address_Type parameter:
		0	Reserved (not in use)
		1	LE Public
		2	LE Random

	The provided Address and Address_Type are the identity of
	a device. So either its public address or static random address.


New Signature Resolving Key Event
=================================

	Event Code:		0x0019
	Controller Index:	<controller id>
	Event Parameters:	Store_Hint (1 Octet)
				Key {
					Address (6 Octets)
					Address_Type (1 Octet)
					Type (1 Octet)
					Value (16 Octets)
				}

	This event indicates that a new signature resolving key has been
	generated for either the master or slave device.

	The Store_Hint parameter indicates whether the host is expected
	to store the key persistently or not.

	The Type parameter has the following possible values:

		0x00	Unauthenticated local CSRK
		0x01	Unauthenticated remote CSRK
		0x02	Authenticated local CSRK
		0x03	Authenticated remote CSRK

	The local keys are used for signing data to be sent to the
	remote device, whereas the remote keys are used to verify
	signatures received from the remote device.

	The local signature resolving key will be generated with each
	pairing request. Only after receiving this event with the Type
	indicating a local key is it possible to use ATT Signed Write
	procedures.

	Possible values for the Address_Type parameter:
		0	Reserved (not in use)
		1	LE Public
		2	LE Random

	The provided Address and Address_Type are the identity of
	a device. So either its public address or static random address.


Device Added Event
==================

	Event Code:		0x001a
	Controller Index:	<controller id>
	Event Parameters:	Address (6 Octets)
				Address_Type (1 Octet)
				Action (1 Octet)

	This event indicates that a device has been added using the
	Add Device command.

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	LE Public
		2	LE Random

	The event will only be sent to management sockets other than the
	one through which the command was sent.


Device Removed Event
====================

	Event Code:		0x001b
	Controller Index:	<controller id>
	Event Parameters:	Address (6 Octets)
				Address_Type (1 Octet)

	This event indicates that a device has been removed using the
	Remove Device command.

	Possible values for the Address_Type parameter:
		0	BR/EDR
		1	LE Public
		2	LE Random

	The event will only be sent to management sockets other than the
	one through which the command was sent.


New Connection Parameter Event
==============================

	Event Code:		0x001c
	Controller Index:	<controller id>
	Event Parameters:	Store_Hint (1 Octet)
				Param {
					Address (6 Octets)
					Address_Type (1 Octet)
					Min_Connection_Interval (2 Octets)
					Max_Connection_Interval (2 Octes)
					Connection_Latency (2 Octets)
					Supervision_Timeout (2 Octets)
				}

	This event indicates a new set of connection parameters from
	a peripheral device.

	The Store_Hint parameter indicates whether the host is expected
	to store this information persistently or not.

	Possible values for the Address_Type parameter:
		0	Reserved (not in use)
		1	LE Public
		2	LE Random

	The Min_Connection_Interval, Max_Connection_Interval,
	Connection_Latency and Supervision_Timeout parameters are
	encoded as described in Core 4.1 spec, Vol 2, 7.7.65.3.


Unconfigured Index Added Event
==============================

	Event Code:		0x001d
	Controller Index:	<controller id>
	Event Parameters:

	This event indicates that a new unconfigured controller has been
	added to the system. It is usually followed by a Read Controller
	Configuration Information command.

	Only when a controller requires further configuration, it will
	be announced with this event. If it supports configuration, but
	does not require it, then an Index Added event will be used.

	Once the Read Extended Controller Index List command has been
	used at least once, the Extended Index Added event will be
	send instead of this one.


Unconfigured Index Removed Event
================================

	Event Code:		0x001e
	Controller Index:	<controller id>
	Event Parameters:

	This event indicates that an unconfigured controller has been
	removed from the system.

	Once the Read Extended Controller Index List command has been
	used at least once, the Extended Index Removed event will be
	send instead of this one.


New Configuration Options Event
===============================

	Event Code:		0x001f
	Controller Index:	<controller id>
	Event Parameters:	Missing_Options (4 Octets)

	This event indicates that one or more of the options for the
	controller configuration has changed.


Extended Index Added Event
==========================

	Event Code:		0x0020
	Controller Index:	<controller id>
	Event Parameters:	Controller_Type (1 Octet)
				Controller_Bus (1 Octet)

	This event indicates that a new controller index has been
	added to the system.

	This event will only be used after Read Extended Controller Index
	List has been used at least once. If it has not been used, then
	Index Added and Unconfigured Index Added are sent instead.


Extended Index Removed Event
============================

	Event Code:		0x0021
	Controller Index:	<controller id>
	Event Parameters:	Controller_Type (1 Octet)
				Controller_Bus (1 Octet)

	This event indicates that an existing controller index has been
	removed from the system.

	This event will only be used after Read Extended Controller Index
	List has been used at least once. If it has not been used, then
	Index Removed and Unconfigured Index Removed are sent instead.


Local Out Of Band Extended Data Updated Event
=============================================

	Event Code:		0x0022
	Controller Index:	<controller id>
	Event Parameters:	Address_Type (1 Octet)
				EIR_Data_Length (2 Octets)
				EIR_Data (0-65535 Octets)

	This event is used when the Read Local Out Of Band Extended Data
	command has been used and some other user requested a new set
	of local out-of-band data. This allows for the original caller
	to adjust the data.

	Possible values for the Address_Type parameter are a bit-wise or
	of the following bits:

		0	BR/EDR
		1	LE Public
		2	LE Random

	By combining these e.g. the following values are possible:

		1	BR/EDR
		6	LE (public & random)
		7	Reserved (not in use)

	The value for EIR_Data_Length and content for EIR_Data is the
	same as described in Read Local Out Of Band Extended Data command.

	When LE Privacy is used and LE Secure Connections out-of-band
	data has been requested, then this event will be emitted every
	time the Resolvable Private Address (RPA) gets changed. The new
	RPA will be included in the EIR_Data.

	The event will only be sent to management sockets other than the
	one through which the command was sent. It will additionally also
	only be sent to sockets that have used the command at least once.


Advertising Added Event
=======================

	Event Code:		0x0023
	Controller Index:	<controller id>
	Event Parameters:	Instance (1 Octet)

	This event indicates that an advertising instance has been added
	using the Add Advertising command.

	The event will only be sent to management sockets other than the
	one through which the command was sent.


Advertising Removed Event
=========================

	Event Code:		0x0024
	Controller Index:	<controller id>
	Event Parameters:	Instance (1 Octet)

	This event indicates that an advertising instance has been removed
	using the Remove Advertising command.

	The event will only be sent to management sockets other than the
	one through which the command was sent.
