xref: /aosp_15_r20/external/autotest/client/cros/bluetooth/hcitool.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
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