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

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 and Start Limited
Discovery commands.

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.
