# Copyright (c) 2012 The Chromium OS Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import dbus import dbus_std_ifaces import utils import common from autotest_lib.client.cros.cellular import mm1_constants from autotest_lib.client.cros.cellular import net_interface class Bearer(dbus_std_ifaces.DBusProperties): """ Fake implementation of the org.freedesktop.ModemManager1.Bearer interface. Bearer objects are owned and managed by specific Modem objects. A single Modem may expose one or more Bearer objects, which can then be used to get the modem into connected state. """ count = 0 def __init__(self, bus, properties, config=None): self._active = False self._bearer_props = properties path = '%s/Bearer/%d' % (mm1_constants.MM1, Bearer.count) Bearer.count += 1 dbus_std_ifaces.DBusProperties.__init__(self, path, bus, config) def _InitializeProperties(self): props = { 'Interface': net_interface.PseudoNetInterface.IFACE_NAME, 'Connected': dbus.types.Boolean(False), 'Suspended': dbus.types.Boolean(False), 'Properties': self._bearer_props } return { mm1_constants.I_BEARER: props } def _AddProperty(self, property_key): self._properties[mm1_constants.I_BEARER][property_key] = None def _RemoveProperty(self, property_key): try: self._properties[mm1_constants.I_BEARER].pop(property_key) except KeyError: pass def IsActive(self): """ @returns: True, if the bearer is currently active. """ return self._active @property def bearer_properties(self): """ @returns: The current bearer properties that were set during a call to org.freedesktop.ModemManager1.Modem.Simple.Connect. """ return self._bearer_props @utils.log_dbus_method() @dbus.service.method(mm1_constants.I_BEARER) def Connect(self): """ Requests activation of a packet data connection with the network using this bearer's properties. Upon successful activation, the modem can send and receive packet data and, depending on the addressing capability of the modem, a connection manager may need to start PPP, perform DHCP, or assign the IP address returned by the modem to the data interface. Upon successful return, the "Ip4Config" and/or "Ip6Config" properties become valid and may contain IP configuration information for the data interface associated with this bearer. Since this is a mock implementation, this bearer will not establish a real connection with the outside world. Since shill does not specify IP addressing information to the bearer, we do not need to populate these properties. """ # Set the ip config property ip_family = self._bearer_props.get('ip-type', None) if ip_family and ip_family >= mm1_constants.MM_BEARER_IP_FAMILY_IPV6: config_prop = 'Ip6Config' else: config_prop = 'Ip4Config' self._AddProperty('Ip4Config') self.Set(mm1_constants.I_BEARER, config_prop, { 'method': dbus.types.UInt32(mm1_constants.MM_BEARER_IP_METHOD_DHCP, variant_level=1) }) self._active = True self.Set(mm1_constants.I_BEARER, 'Connected', dbus.types.Boolean(True)) @utils.log_dbus_method() @dbus.service.method(mm1_constants.I_BEARER) def Disconnect(self): """ Disconnect and deactivate this packet data connection. In a real bearer, any ongoing data session would be terminated and IP addresses would become invalid when this method is called, however, the fake implementation doesn't set the IP properties. """ self._RemoveProperty('Ip4Config') self._RemoveProperty('Ip6Config') self._active = False self.Set(mm1_constants.I_BEARER, 'Connected', dbus.types.Boolean(False))