blob: af2c2da5a41a4967b2545c5f4663487c39fb74be [file] [log] [blame]
David Rochbergfa1d31d2012-03-20 10:38:07 -04001// 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#include "shill/modem.h"
6
Nathan Williamsfd10ec22012-04-11 20:29:16 -04007#include <base/file_util.h>
David Rochbergfa1d31d2012-03-20 10:38:07 -04008#include <mm/ModemManager-enums.h>
9#include <mm/ModemManager-names.h>
10
11#include "shill/cellular.h"
12
13using std::string;
14
15namespace shill {
16
Jason Glasgow82f9ab32012-04-04 14:27:19 -040017namespace {
18// The default place where the system keeps symbolic links for network device
19const char kDefaultNetfilesPath[] = "/sys/class/net";
20} // namespace {}
21
David Rochbergfa1d31d2012-03-20 10:38:07 -040022Modem1::Modem1(const string &owner,
23 const string &path,
24 ControlInterface *control_interface,
25 EventDispatcher *dispatcher,
26 Metrics *metrics,
27 Manager *manager,
28 mobile_provider_db *provider_db)
29 : Modem(owner, path, control_interface, dispatcher, metrics, manager,
Jason Glasgow82f9ab32012-04-04 14:27:19 -040030 provider_db),
31 netfiles_path_(kDefaultNetfilesPath) {
David Rochbergfa1d31d2012-03-20 10:38:07 -040032}
33
34Modem1::~Modem1() {}
35
36Cellular::ModemState Modem1::ConvertMmToCellularModemState(uint32 input) const {
37 switch (input) {
38 case MM_MODEM_STATE_UNKNOWN: return Cellular::kModemStateUnknown;
39 case MM_MODEM_STATE_INITIALIZING: return Cellular::kModemStateInitializing;
40 case MM_MODEM_STATE_LOCKED: return Cellular::kModemStateLocked;
41 case MM_MODEM_STATE_DISABLED: return Cellular::kModemStateDisabled;
42 case MM_MODEM_STATE_DISABLING: return Cellular::kModemStateDisabling;
43 case MM_MODEM_STATE_ENABLING: return Cellular::kModemStateEnabling;
44 case MM_MODEM_STATE_ENABLED: return Cellular::kModemStateEnabled;
45 case MM_MODEM_STATE_SEARCHING: return Cellular::kModemStateSearching;
46 case MM_MODEM_STATE_REGISTERED: return Cellular::kModemStateRegistered;
47 case MM_MODEM_STATE_DISCONNECTING:
48 return Cellular::kModemStateDisconnecting;
49 case MM_MODEM_STATE_CONNECTING: return Cellular::kModemStateConnecting;
50 case MM_MODEM_STATE_CONNECTED: return Cellular::kModemStateConnected;
51 default:
52 DCHECK(false) << "Unknown cellular state: " << input;
53 return Cellular::kModemStateUnknown;
54 }
55}
56
Nathan Williamsfd10ec22012-04-11 20:29:16 -040057bool Modem1::GetLinkName(const DBusPropertiesMap &modem_props,
David Rochbergfa1d31d2012-03-20 10:38:07 -040058 string *name) const {
Nathan Williamsfd10ec22012-04-11 20:29:16 -040059 string device_prop;
60 if (!DBusProperties::GetString(modem_props,
Jason Glasgow82f9ab32012-04-04 14:27:19 -040061 MM_MODEM_PROPERTY_DEVICE,
Nathan Williamsfd10ec22012-04-11 20:29:16 -040062 &device_prop)) {
63 return false;
64 }
65
66 // |device_prop| will be a sysfs path such as:
67 // /sys/devices/pci0000:00/0000:00:1d.7/usb1/1-2
68 FilePath device_path(device_prop);
69
Jason Glasgow82f9ab32012-04-04 14:27:19 -040070 // Each entry in |netfiles_path_" (typically /sys/class/net)
71 // has the name of a network interface and is a symlink into the
72 // actual device structure:
Nathan Williamsfd10ec22012-04-11 20:29:16 -040073 // eth0 -> ../../devices/pci0000:00/0000:00:1c.5/0000:01:00.0/net/eth0
74 // Iterate over all of these and see if any of them point into
75 // subdirectories of the sysfs path from the Device property.
Nathan Williamsfd10ec22012-04-11 20:29:16 -040076 // FileEnumerator warns that it is a blocking interface; that
77 // shouldn't be a problem here.
Jason Glasgow82f9ab32012-04-04 14:27:19 -040078 file_util::FileEnumerator netfiles(netfiles_path_,
Nathan Williamsfd10ec22012-04-11 20:29:16 -040079 false, // don't recurse
80 file_util::FileEnumerator::DIRECTORIES);
81 for (FilePath link = netfiles.Next(); !link.empty(); link = netfiles.Next()) {
82 FilePath target;
83 if (!file_util::ReadSymbolicLink(link, &target))
84 continue;
85 if (!target.IsAbsolute())
Jason Glasgow82f9ab32012-04-04 14:27:19 -040086 target = netfiles_path_.Append(target);
Nathan Williamsfd10ec22012-04-11 20:29:16 -040087 if (file_util::ContainsPath(device_path, target)) {
88 *name = link.BaseName().value();
89 return true;
90 }
91 }
92 return false;
David Rochbergfa1d31d2012-03-20 10:38:07 -040093}
94
95void Modem1::CreateDeviceMM1(const DBusInterfaceToProperties &i_to_p) {
Eric Shienbrood11567d02012-04-10 18:08:49 -040096 Init();
David Rochbergfa1d31d2012-03-20 10:38:07 -040097 DBusInterfaceToProperties::const_iterator modem_properties =
98 i_to_p.find(MM_DBUS_INTERFACE_MODEM);
99 if (modem_properties == i_to_p.end()) {
100 LOG(ERROR) << "Cellular device with no modem properties";
101 return;
102 }
103 set_type(Cellular::kTypeUniversal);
104
105 // We cannot check the IP method to make sure it's not PPP. The IP
106 // method will be checked later when the bearer object is fetched.
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400107 // TODO(jglasgow): We should pass i_to_p because there are lots of
108 // properties we might want
David Rochbergfa1d31d2012-03-20 10:38:07 -0400109 CreateDeviceFromModemProperties(modem_properties->second);
110}
111
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400112string Modem1::GetModemInterface(void) const {
113 return string(MM_DBUS_INTERFACE_MODEM);
114}
115
David Rochbergfa1d31d2012-03-20 10:38:07 -0400116} // namespace shill