1# Lint as: python3 2# Copyright 2022 The Chromium OS Authors. All rights reserved. 3# Use of this source code is governed by a BSD-style license that can be 4# found in the LICENSE file. 5"""Module to execute hcitool commands according to Bluetooth Core Spec v5.2.""" 6 7import btsocket 8import logging 9import struct 10from autotest_lib.client.bin import utils 11from autotest_lib.client.common_lib import error 12 13 14class Hcitool(object): 15 """Executes hcitool commands according to Bluetooth Core Spec v5.2.""" 16 CONTROLLER_PASS_CODE_VALUE = 0 17 HCI_COMMAND_COMPLETE_EVENT = '0x0e' 18 19 def _execute_hcitool_cmd(self, ogf, ocf, *parameter): 20 """Executes hcitool commands using 'hcitool cmd ... ' 21 22 NOTE: return list depend on the Bluetooth Core Spec documentation. 23 24 @param ogf: btsocket.OGF_... (int value). 25 @param ocf: btsocket.OCF_... (int value). 26 @param *parameter: parameter as hex string, e.g., ...,'1A','FA'. 27 28 @return: list of the hcitool output. In case 29 of failure, returns [hcitool status]. 30 """ 31 params = ['hcitool', 'cmd', hex(ogf), hex(ocf)] 32 params.extend(parameter) 33 cmd = ' '.join(params) 34 logging.debug('Running "%s"', cmd) 35 # Output format of hcitool command: 36 # < HCI Command: ogf 0xXX, ocf 0xXXXX, plen X 37 # > HCI Event: 0xXX plen XX 38 # XX XX XX XX XX XX XX XX XX XX ... 39 output = utils.system_output(cmd, retain_output=True) 40 output_parse_value = HciToolParser.parse_output(output) 41 event_type, plen_value, status, event_bytearray = output_parse_value 42 if event_type != self.HCI_COMMAND_COMPLETE_EVENT: 43 raise error.TestError( 44 'Expect Command complete event with value: ' + 45 self.HCI_COMMAND_COMPLETE_EVENT + ' but got ' + event_type) 46 47 if len(event_bytearray) != plen_value: 48 raise error.TestError('Expect plen value of ' + str(plen_value) + 49 'but got ' + str(len(event_bytearray))) 50 51 if status != self.CONTROLLER_PASS_CODE_VALUE: 52 return [status] 53 54 return HciToolParser.parse_payload(event_bytearray, ogf, ocf) 55 56 @staticmethod 57 def filter_with_mask(names, mask): 58 """Picks the supported names base on the given mask. 59 60 @param names: List of names like feature,commands,... 61 @param mask: A bitmask (8 bit little-endian) or a list of bitmasks. 62 63 @return: List of supported names (features/commands/...). 64 """ 65 66 if isinstance(mask, list): 67 # Convert masks to bitstring in little-endian. 68 mask = ''.join('{0:08b}'.format(m)[::-1] for m in mask) 69 else: 70 mask = '{:b}'.format(mask) 71 mask = mask[::-1] 72 return [names[i] for i, m in enumerate(mask) if m == '1'] 73 74 def _execute_hcitool_cmd_or_raise(self, ogf, ocf, *parameter): 75 result = self._execute_hcitool_cmd(ogf, ocf, *parameter) 76 status = result[0] 77 if status != self.CONTROLLER_PASS_CODE_VALUE: 78 raise error.TestError( 79 'Unexpected command output, the status code is ' + 80 str(status)) 81 return result 82 83 def read_buffer_size(self): 84 """Reads the buffer size of the BT controller. 85 86 @returns: (status, acl_data_packet_length, 87 synchronous_data_packet_length, total_num_acl_data_packets, 88 total_num_synchronous_data_packets). 89 """ 90 return self._execute_hcitool_cmd_or_raise( 91 btsocket.OGF_INFO_PARAM, btsocket.OCF_READ_BUFFER_SIZE) 92 93 def read_local_supported_features(self): 94 """Reads local supported features for BR/EDR. 95 96 @returns: (status, [features_name_list]). 97 """ 98 execute_command_result = self._execute_hcitool_cmd_or_raise( 99 btsocket.OGF_INFO_PARAM, btsocket.OCF_READ_LOCAL_FEATURES) 100 status = execute_command_result[0] 101 lmp_features_mask = execute_command_result[1] 102 supported_features = SupportedFeatures.SUPPORTED_FEATURES_PAGE_ZERO 103 final_result = self.filter_with_mask(supported_features, 104 lmp_features_mask) 105 return status, final_result 106 107 def read_local_extended_features(self, page_number): 108 """Reads local supported extended features for BR/EDR. 109 110 @param: page number (0,1,2). 111 112 @returns: (status, return_page_number, 113 maximum_page_number, [features_name_list]). 114 """ 115 if page_number not in (0, 1, 2): 116 raise error.TestError( 117 'Invalid page_number: want (0, 1, 2), actual: ' + 118 str(page_number)) 119 execute_command_result = self._execute_hcitool_cmd_or_raise( 120 btsocket.OGF_INFO_PARAM, btsocket.OCF_READ_LOCAL_EXT_FEATURES, 121 str(page_number)) 122 123 status = execute_command_result[0] 124 return_page_number = execute_command_result[1] 125 maximum_page_number = execute_command_result[2] 126 extended_mask = execute_command_result[3] 127 supported_features = [] 128 if page_number == 0: 129 supported_features = SupportedFeatures.SUPPORTED_FEATURES_PAGE_ZERO 130 elif page_number == 1: 131 supported_features = SupportedFeatures.SUPPORTED_FEATURES_PAGE_ONE 132 elif page_number == 2: 133 supported_features = SupportedFeatures.SUPPORTED_FEATURES_PAGE_TWO 134 135 final_result = self.filter_with_mask(supported_features, extended_mask) 136 137 return status, return_page_number, maximum_page_number, final_result 138 139 def read_le_local_supported_features(self): 140 """Reads LE (Low Energy) supported features. 141 142 @return: (status, [LE_features_name_list]). 143 """ 144 145 execute_command_result = self._execute_hcitool_cmd_or_raise( 146 btsocket.OGF_LE_CTL, 147 btsocket.OCF_LE_READ_LOCAL_SUPPORTED_FEATURES) 148 149 status = execute_command_result[0] 150 le_features_mask = execute_command_result[1] 151 le_supported_features = SupportedFeatures.LE_SUPPORTED_FEATURE 152 final_result = self.filter_with_mask(le_supported_features, 153 le_features_mask) 154 155 return status, final_result 156 157 def set_event_filter(self, filter_type, filter_condition_type, condition): 158 """Sets event filter. 159 160 @param filter_type: filter type. 161 @param filter_condition_type: filter condition type. 162 @param condition: condition. 163 164 @return: [status]. 165 """ 166 execute_command_result = self._execute_hcitool_cmd( 167 btsocket.OGF_HOST_CTL, btsocket.OCF_SET_EVENT_FLT, filter_type, 168 filter_condition_type, condition) 169 170 return execute_command_result 171 172 def read_local_supported_commands(self): 173 """Reads local supported commands. 174 175 @return: (status, [supported_commands_name_list]). 176 """ 177 execute_command_result = self._execute_hcitool_cmd_or_raise( 178 btsocket.OGF_INFO_PARAM, btsocket.OCF_READ_LOCAL_COMMANDS) 179 status = execute_command_result[0] 180 commands_mask = list(execute_command_result[1:]) 181 commands = SupportedCommands.SUPPORTED_COMMANDS 182 final_result = self.filter_with_mask(commands, commands_mask) 183 184 return status, final_result 185 186 def check_command_supported(self, command_name): 187 """Check if the given command name is supported. 188 189 @param: command_name as string, e.g., HCI_Inquiry. 190 191 @return: True if the command is supported, False otherwise. 192 """ 193 supported_commands = self.read_local_supported_commands()[1] 194 195 return command_name in supported_commands 196 197 def le_read_accept_list_size(self): 198 """Reads accept list size of the BT LE controller. 199 200 @returns: (status, accept_list_size). 201 """ 202 return self._execute_hcitool_cmd_or_raise( 203 btsocket.OGF_LE_CTL, btsocket.OCF_LE_READ_ACCEPT_LIST_SIZE) 204 205 def le_read_maximum_data_length(self): 206 """Reads packet data length of the BT LE controller. 207 208 @returns: (status, supported_max_tx_octets, supported_max_tx_time, 209 supported_max_rx_octets, supported_max_rx_time). 210 """ 211 return self._execute_hcitool_cmd_or_raise( 212 btsocket.OGF_LE_CTL, 213 HciToolParser.OCF_LE_READ_MAXIMUM_DATA_LENGTH) 214 215 def le_read_resolving_list_size(self): 216 """Reads resolving list size of the BT LE controller. 217 @returns: (status, resolving_list_size). 218 """ 219 return self._execute_hcitool_cmd_or_raise( 220 btsocket.OGF_LE_CTL, 221 HciToolParser.OCF_LE_READ_RESOLVING_LIST_SIZE) 222 223 def le_read_number_of_supported_advertising_sets(self): 224 """Reads number of supported advertisement sets. 225 226 @returns: (status, num_supported_advertising_sets). 227 """ 228 return self._execute_hcitool_cmd_or_raise( 229 btsocket.OGF_LE_CTL, 230 HciToolParser.OCF_LE_READ_NUMBER_OF_SUPPORTED_ADVERTISING_SETS) 231 232 def vs_msft_read_supported_features(self, msft_ocf): 233 """Reads VS MSFT supported features. 234 235 @param msft_ocf: The msft_ocf for different chipset. 236 237 @returns: (status, subcommand_opcode, [vs_msft_features_name_list], 238 microsoft_event_prefix_length, microsoft_event_prefix) 239 """ 240 VS_MSFT_READ_SUPPORTED_FEATURES_SUBCOMMAND_OPCODE = '00' 241 execute_command_result = self._execute_hcitool_cmd_or_raise( 242 btsocket.OGF_VENDOR_CMD, msft_ocf, 243 VS_MSFT_READ_SUPPORTED_FEATURES_SUBCOMMAND_OPCODE) 244 status = execute_command_result[0] 245 vs_msft_features_mask = execute_command_result[2] 246 vs_msft_supported_features = ( 247 SupportedFeatures.VS_MSFT_SUPPORTED_FEATURES) 248 final_result = self.filter_with_mask(vs_msft_supported_features, 249 vs_msft_features_mask) 250 (_, subcommand_opcode, _, microsoft_event_prefix_length, 251 microsoft_event_prefix) = execute_command_result 252 return (status, subcommand_opcode, final_result, 253 microsoft_event_prefix_length, microsoft_event_prefix) 254 255 def le_get_vendor_capabilities_command(self): 256 """Gets AOSP LE vendor capabilities. 257 258 @returns: (status, max_advt_instances(deprecated), 259 offloaded_resolution_of_private-address(deprecated), 260 total_scan_results_storage, max_irk_list_sz, filtering_support, 261 max_filter, activity_energy_info_support, version_supported, 262 total_num_of_advt_tracked, extended_scan_support, 263 debug_logging_supported, 264 LE_address_generation_offloading_support(deprecated), 265 A2DP_source_offload_capability_mask, 266 bluetooth_quality_report_support, dynamic_audio_buffer_support). 267 """ 268 execute_command_result = self._execute_hcitool_cmd_or_raise( 269 btsocket.OGF_VENDOR_CMD, 270 HciToolParser.OCF_LE_GET_VENDOR_CAPABILITIES_COMMAND) 271 pack_format = '<{}B'.format(len(execute_command_result)) 272 execute_command_result = struct.pack(pack_format, 273 execute_command_result) 274 aosp_formats = [ 275 '<BBBHBBBBHHBB', # v0.95 276 '<BBBHBBBBHHBBB', # v0.96 277 '<BBBHBBBBHHBBBIB', # v0.98 278 '<BBBHBBBBHHBBBIBI', # v1.00 279 ] 280 281 for f in aosp_formats: 282 if struct.calcsize(f) == len(execute_command_result): 283 return struct.unpack(f, execute_command_result) 284 raise error.TestError( 285 'Invalid output of AOSP capability command, length = ' + 286 str(len(execute_command_result))) 287 288 289class HciToolParser: 290 """Parser of hcitool command output based on the hcitool parameters.""" 291 OCF_LE_READ_MAXIMUM_DATA_LENGTH = 0x002F 292 OCF_LE_READ_RESOLVING_LIST_SIZE = 0x002A 293 OCF_LE_READ_NUMBER_OF_SUPPORTED_ADVERTISING_SETS = 0x003B 294 OCF_MSFT_INTEL_CHIPSET = 0X001e 295 OCF_MSFT_MEDIATEK_CHIPSET = 0x0130 296 OCF_MSFT_QCA_CHIPSET = 0x0170 297 OCF_LE_GET_VENDOR_CAPABILITIES_COMMAND = 0x0153 298 299 FORMATS = { 300 ################## OGF=0X03 (OGF_HOST_CTL) ################## 301 # Set Event Filter command 302 (btsocket.OGF_HOST_CTL, btsocket.OCF_SET_EVENT_FLT): 303 '<B', 304 305 ################## OGF=0X04 (OGF_INFO_PARAM) ################## 306 # Read Local Supported Commands command 307 (btsocket.OGF_INFO_PARAM, btsocket.OCF_READ_LOCAL_COMMANDS): 308 '<B64B', 309 # Read Local Supported Features command 310 (btsocket.OGF_INFO_PARAM, btsocket.OCF_READ_LOCAL_FEATURES): 311 '<BQ', 312 # Read Local Extended Features command 313 (btsocket.OGF_INFO_PARAM, btsocket.OCF_READ_LOCAL_EXT_FEATURES): 314 '<BBBQ', 315 # Read Buffer Size command 316 (btsocket.OGF_INFO_PARAM, btsocket.OCF_READ_BUFFER_SIZE): 317 '<BHBHH', 318 319 ################## OGF=0X08 (OGF_LE_CTL) ################## 320 # LE Read Local Supported Features command 321 (btsocket.OGF_LE_CTL, btsocket.OCF_LE_READ_LOCAL_SUPPORTED_FEATURES): 322 '<BQ', 323 # LE Set Advertising Data command 324 (btsocket.OGF_LE_CTL, btsocket.OCF_LE_SET_ADVERTISING_DATA): 325 '<B', 326 # Read Data Packet Size 327 (btsocket.OGF_LE_CTL, OCF_LE_READ_MAXIMUM_DATA_LENGTH): 328 '<BHHHH', 329 # LE Read Number of Supported Advertising Sets command 330 (btsocket.OGF_LE_CTL, OCF_LE_READ_NUMBER_OF_SUPPORTED_ADVERTISING_SETS): 331 '<BB', 332 # LE Read Resolving List Size 333 (btsocket.OGF_LE_CTL, OCF_LE_READ_RESOLVING_LIST_SIZE): 334 '<BB', 335 # LE Read Accept List Size command 336 (btsocket.OGF_LE_CTL, btsocket.OCF_LE_READ_ACCEPT_LIST_SIZE): 337 '<BB', 338 339 ################## OGF=0X3f (OGF_VENDOR_CMD) ################## 340 # LE_Get_Vendor_Capabilities_Command 341 (btsocket.OGF_VENDOR_CMD, OCF_LE_GET_VENDOR_CAPABILITIES_COMMAND): 342 None, 343 # HCI_VS_MSFT_Intel_Read_Supported_Features 344 (btsocket.OGF_VENDOR_CMD, OCF_MSFT_INTEL_CHIPSET): 345 '<BBQBB', 346 # HCI_VS_MSFT_QCA_Read_Supported_Features 347 (btsocket.OGF_VENDOR_CMD, OCF_MSFT_QCA_CHIPSET): 348 '<BBQBB', 349 # HCI_VS_MSFT_Mediatek_Read_Supported_Features 350 (btsocket.OGF_VENDOR_CMD, OCF_MSFT_MEDIATEK_CHIPSET): 351 '<BBQBB' 352 } 353 354 @staticmethod 355 def get_parsing_format(ogf, ocf): 356 """Gets the format string to unpack the hcitool command output. 357 358 @param ogf: Opcode Group Field. 359 @param ocf: Opcode Command Field. 360 361 @return: opcode output format according to Bluetooth Core Spec v5.2. 362 """ 363 return HciToolParser.FORMATS[(ogf, ocf)] 364 365 @staticmethod 366 def parse_output(output): 367 """Parse hcitool output. 368 @param output: hcitool command output. 369 370 @return: event_type, plen_value, status, event_bytearray. 371 """ 372 hci_event = output.split('HCI Event:')[1].strip() 373 event_type, *_, plen_value = hci_event.split('\n')[0].split(' ') 374 375 # for example hci_event_values =XX XX XX XX XX XX XX XX XX XX ... 376 # Sometimes hci_event_values may consist of multiple lines 377 hci_event_values = hci_event.split('\n')[1:] 378 hci_event_values_as_string = ''.join([ 379 v for v in hci_event_values 380 ]).strip().replace("'", '').replace(' ', '') 381 status = int(hci_event_values_as_string[6:8]) 382 event_bytearray = bytearray.fromhex(hci_event_values_as_string[6:]) 383 # Remove first 3 octet from count, not in 'event_bytearray' 384 plen_value = int(plen_value) - 3 385 return event_type, plen_value, status, event_bytearray 386 387 @staticmethod 388 def parse_payload(payload, ogf, ocf): 389 """Parse hcitool payload. 390 391 @param payload: hcitool event payload (as bytearray). 392 @param ogf: btsocket.OGF_... (int value). 393 @param ocf: btsocket.OCF_... (int value). 394 395 @return: parsed result of the hcitool payload based on (ogf, ocf). 396 If it cannot be parsed, returns the payload as bytes. 397 """ 398 cmd_output_format = HciToolParser.get_parsing_format(ogf, ocf) 399 if cmd_output_format is None: 400 cmd_output_format = '<{}B'.format(len(payload)) 401 return struct.unpack(cmd_output_format, payload) 402 403 404class SupportedFeatures: 405 """List supported features names from BT core spec 5.2.""" 406 VS_MSFT_SUPPORTED_FEATURES = [ 407 'RSSI Monitoring feature for BR/EDR', 408 'RSSI Monitoring feature for LE connections', 409 'RSSI Monitoring of LE advertisements', 410 'Advertising Monitoring of LE advertisements', 411 'Verifying the validity of P-192 and P-256 keys', 412 'Continuous Advertising Monitoring' 413 ] 414 SUPPORTED_FEATURES_PAGE_ZERO = [ 415 '3 slot packets', '5 slot packets', 'Encryption', 'Slot offset', 416 'Timing accuracy', 'Role switch', 'Hold mode', 'Sniff mode', 417 'Previously used', 'Power control requests', 418 'Channel quality driven data rate (CQDDR)', 'SCO link', 419 'HV2 packets', 'HV3 packets', 'u-law log synchronous data', 420 'A-law log synchronous data', 'CVSD synchronous data', 421 'Paging parameter negotiation', 'Power control', 422 'Transparent synchronous data', 423 'Flow control lag (least significant bit)', 424 'Flow control lag (middle bit)', 425 'Flow control lag (most significant bit)', 'Broadcast Encryption', 426 'Reserved for future use', 'Enhanced Data Rate ACL 2 Mb/s mode', 427 'Enhanced Data Rate ACL 3 Mb/s mode', 'Enhanced inquiry scan', 428 'Interlaced inquiry scan', 'Interlaced page scan', 429 'RSSI with inquiry results', 'Extended SCO link (EV3 packets)', 430 'EV4 packets', 'EV5 packets', 'Reserved for future use', 431 'AFH capable slave', 'AFH classification slave', 432 'BR/EDR Not Supported', 'LE Supported (Controller)', 433 '3-slot Enhanced Data Rate ACL packets', 434 '5-slot Enhanced Data Rate ACL packets', 'Sniff subrating', 435 'Pause encryption', 'AFH capable master', 436 'AFH classification master', 'Enhanced Data Rate eSCO 2 Mb/s mode', 437 'Enhanced Data Rate eSCO 3 Mb/s mode', 438 '3-slot Enhanced Data Rate eSCO packets', 439 'Extended Inquiry Response', 440 'Simultaneous LE and BR/EDR to Same Device Capable (Controller)', 441 'Reserved for future use', 442 'Secure Simple Pairing (Controller Support)', 'Encapsulated PDU', 443 'Erroneous Data Reporting', 'Non-flushable Packet Boundary Flag', 444 'Reserved for future use', 445 'HCI_Link_Supervision_Timeout_Changed event', 446 'Variable Inquiry TX Power Level', 'Enhanced Power Control', 447 'Reserved for future use', 'Reserved for future use', 448 'Reserved for future use', 'Reserved for future use', 449 'Extended features' 450 ] 451 452 SUPPORTED_FEATURES_PAGE_ONE = [ 453 'Secure Simple Pairing (Host Support)', 'LE Supported (Host)', 454 'Simultaneous LE and BR/EDR to Same Device Capable (Host)', 455 'Secure Connections (Host Support)' 456 ] 457 458 SUPPORTED_FEATURES_PAGE_TWO = [ 459 'Connectionless Slave Broadcast – Master Operation', 460 'Connectionless Slave Broadcast – Slave Operation', 461 'Synchronization Train', 'Synchronization Scan', 462 'HCI_Inquiry_Response_Notification event', 463 'Generalized interlaced scan', 'Coarse Clock Adjustment', 464 'Reserved for future use', 465 'Secure Connections (Controller Support)', 'Ping', 466 'Slot Availability Mask', 'Train nudging' 467 ] 468 469 LE_SUPPORTED_FEATURE = [ 470 'LE Encryption', 'Connection Parameters Request Procedure', 471 'Extended Reject Indication', 'Slave-initiated Features Exchange', 472 'LE Ping', 'LE Data Packet Length Extension', 'LL Privacy', 473 'Extended Scanner Filter Policies', 'LE 2M PHY', 474 'Stable Modulation Index - Transmitter', 475 'Stable Modulation Index Receiver', 'LE Coded PHY', 476 'LE Extended Advertising', 'LE Periodic Advertising', 477 'Channel Selection Algorithm #2', 'LE Power Class 1', 478 'Minimum Number of Used Channels Procedur', 479 'Connection CTE Request', 'Connection CTE Response', 480 'Connectionless CTE Transmitter', 'Connectionless CTE Receiver', 481 'Antenna Switching During CTE Transmission (AoD)', 482 'Antenna Switching During CTE Reception (AoA)', 483 'Receiving Constant Tone Extensions', 484 'Periodic Advertising Sync Transfer Sender', 485 'Periodic Advertising Sync Transfer Recipient', 486 'Sleep Clock Accuracy Updates', 'Remote Public Key Validation', 487 'Connected Isochronous Stream Master', 488 'Connected Isochronous Stream Slave', 'Isochronous Broadcaster', 489 'Synchronized Receiver', 'Isochronous Channels (Host Support)', 490 'LE Power Control Request', 'LE Power Change Indication', 491 'LE Path Loss Monitoring' 492 ] 493 494 495class SupportedCommands: 496 """List supported command from BT core spec 5.2.""" 497 SUPPORTED_COMMANDS = [ 498 "HCI_Inquiry", "HCI_Inquiry_Cancel", "HCI_Periodic_Inquiry_Mode", 499 "HCI_Exit_Periodic_Inquiry_Mode", "HCI_Create_Connection", 500 "HCI_Disconnect", "HCI_Add_SCO_Connection", 501 "HCI_Create_Connection_Cancel", "HCI_Accept_Connection_Request", 502 "HCI_Reject_Connection_Request", "HCI_Link_Key_Request_Reply", 503 "HCI_Link_Key_Request_Negative_Reply", 504 "HCI_PIN_Code_Request_Reply", 505 "HCI_PIN_Code_Request_Negative_Reply", 506 "HCI_Change_Connection_Packet_Type", 507 "HCI_Authentication_Requested", "HCI_Set_Connection_Encryption", 508 "HCI_Change_Connection_Link_Key", "HCI_Master_Link_Key", 509 "HCI_Remote_Name_Request", "HCI_Remote_Name_Request_Cancel", 510 "HCI_Read_Remote_Supported_Features", 511 "HCI_Read_Remote_Extended_Features", 512 "HCI_Read_Remote_Version_Information", "HCI_Read_Clock_Offset", 513 "HCI_Read_LMP_Handle", "Reserved for future use", 514 "Reserved for future use", "Reserved for future use", 515 "Reserved for future use", "Reserved for future use", 516 "Reserved for future use", "Reserved for future use", 517 "HCI_Hold_Mode", "HCI_Sniff_Mode", "HCI_Exit_Sniff_Mode", 518 "Previously used", "Previously used", "HCI_QoS_Setup", 519 "HCI_Role_Discovery", "HCI_Switch_Role", 520 "HCI_Read_Link_Policy_Settings", "HCI_Write_Link_Policy_Settings", 521 "HCI_Read_Default_Link_Policy_Settings", 522 "HCI_Write_Default_Link_Policy_Settings", "HCI_Flow_Specification", 523 "HCI_Set_Event_Mask", "HCI_Reset", "HCI_Set_Event_Filter", 524 "HCI_Flush", "HCI_Read_PIN_Type", "HCI_Write_PIN_Type", 525 "Previously used", "HCI_Read_Stored_Link_Key", 526 "HCI_Write_Stored_Link_Key", "HCI_Delete_Stored_Link_Key", 527 "HCI_Write_Local_Name", "HCI_Read_Local_Name", 528 "HCI_Read_Connection_Accept_Timeout", 529 "HCI_Write_Connection_Accept_Timeout", "HCI_Read_Page_Timeout", 530 "HCI_Write_Page_Timeout", "HCI_Read_Scan_Enable", 531 "HCI_Write_Scan_Enable", "HCI_Read_Page_Scan_Activity", 532 "HCI_Write_Page_Scan_Activity", "HCI_Read_Inquiry_Scan_Activity", 533 "HCI_Write_Inquiry_Scan_Activity", 534 "HCI_Read_Authentication_Enable", 535 "HCI_Write_Authentication_Enable", "HCI_Read_Encryption_Mode", 536 "HCI_Write_Encryption_Mode", "HCI_Read_Class_Of_Device", 537 "HCI_Write_Class_Of_Device", "HCI_Read_Voice_Setting", 538 "HCI_Write_Voice_Setting", "HCI_Read_Automatic_Flush_Timeout", 539 "HCI_Write_Automatic_Flush_Timeout", 540 "HCI_Read_Num_Broadcast_Retransmissions", 541 "HCI_Write_Num_Broadcast_Retransmissions", 542 "HCI_Read_Hold_Mode_Activity", "HCI_Write_Hold_Mode_Activity", 543 "HCI_Read_Transmit_Power_Level", 544 "HCI_Read_Synchronous_Flow_Control_Enable", 545 "HCI_Write_Synchronous_Flow_Control_Enable", 546 "HCI_Set_Controller_To_Host_Flow_Control", "HCI_Host_Buffer_Size", 547 "HCI_Host_Number_Of_Completed_Packets", 548 "HCI_Read_Link_Supervision_Timeout", 549 "HCI_Write_Link_Supervision_Timeout", 550 "HCI_Read_Number_Of_Supported_IAC", "HCI_Read_Current_IAC_LAP", 551 "HCI_Write_Current_IAC_LAP", "HCI_Read_Page_Scan_Mode_Period", 552 "HCI_Write_Page_Scan_Mode_Period", "HCI_Read_Page_Scan_Mode", 553 "HCI_Write_Page_Scan_Mode", 554 "HCI_Set_AFH_Host_Channel_Classification", 555 "Reserved for future use", "Reserved for future use", 556 "HCI_Read_Inquiry_Scan_Type", "HCI_Write_Inquiry_Scan_Type", 557 "HCI_Read_Inquiry_Mode", "HCI_Write_Inquiry_Mode", 558 "HCI_Read_Page_Scan_Type", "HCI_Write_Page_Scan_Type", 559 "HCI_Read_AFH_Channel_Assessment_Mode", 560 "HCI_Write_AFH_Channel_Assessment_Mode", "Reserved for future use", 561 "Reserved for future use", "Reserved for future use", 562 "Reserved for future use", "Reserved for future use", 563 "Reserved for future use", "Reserved for future use", 564 "HCI_Read_Local_Version_Information", "Reserved for future use", 565 "HCI_Read_Local_Supported_Features", 566 "HCI_Read_Local_Extended_Features", "HCI_Read_Buffer_Size", 567 "HCI_Read_Country_Code", "HCI_Read_BD_ADDR", 568 "HCI_Read_Failed_Contact_Counter", 569 "HCI_Reset_Failed_Contact_Counter", "HCI_Read_Link_Quality", 570 "HCI_Read_RSSI", "HCI_Read_AFH_Channel_Map", "HCI_Read_Clock", 571 "HCI_Read_Loopback_Mode", "HCI_Write_Loopback_Mode", 572 "HCI_Enable_Device_Under_Test_Mode", 573 "HCI_Setup_Synchronous_Connection_Request", 574 "HCI_Accept_Synchronous_Connection_Request", 575 "HCI_Reject_Synchronous_Connection_Request", 576 "Reserved for future use", "Reserved for future use", 577 "HCI_Read_Extended_Inquiry_Response", 578 "HCI_Write_Extended_Inquiry_Response", 579 "HCI_Refresh_Encryption_Key", "Reserved for future use", 580 "HCI_Sniff_Subrating", "HCI_Read_Simple_Pairing_Mode", 581 "HCI_Write_Simple_Pairing_Mode", "HCI_Read_Local_OOB_Data", 582 "HCI_Read_Inquiry_Response_Transmit_Power_Level", 583 "HCI_Write_Inquiry_Transmit_Power_Level", 584 "HCI_Read_Default_Erroneous_Data_Reporting", 585 "HCI_Write_Default_Erroneous_Data_Reporting", 586 "Reserved for future use", "Reserved for future use", 587 "Reserved for future use", "HCI_IO_Capability_Request_Reply", 588 "HCI_User_Confirmation_Request_Reply", 589 "HCI_User_Confirmation_Request_Negative_Reply", 590 "HCI_User_Passkey_Request_Reply", 591 "HCI_User_Passkey_Request_Negative_Reply", 592 "HCI_Remote_OOB_Data_Request_Reply", 593 "HCI_Write_Simple_Pairing_Debug_Mode", "HCI_Enhanced_Flush", 594 "HCI_Remote_OOB_Data_Request_Negative_Reply", 595 "Reserved for future use", "Reserved for future use", 596 "HCI_Send_Keypress_Notification", 597 "HCI_IO_Capability_Request_Negative_Reply", 598 "HCI_Read_Encryption_Key_Size", "Reserved for future use", 599 "Reserved for future use", "Reserved for future use", 600 "HCI_Create_Physical_Link", "HCI_Accept_Physical_Link", 601 "HCI_Disconnect_Physical_Link", "HCI_Create_Logical_Link", 602 "HCI_Accept_Logical_Link", "HCI_Disconnect_Logical_Link", 603 "HCI_Logical_Link_Cancel", "HCI_Flow_Spec_Modify", 604 "HCI_Read_Logical_Link_Accept_Timeout", 605 "HCI_Write_Logical_Link_Accept_Timeout", 606 "HCI_Set_Event_Mask_Page_2", "HCI_Read_Location_Data", 607 "HCI_Write_Location_Data", "HCI_Read_Local_AMP_Info", 608 "HCI_Read_Local_AMP_ASSOC", "HCI_Write_Remote_AMP_ASSOC", 609 "HCI_Read_Flow_Control_Mode", "HCI_Write_Flow_Control_Mode", 610 "HCI_Read_Data_Block_Size", "Reserved for future use", 611 "Reserved for future use", "HCI_Enable_AMP_Receiver_Reports", 612 "HCI_AMP_Test_End", "HCI_AMP_Test", 613 "HCI_Read_Enhanced_Transmit_Power_Level", 614 "Reserved for future use", "HCI_Read_Best_Effort_Flush_Timeout", 615 "HCI_Write_Best_Effort_Flush_Timeout", "HCI_Short_Range_Mode", 616 "HCI_Read_LE_Host_Support", "HCI_Write_LE_Host_Support", 617 "Reserved for future use", "HCI_LE_Set_Event_Mask", 618 "HCI_LE_Read_Buffer_Size [v1]", 619 "HCI_LE_Read_Local_Supported_Features", "Reserved for future use", 620 "HCI_LE_Set_Random_Address", "HCI_LE_Set_Advertising_Parameters", 621 "HCI_LE_Read_Advertising_Physical_Channel_Tx_Power", 622 "HCI_LE_Set_Advertising_Data", "HCI_LE_Set_Scan_Response_Data", 623 "HCI_LE_Set_Advertising_Enable", "HCI_LE_Set_Scan_Parameters", 624 "HCI_LE_Set_Scan_Enable", "HCI_LE_Create_Connection", 625 "HCI_LE_Create_Connection_Cancel", "HCI_LE_Read_White_List_Size", 626 "HCI_LE_Clear_White_List", "HCI_LE_Add_Device_To_White_List", 627 "HCI_LE_Remove_Device_From_White_List", "HCI_LE_Connection_Update", 628 "HCI_LE_Set_Host_Channel_Classification", 629 "HCI_LE_Read_Channel_Map", "HCI_LE_Read_Remote_Features", 630 "HCI_LE_Encrypt", "HCI_LE_Rand", "HCI_LE_Enable_Encryption", 631 "HCI_LE_Long_Term_Key_Request_Reply", 632 "HCI_LE_Long_Term_Key_Request_Negative_Reply", 633 "HCI_LE_Read_Supported_States", "HCI_LE_Receiver_Test [v1]", 634 "HCI_LE_Transmitter_Test [v1]", "HCI_LE_Test_End", 635 "Reserved for future use", "Reserved for future use", 636 "Reserved for future use", "Reserved for future use", 637 "HCI_Enhanced_Setup_Synchronous_Connection", 638 "HCI_Enhanced_Accept_Synchronous_Connection", 639 "HCI_Read_Local_Supported_Codecs", 640 "HCI_Set_MWS_Channel_Parameters", 641 "HCI_Set_External_Frame_Configuration", "HCI_Set_MWS_Signaling", 642 "HCI_Set_MWS_Transport_Layer", "HCI_Set_MWS_Scan_Frequency_Table", 643 "HCI_Get_MWS_Transport_Layer_Configuration", 644 "HCI_Set_MWS_PATTERN_Configuration", 645 "HCI_Set_Triggered_Clock_Capture", "HCI_Truncated_Page", 646 "HCI_Truncated_Page_Cancel", 647 "HCI_Set_Connectionless_Slave_Broadcast", 648 "HCI_Set_Connectionless_Slave_Broadcast_Receive", 649 "HCI_Start_Synchronization_Train", 650 "HCI_Receive_Synchronization_Train", "HCI_Set_Reserved_LT_ADDR", 651 "HCI_Delete_Reserved_LT_ADDR", 652 "HCI_Set_Connectionless_Slave_Broadcast_Data", 653 "HCI_Read_Synchronization_Train_Parameters", 654 "HCI_Write_Synchronization_Train_Parameters", 655 "HCI_Remote_OOB_Extended_Data_Request_Reply", 656 "HCI_Read_Secure_Connections_Host_Support", 657 "HCI_Write_Secure_Connections_Host_Support", 658 "HCI_Read_Authenticated_Payload_Timeout", 659 "HCI_Write_Authenticated_Payload_Timeout", 660 "HCI_Read_Local_OOB_Extended_Data", 661 "HCI_Write_Secure_Connections_Test_Mode", 662 "HCI_Read_Extended_Page_Timeout", 663 "HCI_Write_Extended_Page_Timeout", 664 "HCI_Read_Extended_Inquiry_Length", 665 "HCI_Write_Extended_Inquiry_Length", 666 "HCI_LE_Remote_Connection_Parameter_Request_Reply", 667 "HCI_LE_Remote_Connection_Parameter_Request_Negative_Reply", 668 "HCI_LE_Set_Data_Length", 669 "HCI_LE_Read_Suggested_Default_Data_Length", 670 "HCI_LE_Write_Suggested_Default_Data_Length", 671 "HCI_LE_Read_Local_P-256_Public_Key", "HCI_LE_Generate_DHKey [v1]", 672 "HCI_LE_Add_Device_To_Resolving_List", 673 "HCI_LE_Remove_Device_From_Resolving_List", 674 "HCI_LE_Clear_Resolving_List", "HCI_LE_Read_Resolving_List_Size", 675 "HCI_LE_Read_Peer_Resolvable_Address", 676 "HCI_LE_Read_Local_Resolvable_Address", 677 "HCI_LE_Set_Address_Resolution_Enable", 678 "HCI_LE_Set_Resolvable_Private_Address_Timeout", 679 "HCI_LE_Read_Maximum_Data_Length", "HCI_LE_Read_PHY", 680 "HCI_LE_Set_Default_PHY", "HCI_LE_Set_PHY", 681 "HCI_LE_Receiver_Test [v2]", "HCI_LE_Transmitter_Test [v2]", 682 "HCI_LE_Set_Advertising_Set_Random_Address", 683 "HCI_LE_Set_Extended_Advertising_Parameters", 684 "HCI_LE_Set_Extended_Advertising_Data", 685 "HCI_LE_Set_Extended_Scan_Response_Data", 686 "HCI_LE_Set_Extended_Advertising_Enable", 687 "HCI_LE_Read_Maximum_Advertising_Data_Length", 688 "HCI_LE_Read_Number_of_Supported_Advertising_Sets", 689 "HCI_LE_Remove_Advertising_Set", "HCI_LE_Clear_Advertising_Sets", 690 "HCI_LE_Set_Periodic_Advertising_Parameters", 691 "HCI_LE_Set_Periodic_Advertising_Data", 692 "HCI_LE_Set_Periodic_Advertising_Enable", 693 "HCI_LE_Set_Extended_Scan_Parameters", 694 "HCI_LE_Set_Extended_Scan_Enable", 695 "HCI_LE_Extended_Create_Connection", 696 "HCI_LE_Periodic_Advertising_Create_Sync", 697 "HCI_LE_Periodic_Advertising_Create_Sync_Cancel", 698 "HCI_LE_Periodic_Advertising_Terminate_Sync", 699 "HCI_LE_Add_Device_To_Periodic_Advertiser_List", 700 "HCI_LE_Remove_Device_From_Periodic_Advertiser_List", 701 "HCI_LE_Clear_Periodic_Advertiser_List", 702 "HCI_LE_Read_Periodic_Advertiser_List_Size", 703 "HCI_LE_Read_Transmit_Power", "HCI_LE_Read_RF_Path_Compensation", 704 "HCI_LE_Write_RF_Path_Compensation", "HCI_LE_Set_Privacy_Mode", 705 "HCI_LE_Receiver_Test [v3]", "HCI_LE_Transmitter_Test [v3]", 706 "HCI_LE_Set_Connectionless_CTE_Transmit_Parameters", 707 "HCI_LE_Set_Connectionless_CTE_Transmit_Enable", 708 "HCI_LE_Set_Connectionless_IQ_Sampling_Enable", 709 "HCI_LE_Set_Connection_CTE_Receive_Parameters", 710 "HCI_LE_Set_Connection_CTE_Transmit_Parameters", 711 "HCI_LE_Connection_CTE_Request_Enable", 712 "HCI_LE_Connection_CTE_Response_Enable", 713 "HCI_LE_Read_Antenna_Information", 714 "HCI_LE_Set_Periodic_Advertising_Receive_Enable", 715 "HCI_LE_Periodic_Advertising_Sync_Transfer", 716 "HCI_LE_Periodic_Advertising_Set_Info_Transfer", 717 "HCI_LE_Set_Periodic_Advertising_Sync_Transfer_Parameters", 718 "HCI_LE_Set_Default_Periodic_Advertising_Sync_Transfer_Parameters", 719 "HCI_LE_Generate_DHKey [v2]", 720 "HCI_Read_Local_Simple_Pairing_Options", 721 "HCI_LE_Modify_Sleep_Clock_Accuracy", 722 "HCI_LE_Read_Buffer_Size [v2]", "HCI_LE_Read_ISO_TX_Sync", 723 "HCI_LE_Set_CIG_Parameters", "HCI_LE_Set_CIG_Parameters_Test", 724 "HCI_LE_Create_CIS", "HCI_LE_Remove_CIG", 725 "HCI_LE_Accept_CIS_Request", "HCI_LE_Reject_CIS_Request", 726 "HCI_LE_Create_BIG", "HCI_LE_Create_BIG_Test", 727 "HCI_LE_Terminate_BIG", "HCI_LE_BIG_Create_Sync", 728 "HCI_LE_BIG_Terminate_Sync", "HCI_LE_Request_Peer_SCA", 729 "HCI_LE_Setup_ISO_Data_Path", "HCI_LE_Remove_ISO_Data_Path", 730 "HCI_LE_ISO_Transmit_Test", "HCI_LE_ISO_Receive_Test", 731 "HCI_LE_ISO_Read_Test_Counters", "HCI_LE_ISO_Test_End", 732 "HCI_LE_Set_Host_Feature", "HCI_LE_Read_ISO_Link_Quality", 733 "HCI_LE_Enhanced_Read_Transmit_Power_Level", 734 "HCI_LE_Read_Remote_Transmit_Power_Level", 735 "HCI_LE_Set_Path_Loss_Reporting_Parameters", 736 "HCI_LE_Set_Path_Loss_Reporting_Enable", 737 "HCI_LE_Set_Transmit_Power_Reporting_Enable", 738 "HCI_LE_Transmitter_Test [v4]", "HCI_Set_Ecosystem_Base_Interval", 739 "HCI_Read_Local_Supported_Codecs [v2]", 740 "HCI_Read_Local_Supported_Codec_Capabilities", 741 "HCI_Read_Local_Supported_Controller_Delay", 742 "HCI_Configure_Data_Path", "Reserved for future use", 743 "Reserved for future use" 744 ] 745 DEPRECATED_COMMANDS = [ 746 "HCI_Add_SCO_Connection", "HCI_Read_Encryption_Mode", 747 "HCI_Write_Encryption_Mode", "HCI_Read_Page_Scan_Mode_Period", 748 "HCI_Write_Page_Scan_Mode_Period", "HCI_Read_Page_Scan_Mode", 749 "HCI_Write_Page_Scan_Mode", "HCI_Read_Country_Code" 750 ] 751