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

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


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

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


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

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


Read Management Supported Features Command
==========================================

	Command Code:		0x0002
	Controller Index:	<non-controller>
	Command Parameters:
	Return Parameters:	Features (8 Octets)

		Feature Bit 0:	Controller Support
		Feature Bit 1:	Tracing Support


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)


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)

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

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

		1	Powered
		2	Connectable
		3	Fast Connectable
		4	Discoverable
		5	Pairable
		6	Link Level Security (Sec. mode 3)
		7	Secure Simple Pairing
		8	Basic Rate/Enhanced Data Rate
		9	High Speed
		10	Low Energy


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

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


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

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

	Timeout is the time in seconds and is only meningful when
	Discoverable is set to 1.


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

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


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

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


Set Pairable Command
====================

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


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

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


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)


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

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


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

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


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 will also implicitly disable caching of pending CoD
	and EIR updates.


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)

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


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)


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

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


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)
					Type (1 Octet)
					Value (16 Octets)
					PIN_Length (1 Octet)
				}
				Key2 { }
				...
	Return Parameters:


Remove Keys Command
===================

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

	Removes all keys associated with the remote device.


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

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


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

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

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


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

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


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

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


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

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


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)
				Status (1 Octet)

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


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

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


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

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


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

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


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

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


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

	Command Code:		0x001E
	Controller Index:	<controller id>
	Command Parameters:
	Return Parameters:	Hash (16 Octets)
				Randomizer (16 Octets)


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

	Command Code:		0x001F
	Controller Index:	<controller id>
	Command Parameters:	Address (6 Octets)
				Hash (16 Octets)
				Randomizer (16 Octets)
	Return Parameters:


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

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


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

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

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

		1	BR/EDR
		2	LE Public
		3	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)


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

	Command Code:		0x00022
	Controller Index:	<controller id>
	Command Parameters:
	Return Parameters:


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

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

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


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

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


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

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


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

	Command Code:		0x0026
	Controller Index:	<controller id>
	Command Parameters:	Key Count (2 Octets)
				Key1 {
					Address (6 Octets)
					Authenticated (1 Octet)
					Encryption Size (1 Octet)
					Enc. Diversifier (2 Octets)
					Random Number (8 Octets)
					Value (16 Octets)
				}
				Key2 {  }
				...


Read Tracing Buffer Size Command
================================

	Command Code:		<not yet assigned>
	Controller Index:	<non-controller>
	Command Parameters:
	Return Parameters:	Status (1 Octet)
				Buffer_Size (2 Octets)

		Buffer Size in Kilobytes


Write Tracing Buffer Size Command
=================================

	Command Code:		<not yet assigned>
	Controller Index:	<non-controller>
	Command Parameters:	Buffer_Size (2 Octets)
	Return Parameters:	Status (1 Octet)

		Buffer Size in Kilobytes


Read Controller Tracing Filter Command
=======================================

	Command Code:		<not yet assigned>
	Controller Index:	<controller id>
	Command Parameters:
	Return Parameters:	Status (1 Octet)
				Tracing_Enable (1 Octect)
				Num_Filters (2 Octect)
				Protocol_UUID[i] (16 Octets)
				Protocol_Identifier[i] (16 Octets)

		Tracing_Enable:	0x00 Tracing disabled
				0x01 Command and Event tracing
				0x02 Command, Event and ACL tracing
				0x03 Command, Event, ACL and SCO tracing


Write Controller Tracing Filter Command
=======================================

	Command Code:		<not yet assigned>
	Controller Index:	<controller id>
	Command Parameters:	Tracing_Enable (1 Octect)
				Num_Filters (2 Octect)
				Protocol_UUID[i] (16 Octets)
				Protocol_Identifier[i] (16 Octets)
	Return Parameters:	Status (1 Octet)


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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

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


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

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

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


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

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

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


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

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

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


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

Event Code		0x000E
Controller Index:	<controller id>
Event Parameters	Address (6 Octets)
			Value (4 Octets)


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

Event Code		0x000F
Controller Index:	<controller id>
Event Parameters	Address (6 Octets)


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

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


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

Event Code		0x0011
Controller Index	<controller id>
Event Parameters	Address (6 Octets)
			Type (1 Octet)
			Class_Of_Device (3 Octets)
			RSSI (1 Octet)
			Confirm Name (1 Octet)
			EIR_Data (240 Octets)

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


Remote Name Event
=================

Event Code		0x0012
Controller Index	<controller id>
Event Parameters	Address (6 Octets)
			Name (249 Octets)


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

Event Code		0x00013
Controller Index	<controller id>
Event Parameters	Discovering (1 Octet)


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

Event Code		0x00014
Controller Index	<controller id>
Event Parameters	Address (6 Octets)


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

Event Code		0x00015
Controller Index	<controller id>
Event Parameters	Address (6 Octets)


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

Event Code		0x0016
Controller Index	<controller id>
Event Parameters	Store Hint (1 Octet)
			Key {
				Address (6 Octets)
				Authenticated (1 Octet)
				Encryption Size (1 Octet)
				Enc. Diversifier (2 Octets)
				Random Number (8 Octets)
				Value (16 Octets)
			}
