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