Tester protocol for Bluetooth stack
***********************************

Copyright (C) 2015  Intel Corporation


Overview
========

This document describes the format of data used for communicating between tester
and implementation under test (IUT).

The protocol is SOCK_STREAM based and follows a strict PDU specification
with a generic header and initial registration exchange. The communication is
driver from tester with commands/response exchange. The protocol is single PDU
exchanged based, meaning every command requires a response. IUT will use events
to signal notifications.

Commands and events use single socket. All services are multi-plexed over same
socket.

	.--  IUT  --.                             .--Tester--.
	|           |                             |          |
	|           |          Command            |          |
	|           | <-------------------------- |          |
	|           |                             |          |
	|           |          Response           |          |
	|           | --------------------------> |          |
	|           |                             |          |
	|           |           Event             |          |
	|           | --------------------------> |          |
	|           |                             |          |
	'-----------'                             '----------'


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

Every packet will follow the basic header to support simple multi-plexing
over the same socket. It will also support a basic control channel with service
id 0. Due to use of single socket for command/response and events it is
possible that event(s) will be received before response to command.

	0            8       16                  24            40
	+------------+--------+------------------+-------------+
	| Service ID | Opcode | Controller Index | Data Length |
	+------------+--------+------------------+-------------+
	|                                                      |

The unique service ID is assigned by this specification for each service
supported by tester.

As general rule of thumb, the opcode for command matches the opcode for a
response. Or the opcode 0x00 for an error is returned.

Events opcodes start from 0x80.

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>		0x00 to 0xFE
	<non-controller>	0xFF

Error response is common for all services and has fixed structure:

	Opcode 0x00 - Error response

		Response parameters: Status (1 octet)

		Valid status values:	0x01 = Fail
					0x02 = Unknown Command
					0x03 = Not ready
					0x04 = Invalid Index

Core Service (ID 0)
===================

Commands and responses:

	Opcode 0x00 - Error response

	Opcode 0x01 - Read Supported Commands command/response

		Controller Index:	<non-controller>
		Command parameters:	<none>
		Response parameters:	<supported commands> (variable)

		Each bit in response is a flag indicating if command with
		opcode matching bit number is supported. Bit set to 1 means
		that command is supported. Bit 0 is reserved and shall always
		be set to 0. If specific bit is not present in response (less
		than required bytes received) it shall be assumed that command
		is not supported.

		In case of an error, the error response will be returned.

	Opcode 0x02 - Read Supported Services command/response

		Controller Index:	<non-controller>
		Command parameters:	<none>
		Response parameters:	<supported services> (variable)

		Each bit in response is a flag indicating if service with ID
		matching bit number is supported. Bit set to 1 means that
		service is supported. If specific bit is not present in response
		(less than required bytes received) it shall be assumed that
		service is not supported.

		In case of an error, the error response will be returned.

	Opcode 0x03 - Register Service command/response

		Controller Index:	<non-controller>
		Command parameters:	Service ID (1 octet)
		Response parameters:	<none>

		In case a command is sent for an undeclared service ID, it will
		be rejected. Also there will be no events for undeclared
		service ID.

		In case of an error, the error response will be returned.

	Opcode 0x04 - Unregister Service command/response

		Controller Index:	<non-controller>
		Command parameters:	Service ID (1 octet)
		Response parameters:	<none>

		In case of an error, the error response will be returned.

Events:
	Opcode 0x80 - IUT ready event

		Controller Index:	<non-controller>
		Event parameters:	<none>

		This event indicates that IUT has been initialized and is ready to
		receive BTP commands.
		Tester shall wait for this event before sending any command to the IUT.

GAP Service (ID 1)
==================

