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