132694e182daed32e30dbc9d13d8af0154660cf1cRoshan Pius# Copyright 2015 The Chromium OS Authors. All rights reserved.
24d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou# Use of this source code is governed by a BSD-style license that can be
34d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou# found in the LICENSE file.
44d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou"""
54d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen ChouConnect Sequence
64d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou
74d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen ChouReference:
84d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou    [1] Universal Serial Bus Communication Class MBIM Compliance Testing: 20
94d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou        http://www.usb.org/developers/docs/devclass_docs/MBIM-Compliance-1.0.pdf
104d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou"""
114d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chouimport array
124d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chouimport common
13e938ff00845c29f56935f2b973dd677793b8d834Roshan Pius
144d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Choufrom autotest_lib.client.cros.cellular.mbim_compliance import mbim_channel
15e938ff00845c29f56935f2b973dd677793b8d834Roshan Piusfrom autotest_lib.client.cros.cellular.mbim_compliance \
16e938ff00845c29f56935f2b973dd677793b8d834Roshan Pius        import mbim_command_message
174d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Choufrom autotest_lib.client.cros.cellular.mbim_compliance import mbim_constants
184d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Choufrom autotest_lib.client.cros.cellular.mbim_compliance import mbim_errors
19e938ff00845c29f56935f2b973dd677793b8d834Roshan Piusfrom autotest_lib.client.cros.cellular.mbim_compliance \
20e938ff00845c29f56935f2b973dd677793b8d834Roshan Pius        import mbim_message_request
21e938ff00845c29f56935f2b973dd677793b8d834Roshan Piusfrom autotest_lib.client.cros.cellular.mbim_compliance \
22e938ff00845c29f56935f2b973dd677793b8d834Roshan Pius        import mbim_message_response
234d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Choufrom autotest_lib.client.cros.cellular.mbim_compliance.sequences \
244d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou        import sequence
254d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou
264d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou
274d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chouclass ConnectSequence(sequence.Sequence):
284d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou    """ Implement the Connect Sequence. """
294d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou
3020ea63d02216bbbf3e4d8776f37896113a26a429Roshan Pius    def run_internal(self,
3120ea63d02216bbbf3e4d8776f37896113a26a429Roshan Pius                     introduce_error_in_access_offset=False,
3220ea63d02216bbbf3e4d8776f37896113a26a429Roshan Pius                     introduce_error_in_packets_order=None,
3320ea63d02216bbbf3e4d8776f37896113a26a429Roshan Pius                     raise_exception_on_failure=True):
344d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou        """
354d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou        Run the Connect Sequence.
364d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou
374d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou        Once the command message is sent, there should be at least one
384d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou        notification received apart from the command done message.
394d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou
4020ea63d02216bbbf3e4d8776f37896113a26a429Roshan Pius        @param introduce_error_in_access_offset: Whether to introduce an
4120ea63d02216bbbf3e4d8776f37896113a26a429Roshan Pius                error in the access_string offset or not.
4220ea63d02216bbbf3e4d8776f37896113a26a429Roshan Pius        @param introduce_error_in_packets_order: Whether to introduce an
4320ea63d02216bbbf3e4d8776f37896113a26a429Roshan Pius                error in the order of packets sent or not. It's a user provided
4420ea63d02216bbbf3e4d8776f37896113a26a429Roshan Pius                list of packet sequence numbers to reorder, repeat or remove
4520ea63d02216bbbf3e4d8776f37896113a26a429Roshan Pius                packets generated for connect before sending it to the device.
4608de03278ead5322675abf7f695a8d22e26e1745Roshan Pius        @param raise_exception_on_failure: Whether to raise an exception or not.
4708de03278ead5322675abf7f695a8d22e26e1745Roshan Pius        @returns tuple of (command_message, response_message, notifications):
4808de03278ead5322675abf7f695a8d22e26e1745Roshan Pius                command_message: The command message sent to device.
494d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou                |command_message| is a MBIMCommandMessage object.
5008de03278ead5322675abf7f695a8d22e26e1745Roshan Pius                response_message: The response to the |command_message|.
514d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou                |response_message| is a MBIMCommandDoneMessage object.
5208de03278ead5322675abf7f695a8d22e26e1745Roshan Pius                notifications: The list of notifications message sent from the
534d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou                modem to the host. |notifications| is a list of
544d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou                |MBIMIndicateStatusMessage| objects.
554d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou        """
564d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou        # Step 1
574d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou        # Send MBIM_COMMAND_MSG.
58e938ff00845c29f56935f2b973dd677793b8d834Roshan Pius        context_type = mbim_constants.MBIM_CONTEXT_TYPE_INTERNET.bytes
59e938ff00845c29f56935f2b973dd677793b8d834Roshan Pius        data_buffer = array.array('B', 'loopback'.encode('utf-16le'))
60e938ff00845c29f56935f2b973dd677793b8d834Roshan Pius        information_buffer_length = (
61e938ff00845c29f56935f2b973dd677793b8d834Roshan Pius                mbim_command_message.MBIMSetConnect.get_struct_len())
62e938ff00845c29f56935f2b973dd677793b8d834Roshan Pius        information_buffer_length += len(data_buffer)
63cc38f7e2548b0b33c48fcf3343e41f3f7e5833f7Roshan Pius        device_context = self.device_context
64e938ff00845c29f56935f2b973dd677793b8d834Roshan Pius        descriptor_cache = device_context.descriptor_cache
6520ea63d02216bbbf3e4d8776f37896113a26a429Roshan Pius        if introduce_error_in_access_offset:
6620ea63d02216bbbf3e4d8776f37896113a26a429Roshan Pius            access_string_offset = 0
6720ea63d02216bbbf3e4d8776f37896113a26a429Roshan Pius        else:
6820ea63d02216bbbf3e4d8776f37896113a26a429Roshan Pius            access_string_offset = 60
69e938ff00845c29f56935f2b973dd677793b8d834Roshan Pius        command_message = (
70e938ff00845c29f56935f2b973dd677793b8d834Roshan Pius                mbim_command_message.MBIMSetConnect(session_id=0,
71e938ff00845c29f56935f2b973dd677793b8d834Roshan Pius                        activation_command=1,
7220ea63d02216bbbf3e4d8776f37896113a26a429Roshan Pius                        access_string_offset=access_string_offset,
73e938ff00845c29f56935f2b973dd677793b8d834Roshan Pius                        access_string_size=16,
74e938ff00845c29f56935f2b973dd677793b8d834Roshan Pius                        user_name_offset=0,
75e938ff00845c29f56935f2b973dd677793b8d834Roshan Pius                        user_name_size=0,
76e938ff00845c29f56935f2b973dd677793b8d834Roshan Pius                        password_offset=0,
77e938ff00845c29f56935f2b973dd677793b8d834Roshan Pius                        password_size=0,
78e938ff00845c29f56935f2b973dd677793b8d834Roshan Pius                        compression=0,
79e938ff00845c29f56935f2b973dd677793b8d834Roshan Pius                        auth_protocol=0,
80e938ff00845c29f56935f2b973dd677793b8d834Roshan Pius                        ip_type=1,
81e938ff00845c29f56935f2b973dd677793b8d834Roshan Pius                        context_type=context_type,
82e938ff00845c29f56935f2b973dd677793b8d834Roshan Pius                        information_buffer_length=information_buffer_length,
83e938ff00845c29f56935f2b973dd677793b8d834Roshan Pius                        payload_buffer=data_buffer))
84e938ff00845c29f56935f2b973dd677793b8d834Roshan Pius        packets = mbim_message_request.generate_request_packets(
85e938ff00845c29f56935f2b973dd677793b8d834Roshan Pius                command_message,
86b3c9e7a6dad23d6c10fcff9396b9b875285da162Roshan Pius                device_context.max_control_transfer_size)
874d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou        channel = mbim_channel.MBIMChannel(
88cc38f7e2548b0b33c48fcf3343e41f3f7e5833f7Roshan Pius                device_context._device,
89e938ff00845c29f56935f2b973dd677793b8d834Roshan Pius                descriptor_cache.mbim_communication_interface.bInterfaceNumber,
90e938ff00845c29f56935f2b973dd677793b8d834Roshan Pius                descriptor_cache.interrupt_endpoint.bEndpointAddress,
91b3c9e7a6dad23d6c10fcff9396b9b875285da162Roshan Pius                device_context.max_control_transfer_size)
9220ea63d02216bbbf3e4d8776f37896113a26a429Roshan Pius        if introduce_error_in_packets_order is not None:
9320ea63d02216bbbf3e4d8776f37896113a26a429Roshan Pius            packets = [packets[i] for i in introduce_error_in_packets_order]
944d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou        response_packets = channel.bidirectional_transaction(*packets)
954d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou        notifications_packets = channel.get_outstanding_packets();
964d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou        channel.close()
974d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou
984d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou        # Step 2
99e938ff00845c29f56935f2b973dd677793b8d834Roshan Pius        response_message = mbim_message_response.parse_response_packets(
100e938ff00845c29f56935f2b973dd677793b8d834Roshan Pius                response_packets)
1014d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou        notifications = []
1024d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou        for notification_packets in notifications_packets:
1034d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou            notifications.append(
104e938ff00845c29f56935f2b973dd677793b8d834Roshan Pius                    mbim_message_response.parse_response_packets(
105e938ff00845c29f56935f2b973dd677793b8d834Roshan Pius                            notification_packets))
1064d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou
1074d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou        # Step 3
1084d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou        if (response_message.message_type != mbim_constants.MBIM_COMMAND_DONE or
1094d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou            response_message.status_codes != mbim_constants.MBIM_STATUS_SUCCESS):
11008de03278ead5322675abf7f695a8d22e26e1745Roshan Pius            if raise_exception_on_failure:
11108de03278ead5322675abf7f695a8d22e26e1745Roshan Pius                mbim_errors.log_and_raise(
11208de03278ead5322675abf7f695a8d22e26e1745Roshan Pius                        mbim_errors.MBIMComplianceSequenceError,
11308de03278ead5322675abf7f695a8d22e26e1745Roshan Pius                        'Connect sequence failed.')
1144d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou
1154d427943bf1931aab7f9992b9f034334e36ec7dbMiao-chen Chou        return command_message, response_message, notifications
116