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
Linux kernel v4.2	Version 1.10
Linux kernel v4.5	Version 1.11
Linux kernel v4.6	Version 1.12
Linux kernel v4.8	Version 1.13
Linux kernel v4.9	Version 1.14 (not yet released)

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.

Version 1.11 introduces Get Advertising Size Information command.

Version 1.12 introduces a new limited privacy mode (value 0x02 passed to
the Set Privacy command).

Version 1.13 introduces a new authentication failure reason code for the
Device Disconnected event.

Version 1.14 introduces Read Extended Controller Information command and
Extended Controller Information Changed event. It also adds Set Appearance
command. The advertising flags Appearance and Local Name for adding scan
response information are now supported.


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 retrieve 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
	receipt 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 receipt 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 Capability (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-resolvable 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 a limited privacy mode with a
	resolvable private address except when the controller is bondable
	and discoverable, in which case the identity address is used.

	Exposing the identity address when bondable and discoverable or
	during initiated 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 address 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 receipt 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 Octets)
					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 retrieve 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 command.

	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 (2 Octets)
				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 indicate 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
		0x07	SPI
		0x08	I2C
		0x09	SMD

	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
	Appearance 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


Get Advertising Size Information Command
========================================

	Command Code:		0x0040
	Controller Index:	<controller id>
	Command Parameters:	Instance (1 Octet)
				Flags (4 Octets)
	Return Parameters:	Instance (1 Octet)
				Flags (4 Octets)
				Max_Adv_Data_Len (1 Octet)
				Max_Scan_Rsp_Len (1 Octet)

	The Read Advertising Features command returns the overall maximum
	size of advertising data and scan response data fields. That size is
	valid when no Flags are used. However when certain Flags are used,
	then the size might decrease. This command can be used to request
	detailed information about the maximum available size.

	The following Flags values 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

	To get accurate information about the available size, the same Flags
	values should be used with the Add Advertising command.

	The Max_Adv_Data_Len and Max_Scan_Rsp_Len fields provide information
	about the maximum length of the data fields for the given Flags
	values. When the Flags field is zero, then these fields would contain
	the same values as Read Advertising Features.

	Possible errors:	Invalid Parameters
				Invalid Index


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

	Command Code:		0x0041
	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 discoverability flag
	configured. On BR/EDR it uses LIAC and filters on the limited
	discoverability 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


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

	Command Code:		0x0042
	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)
				EIR_Data_Length (2 Octets)
				EIR_Data (0-65535 Octets)

	This command is used to retrieve 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 (or its extended counterparts).

	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.

	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

	The EIR_Data field contains information about class of device,
	local name and other values. Not all of them might be present. For
	example a Low Energy only device does not contain class of device
	information.

	When any of the values in the EIR_Data field changes, the event
	Extended Controller Information Changed will be used to inform
	clients about the updated information.

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

	Possible errors:	Invalid Parameters
				Invalid Index


Set Appearance Command
======================

	Command Code:		0x0042
	Controller Index:	<controller id>
	Command Parameters:	Appearance (2 Octets)
	Return Parameters:

	This command is used to set the appearance value of a controller.

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

	The value of appearance will be remembered when switching
	the controller off and back on again. So the appearance 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.

	This command is only available for LE capable controllers.
	It will return Not Supported otherwise.

	Possible errors:	Not Supported
				Invalid Parameters
				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 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	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 procedure 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 procedure 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
		4	Connection terminated due to authentication failure

	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 parameters 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 Octets)
					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.


Extended Controller Information Changed Event
=============================================

	Event Code:		0x0025
	Controller Index:	<controller id>
	Event Parameters:	EIR_Data_Length (2 Octets)
				EIR_Data (0-65535 Octets)

	This event indicates that controller information has been updated
	and new values are used. This includes the local name, class of
	device, device id and LE address information.

	This event will only be used after Read Extended Controller
	Information command has been used at least once. If it has not
	been used the legacy events are used.

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