blob: 2d2a7ac0c6fb8319a46e7007c41bbba3e66dc178 [file] [log] [blame]
# 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 mm1
import pseudomodem
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/Bearers/%d' % (mm1.MM1, Bearer.count)
Bearer.count += 1
dbus_std_ifaces.DBusProperties.__init__(self, path, bus, config)
def _InitializeProperties(self):
props = {
'Interface': pseudomodem.IFACE_NAME,
'Connected': dbus.types.Boolean(False),
'Suspended': dbus.types.Boolean(False),
'Properties': self._bearer_props
}
return { mm1.I_BEARER: props }
def _AddProperty(self, property_key):
self._properties[mm1.I_BEARER][property_key] = None
def _RemoveProperty(self, property_key):
try:
self._properties[mm1.I_BEARER].pop(property_key)
except KeyError:
pass
def IsActive(self):
return self._active
@property
def bearer_properties(self):
return self._bearer_props
@dbus.service.method(mm1.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.MM_BEARER_IP_FAMILY_IPV6:
config_prop = 'Ip6Config'
else:
config_prop = 'Ip4Config'
self._AddProperty('Ip4Config')
self.Set(mm1.I_BEARER, config_prop, {
'method': dbus.types.UInt32(mm1.MM_BEARER_IP_METHOD_DHCP)
})
self._active = True
self.Set(mm1.I_BEARER, 'Connected', dbus.types.Boolean(True))
@dbus.service.method(mm1.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.I_BEARER, 'Connected', dbus.types.Boolean(False))