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