1 # Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 2 # Use of this source code is governed by a BSD-style license that can be 3 # found in the LICENSE file. 4 5 import dbus 6 7 import dbus_std_ifaces 8 import utils 9 10 import common 11 from autotest_lib.client.cros.cellular import mm1_constants 12 from autotest_lib.client.cros.cellular import net_interface 13 14 class Bearer(dbus_std_ifaces.DBusProperties): 15 """ 16 Fake implementation of the org.freedesktop.ModemManager1.Bearer 17 interface. Bearer objects are owned and managed by specific Modem objects. 18 A single Modem may expose one or more Bearer objects, which can then be 19 used to get the modem into connected state. 20 21 """ 22 23 count = 0 24 25 def __init__(self, bus, properties, config=None): 26 self._active = False 27 self._bearer_props = properties 28 path = '%s/Bearer/%d' % (mm1_constants.MM1, Bearer.count) 29 Bearer.count += 1 30 dbus_std_ifaces.DBusProperties.__init__(self, path, bus, config) 31 32 33 def _InitializeProperties(self): 34 props = { 35 'Interface': net_interface.PseudoNetInterface.IFACE_NAME, 36 'Connected': dbus.types.Boolean(False), 37 'Suspended': dbus.types.Boolean(False), 38 'Properties': self._bearer_props 39 } 40 return { mm1_constants.I_BEARER: props } 41 42 43 def _AddProperty(self, property_key): 44 self._properties[mm1_constants.I_BEARER][property_key] = None 45 46 47 def _RemoveProperty(self, property_key): 48 try: 49 self._properties[mm1_constants.I_BEARER].pop(property_key) 50 except KeyError: 51 pass 52 53 54 def IsActive(self): 55 """ 56 @returns: True, if the bearer is currently active. 57 58 """ 59 return self._active 60 61 62 @property 63 def bearer_properties(self): 64 """ 65 @returns: The current bearer properties that were set during a call to 66 org.freedesktop.ModemManager1.Modem.Simple.Connect. 67 68 """ 69 return self._bearer_props 70 71 72 @utils.log_dbus_method() 73 @dbus.service.method(mm1_constants.I_BEARER) 74 def Connect(self): 75 """ 76 Requests activation of a packet data connection with the network using 77 this bearer's properties. Upon successful activation, the modem can 78 send and receive packet data and, depending on the addressing 79 capability of the modem, a connection manager may need to start PPP, 80 perform DHCP, or assign the IP address returned by the modem to the 81 data interface. Upon successful return, the "Ip4Config" and/or 82 "Ip6Config" properties become valid and may contain IP configuration 83 information for the data interface associated with this bearer. 84 85 Since this is a mock implementation, this bearer will not establish 86 a real connection with the outside world. Since shill does not specify 87 IP addressing information to the bearer, we do not need to populate 88 these properties. 89 90 """ 91 # Set the ip config property 92 ip_family = self._bearer_props.get('ip-type', None) 93 if ip_family and ip_family >= mm1_constants.MM_BEARER_IP_FAMILY_IPV6: 94 config_prop = 'Ip6Config' 95 else: 96 config_prop = 'Ip4Config' 97 98 self._AddProperty('Ip4Config') 99 self.Set(mm1_constants.I_BEARER, config_prop, { 100 'method': dbus.types.UInt32(mm1_constants.MM_BEARER_IP_METHOD_DHCP, 101 variant_level=1) 102 }) 103 self._active = True 104 self.Set(mm1_constants.I_BEARER, 'Connected', dbus.types.Boolean(True)) 105 106 107 @utils.log_dbus_method() 108 @dbus.service.method(mm1_constants.I_BEARER) 109 def Disconnect(self): 110 """ 111 Disconnect and deactivate this packet data connection. In a real bearer, 112 any ongoing data session would be terminated and IP addresses would 113 become invalid when this method is called, however, the fake 114 implementation doesn't set the IP properties. 115 116 """ 117 self._RemoveProperty('Ip4Config') 118 self._RemoveProperty('Ip6Config') 119 self._active = False 120 self.Set(mm1_constants.I_BEARER, 'Connected', 121 dbus.types.Boolean(False)) 122