Bluetooth Management API ************************* Copyright (C) 2008-2009 Marcel Holtmann 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 to indicate that command or event is not related to any controller. Possible values: 0x0000 to 0xFFFE 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 Read Management Version Information Command =========================================== Command Code: 0x0001 Controller Index: Command Parameters: Return Parameters: Version (1 Octets) Revision (2 Octets) 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: 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) ... 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: Command Parameters: Return Parameters: Num_Controllers (2 Octets) Controller_Index[i] (2 Octets) 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: 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 This command generates a Command Complete event on success or a Command Status event on failure. Set Powered Command =================== Command Code: 0x0005 Controller Index: Command Parameters: Powered (1 Octet) Return Parameters: Current_Settings (4 Octets) If discoverable setting is activated with a timeout, then switching the controller off will expire this timeout and disable discoverable. This command generates a Command Complete event on success or a Command Status event on failure. Set Discoverable Command ======================== Command Code: 0x0006 Controller Index: Command Parameters: Discoverable (1 Octet) Timeout (2 Octets) Return Parameters: Current_Settings (4 Octets) Timeout is the time in seconds and is only meaningful when Discoverable is set to 1. 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 an error. When switching discoverable on and the connectable setting is off it will return an error. This command generates a Command Complete event on success or a Command Status event on failure. Set Connectable Command ======================= Command Code: 0x0007 Controller Index: Command Parameters: Connectable (1 Octet) Return Parameters: Current_Settings (4 Octets) 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 command generates a Command Complete event on success or a Command Status event on failure. Set Fast Connectable Command ============================ Command Code: 0x0008 Controller Index: Command Parameters: Enable (1 Octet) Return Parameters: Current_Settings (4 Octets) This command can be used when the controller is not powered and all settings will be programmed once powered. If connectable is not set, then this command will fail. This command generates a Command Complete event on success or a Command Status event on failure. Set Pairable Command ==================== Command Code: 0x0009 Controller Index: Command Parameters: Pairable (1 Octet) Return Parameters: Current_Settings (4 Octets) This command can be used when the controller is not powered and all settings will be programmed once powered. Turning pairable 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. Set Link Security Command ========================= Command Code: 0x000A Controller Index: Command Parameters: Link_Security (1 Octet) Return Parameters: Current_Settings (4 Octets) 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. Set Secure Simple Pairing Command ================================= Command Code: 0x000B Controller Index: Command Parameters: Secure_Simple_Pairing (1 Octet) Return Parameters: Current_Settings (4 Octets) 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. This command generates a Command Complete event on success or a Command Status event on failure. Set High Speed Command ====================== Command Code: 0x000C Controller Index: Command Parameters: High_Speed (1 Octet) Return Parameters: Current_Settings (4 Octets) 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 High Speed, the command will fail regardless. This command generates a Command Complete event on success or a Command Status event on failure. Set Low Energy Command ====================== Command Code: 0x000D Controller Index: Command Parameters: Low_Energy (1 Octet) Return Parameters: Current_Settings (4 Octets) 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. This command generates a Command Complete event on success or a Command Status event on failure. Set Device Class ================ Command Code: 0x000E Controller Index: 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. 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. Set Local Name Command ====================== Command Code: 0x000F Controller Index: 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 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. Add UUID Command ================ Command Code: 0x0010 Controller Index: Command Parameters: UUID (16 Octets) SVC_Hint (1 Octet) Return Parameters: Class_Of_Device (3 Octets) 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. Remove UUID Command =================== Command Code: 0x0011 Controller Index: Command Parameters: UUID (16 Octets) Return Parameters: Class_Of_Device (3 Octets) 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. Load Link Keys Command ====================== Command Code: 0x0012 Controller Index: 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 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. Load Long Term Keys Command =========================== Command Code: 0x0013 Controller Index: Command Parameters: Key Count (2 Octets) Key1 { Address (6 Octets) Address_Type (1 Octet) Authenticated (1 Octet) Master (1 Octet) Encryption Size (1 Octet) Enc. Diversifier (2 Octets) Random Number (8 Octets) Value (16 Octets) } Key2 { } ... 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. Disconnect Command ================== Command Code: 0x0014 Controller Index: Command Parameters: Address (6 Octets) Address_Type (1 Octet) Return Parameters: Address (6 Octets) Address_Type (1 Octet) This command can only be used when the controller is powered. This command generates a Command Complete event on success or failure. Get Connections Command ======================= Command Code: 0x0015 Controller Index: Command Parameters: Return Parameters: Connection_Count (2 Octets) Address1 { Address (6 Octets) Address_Type (1 Octet) } Address2 { } ... 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 a Command Status event on failure. PIN Code Reply Command ======================= Command Code: 0x0016 Controller Index: 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 can only be used when the controller is powered. This command generates a Command Complete event on success or failure. PIN Code Negative Reply Command =============================== Command Code: 0x0017 Controller Index: Command Parameters: Address (6 Octets) Address_Type (1 Octet) Return Parameters: Address (6 Octets) Address_Type (1 Octet) This command can only be used when the controller is powered. This command generates a Command Complete event on success or failure. Set IO Capability Command ========================= Command Code: 0x0018 Controller Index: Command Parameters: IO_Capability (1 Octet) Return Parameters: 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. Pair Device Command =================== Command Code: 0x0019 Controller Index: Command Parameters: Address (6 Octets) Address_Type (1 Octet) IO_Capability (1 Octet) Return Parameters: Address (6 Octets) Address_Type (1 Octet) 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. Cancel Pair Device ================== Command Code: 0x001A Controller Index: 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. This command can only be used when the controller is powered. This command generates a Command Complete event on success or failure. Unpair Device Command ===================== Command Code: 0x001B Controller Index: 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. 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. This command can only be used when the controller is powered. This command generates a Command Complete event on success or failure. User Confirmation Reply Command =============================== Command Code: 0x001C Controller Index: Command Parameters: Address (6 Octets) Address_Type (1 Octet) Return Parameters: Address (6 Octets) Address_Type (1 Octet) This command can only be used when the controller is powered. This command generates a Command Complete event on success or failure. User Confirmation Negative Reply Command ======================================== Command Code: 0x001D Controller Index: Command Parameters: Address (6 Octets) Address_Type (1 Octet) Return Parameters: Address (6 Octets) Address_Type (1 Octet) This command can only be used when the controller is powered. This command generates a Command Complete event on success or failure. User Passkey Reply Command ========================== Command Code: 0x001E Controller Index: Command Parameters: Address (6 Octets) Address_Type (1 Octet) Passkey (4 Octets) Return Parameters: Address (6 Octets) Address_Type (1 Octet) This command can only be used when the controller is powered. This command generates a Command Complete event on success or failure. User Passkey Negative Reply Command =================================== Command Code: 0x001F Controller Index: Command Parameters: Address (6 Octets) Address_Type (1 Octet) Return Parameters: Address (6 Octets) Address_Type (1 Octet) This command can only be used when the controller is powered. This command generates a Command Complete event on success or failure. Read Local Out Of Band Data Command =================================== Command Code: 0x0020 Controller Index: Command Parameters: Return Parameters: Hash (16 Octets) Randomizer (16 Octets) 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. Add Remote Out Of Band Data Command =================================== Command Code: 0x0021 Controller Index: Command Parameters: Address (6 Octets) Address_Type (1 Octet) Hash (16 Octets) Randomizer (16 Octets) Return Parameters: Address (6 Octets) Address_Type (1 Octet) This command can only be used when the controller is powered. This command generates a Command Complete event on success or failure. Remove Remote Out Of Band Data Command ====================================== Command Code: 0x0022 Controller Index: Command Parameters: Address (6 Octets) Address_Type (1 Octet) Return Parameters: Address (6 Octets) Address_Type (1 Octet) This command can only be used when the controller is powered. This command generates a Command Complete event on success or failure. Start Discovery Command ======================= Command Code: 0x0023 Controller Index: Command Parameters: Address_Type (1 Octet) Return Parameters: Address_Type (1 Octet) Possible values for the Address_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) This command can only be used when the controller is powered. This command generates a Command Complete event on success or failure. Stop Discovery Command ====================== Command Code: 0x0024 Controller Index: Command Parameters: Address_Type (1 Octet) Return Parameters: Address_Type (1 Octet) This command can only be used when the controller is powered. This command generates a Command Complete event on success or failure. Confirm Name Command ==================== Command Code: 0x0025 Controller Index: 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. This command can only be used when the controller is powered. This command generates a Command Complete event on success or failure. Block Device Command ==================== Command Code: 0x0026 Controller Index: Command Parameters: Address (6 Octets) Address_Type (1 Octet) Return Parameters: Address (6 Octets) Address_Type (1 Octet) This command can be used when the controller is not powered. This command generates a Command Complete event on success or failure. Unblock Device Command ====================== Command Code: 0x0027 Controller Index: Command Parameters: Address (6 Octets) Address_Type (1 Octet) Return Parameters: Address (6 Octets) Address_Type (1 Octet) This command can be used when the controller is not powered. This command generates a Command Complete event on success or failure. Set Device ID Command ===================== Command Code: 0x0028 Controller Index: 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 are put into the EIR data. If the controller does not support EIR or if SSP is disabled, this command will still succeed. The information are 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. Command Complete Event ====================== Event Code 0x0001 Controller Index: or Event Parameters Command_Opcode (2 Octets) Status (1 Octet) Return_Parameters Command Status Event ==================== Event Code 0x0002 Controller Index: or Event Parameters Command_Opcode (2 Octets) Status (1 Octet) Controller Error Event ====================== Event Code 0x0003 Controller Index: Event Parameters Error_Code (1 Octet) Index Added Event ================= Event Code 0x0004 Controller Index: Event Parameters Index Removed Event =================== Event Code 0x0005 Controller Index: Event Parameters New Settings Event ================== Event Code 0x0006 Controller Index: Event Parameters: Current_Settings (4 Octets) Class Of Device Changed Event ============================= Event Code 0x0007 Controller Index: Event Parameters: Class_Of_Device (3 Octets) Local Name Changed Event ======================== Event Code 0x0008 Controller Index Event Parameters Name (249 Octets) Short_Name (11 Octets) New Link Key Event ================== Event Code 0x0009 Controller Index: Event Parameters Key { Address (6 Octets) Address_Type (1 Octet) Key_Type (1 Octet) Value (16 Octets) PIN_Length (1 Octet) } New Long Term Key Event ======================= Event Code 0x000A Controller Index Event Parameters Store Hint (1 Octet) Key { Address (6 Octets) Address_Type (1 Octet) Authenticated (1 Octet) Master (1 Octet) Encryption Size (1 Octet) Enc. Diversifier (2 Octets) Random Number (8 Octets) Value (16 Octets) } Device Connected Event ====================== Event Code 0x000B Controller Index: Event Parameters Address (6 Octets) Address_Type (1 Octet) Flags (4 Octets) EIR_Data_Length (2 Octets) EIR_Data (0-65535 Octets) 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 Reserved (not in use) 1 Legacy Pairing Device Disconnected Event ========================= Event Code 0x000C Controller Index: Event Parameters Address (6 Octets) Address_Type (1 Octet) Possible values for the Address_Type parameter: 0 BR/EDR 1 LE Public 2 LE Random Connect Failed Event ==================== Event Code 0x000D Controller Index: Event 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 PIN Code Request Event ====================== Event Code 0x000E Controller Index: Event Parameters Address (6 Octets) Address_Type (1 Octet) Secure (1 Octet) Secure: 0x01 secure PIN code required 0x00 secure PIN code not required User Confirmation Request Event =============================== Event Code 0x000F Controller Index: Event Parameters Address (6 Octets) Address_Type (1 Octet) Confirm_Hint (1 Octet) Value (4 Octets) User Passkey Request Event ========================== Event Code 0x0010 Controller Index: Event Parameters Address (6 Octets) Address_Type (1 Octet) Authentication Failed Event =========================== Event Code 0x0011 Controller Index: Event Parameters Address (6 Octets) Address_Type (1 Octet) Status (1 Octet) Device Found Event ================== Event Code 0x0012 Controller Index 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) 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 Discovering Event ================= Event Code 0x0013 Controller Index Event Parameters Address_Type (1 Octet) Discovering (1 Octet) Device Blocked Event ==================== Event Code 0x0014 Controller Index Event Parameters Address (6 Octets) Address_Type (1 Octet) Device Unblocked Event ====================== Event Code 0x0015 Controller Index Event Parameters Address (6 Octets) Address_Type (1 Octet) Device Unpaired Event ===================== Event Code 0x0016 Controller Index Event Parameters Address (6 Octets) Address_Type (1 Octet)