Commands and responses:

	Opcode 0x00 - Error response

	Opcode 0x01 - Read Supported Commands command/response

		Controller Index:	<non-controller>
		Command parameters:	<none>
		Response parameters:	<supported commands> (variable)

		Each bit in response is a flag indicating if command with
		opcode matching bit number is supported. Bit set to 1 means
		that command is supported. Bit 0 is reserved and shall always
		be set to 0. If specific bit is not present in response (less
		than required bytes received) it shall be assumed that command
		is not supported.

		In case of an error, the error response will be returned.

	Opcode 0x02 - Read Controller Index List command/response

		Controller Index:	<non-controller>
		Command parameters:	<none>
		Response parameters:	Number of Controllers (1 octet)
					Controller Index[i] (1 octet)

		This command returns the list of controllers.

		In case of an error, the error response will be returned.

	Opcode 0x03 - Read Controller Information command/response

	Controller Index:	<controller id>
	Command parameters:	<none>
	Response parameters:	Address (6 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

		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

		In case of an error, the error response will be returned.

	Opcode 0x04 - Reset command/response

		Controller Index:	<controller id>
		Command parameters:	<none>
		Response parameters:	Current_Settings (4 Octets)

		This allows to clean up any state data (eg. keys) and restore
		controller to its default system state.

		In case of an error, the error response will be returned.

	Opcode 0x05 - Set Powered command/response

		Controller Index:	<controller id>
		Command parameters:	Powered (1 octet)
		Response parameters:	Current_Settings (4 Octets)

		Valid Powered values:	0x00 = Off
					0x01 = On

		This command is used to power on or off a controller.

		In case of an error, the error response will be returned.

	Opcode 0x06 - Set Connectable command/response

		Controller Index:	<controller id>
		Command parameters:	Connectable (1 octet)
		Response parameters:	Current_Settings (4 Octets)

		Valid Connectable values:	0x00 = Off
						0x01 = On

		This command is used to set controller connectable.

		In case of an error, the error response will be returned.

	Opcode 0x07 - Set Fast Connectable command/response

		Controller Index:	<controller id>
		Command parameters:	Fast Connectable (1 octet)
		Response parameters:	Current_Settings (4 Octets)

		Valid Fast Connectable values:	0x00 = Off
						0x01 = On

		This command is used to set controller fast connectable.
		This command is only available for BR/EDR capable controllers.

		In case of an error, the error response will be returned.

	Opcode 0x08 - Set Discoverable command/response

		Controller Index:	<controller id>
		Command parameters:	Discoverable (1 octet)
		Response parameters:	Current_Settings (4 Octets)

		Valid Discoverable values:	0x00 = Off
						0x01 = General Discoverable
						0x02 = Limited Discoverable

		This command is used to set controller discoverable.

		In case of an error, the error response will be returned.

	Opcode 0x09 - Set Bondable command/response

		Controller Index:	<controller id>
		Command parameters:	Bondable (1 octet)
		Response parameters:	Current_Settings (4 Octets)

		Valid Bondable values:	0x00 = Off
					0x01 = On

		This command is used to set controller bondable.

		In case of an error, the error response will be returned.

	Opcode 0x0a - Start Advertising command/response

		Controller Index:	<controller id>
		Command parameters:	Adv_Data_Len (1 octet)
					Scan_Rsp_len (1 octet)
					Adv_Data (0-255 octets)
					Scan_Rsp (0-255 octets)
		Return Parameters:	Current_Settings (4 Octets)

		This command is used to start advertising.

		In case of an error, the error response will be returned.

	Opcode 0x0b - Stop Advertising command/response

		Controller Index:	<controller id>
		Command parameters:	<none>
		Return Parameters:	Current_Settings (4 Octets)

		This command is used to stop advertising.

		In case of an error, the error response will be returned.

	Opcode 0x0c - Start Discovery command/response

		Controller Index:	<controller id>
		Command parameters:	Flags (1 octet)
		Return Parameters:	<none>

		Possible values for the Flags parameter are a bit-wise or
		of the following bits:
					0 = LE scan
					1 = BR/EDR scan
					2 = Use limited discovery procedure
					3 = Use active scan type
					4 = Use observation procedure

		This command is used to start discovery.

		Observation Procedure allows to receive advertisements
		(and scan responses) from broadcasters (that are not visible
		during General or Limited discovery, because those are not
		discoverable). This procedure can use either passive or active
		scan type. If "Use observation procedure" (bit 4) is set,
		"Use limited discovery procedure" (bit 2) is excluded.

		In case of an error, the error response will be returned.

	Opcode 0x0d - Stop Discovery command/response

		Controller Index:	<controller id>
		Command parameters:	<none>
		Return Parameters:	<none>

		This command is used to stop discovery.

		In case of an error, the error response will be returned.

	Opcode 0x0e - Connect command/response

		Controller Index:	<controller id>
		Command parameters:	Address_Type (1 octet)
					Address (6 octets)
		Return Parameters:	<none>

		Valid Address_Type parameter values:
					0x00 = Public
					0x01 = Random

		This command is used to create a Link Layer connection with
		remote device.

		In case of an error, the error response will be returned.

	Opcode 0x0f - Disconnect command/response

		Controller Index:	<controller id>
		Command parameters:	Address_Type (1 octet)
					Address (6 octets)
		Return Parameters:	<none>

		Valid Address_Type parameter values:
					0x00 = Public
					0x01 = Random

		This command is used to terminate an existing connection or
		to cancel pending connection attempt.

		In case of an error, the error response will be returned.

	Opcode 0x10 - Set IO Capability command/response

		Controller Index:	<controller id>
		Command parameters:	IO_Capability (1 octet)
		Return Parameters:	<none>

		Valid IO_Capabilities parameter values:
					0x00 = Display Only
					0x01 = Display Yes/No
					0x02 = Keyboard Only
					0x03 = No Input, No Output
					0x04 = Keyboard Display

		This command is used to set IO capability.

		In case of an error, the error response will be returned.

	Opcode 0x11 - Pair command/response

		Controller Index:	<controller id>
		Command parameters:	Address_Type (1 octet)
					Address (6 octets)
		Return Parameters:	<none>

		This command is used to initiate pairing with remote.

		In case of an error, the error response will be returned.

	Opcode 0x12 - Unpair command/response

		Controller Index:	<controller id>
		Command parameters:	Address_Type (1 octet)
					Address (6 octets)
		Return Parameters:	<none>

		This command is used to unpair with remote.

		In case of an error, the error response will be returned.

	Opcode 0x13 - Passkey Entry Response command/response

		Controller Index:	<controller id>
		Command parameters:	Address_Type (1 octet)
					Address (6 octets)
					Passkey (4 octets)
		Return Parameters:	<none>

		This command is used to response with passkey for pairing
		request.

		In case of an error, the error response will be returned.

	Opcode 0x14 - Passkey Confirmation Response command/response

		Controller Index:	<controller id>
		Command parameters:	Address_Type (1 octet)
					Address (6 octets)
					Match (1 octet)
		Return Parameters:	<none>

		This command is used to response for pairing request with
		confirmation in accordance with initiator and responder
		passkey.

		In case of an error, the error response will be returned.

Events:
	Opcode 0x80 - New Settings event

		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.

	Opcode 0x81 - Device Found event

		Controller Index:	<controller id>
		Event parameters:	Address (6 octets)
					Address_Type (1 octet)
					RSSI (1 octet)
					Flags (1 octet)
					EIR_Data_Length (2 Octets)
					EIR_Data (0-65535 Octets)

		Possible values for the Flags parameter are a bit-wise or
		of the following bits:
					0 = RSSI valid
					1 = Adv_Data included
					2 = Scan_Rsp included

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

	Opcode 0x82 - Device Connected event

		Controller Index:	<controller id>
		Event parameters:	Address_Type (1 octet)
					Address (6 octets)

		This event indicates that a device was connected.

	Opcode 0x83 - Device Disconnected event

		Controller Index:	<controller id>
		Event parameters:	Address_Type (1 octet)
					Address (6 octets)

		This event indicates that a device was disconnected.

	Opcode 0x84 - Passkey Display event

		Controller Index:	<controller id>
		Event parameters:	Address_Type (1 octet)
					Address (6 octets)
					Passkey (4 octets)

		This event indicates that passkey was received and it needs to
		be confirmed on remote side.

	Opcode 0x85 - Passkey Enter Request event

		Controller Index:	<controller id>
		Event parameters:	Address_Type (1 octet)
					Address (6 octets)

		This event indicates that remote requests for passkey enter.

	Opcode 0x86 - Passkey Confirm Request event

		Controller Index:	<controller id>
		Event parameters:	Address_Type (1 octet)
					Address (6 octets)
					Passkey (4 octets)

		This event indicates that passkey needs to be confirmed.

	Opcode 0x87 - Identity Resolved event

		Controller Index:	<controller id>
		Event parameters:	Address_Type (1 octet)
					Address (6 octets)
					Identity_Address_Type (1 octet)
					Identity_Address (6 octets)

		This event indicates that the remote Identity Address has been
		resolved.

GATT Service (ID 2)
===================

Commands and responses:

	Opcode 0x00 - Error response

	Opcode 0x01 - Read Supported Commands command/response

		Controller Index:	<non-controller>
		Command parameters:	<none>
		Response parameters:	<supported commands> (variable)

		Each bit in response is a flag indicating if command with
		opcode matching bit number is supported. Bit set to 1 means
		that command is supported. Bit 0 is reserved and shall always
		be set to 0. If specific bit is not present in response (less
		than required bytes received) it shall be assumed that command
		is not supported.

		In case of an error, the error response will be returned.

	Opcode 0x02 - Add Service

		Controller Index:	<controller id>
		Command parameters:	Type (1 octet)
					UUID_Length (1 octet)
					UUID (2 or 16 octets)
		Response parameters:	Service_ID (2 octets)

		Valid Type parameter values:
					0x00 = Primary
					0x01 = Secondary

		Valid UUID_Length parameter values:
					0x02 = UUID16
					0x10 = UUID128

		This command is used to add new service to GATT Server.
		Service ID of service declaration is returned in the response.
		Attribute database shall be initiated sequentially.
		After this issuing this command tester shall add characteristics
		or included services this service contains.

		In case of an error, the error response will be returned.

	Opcode 0x03 - Add Characteristic

		Controller Index:	<controller id>
		Command parameters:	Service_ID (2 octets)
					Properties (1 octet)
					Permissions (1 octet)
					UUID_Length (1 octet)
					UUID (2 or 16 octets)
		Response parameters:	Characteristic_ID (2 octets)

		Possible values for Service_ID:
					0x0000 = Add in sequence
					0x0001-0xffff = Add to service

		Possible response parameters:
					0x0000 = Relative ID, will be set after
					start_server
					0x0001-0xffff = ID in db

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

			0	Broadcast
			1	Read
			2	Write Without Response
			3	Write
			4	Notify
			5	Indicate
			6	Authenticated Signed Writes
			7	Extended Properties

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

			0	Read
			1	Write
			2	Read with Encryption
			3	Write with Encryption
			4	Read with Authentication
			5	Write with Authentication
			6	Read with Authorization
			7	Write with Authorization

		This command is used to add new characteristic to GATT Server.
		Characteristic ID of characteristic declaration is returned in
		the response.
		Attribute's database shall be initiated sequentially.
		After issuing this command tester can add descriptors to this
		characteristic.

		In case of an error, the error response will be returned.

	Opcode 0x04 - Add Descriptor

		Controller Index:	<controller id>
		Command parameters:	Characteristic_ID (2 octets)
					Permissions (1 octet)
					UUID_Length (1 octet)
					UUID (2 or 16 octets)
		Response parameters:	Descriptor_ID (2 octets)

		Possible values for Characteristic_ID:
					0x0000 = Add in sequence
					0x0001-0xffff = Add to characteristic

		Possible response parameters:
					0x0000 = Relative ID, will be set after
					start_server
					0x0001-0xffff = ID in db

		This command is used to add new characteristic descriptor
		to GATT Server. The command shall be used right after
		Add Characteristic or previous Add Descriptor command.

		In case of an error, the error response will be returned.

	Opcode 0x05 - Add Included Service

		Controller Index:	<controller id>
		Command parameters:	Service_ID (2 octets)
		Response parameters:	Included_Service_ID (2 octets)

		This command is used to add new included service declaration
		to GATT Server. Service that is going to be included has to be
		already added to the server. Attribute_ID of include
		declaration is returned in the response.

		In case of an error, the error response will be returned.

	Opcode 0x06 - Set Characteristic/Descriptor Value

		Controller Index:	<controller id>
		Command parameters:	Attribute_ID (2 octets)
					Value_Length (2 octet)
					Value (1-512 octets)
		Response parameters:	<none>

		Possible values for Characteristic_ID:
					0x0000 = Set last attribute in db value
					0x0001-0xffff = Set value of attribute
					under ID

		This command is used to set the value of characteristic
		or descriptor.

		In case of an error, the error response will be returned.

	Opcode 0x07 - Start Server

		Controller Index:	<controller id>
		Command parameters:	<none>
		Response parameters:	Database_Attribute_Offset (2 octets)
					Database_Attribute_Count (1 octet)

		This command is used to start server with previously prepared
		attributes database. Device database may contain predefined
		attributes. Predefined attributes should be registered before
		attempt to register sequential database.
		Subsequent calls of this command shall return an error.

		In case of an error, the error response will be returned.

	Opcode 0x08 - Reset Server

		Controller Index:	<controller id>
		Command parameters:	<none>
		Response parameters:	<none>

		This command is used to clear the server from attributes.

		In case of an error, the error response will be returned.

	Opcode 0x09 - Set Required Encryption Key Size

		Controller Index:	<controller id>
		Command parameters:	Attribute_ID (2 octets)
					Encryption_Key_Size (1 octet)
		Response parameters:	<none>

		Possible values for Attribute_ID:
					0x0000 = Set encryption key of last
					added attribute
					0x0001-0xffff = Set enctryption of
					attribute under ID

		This command is used to set required Encryption Key Size of an
		attribute. It shall be used only if encryption or authentication
		is needed to have access to this attribute. Otherwise an error
		shall be returned.

		Possible values for Encryption_Key_Size parameter are:
								<0x07, 0x0f>

		In case of an error, the error response will be returned.

	Opcode 0x0a - Exchange MTU

		Controller Index:	<controller id>
		Command parameters:	Address_Type (1 octet)
					Address (6 octets)
		Response parameters:	<none>

		This command is used by GATT Client to configure ATT protocol.
		IUT is expected to send Exchange MTU Request to negotiate
		MTU size.

		In case of an error, the error response will be returned.

	Opcode 0x0b - Discover All Primary Services

		Controller Index:	<controller id>
		Command parameters:	Address_Type (1 octet)
					Address (6 octets)
		Response parameters:	Services_Count (1 octet)
					[array] Service (variable)

		Object Service is defined as:
					Start_Handle (2 octets)
					End_Group_Handle (2 octets)
					UUID_Length (1 octet)
					UUID (2 or 16 octets)

		Valid UUID_Length parameter values:
					0x02 = UUID16
					0x10 = UUID128

		This procedure is used by a client to discover all primary
		services on a server.
		Services found during discovery are returned in the response.

		In case of an error, the error response will be returned.

	Opcode 0x0c - Discover Primary Service by UUID

		Controller Index:	<controller id>
		Command parameters:	Address_Type (1 octet)
					Address (6 octets)
					UUID_Length (1 octet)
					UUID (2 or 16 octets)
		Response parameters:	Services_Count (1 octet)
					[array] Service (variable)

		Object Service is defined as:
					Start_Handle (2 octets)
					End_Group_Handle (2 octets)
					UUID_Length (1 octet)
					UUID (2 or 16 octets)

		Valid UUID_Length parameter values:
					0x02 = UUID16
					0x10 = UUID128

		This procedure is used by a client to discover primary services
		with specific UUID on a server.
		Services found during discovery are returned in the response.

		In case of an error, the error response will be returned.

	Opcode 0x0d - Find Included Services

		Controller Index:	<controller id>
		Command parameters:	Address_Type (1 octet)
					Address (6 octets)
					Service_Start_Handle (2 octets)
					Service_End_Handle (2 octets)
		Response parameters:	Services_Count (1 octet)
					[array] Included_Service (variable)

		Object Included_Service is defined as:
					Included_Handle (2 octets)
					Type (1 octet)
					Service (7 or 21 octets)

		Valid Type parameter values:
					0x00 = Primary
					0x01 = Secondary

		Object Service is defined as:
					Start_Handle (2 octets)
					End_Group_Handle (2 octets)
					UUID_Length (1 octet)
					UUID (2 or 16 octets)

		Valid UUID_Length parameter values:
					0x02 = UUID16
					0x10 = UUID128

		This procedure is used by a client to discover service
		relationships to other services.
		Services found during discovery are returned in the response.

	Opcode 0x0e - Discover All Characteristics of a Service

		Controller Index:	<controller id>
		Command parameters:	Address_Type (1 octet)
					Address (6 octets)
					Service_Start_Handle (2 octets)
					Service_End_Handle (2 octets)
		Response parameters:	Characteristics_Count (1 octet)
					[array] Characteristic (variable)

		Object Characteristic is defined as:
					Characteristic_Handle (2 octets)
					Value_Handle (2 octets)
					Properties (1 octet)
					UUID_Length (1 octet)
					UUID (2 or 16 octets)

		Valid UUID_Length parameter values:
					0x02 = UUID16
					0x10 = UUID128

		This procedure is used by a client to discover all
		characteristics within specified service range.
		Characteristics found during discovery are returned in the
		response.

		In case of an error, the error response will be returned.

	Opcode 0x0f - Discover Characteristics by UUID

		Controller Index:	<controller id>
		Command parameters:	Address_Type (1 octet)
					Address (6 octets)
					Start_Handle (2 octets)
					End_Handle (2 octets)
					UUID_Length (1 octet)
					UUID (2 or 16 octets)
		Response parameters:	Characteristics_Count (1 octet)
					[array] Characteristic (variable)

		Object Characteristic is defined as:
					Characteristic_Handle (2 octets)
					Value_Handle (2 octets)
					Properties (1 octet)
					UUID_Length (1 octet)
					UUID (2 or 16 octets)

		Valid UUID_Length parameter values:
					0x02 = UUID16
					0x10 = UUID128

		This procedure is used by a client to discover characteristic
		declarations with given UUID on a server.
		Characteristics found during discovery are returned in the
		response.

		In case of an error, the error response will be returned.

	Opcode 0x10 - Discover All Characteristic Descriptors

		Controller Index:	<controller id>
		Command parameters:	Address_Type (1 octet)
					Address (6 octets)
					Start_Handle (2 octets)
					End_Handle (2 octets)
		Response parameters:	Descriptors_Count (1 octet)
					[array] Descriptor (variable)

		Object Descriptor is defined as:
					Descriptor_Handle (2 octets)
					UUID_Length (1 octet)
					UUID (2 or 16 octets)

		Valid UUID_Length parameter values:
					0x02 = UUID16
					0x10 = UUID128

		This procedure is used by a client to discover all the
		characteristic descriptors contained within characteristic.
		Descriptors found during discovery are returned in the
		response.

		In case of an error, the error response will be returned.

	Opcode 0x11 - Read Characteristic Value/Descriptor

		Controller Index:	<controller id>
		Command parameters:	Address_Type (1 octet)
					Address (6 octets)
					Handle (2 octets)
		Response parameters:	ATT_Response (1 octet)
					Data_Length (2 octets)
					Data (variable)

		This procedure is used to read a Characteristic Value or
		Characteristic Descriptor from a server.
		Read results are returned in the response to this command.
		ATT_Response shall be set to 0x00, if Read has been completed
		successfully. Otherwise it shall be set to ATT error code
		received.

		In case of an error, the error response will be returned.

	Opcode 0x12 - Read Using Characteristic UUID

		Controller Index:	<controller id>
		Command parameters:	Address_Type (1 octet)
					Address (6 octets)
					Start_Handle (2 octets)
					End_Handle (2 octets)
					UUID_Length (1 octet)
					UUID (2 or 16 octets)
		Response parameters:	ATT_Response (1 octet)s
					Data_Length (2 octets)
					Data (variable)

		Valid UUID_Length parameter values:
					0x02 = UUID16
					0x10 = UUID128

		This procedure is used to read a Characteristic Value from a
		server when characteristic UUID is known.
		Read results are returned in the response to this command.
		ATT_Response shall be set to 0x00, if Read has been completed
		successfully. Otherwise it shall be set to ATT error code
		received.

		In case of an error, the error response will be returned.

	Opcode 0x13 - Read Long Characteristic Value/Descriptor

		Controller Index:	<controller id>
		Command parameters:	Address_Type (1 octet)
					Address (6 octets)
					Handle (2 octets)
					Offset (2 octets)
		Response parameters:	ATT_Response (1 octet)
					Data_Length (2 octets)
					Data (variable)

		This procedure is used to read Long Characteristic Value or
		Long Characteristic Descriptor from a server.
		Read results are returned in the response to this command.
		ATT_Response shall be set to 0x00, if Read has been completed
		successfully. Otherwise it shall be set to ATT error code
		received.

		In case of an error, the error response will be returned.

	Opcode 0x14 - Read Multiple Characteristic Values

		Controller Index:	<controller id>
		Command parameters:	Address_Type (1 octet)
					Address (6 octets)
					Handles_Count (1 octet)
					Handles (variable)
		Response parameters:	ATT_Response (1 octet)
					Data_Length (2 octets)
					Data (variable)

		This procedure is used to read multiple Characteristic Values
		from a server.
		Read results are returned in the response to this command.
		ATT_Response shall be set to 0x00, if Read has been completed
		successfully. Otherwise it shall be set to ATT error code
		received.

		In case of an error, the error response will be returned.

	Opcode 0x15 - Write Without Response

		Controller Index:	<controller id>
		Command parameters:	Address_Type (1 octet)
					Address (6 octets)
					Handle (2 octets)
					Data_Length (2 octets)
					Data (variable)
		Response parameters:	<none>

		This procedure is used to write a Characteristic Value to a
		server. There is no acknowledgment that the write was
		successfully performed.

		In case of an error, the error response will be returned.

	Opcode 0x16 - Signed Write Without Response

		Controller Index:	<controller id>
		Command parameters:	Address_Type (1 octet)
					Address (6 octets)
					Handle (2 octets)
					Data_Length (2 octets)
					Data (variable)
		Response parameters:	<none>

		This procedure is used to write a Characteristic Value to a
		server. There is no acknowledgment that the write was
		successfully performed. This procedure is intended to be used
		if client and server are bonded, and connected using
		non-encrypted link.

		In case of an error, the error response will be returned.

	Opcode 0x17 - Write Characteristic Value/Descriptor

		Controller Index:	<controller id>
		Command parameters:	Address_Type (1 octet)
					Address (6 octets)
					Handle (2 octets)
					Data_Length (2 octets)
					Data (variable)
		Response parameters:	ATT_Response (1 octet)

		This procedure is used to write a Characteristic Value or
		Characteristic Descriptor to a server.
		ATT_Response shall be set to 0x00, if Write has been completed
		successfully. Otherwise it shall be set to ATT error code
		received.

		In case of an error, the error response will be returned.

	Opcode 0x18 - Write Long Characteristic Value/Descriptor

		Controller Index:	<controller id>
		Command parameters:	Address_Type (1 octet)
					Address (6 octets)
					Handle (2 octets)
					Offset (2 octets)
					Data_Length (2 octets)
					Data (variable)
		Response parameters:	ATT_Response (1 octet)

		This procedure is used to write a Long Characteristic Value or
		Long Characteristic Descriptor to a server.
		ATT_Response shall be set to 0x00, if Write has been completed
		successfully. Otherwise it shall be set to ATT error code
		received.

		In case of an error, the error response will be returned.

	Opcode 0x19 - Reliable Write

		Controller Index:	<controller id>
		Command parameters:	Address_Type (1 octet)
					Address (6 octets)
					Handle (2 octets)
					Offset (2 octets)
					Data_Length (2 octets)
					Data (variable)
		Response parameters:	ATT_Response (1 octet)

		This procedure is used to write a Characteristic Value to
		a server and assurance is required that the correct
		Characteristic Value is going to be written.
		ATT_Response shall be set to 0x00, if Write has been completed
		successfully. Otherwise it shall be set to ATT error code
		received.

		In case of an error, the error response will be returned.

	Opcode 0x1a - Configure Notifications

		Controller Index:	<controller id>
		Command parameters:	Address_Type (1 octet)
					Address (6 octets)
					Enable (1 octet)
					CCC_Handle (2 octets)
		Response parameters:	<none>

		This procedure is used to configure server to notify
		characteristic value to a client.

		In case of an error, the error response will be returned.

	Opcode 0x1b - Configure Indications

		Controller Index:	<controller id>
		Command parameters:	Address_Type (1 octet)
					Address (6 octets)
					Enable (1 octet)
					CCC_Handle (2 octets)
		Response parameters:	<none>

		This procedure is used to configure server to indicate
		characteristic value to a client.

		In case of an error, the error response will be returned.

Events:
	Opcode 0x80 - Notification/Indication Received

		Controller Index:	<controller id>
		Event parameters:	Address_Type (1 octet)
					Address (6 octets)
					Type (1 octet)
					Handle (2 octets)
					Data_Length (2 octets)
					Data (variable)

		Valid Type parameter values:
					0x01 = Notification
					0x02 = Indication

		This event indicates that IUT has received notification
		or notification.

	Opcode 0x81 - Attribute Value Changed

		Controller Index:	<controller id>
		Event parameters:	Attribute_ID (2 octets)
					Data_Length (2 octet)
					Data (1-512 octets)

		This event command is used to indicate attribute
		(characteristic or descriptor) value changed.
		Event is triggered when ATT Write operation to Tester GATT
		Server has been performed successfully.

L2CAP Service (ID 3)
==================

Commands and responses:

	Opcode 0x00 - Error response

	Opcode 0x01 - Read Supported Commands command/response

		Controller Index:	<controller id>
		Command parameters:	<none>
		Response parameters:	<supported commands> (variable)

		Each bit in response is a flag indicating if command with
		opcode matching bit number is supported. Bit set to 1 means
		that command is supported. Bit 0 is reserved and shall always
		be set to 0. If specific bit is not present in response (less
		than required bytes received) it shall be assumed that command
		is not supported.

		In case of an error, the error response will be returned.

	Opcode 0x02 - Connect command/response

		Controller Index:	<controller id>
		Command parameters:	Address_Type (1 octet)
					Address (6 octets)
					PSM (2 octets)
		Response parameters:	Chan_ID (1 octet)

		This command is used to create an L2CAP channel.
		Chan_ID is returned in the response to this command to allow
		cancellation of this connection request using Disconnect
		command.
		Connected Event (or Disconnected Event in case of an error)
		shall be expected after issuing this command.

		In case of an error, the error response will be returned.

	Opcode 0x03 - Disconnect command

		Controller Index:	<controller id>
		Command parameters:	Chan_ID (1 octet)
		Response parameters:	<none>

		This command is used to close an L2CAP channel.
		Chan_ID is the internal application number that identifies
		L2CAP channel.
		Disconnected Event shall be expected after issuing this command.

		In case of an error, the error response will be returned.

	Opcode 0x04 - Send Data command

		Controller Index:	<controller id>
		Command parameters:	Chan_ID (1 octet)
					Data_Length (2 octets)
					Data (Data_Length octets)
		Response parameters:	<none>

		This command is used to send data over L2CAP channel.
		Chan_ID is the internal application number that identifies
		L2CAP channel.

		In case of an error, the error response will be returned.

	Opcode 0x05 - Listen command

		Controller Index:	<controller id>
		Command parameters:	PSM (2 octets)
					Transport (1 octet)
		Response parameters:	<none>

		Valid Transport parameter values:
					0x00 = BR/EDR
					0x01 = LE

		This command is used to register L2CAP PSM and listen for
		incoming data.

		In case of an error, the error response will be returned.

	Opcode 0x06 - Accept Connection Request

		Controller Index:	<controller id>
		Command parameters:	Chan_ID (1 octet)
					Result (2 octets)
		Return Parameters:	<none>

		This command is used to accept/reject incoming connection
		request. Connection can be rejected with non-zero Result value
		(refer to the L2CAP <LE Credit Based> Connection Result values).
		Connected Event shall be expected after issuing this command.

		In case of an error, the error response will be returned.

Events:
	Opcode 0x80 - Connection Request Event

		Controller Index:	<controller id>
		Event parameters:	Chan_ID (1 octet)
					PSM (2 octets)
					Address_Type (1 octet)
					Address (6 octets)

		This event indicates incoming request for L2CAP connection.
		Connection Request needs to be accepted/rejected with result
		code using Accept Connection Request command.

	Opcode 0x81 - Connected Event

		Controller Index:	<controller id>
		Event parameters:	Chan_ID (1 octet)
					PSM (2 octets)
					Address_Type (1 octet)
					Address (6 octets)

		This event indicates new L2CAP connection.
		Chan_ID is the internal application number that identifies
		L2CAP channel.

	Opcode 0x82 - Disconnected Event

		Controller Index:	<controller id>
		Event parameters:	Result (2 octets)
					Chan_ID (1 octet)
					PSM (2 octets)
					Address_Type (1 octet)
					Address (6 octets)

		This event indicates L2CAP disconnection.
		Result value is returned in the response, if remote rejected
		connection request only. Otherwise it shall be set to zero.
		Please refer to the Core Specification for possible
		L2CAP <LE Credit Based> Connection Result values.
		Chan_ID is the internal application number that identifies
		L2CAP channel.

	Opcode 0x83 - Data Received Event

		Controller Index:	<controller id>
		Event parameters:	Chan_ID (1 octet)
					Data_Length (2 octets)
					Data (Data_Length octets)

		This event forwards data received over L2CAP channel.
		Chan_ID is the internal application number that identifies
		L2CAP channel.
